Archived
1
This repository has been archived on 2022-11-04. You can view files and clone it, but cannot push or open issues or pull requests.
fwzookeeper/internal/telegram/telegram.go
Vladimir Hodakov 5820a37326
Add LICENSE and first command
This commit may be used as template for making any new Telegram bots.
Just check out it, change your variables and start developing new
shiny bot!

Maybe I need to create bot generator...
2018-11-29 20:51:36 +04:00

97 lines
2.5 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 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 Bot() *telegram.Bot {
return bot
}
// StartBot starts connection with Telegram
func 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 {
bot = new(telegram.Bot)
client := new(http.Client)
client.Dial = proxyDialer
bot.SetClient(client)
bot.AccessToken = c.Config.Telegram.Token
bot.User, err = bot.GetMe()
} else {
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() + bot.AccessToken)
webhook := telegram.NewWebhook(url.String()+bot.AccessToken, nil)
webhook.MaxConnections = 40
updates = 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 = bot.GetWebhookInfo()
if err != nil {
log.Fatal().Err(err)
}
if info != nil && info.URL != "" {
log.Info().Msg("Deleting old webhook...")
_, err := bot.DeleteWebhook()
if err != nil {
log.Fatal().Err(err)
}
}
updatesParams := telegram.GetUpdatesParameters{
Offset: 0,
Limit: 100,
Timeout: 60,
}
updates = bot.NewLongPollingChannel(&updatesParams)
}
log.Info().Msg("Connection with Telegram established")
for update := range updates {
log.Debug().Msgf("%+v", update)
go router.Respond(update)
}
}