Archived
1

Add SOCKS5 proxy support to bot

In Soviet Russia... wait, wrong time period.
This commit is contained in:
2018-05-11 18:55:37 +04:00
parent 2c72bc8023
commit b52a0c34b8
3 changed files with 69 additions and 2 deletions

View File

@@ -8,11 +8,13 @@ import (
_ "github.com/go-sql-driver/mysql" // MySQL driver for sqlx
"github.com/go-telegram-bot-api/telegram-bot-api"
"github.com/jmoiron/sqlx"
"golang.org/x/net/proxy"
"net/http"
"source.wtfteam.pro/i2_bot/i2_bot/lib/config"
)
// BotInit initializes connection to Telegram
func BotInit(cfg *config.Config, lg *mogrus.LoggerHandler) *tgbotapi.BotAPI {
// botInitDirect used when no proxy in config file
func botInitDirect(cfg *config.Config, lg *mogrus.LoggerHandler) *tgbotapi.BotAPI {
bot, err := tgbotapi.NewBotAPI(cfg.Telegram.APIToken)
if err != nil {
lg.Fatal(err.Error())
@@ -26,6 +28,57 @@ func BotInit(cfg *config.Config, lg *mogrus.LoggerHandler) *tgbotapi.BotAPI {
return bot
}
// botInitWithProxy used when there is proxy in config file
func botInitWithProxy(cfg *config.Config, lg *mogrus.LoggerHandler) *tgbotapi.BotAPI {
proxyAuth := proxy.Auth{}
if cfg.Proxy.Username != "" {
proxyAuth.User = cfg.Proxy.Username
proxyAuth.Password = cfg.Proxy.Password
}
var dialProxy proxy.Dialer
var err error
if cfg.Proxy.Username != "" {
dialProxy, err = proxy.SOCKS5("tcp", cfg.Proxy.Address, &proxyAuth, proxy.Direct)
if err != nil {
lg.Fatal(err.Error())
}
} else {
dialProxy, err = proxy.SOCKS5("tcp", cfg.Proxy.Address, &proxyAuth, proxy.Direct)
if err != nil {
lg.Fatal(err.Error())
}
}
proxyTransport := &http.Transport{Dial: dialProxy.Dial}
proxyClient := http.Client{Transport: proxyTransport}
bot, err := tgbotapi.NewBotAPIWithClient(cfg.Telegram.APIToken, &proxyClient)
if err != nil {
lg.Fatal(err.Error())
}
bot.Debug = true
lg.Info("Bot version: " + config.VERSION)
lg.Info("Authorized on account @", bot.Self.UserName)
return bot
}
// External functions
// BotInit initializes connection to Telegram
func BotInit(cfg *config.Config, lg *mogrus.LoggerHandler) *tgbotapi.BotAPI {
if cfg.Proxy.Enabled {
lg.Info("Using proxy for bot: " + cfg.Proxy.Address)
return botInitWithProxy(cfg, lg)
}
lg.Info("Using direct connection to Telegram")
return botInitDirect(cfg, lg)
}
// DBInit initializes database connection
func DBInit(cfg *config.Config, lg *mogrus.LoggerHandler) *sqlx.DB {
database, err := sqlx.Connect("mysql", cfg.Database.User+":"+cfg.Database.Password+"@tcp("+cfg.Database.Host+":"+cfg.Database.Port+")/"+cfg.Database.Database+"?parseTime=true&charset=utf8mb4,utf8")