package bot import ( "log" "strings" "git.1750studios.com/ToddShepard/DB640/internal/config" "git.1750studios.com/ToddShepard/DB640/internal/database" "git.1750studios.com/ToddShepard/DB640/internal/telegram" "git.1750studios.com/ToddShepard/DB640/internal/twitter" "github.com/jinzhu/gorm" ) var stream *twitter.Stream var updates telegram.UpdateChan // 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 { log.Fatalf("Could not establish database connection: %+v", err) } log.Printf("[DATABASE] Connection established\n") twitter.Init() stream, err = twitter.GetStreamForTag(config.C.Twitter.MagicHashtag) if err != nil { log.Fatalf("Could not establish twitter stream: %+v", err) } go twitter.StreamDemux(stream, handleHashtagTweet) log.Printf("[TWITTER] Connection established\n") updates, err = telegram.Init() if err != nil { log.Fatalf("Could not establish telegram connection: %+v", err) } go handleTelegram() log.Printf("[TELEGRAM] Connection established\n") } // 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 { log.Printf("[TWITTER] %s: %s - IGNORED (RT)\n", tweet.User.ScreenName, msg) return } // Ignore replys if tweet.InReplyToStatusID != 0 { log.Printf("[TWITTER] %s: %s - IGNORED (RPLY)\n", tweet.User.ScreenName, msg) return } // Ignore if only magic hashtag is given if len(tags) < 2 { log.Printf("[TWITTER] %s: %s - IGNORED (<2#)\n", tweet.User.ScreenName, msg) return } log.Printf("[TWITTER] %s: %s\n", tweet.User.ScreenName, msg) 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) } } 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) } } }