98 lines
2.6 KiB
Go
98 lines
2.6 KiB
Go
|
// 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)
|
||
|
}
|
||
|
|
||
|
}
|