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"
|
2020-04-02 16:17:19 +00:00
|
|
|
"github.com/sahilm/fuzzy"
|
2020-03-24 14:50:49 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
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-04-02 16:17:19 +00:00
|
|
|
err = telegram.Init()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("Could not establish telegram connection: %+v", err)
|
|
|
|
}
|
|
|
|
updates, err = telegram.GetChan()
|
2020-03-26 17:11:12 +00:00
|
|
|
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()
|
2020-04-02 16:17:19 +00:00
|
|
|
telegram.DeInit()
|
2020-03-24 14:50:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-04-02 17:49:41 +00:00
|
|
|
if update.InlineQuery != nil {
|
|
|
|
telegram.DoInlineQuery(update)
|
|
|
|
}
|
2020-03-26 17:11:12 +00:00
|
|
|
if update.Message == nil {
|
|
|
|
// ignore any non-Message Updates
|
|
|
|
continue
|
|
|
|
}
|
2020-04-02 16:17:19 +00:00
|
|
|
log.Printf("[TELEGRAM] %s: %s\n", update.Message.From.String(), update.Message.Text)
|
|
|
|
|
|
|
|
if update.Message.IsCommand() {
|
|
|
|
switch update.Message.Command() {
|
|
|
|
case "start", "help":
|
2020-04-02 17:49:41 +00:00
|
|
|
reply := `Willkommen beim DB 640 Telegram Bot!
|
|
|
|
|
|
|
|
Einfach den gewünschten DB 640 Betriebsstellencode schicken, und der Bot antwortet mit der zugehörigen Betriebsstelle!
|
|
|
|
|
|
|
|
Zum Beispiel: Nb -> Wiener Neustadt Hbf (in Nb)
|
|
|
|
|
|
|
|
Alternativ nach Codes suchen:
|
|
|
|
/find Name
|
|
|
|
Zum Beispiel: /find Matzleinsdorf gibt die entsprechenden Betriebsstelle(n) und Code(s) aus.`
|
2020-04-02 16:17:19 +00:00
|
|
|
telegram.SendReply(reply, update)
|
|
|
|
continue
|
|
|
|
case "find":
|
|
|
|
if update.Message.CommandArguments() == "" {
|
2020-04-02 17:49:41 +00:00
|
|
|
reply := "Benutze \"/find Name\" um einen Code für eine Betriebsstelle zu finden!"
|
2020-04-02 16:17:19 +00:00
|
|
|
telegram.SendReply(reply, update)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
var bs database.Betriebsstellen
|
|
|
|
var reply string
|
2020-04-02 17:49:41 +00:00
|
|
|
if err := database.Db.Find(&bs, "name LIKE ?", "%"+update.Message.CommandArguments()+"%").Error; err != nil || len(bs) == 0 {
|
|
|
|
reply = "Keine Betriebsstelle mit Namen '" + update.Message.CommandArguments() + "' gefunden!"
|
|
|
|
} else {
|
2020-04-02 16:17:19 +00:00
|
|
|
results := fuzzy.FindFrom(update.Message.CommandArguments(), bs)
|
|
|
|
for i, r := range results {
|
|
|
|
reply = reply + bs[r.Index].Code + ": " + bs[r.Index].Name + "\n"
|
|
|
|
if i == 49 {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reply = reply[0 : len(reply)-1]
|
|
|
|
}
|
|
|
|
err := telegram.SendReply(reply, update)
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("Cannot send reply, error: %+v", err)
|
|
|
|
}
|
|
|
|
continue
|
|
|
|
}
|
2020-03-26 17:11:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|