diff --git a/context/exported.go b/context/exported.go index 83bf07a..9f65e36 100644 --- a/context/exported.go +++ b/context/exported.go @@ -9,7 +9,7 @@ import ( ) // VERSION is the current bot's version -const VERSION = "0.0.1" +const VERSION = "0.0.2" // Context is the main application context. type Context struct { diff --git a/domains/announces/v1/announces.go b/domains/announces/v1/announces.go new file mode 100644 index 0000000..eccb98f --- /dev/null +++ b/domains/announces/v1/announces.go @@ -0,0 +1,73 @@ +// Fantasy World Zookeeper Helper Bot +// Copyright (c) 2018-2019 Vladimir "fat0troll" Hodakov + +package announcesv1 + +import ( + tdlib "github.com/Arman92/go-tdlib" + "strings" +) + +func fwMessagesFilter(msg *tdlib.TdMessage) bool { + updateMsg := (*msg).(*tdlib.UpdateNewMessage) + // We need only messages, created by @FWorldBot + return updateMsg.Message.ViaBotUserID == 6.74929718e+08 +} + +// ZookeeperReceiver adds announcement functionality to bot +func ZookeeperReceiver(client *tdlib.Client) { + log.Debug().Msg("Adding receiver for @FWorld_bot messages...") + // Here we can add a receiver to retreive any message type we want + // We like to get UpdateNewMessage events and with a specific FilterFunc + receiver := client.AddEventReceiver(&tdlib.UpdateNewMessage{}, fwMessagesFilter, 5) + log.Debug().Msg("Receiver added") + go func() { + for newMsg := range receiver.Chan { + updateMsg := (newMsg).(*tdlib.UpdateNewMessage) + // Check if message text contains needed battle data + msgText := updateMsg.Message.Content.(*tdlib.MessageText) + if strings.HasPrefix(msgText.Text.Text, "Я встретил") { + log.Debug().Msgf("%s", msgText.Text.Text) + battleType := "" + battleTag := "" + if strings.Contains(msgText.Text.Text, "Огров") { + battleType = "Огры!" + } + if strings.Contains(msgText.Text.Text, "Буйволов") { + battleType = "Буйволы!" + } + if strings.Contains(msgText.Text.Text, "Кабанов") { + battleType = "Кабаны!" + } + switch updateMsg.Message.ReplyMarkup.(type) { + case *tdlib.ReplyMarkupInlineKeyboard: + keyboard := updateMsg.Message.ReplyMarkup.(*tdlib.ReplyMarkupInlineKeyboard) + if len(keyboard.Rows) > 0 { + if len(keyboard.Rows[0]) > 0 { + button := keyboard.Rows[0][0] + switch button.Type.(type) { + case *tdlib.InlineKeyboardButtonTypeSwitchInline: + buttonQuery := button.Type.(*tdlib.InlineKeyboardButtonTypeSwitchInline) + battleTag = string(buttonQuery.Query) + default: + log.Error().Msg("Invalid button type") + } + } + } + default: + log.Error().Msg("Invalid keyboard type") + } + log.Debug().Msgf("Battle type: %s", battleType) + log.Debug().Msgf("Battle tag: %s", battleTag) + + replyText := battleType + " " + battleTag + + reply := tdlib.NewInputMessageText(tdlib.NewFormattedText(replyText, nil), true, true) + _, err := client.SendMessage(updateMsg.Message.ChatID, 0, false, true, nil, reply) + if err != nil { + log.Error().Err(err) + } + } + } + }() +} diff --git a/domains/announces/v1/exported.go b/domains/announces/v1/exported.go new file mode 100644 index 0000000..375b0fc --- /dev/null +++ b/domains/announces/v1/exported.go @@ -0,0 +1,22 @@ +// Fantasy World Zookeeper Helper Bot +// Copyright (c) 2018-2019 Vladimir "fat0troll" Hodakov + +package announcesv1 + +import ( + "github.com/rs/zerolog" + "lab.wtfteam.pro/fat0troll/fw_zookeeper_helper/context" +) + +var ( + c *context.Context + log zerolog.Logger +) + +// New initializes package +func New(cc *context.Context) { + c = cc + log = c.Logger.With().Str("domain", "announces").Int("version", 1).Logger() + + log.Info().Msg("Adding announces handler to Telegram instance") +} diff --git a/local/telegram/exported.go b/local/telegram/exported.go index 6f1a66c..f189e4c 100644 --- a/local/telegram/exported.go +++ b/local/telegram/exported.go @@ -24,8 +24,5 @@ func New(cc *context.Context) { log.Info().Msg("Starting Telegram MTProto instance") Authenticate() - - go func() { - Connect() - }() + Connect() } diff --git a/local/telegram/telegram.go b/local/telegram/telegram.go index 5bf97b0..b03084b 100644 --- a/local/telegram/telegram.go +++ b/local/telegram/telegram.go @@ -7,7 +7,7 @@ import ( "fmt" tdlib "github.com/Arman92/go-tdlib" "lab.wtfteam.pro/fat0troll/fw_zookeeper_helper/context" - "strings" + "lab.wtfteam.pro/fat0troll/fw_zookeeper_helper/domains/announces/v1" ) // Authenticate connects instance to Telegram @@ -70,75 +70,19 @@ func Authenticate() { } // Connect connects into updates chain -// func Connect() { go func() { - // Create an filter function which will be used to filter out unwanted tdlib messages - eventFilter := func(msg *tdlib.TdMessage) bool { - updateMsg := (*msg).(*tdlib.UpdateNewMessage) - // We need only messages, created by @FWorldBot - return updateMsg.Message.ViaBotUserID == 6.74929718e+08 - } - - // Here we can add a receiver to retreive any message type we want - // We like to get UpdateNewMessage events and with a specific FilterFunc - receiver := client.AddEventReceiver(&tdlib.UpdateNewMessage{}, eventFilter, 5) - for newMsg := range receiver.Chan { - updateMsg := (newMsg).(*tdlib.UpdateNewMessage) - // Check if message text contains needed battle data - msgText := updateMsg.Message.Content.(*tdlib.MessageText) - if strings.HasPrefix(msgText.Text.Text, "Я встретил") { - log.Debug().Msgf("%s", msgText.Text.Text) - battleType := "" - battleTag := "" - if strings.Contains(msgText.Text.Text, "Огров") { - battleType = "Огры!" - } - if strings.Contains(msgText.Text.Text, "Буйволов") { - battleType = "Буйволы!" - } - if strings.Contains(msgText.Text.Text, "Кабанов") { - battleType = "Кабаны!" - } - switch updateMsg.Message.ReplyMarkup.(type) { - case *tdlib.ReplyMarkupInlineKeyboard: - keyboard := updateMsg.Message.ReplyMarkup.(*tdlib.ReplyMarkupInlineKeyboard) - if len(keyboard.Rows) > 0 { - if len(keyboard.Rows[0]) > 0 { - button := keyboard.Rows[0][0] - switch button.Type.(type) { - case *tdlib.InlineKeyboardButtonTypeSwitchInline: - buttonQuery := button.Type.(*tdlib.InlineKeyboardButtonTypeSwitchInline) - battleTag = string(buttonQuery.Query) - default: - log.Error().Msg("Invalid button type") - } - } - } - default: - log.Error().Msg("Invalid keyboard type") - } - log.Debug().Msgf("Battle type: %s", battleType) - log.Debug().Msgf("Battle tag: %s", battleTag) - - reply := tdlib.InputMessageText{ - DisableWebPagePreview: true, - Text: &tdlib.FormattedText{ - Text: "Вызываю на помощь!", - }, - } - - _, err := client.SendMessage(updateMsg.Message.ChatID, 0, false, false, nil, &reply) - if err != nil { - log.Error().Err(err) - } - } - } - + announcesv1.ZookeeperReceiver(client) }() - rawUpdates := client.GetRawUpdatesChannel(100) + log.Debug().Msg("Connection with Telegram established") for update := range rawUpdates { log.Debug().Msgf("Update of type %s received", update.Data["@type"]) } } + +// Shutdown disconnects from Telegram +func Shutdown() { + client.DestroyInstance() + log.Info().Msg("Connection with Telegram closed") +} diff --git a/main.go b/main.go index 9c22b44..19ec6e2 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ package main import ( "lab.wtfteam.pro/fat0troll/fw_zookeeper_helper/context" + "lab.wtfteam.pro/fat0troll/fw_zookeeper_helper/domains/announces/v1" "lab.wtfteam.pro/fat0troll/fw_zookeeper_helper/local/telegram" "os" "os/signal" @@ -23,8 +24,6 @@ func main() { c.Init() c.InitConfiguration() - telegram.New(c) - // CTRL+C handler. interrupt := make(chan os.Signal, 1) signal.Notify(interrupt) @@ -33,10 +32,16 @@ func main() { signalThing := <-interrupt if signalThing == syscall.SIGTERM || signalThing == syscall.SIGINT { c.Logger.Info().Msg("Got " + signalThing.String() + " signal, shutting down...") + + telegram.Shutdown() + shutdownDone <- true } }() + announcesv1.New(c) + telegram.New(c) + <-shutdownDone os.Exit(0)