From 5aab5c3b63e00caf198c3e6948199e32f5ae19ad Mon Sep 17 00:00:00 2001 From: Andreas Mieke Date: Thu, 2 Apr 2020 19:49:41 +0200 Subject: [PATCH] Fix crash on non existing names, add inline query --- go.mod | 3 ++- go.sum | 2 ++ internal/bot/bot.go | 22 ++++++++++++++++------ internal/telegram/telegram.go | 26 ++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 9e8d3b9..35ff1cb 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/dghubble/oauth1 v0.6.0 github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible github.com/jinzhu/gorm v1.9.12 - github.com/technoweenie/multipartstreamer v1.0.1 // indirect + github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d github.com/sahilm/fuzzy v0.1.0 + github.com/technoweenie/multipartstreamer v1.0.1 // indirect ) diff --git a/go.sum b/go.sum index 0bbb28f..5ae21ef 100644 --- a/go.sum +++ b/go.sum @@ -34,6 +34,8 @@ github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw= github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= +github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= diff --git a/internal/bot/bot.go b/internal/bot/bot.go index 78b2036..fd6d7cc 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -100,6 +100,9 @@ func sendReply(tweet *twitter.Tweet, betriebsstellen []database.Betriebsstelle) func handleTelegram() { for update := range updates { + if update.InlineQuery != nil { + telegram.DoInlineQuery(update) + } if update.Message == nil { // ignore any non-Message Updates continue @@ -109,19 +112,28 @@ func handleTelegram() { if update.Message.IsCommand() { switch update.Message.Command() { case "start", "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)" + 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.` telegram.SendReply(reply, update) continue case "find": if update.Message.CommandArguments() == "" { - reply := "Benutze /find um einen Code für eine Betriebsstelle zu finden!" + reply := "Benutze \"/find Name\" um einen Code für eine Betriebsstelle zu finden!" telegram.SendReply(reply, update) continue } var bs database.Betriebsstellen var reply string - if database.Db.Find(&bs, "name LIKE ?", "%"+update.Message.CommandArguments()+"%").Error != gorm.ErrRecordNotFound { - + 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 { results := fuzzy.FindFrom(update.Message.CommandArguments(), bs) for i, r := range results { reply = reply + bs[r.Index].Code + ": " + bs[r.Index].Name + "\n" @@ -130,8 +142,6 @@ func handleTelegram() { } } reply = reply[0 : len(reply)-1] - } else { - reply = "Keine Betriebsstelle mit Namen '" + update.Message.CommandArguments() + "' gefunden!" } err := telegram.SendReply(reply, update) if err != nil { diff --git a/internal/telegram/telegram.go b/internal/telegram/telegram.go index ab40e18..ba768a3 100644 --- a/internal/telegram/telegram.go +++ b/internal/telegram/telegram.go @@ -7,6 +7,7 @@ import ( "git.1750studios.com/ToddShepard/DB640/internal/database" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api" "github.com/jinzhu/gorm" + uuid "github.com/nu7hatch/gouuid" ) // UpdateChan is telegram UpdatesChannel @@ -74,3 +75,28 @@ func SendAll(msg string) { } } } + +// DoInlineQuery does the inline query search and returns results +func DoInlineQuery(update tgbotapi.Update) { + var config tgbotapi.InlineConfig + var results []interface{} + var betriebsstellen []database.Betriebsstelle + + config.InlineQueryID = update.InlineQuery.ID + config.Results = results + + err := database.Db.Limit(50).Find(&betriebsstellen, "Code LIKE ?", update.InlineQuery.Query+"%").Error + if err != nil || len(betriebsstellen) == 0 { + bot.AnswerInlineQuery(config) + return + } + for _, bs := range betriebsstellen { + msg := bs.Code + ": " + bs.Name + id, _ := uuid.NewV4() + results = append(results, tgbotapi.NewInlineQueryResultArticle(id.String(), msg, msg)) + } + + config.Results = results + bot.AnswerInlineQuery(config) + log.Printf("[TELEGRAM Inline] %s: %s", update.InlineQuery.From.String(), update.InlineQuery.Query) +}