All checks were successful
continuous-integration/drone/push Build is passing
166 lines
3.1 KiB
Go
166 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gocolly/colly"
|
|
tb "gopkg.in/tucnak/telebot.v2"
|
|
)
|
|
|
|
const (
|
|
dbFile = "quotes.json"
|
|
)
|
|
|
|
// Quote represent a quote of the flim
|
|
type Quote struct {
|
|
Quote string `json:"quote"`
|
|
YoutubeKey string `json:"youtube_key"`
|
|
}
|
|
|
|
// ThumbURL get url of the thumbnail
|
|
func (q *Quote) ThumbURL() string {
|
|
return fmt.Sprintf(
|
|
"https://img.youtube.com/vi/%s/0.jpg",
|
|
q.YoutubeKey,
|
|
)
|
|
|
|
}
|
|
|
|
// VideoURL get url of the video
|
|
func (q *Quote) VideoURL() string {
|
|
return fmt.Sprintf(
|
|
"https://www.youtube.com/watch?v=%s",
|
|
q.YoutubeKey,
|
|
)
|
|
}
|
|
|
|
func main() {
|
|
var quotes []Quote
|
|
|
|
// Load quote database
|
|
file, err := os.Open(dbFile)
|
|
if err != nil {
|
|
log.Fatalf("Could not open quote file: %s\n", err)
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
bytes, err := ioutil.ReadAll(file)
|
|
if err != nil {
|
|
log.Fatalf("Could not read quote file: %s\n", err)
|
|
return
|
|
}
|
|
|
|
if err = json.Unmarshal(bytes, "es); err != nil {
|
|
log.Fatalf("Could not Unmarshal quote file: %s\n", err)
|
|
return
|
|
}
|
|
|
|
// Index quote database
|
|
index, err := indexQuotes(quotes)
|
|
if err != nil {
|
|
log.Fatalf("Could not index quotes: %s\n", err)
|
|
return
|
|
}
|
|
|
|
// Load telegram bot
|
|
b, err := tb.NewBot(tb.Settings{
|
|
Token: os.Getenv("TELEGRAM_TOKEN"),
|
|
Poller: &tb.LongPoller{Timeout: 10 * time.Second},
|
|
})
|
|
if err != nil {
|
|
log.Fatalf("Colud not connect to telegram: %s\n", err)
|
|
return
|
|
}
|
|
|
|
// Add bot capabilities
|
|
b.Handle(tb.OnQuery, func(q *tb.Query) {
|
|
quotes, err := index.Search(q.Text)
|
|
if err != nil {
|
|
log.Println("Pas de fichier citation trouvé")
|
|
return
|
|
}
|
|
results := make(tb.Results, len(quotes))
|
|
for i, quote := range quotes {
|
|
url := quote.VideoURL()
|
|
thumb := quote.ThumbURL()
|
|
log.Printf("{%s, %s}\n", url, thumb)
|
|
results[i] = &tb.VideoResult{
|
|
URL: url,
|
|
MIME: "text/html",
|
|
ThumbURL: thumb,
|
|
Title: quote.Quote,
|
|
}
|
|
results[i].SetContent(
|
|
&tb.InputTextMessageContent{
|
|
Text: fmt.Sprintf(
|
|
"%s\n\n%s",
|
|
quote.Quote,
|
|
url,
|
|
),
|
|
ParseMode: tb.ModeHTML,
|
|
DisablePreview: false,
|
|
},
|
|
)
|
|
results[i].SetResultID(strconv.Itoa(i))
|
|
}
|
|
err = b.Answer(q, &tb.QueryResponse{
|
|
Results: results,
|
|
SwitchPMParameter: "Ajoute moi",
|
|
CacheTime: 0, // One minut
|
|
})
|
|
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
})
|
|
|
|
// Start bot
|
|
log.Println("Bot started")
|
|
b.Start()
|
|
}
|
|
|
|
// Update get a fresh list of quotes from george-abitbol.fr
|
|
func Update() error {
|
|
var videos []Quote
|
|
|
|
c := colly.NewCollector(
|
|
colly.AllowedDomains("george-abitbol.fr"),
|
|
)
|
|
|
|
// Find and visit all links
|
|
c.OnHTML("img[data-original]", func(e *colly.HTMLElement) {
|
|
videos = append(
|
|
videos,
|
|
Quote{
|
|
Quote: e.Attr("alt"),
|
|
YoutubeKey: strings.Split(e.Attr("data-original"), "/")[4],
|
|
},
|
|
)
|
|
})
|
|
|
|
c.Visit("http://george-abitbol.fr")
|
|
|
|
file, err := os.Create(dbFile)
|
|
if err != nil {
|
|
return fmt.Errorf("could not create quotes files: %w", err)
|
|
}
|
|
defer file.Close()
|
|
|
|
bytes, err := json.Marshal(&videos)
|
|
if err != nil {
|
|
return fmt.Errorf("could not marshal quotes: %w", err)
|
|
}
|
|
|
|
file.Write(bytes)
|
|
|
|
return nil
|
|
}
|