This commit is contained in:
165
bot.go
Normal file
165
bot.go
Normal file
@@ -0,0 +1,165 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user