From 1635dbf8beefd3432dec0e307110f8a6d8b71c6a Mon Sep 17 00:00:00 2001 From: Surbiks Date: Wed, 20 Dec 2023 09:37:14 +0330 Subject: [PATCH] socks5 option added to telegram bot settings --- web/assets/js/model/setting.js | 1 + web/entity/entity.go | 1 + web/html/xui/settings.html | 1 + web/service/setting.go | 9 +++++++++ web/service/tgbot.go | 27 ++++++++++++++++++++++++++- web/translation/translate.en_US.toml | 2 ++ xray/api.go | 4 +++- 7 files changed, 43 insertions(+), 2 deletions(-) diff --git a/web/assets/js/model/setting.js b/web/assets/js/model/setting.js index 86bea983..8b08fd4b 100644 --- a/web/assets/js/model/setting.js +++ b/web/assets/js/model/setting.js @@ -14,6 +14,7 @@ class AllSetting { this.remarkModel = "-ieo"; this.tgBotEnable = false; this.tgBotToken = ""; + this.tgBotProxy = ""; this.tgBotChatId = ""; this.tgRunTime = "@daily"; this.tgBotBackup = false; diff --git a/web/entity/entity.go b/web/entity/entity.go index 69e5b2d4..46238902 100644 --- a/web/entity/entity.go +++ b/web/entity/entity.go @@ -28,6 +28,7 @@ type AllSetting struct { RemarkModel string `json:"remarkModel" form:"remarkModel"` TgBotEnable bool `json:"tgBotEnable" form:"tgBotEnable"` TgBotToken string `json:"tgBotToken" form:"tgBotToken"` + TgBotProxy string `json:"tgBotProxy" form:"tgBotProxy"` TgBotChatId string `json:"tgBotChatId" form:"tgBotChatId"` TgRunTime string `json:"tgRunTime" form:"tgRunTime"` TgBotBackup bool `json:"tgBotBackup" form:"tgBotBackup"` diff --git a/web/html/xui/settings.html b/web/html/xui/settings.html index 65268870..a63f9dbb 100644 --- a/web/html/xui/settings.html +++ b/web/html/xui/settings.html @@ -243,6 +243,7 @@ + diff --git a/web/service/setting.go b/web/service/setting.go index 8b60d166..d2d49ba5 100644 --- a/web/service/setting.go +++ b/web/service/setting.go @@ -38,6 +38,7 @@ var defaultValueMap = map[string]string{ "timeLocation": "Asia/Tehran", "tgBotEnable": "false", "tgBotToken": "", + "tgBotProxy": "", "tgBotChatId": "", "tgRunTime": "@daily", "tgBotBackup": "false", @@ -244,6 +245,14 @@ func (s *SettingService) SetTgBotToken(token string) error { return s.setString("tgBotToken", token) } +func (s *SettingService) GetTgBotProxy() (string, error) { + return s.getString("tgBotProxy") +} + +func (s *SettingService) SetTgBotProxy(token string) error { + return s.setString("tgBotProxy", token) +} + func (s *SettingService) GetTgBotChatId() (string, error) { return s.getString("tgBotChatId") } diff --git a/web/service/tgbot.go b/web/service/tgbot.go index 0847e418..9277a8ca 100644 --- a/web/service/tgbot.go +++ b/web/service/tgbot.go @@ -4,6 +4,7 @@ import ( "embed" "fmt" "net" + "net/url" "os" "strconv" "strings" @@ -20,6 +21,8 @@ import ( "github.com/mymmrac/telego" th "github.com/mymmrac/telego/telegohandler" tu "github.com/mymmrac/telego/telegoutil" + "github.com/valyala/fasthttp" + "github.com/valyala/fasthttp/fasthttpproxy" ) var bot *telego.Bot @@ -89,7 +92,12 @@ func (t *Tgbot) Start(i18nFS embed.FS) error { } } - bot, err = telego.NewBot(tgBottoken) + tgBotProxy, err := t.settingService.GetTgBotProxy() + if err != nil { + logger.Warning("Failed to get ProxyUrl:", err) + } + + bot, err = t.NewBot(tgBottoken, tgBotProxy) if err != nil { fmt.Println("Get tgbot's api error:", err) return err @@ -105,6 +113,23 @@ func (t *Tgbot) Start(i18nFS embed.FS) error { return nil } +func (t *Tgbot) NewBot(token string, proxyUrl string) (*telego.Bot, error) { + if proxyUrl == "" || !strings.HasPrefix(proxyUrl, "socks5://") { + logger.Warning("invalid socks5 url, start with default") + return telego.NewBot(token) + } + + _, err := url.Parse(proxyUrl) + if err != nil { + logger.Warning("cant parse proxy url, use default instance for tgbot:", err) + return telego.NewBot(token) + } + + return telego.NewBot(token, telego.WithFastHTTPClient(&fasthttp.Client{ + Dial: fasthttpproxy.FasthttpSocksDialer(proxyUrl), + })) +} + func (t *Tgbot) IsRunning() bool { return isRunning } diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml index 41df2454..455df575 100644 --- a/web/translation/translate.en_US.toml +++ b/web/translation/translate.en_US.toml @@ -255,6 +255,8 @@ "telegramBotEnableDesc" = "Connect to the features of this panel through the Telegram bot." "telegramToken" = "Telegram Token" "telegramTokenDesc" = "The token you have got from @BotFather." +"telegramProxy" = "Telegram Socks5 Proxy" +"telegramProxyDesc" = "If you need Telegram to connect through a socks5 proxy. (socks5://user:pass@host:port)" "telegramChatId" = "Telegram Admin Chat IDs" "telegramChatIdDesc" = "Multiple chat IDs separated by comma. use @userinfobot or use '/id' command in bot to get your Chat IDs." "telegramNotifyTime" = "Telegram bot notification time" diff --git a/xray/api.go b/xray/api.go index 10d22ae1..36b19875 100644 --- a/xray/api.go +++ b/xray/api.go @@ -50,7 +50,9 @@ func (x *XrayAPI) Init(apiPort int) (err error) { } func (x *XrayAPI) Close() { - x.grpcClient.Close() + if x.grpcClient != nil { + x.grpcClient.Close() + } x.HandlerServiceClient = nil x.StatsServiceClient = nil x.isConnected = false