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 )
}
}
}