DB640/internal/bot/bot.go

121 lines
3.5 KiB
Go
Raw Normal View History

2020-03-26 17:11:12 +00:00
package bot
2020-03-24 14:50:49 +00:00
import (
"log"
"strings"
"git.1750studios.com/ToddShepard/DB640/internal/config"
"git.1750studios.com/ToddShepard/DB640/internal/database"
2020-03-26 17:11:12 +00:00
"git.1750studios.com/ToddShepard/DB640/internal/telegram"
2020-03-24 14:50:49 +00:00
"git.1750studios.com/ToddShepard/DB640/internal/twitter"
"github.com/jinzhu/gorm"
)
var stream *twitter.Stream
2020-03-26 17:11:12 +00:00
var updates telegram.UpdateChan
2020-03-24 14:50:49 +00:00
// Init initzializes the bot and subscribes the magic hashtag feed
func Init() {
var err error
err = database.Open(config.C.Database.Dialect, config.C.Database.Connection)
if err != nil {
2020-03-26 17:11:12 +00:00
log.Fatalf("Could not establish database connection: %+v", err)
2020-03-24 14:50:49 +00:00
}
2020-03-26 17:11:12 +00:00
log.Printf("[DATABASE] Connection established\n")
2020-03-24 14:50:49 +00:00
twitter.Init()
stream, err = twitter.GetStreamForTag(config.C.Twitter.MagicHashtag)
if err != nil {
log.Fatalf("Could not establish twitter stream: %+v", err)
}
2020-03-26 17:11:12 +00:00
go twitter.StreamDemux(stream, handleHashtagTweet)
log.Printf("[TWITTER] Connection established\n")
2020-03-24 14:50:49 +00:00
2020-03-26 17:11:12 +00:00
updates, err = telegram.Init()
if err != nil {
log.Fatalf("Could not establish telegram connection: %+v", err)
}
go handleTelegram()
log.Printf("[TELEGRAM] Connection established\n")
2020-03-24 14:50:49 +00:00
}
// DeInit stops the stream and deinitzializes the bot
func DeInit() {
stream.Stop()
database.Close()
}
func handleHashtagTweet(tweet *twitter.Tweet) {
msg, tags := twitter.GetTextAndHashtags(tweet)
// Ignore retweets
if tweet.RetweetedStatus != nil {
2020-03-26 17:11:12 +00:00
log.Printf("[TWITTER] %s: %s - IGNORED (RT)\n", tweet.User.ScreenName, msg)
2020-03-24 14:50:49 +00:00
return
}
// Ignore replys
if tweet.InReplyToStatusID != 0 {
2020-03-26 17:11:12 +00:00
log.Printf("[TWITTER] %s: %s - IGNORED (RPLY)\n", tweet.User.ScreenName, msg)
2020-03-24 14:50:49 +00:00
return
}
// Ignore if only magic hashtag is given
if len(tags) < 2 {
2020-03-26 17:11:12 +00:00
log.Printf("[TWITTER] %s: %s - IGNORED (<2#)\n", tweet.User.ScreenName, msg)
2020-03-24 14:50:49 +00:00
return
}
2020-03-26 17:11:12 +00:00
log.Printf("[TWITTER] %s: %s\n", tweet.User.ScreenName, msg)
2020-03-24 14:50:49 +00:00
go findCodes(tweet)
}
func findCodes(tweet *twitter.Tweet) {
_, tags := twitter.GetTextAndHashtags(tweet)
var betriebsstellen []database.Betriebsstelle
for _, tag := range tags {
code := strings.ReplaceAll(tag.Text, "_", " ")
var bs database.Betriebsstelle
if database.Db.First(&bs, "code = ?", code).Error != gorm.ErrRecordNotFound {
betriebsstellen = append(betriebsstellen, bs)
}
}
sendReply(tweet, betriebsstellen)
}
func sendReply(tweet *twitter.Tweet, betriebsstellen []database.Betriebsstelle) {
var reply string
for _, bs := range betriebsstellen {
reply = reply + bs.Code + ": " + bs.Name + "\n"
}
reply = reply[0 : len(reply)-1]
_, _, err := twitter.SendTweet(reply, tweet)
if err != nil {
log.Printf("Cannot send reply, error: %+v", err)
}
}
2020-03-26 17:11:12 +00:00
func handleTelegram() {
for update := range updates {
if update.Message == nil {
// ignore any non-Message Updates
continue
}
log.Printf("[TELEGRAM] %s: %s\n", update.Message.From.UserName, update.Message.Text)
if update.Message.Text == "/start" || update.Message.Text == "/help" {
reply := "Willkommen beim DB 640 Telegram Bot!\n\nEinfach den gewünschten DB 640 Betriebsstellencode schicken, und der Bot antwortet mit der zugehörigen Betriebsstelle!\n\nZum Beispiel: Nb -> Wiener Neustadt Hbf (in Nb)"
telegram.SendReply(reply, update)
continue
}
var bs database.Betriebsstelle
var reply string
if database.Db.First(&bs, "code = ?", update.Message.Text).Error != gorm.ErrRecordNotFound {
reply = bs.Code + ": " + bs.Name
} else {
reply = update.Message.Text + ": nicht gefunden!"
}
err := telegram.SendReply(reply, update)
if err != nil {
log.Printf("Cannot send reply, error: %+v", err)
}
}
}