// Fantasy World Zookeeper Bot // Copyright (c) 2018 Vladimir "fat0troll" Hodakov package telegram import ( "net" http "github.com/valyala/fasthttp" "gitlab.com/toby3d/telegram" "golang.org/x/net/proxy" "lab.wtfteam.pro/fat0troll/fw_zookeeper/internal/router" ) func (t *Telegram) proxyDialer(addr string) (net.Conn, error) { log.Debug().Msgf("Proxy used: %s", c.Config.Telegram.Proxy.Address) proxyAuth := proxy.Auth{} if c.Config.Telegram.Proxy.Username != "" { proxyAuth.User = c.Config.Telegram.Proxy.Username proxyAuth.Password = c.Config.Telegram.Proxy.Password } var dialProxy proxy.Dialer var err error dialProxy, err = proxy.SOCKS5("tcp", c.Config.Telegram.Proxy.Address, &proxyAuth, proxy.Direct) if err != nil { log.Fatal().Err(err).Msg("Failed to dial proxy") } return dialProxy.Dial("tcp", addr) } // Bot returns Telegram instance func (t *Telegram) Bot() *telegram.Bot { return t.bot } // StartBot starts connection with Telegram func (t *Telegram) StartBot() { // Any errors here considered fatal, because main purpose of this app is Telegram interactions var err error var updates telegram.UpdatesChannel if c.Config.Telegram.Proxy.Enabled { t.bot = new(telegram.Bot) client := new(http.Client) client.Dial = t.proxyDialer t.bot.SetClient(client) t.bot.AccessToken = c.Config.Telegram.Token t.bot.User, err = t.bot.GetMe() } else { t.bot, err = telegram.New(c.Config.Telegram.Token) } if err != nil { log.Fatal().Err(err) } if c.Config.Telegram.Webhook.Enabled { var url *http.URI url.Parse(nil, []byte(c.Config.Telegram.Webhook.Domain)) if len(url.Host()) == 0 { log.Fatal().Msg("Can't parse webhook URL: got empty host") } log.Info().Msg("Trying to set webhook: " + url.String() + t.bot.AccessToken) webhook := telegram.NewWebhook(url.String()+t.bot.AccessToken, nil) webhook.MaxConnections = 40 updates = t.bot.NewWebhookChannel(url, webhook, "", "", c.Config.Telegram.Webhook.Listen) } else { log.Warn().Msg("Using long-polling for updates (not recommended)") var info *telegram.WebhookInfo info, err = t.bot.GetWebhookInfo() if err != nil { log.Fatal().Err(err) } if info != nil && info.URL != "" { log.Info().Msg("Deleting old webhook...") _, err := t.bot.DeleteWebhook() if err != nil { log.Fatal().Err(err) } } updatesParams := telegram.GetUpdatesParameters{ Offset: 0, Limit: 100, Timeout: 60, } updates = t.bot.NewLongPollingChannel(&updatesParams) } log.Info().Msg("Connection with Telegram established") for update := range updates { log.Debug().Msgf("%+v", update) go router.Requests.Respond(update) } }