|
@@ -33,38 +33,35 @@ import (
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
- bot *telego.Bot
|
|
|
- botHandler *th.BotHandler
|
|
|
- adminIds []int64
|
|
|
- isRunning bool
|
|
|
- hostname string
|
|
|
- hashStorage *global.HashStorage
|
|
|
- handler *th.Handler
|
|
|
+ bot *telego.Bot
|
|
|
+ botHandler *th.BotHandler
|
|
|
+ adminIds []int64
|
|
|
+ isRunning bool
|
|
|
+ hostname string
|
|
|
+ hashStorage *global.HashStorage
|
|
|
+ handler *th.Handler
|
|
|
|
|
|
// clients data to adding new client
|
|
|
- receiver_inbound_ID int
|
|
|
- client_Id string
|
|
|
- client_Flow string
|
|
|
- client_Email string
|
|
|
- client_LimitIP int
|
|
|
- client_TotalGB int64
|
|
|
- client_ExpiryTime int64
|
|
|
- client_Enable bool
|
|
|
- client_TgID string
|
|
|
- client_SubID string
|
|
|
- client_Comment string
|
|
|
- client_Reset int
|
|
|
- client_Security string
|
|
|
+ receiver_inbound_ID int
|
|
|
+ client_Id string
|
|
|
+ client_Flow string
|
|
|
+ client_Email string
|
|
|
+ client_LimitIP int
|
|
|
+ client_TotalGB int64
|
|
|
+ client_ExpiryTime int64
|
|
|
+ client_Enable bool
|
|
|
+ client_TgID string
|
|
|
+ client_SubID string
|
|
|
+ client_Comment string
|
|
|
+ client_Reset int
|
|
|
+ client_Security string
|
|
|
client_ShPassword string
|
|
|
client_TrPassword string
|
|
|
- client_Method string
|
|
|
-
|
|
|
+ client_Method string
|
|
|
)
|
|
|
|
|
|
-
|
|
|
var userStates = make(map[int64]string)
|
|
|
|
|
|
-
|
|
|
type LoginStatus byte
|
|
|
|
|
|
const (
|
|
@@ -73,8 +70,6 @@ const (
|
|
|
EmptyTelegramUserID = int64(0)
|
|
|
)
|
|
|
|
|
|
-
|
|
|
-
|
|
|
type Tgbot struct {
|
|
|
inboundService InboundService
|
|
|
settingService SettingService
|
|
@@ -83,7 +78,6 @@ type Tgbot struct {
|
|
|
lastStatus *Status
|
|
|
}
|
|
|
|
|
|
-
|
|
|
func (t *Tgbot) NewTgbot() *Tgbot {
|
|
|
return new(Tgbot)
|
|
|
}
|
|
@@ -263,7 +257,7 @@ func (t *Tgbot) OnReceive() {
|
|
|
}, th.AnyCommand())
|
|
|
|
|
|
botHandler.HandleCallbackQuery(func(_ *telego.Bot, query telego.CallbackQuery) {
|
|
|
- delete(userStates,query.Message.GetChat().ID)
|
|
|
+ delete(userStates, query.Message.GetChat().ID)
|
|
|
t.answerCallback(&query, checkAdmin(query.From.ID))
|
|
|
}, th.AnyCallbackQueryWithMessage())
|
|
|
|
|
@@ -384,8 +378,8 @@ func (t *Tgbot) OnReceive() {
|
|
|
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_comment"), 3, tu.ReplyKeyboardRemove())
|
|
|
delete(userStates, message.Chat.ID)
|
|
|
inbound, _ := t.inboundService.GetInbound(receiver_inbound_ID)
|
|
|
- message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
|
|
|
- t.addClient(message.Chat.ID, message_text)
|
|
|
+ message_text, _ := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
|
|
|
+ t.addClient(message.Chat.ID, message_text)
|
|
|
}
|
|
|
|
|
|
} else {
|
|
@@ -499,7 +493,6 @@ func (t *Tgbot) sendResponse(chatId int64, msg string, onlyMessage, isAdmin bool
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
func (t *Tgbot) randomLowerAndNum(length int) string {
|
|
|
charset := "abcdefghijklmnopqrstuvwxyz0123456789"
|
|
|
bytes := make([]byte, length)
|
|
@@ -510,7 +503,6 @@ func (t *Tgbot) randomLowerAndNum(length int) string {
|
|
|
return string(bytes)
|
|
|
}
|
|
|
|
|
|
-
|
|
|
func (t *Tgbot) randomShadowSocksPassword() string {
|
|
|
array := make([]byte, 32)
|
|
|
_, err := rand.Read(array)
|
|
@@ -520,10 +512,9 @@ func (t *Tgbot) randomShadowSocksPassword() string {
|
|
|
return base64.StdEncoding.EncodeToString(array)
|
|
|
}
|
|
|
|
|
|
-
|
|
|
func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) {
|
|
|
chatId := callbackQuery.Message.GetChat().ID
|
|
|
-
|
|
|
+
|
|
|
if isAdmin {
|
|
|
// get query from hash storage
|
|
|
decodedQuery, err := t.decodeQuery(callbackQuery.Data)
|
|
@@ -695,7 +686,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|
|
}
|
|
|
message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
|
|
|
|
|
|
- t.addClient(chatId,message_text,messageId)
|
|
|
+ t.addClient(chatId, message_text, messageId)
|
|
|
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
|
|
|
case "add_client_limit_traffic_in":
|
|
|
if len(dataArray) >= 2 {
|
|
@@ -901,7 +892,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|
|
date = client_ExpiryTime - int64(days*24*60*60000)
|
|
|
}
|
|
|
client_ExpiryTime = date
|
|
|
-
|
|
|
+
|
|
|
messageId := callbackQuery.Message.GetMessageID()
|
|
|
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
|
|
|
if err != nil {
|
|
@@ -910,7 +901,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|
|
}
|
|
|
message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
|
|
|
|
|
|
- t.addClient(chatId,message_text,messageId)
|
|
|
+ t.addClient(chatId, message_text, messageId)
|
|
|
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
|
|
|
case "add_client_reset_exp_in":
|
|
|
if len(dataArray) >= 2 {
|
|
@@ -1173,21 +1164,21 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clients)
|
|
|
case "add_client_to":
|
|
|
// assign default values to clients variables
|
|
|
- client_Id = uuid.New().String()
|
|
|
+ client_Id = uuid.New().String()
|
|
|
client_Flow = ""
|
|
|
- client_Email = t.randomLowerAndNum(8)
|
|
|
+ client_Email = t.randomLowerAndNum(8)
|
|
|
client_LimitIP = 0
|
|
|
client_TotalGB = 0
|
|
|
client_ExpiryTime = 0
|
|
|
- client_Enable = true
|
|
|
+ client_Enable = true
|
|
|
client_TgID = ""
|
|
|
client_SubID = t.randomLowerAndNum(16)
|
|
|
- client_Comment = ""
|
|
|
- client_Reset = 0
|
|
|
- client_Security="auto"
|
|
|
- client_ShPassword=t.randomShadowSocksPassword()
|
|
|
- client_TrPassword=t.randomLowerAndNum(10)
|
|
|
- client_Method=""
|
|
|
+ client_Comment = ""
|
|
|
+ client_Reset = 0
|
|
|
+ client_Security = "auto"
|
|
|
+ client_ShPassword = t.randomShadowSocksPassword()
|
|
|
+ client_TrPassword = t.randomLowerAndNum(10)
|
|
|
+ client_Method = ""
|
|
|
|
|
|
inboundId := dataArray[1]
|
|
|
inboundIdInt, err := strconv.Atoi(inboundId)
|
|
@@ -1201,9 +1192,9 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|
|
t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
|
|
|
-
|
|
|
+
|
|
|
t.addClient(chatId, message_text)
|
|
|
}
|
|
|
return
|
|
@@ -1260,21 +1251,21 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.helpAdminCommands"))
|
|
|
case "add_client":
|
|
|
// assign default values to clients variables
|
|
|
- client_Id = uuid.New().String()
|
|
|
+ client_Id = uuid.New().String()
|
|
|
client_Flow = ""
|
|
|
- client_Email = t.randomLowerAndNum(8)
|
|
|
+ client_Email = t.randomLowerAndNum(8)
|
|
|
client_LimitIP = 0
|
|
|
client_TotalGB = 0
|
|
|
client_ExpiryTime = 0
|
|
|
- client_Enable = true
|
|
|
+ client_Enable = true
|
|
|
client_TgID = ""
|
|
|
client_SubID = t.randomLowerAndNum(16)
|
|
|
- client_Comment = ""
|
|
|
- client_Reset = 0
|
|
|
- client_Security="auto"
|
|
|
- client_ShPassword=t.randomShadowSocksPassword()
|
|
|
- client_TrPassword=t.randomLowerAndNum(10)
|
|
|
- client_Method=""
|
|
|
+ client_Comment = ""
|
|
|
+ client_Reset = 0
|
|
|
+ client_Security = "auto"
|
|
|
+ client_ShPassword = t.randomShadowSocksPassword()
|
|
|
+ client_TrPassword = t.randomLowerAndNum(10)
|
|
|
+ client_Method = ""
|
|
|
|
|
|
inbounds, err := t.getInboundsAddClient()
|
|
|
if err != nil {
|
|
@@ -1332,7 +1323,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|
|
),
|
|
|
)
|
|
|
prompt_message := t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment)
|
|
|
- t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
|
|
|
+ t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
|
|
|
case "add_client_ch_default_traffic":
|
|
|
inlineKeyboard := tu.InlineKeyboard(
|
|
|
tu.InlineKeyboardRow(
|
|
@@ -1410,7 +1401,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|
|
return
|
|
|
}
|
|
|
message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
|
|
|
- t.addClient(chatId,message_text,messageId)
|
|
|
+ t.addClient(chatId, message_text, messageId)
|
|
|
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+client_Email))
|
|
|
case "add_client_submit_disable":
|
|
|
client_Enable = false
|
|
@@ -1425,9 +1416,8 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-func (t *Tgbot) BuildInboundClientDataMessage(inbound_remark string ,protocol model.Protocol) (string, error) {
|
|
|
- var message string
|
|
|
+func (t *Tgbot) BuildInboundClientDataMessage(inbound_remark string, protocol model.Protocol) (string, error) {
|
|
|
+ var message string
|
|
|
|
|
|
currentTime := time.Now()
|
|
|
timestampMillis := currentTime.UnixNano() / int64(time.Millisecond)
|
|
@@ -1447,34 +1437,33 @@ func (t *Tgbot) BuildInboundClientDataMessage(inbound_remark string ,protocol mo
|
|
|
traffic_value := ""
|
|
|
if client_TotalGB == 0 {
|
|
|
traffic_value = "♾️ Unlimited(Reset)"
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
traffic_value = common.FormatTraffic(client_TotalGB)
|
|
|
}
|
|
|
|
|
|
- switch protocol {
|
|
|
- case model.VMESS, model.VLESS:
|
|
|
- message = t.I18nBot("tgbot.messages.inbound_client_data_id", "InboundRemark=="+inbound_remark,"ClientId=="+client_Id,"ClientEmail=="+client_Email,"ClientTraffic=="+traffic_value,"ClientExp=="+expiryTime,"ClientComment=="+client_Comment)
|
|
|
-
|
|
|
+ switch protocol {
|
|
|
+ case model.VMESS, model.VLESS:
|
|
|
+ message = t.I18nBot("tgbot.messages.inbound_client_data_id", "InboundRemark=="+inbound_remark, "ClientId=="+client_Id, "ClientEmail=="+client_Email, "ClientTraffic=="+traffic_value, "ClientExp=="+expiryTime, "ClientComment=="+client_Comment)
|
|
|
+
|
|
|
case model.Trojan:
|
|
|
- message = t.I18nBot("tgbot.messages.inbound_client_data_pass", "InboundRemark=="+inbound_remark,"ClientPass=="+client_TrPassword,"ClientEmail=="+client_Email,"ClientTraffic=="+traffic_value,"ClientExp=="+expiryTime,"ClientComment=="+client_Comment)
|
|
|
+ message = t.I18nBot("tgbot.messages.inbound_client_data_pass", "InboundRemark=="+inbound_remark, "ClientPass=="+client_TrPassword, "ClientEmail=="+client_Email, "ClientTraffic=="+traffic_value, "ClientExp=="+expiryTime, "ClientComment=="+client_Comment)
|
|
|
|
|
|
- case model.Shadowsocks:
|
|
|
- message = t.I18nBot("tgbot.messages.inbound_client_data_pass", "InboundRemark=="+inbound_remark,"ClientPass=="+client_ShPassword,"ClientEmail=="+client_Email,"ClientTraffic=="+traffic_value,"ClientExp=="+expiryTime,"ClientComment=="+client_Comment)
|
|
|
+ case model.Shadowsocks:
|
|
|
+ message = t.I18nBot("tgbot.messages.inbound_client_data_pass", "InboundRemark=="+inbound_remark, "ClientPass=="+client_ShPassword, "ClientEmail=="+client_Email, "ClientTraffic=="+traffic_value, "ClientExp=="+expiryTime, "ClientComment=="+client_Comment)
|
|
|
|
|
|
- default:
|
|
|
- return "", errors.New("unknown protocol")
|
|
|
- }
|
|
|
+ default:
|
|
|
+ return "", errors.New("unknown protocol")
|
|
|
+ }
|
|
|
|
|
|
- return message, nil
|
|
|
+ return message, nil
|
|
|
}
|
|
|
|
|
|
-
|
|
|
func (t *Tgbot) BuildJSONForProtocol(protocol model.Protocol) (string, error) {
|
|
|
- var jsonString string
|
|
|
+ var jsonString string
|
|
|
|
|
|
- switch protocol {
|
|
|
- case model.VMESS:
|
|
|
- jsonString = fmt.Sprintf(`{
|
|
|
+ switch protocol {
|
|
|
+ case model.VMESS:
|
|
|
+ jsonString = fmt.Sprintf(`{
|
|
|
"clients": [{
|
|
|
"id": "%s",
|
|
|
"security": "%s",
|
|
@@ -1490,8 +1479,8 @@ func (t *Tgbot) BuildJSONForProtocol(protocol model.Protocol) (string, error) {
|
|
|
}]
|
|
|
}`, client_Id, client_Security, client_Email, client_LimitIP, client_TotalGB, client_ExpiryTime, client_Enable, client_TgID, client_SubID, client_Comment, client_Reset)
|
|
|
|
|
|
- case model.VLESS:
|
|
|
- jsonString = fmt.Sprintf(`{
|
|
|
+ case model.VLESS:
|
|
|
+ jsonString = fmt.Sprintf(`{
|
|
|
"clients": [{
|
|
|
"id": "%s",
|
|
|
"flow": "%s",
|
|
@@ -1507,8 +1496,8 @@ func (t *Tgbot) BuildJSONForProtocol(protocol model.Protocol) (string, error) {
|
|
|
}]
|
|
|
}`, client_Id, client_Flow, client_Email, client_LimitIP, client_TotalGB, client_ExpiryTime, client_Enable, client_TgID, client_SubID, client_Comment, client_Reset)
|
|
|
|
|
|
- case model.Trojan:
|
|
|
- jsonString = fmt.Sprintf(`{
|
|
|
+ case model.Trojan:
|
|
|
+ jsonString = fmt.Sprintf(`{
|
|
|
"clients": [{
|
|
|
"password": "%s",
|
|
|
"email": "%s",
|
|
@@ -1523,8 +1512,8 @@ func (t *Tgbot) BuildJSONForProtocol(protocol model.Protocol) (string, error) {
|
|
|
}]
|
|
|
}`, client_TrPassword, client_Email, client_LimitIP, client_TotalGB, client_ExpiryTime, client_Enable, client_TgID, client_SubID, client_Comment, client_Reset)
|
|
|
|
|
|
- case model.Shadowsocks:
|
|
|
- jsonString = fmt.Sprintf(`{
|
|
|
+ case model.Shadowsocks:
|
|
|
+ jsonString = fmt.Sprintf(`{
|
|
|
"clients": [{
|
|
|
"method": "%s",
|
|
|
"password": "%s",
|
|
@@ -1540,33 +1529,28 @@ func (t *Tgbot) BuildJSONForProtocol(protocol model.Protocol) (string, error) {
|
|
|
}]
|
|
|
}`, client_Method, client_ShPassword, client_Email, client_LimitIP, client_TotalGB, client_ExpiryTime, client_Enable, client_TgID, client_SubID, client_Comment, client_Reset)
|
|
|
|
|
|
- default:
|
|
|
- return "", errors.New("unknown protocol")
|
|
|
- }
|
|
|
+ default:
|
|
|
+ return "", errors.New("unknown protocol")
|
|
|
+ }
|
|
|
|
|
|
- return jsonString, nil
|
|
|
+ return jsonString, nil
|
|
|
}
|
|
|
|
|
|
-
|
|
|
func (t *Tgbot) SubmitAddClient() (bool, error) {
|
|
|
|
|
|
-
|
|
|
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
|
|
|
if err != nil {
|
|
|
logger.Warning("getIboundClients run failed:", err)
|
|
|
return false, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
jsonString, err := t.BuildJSONForProtocol(inbound.Protocol)
|
|
|
|
|
|
newInbound := &model.Inbound{
|
|
|
Id: receiver_inbound_ID,
|
|
|
- Settings: jsonString,
|
|
|
+ Settings: jsonString,
|
|
|
}
|
|
|
|
|
|
-
|
|
|
return t.inboundService.AddInboundClient(newInbound)
|
|
|
}
|
|
|
|
|
@@ -1862,7 +1846,7 @@ func (t *Tgbot) getInbounds() (*telego.InlineKeyboardMarkup, error) {
|
|
|
if inbound.Enable {
|
|
|
status = "✅"
|
|
|
}
|
|
|
- callbackData := t.encodeQuery(fmt.Sprintf("%s %d","get_clients", inbound.Id))
|
|
|
+ callbackData := t.encodeQuery(fmt.Sprintf("%s %d", "get_clients", inbound.Id))
|
|
|
buttons = append(buttons, tu.InlineKeyboardButton(fmt.Sprintf("%v - %v", inbound.Remark, status)).WithCallbackData(callbackData))
|
|
|
}
|
|
|
|
|
@@ -1888,11 +1872,11 @@ func (t *Tgbot) getInboundsAddClient() (*telego.InlineKeyboardMarkup, error) {
|
|
|
}
|
|
|
|
|
|
excludedProtocols := map[model.Protocol]bool{
|
|
|
- model.DOKODEMO: true,
|
|
|
- model.Socks: true,
|
|
|
- model.WireGuard: true,
|
|
|
- model.HTTP: true,
|
|
|
- }
|
|
|
+ model.DOKODEMO: true,
|
|
|
+ model.Socks: true,
|
|
|
+ model.WireGuard: true,
|
|
|
+ model.HTTP: true,
|
|
|
+ }
|
|
|
|
|
|
var buttons []telego.InlineKeyboardButton
|
|
|
for _, inbound := range inbounds {
|
|
@@ -1904,7 +1888,7 @@ func (t *Tgbot) getInboundsAddClient() (*telego.InlineKeyboardMarkup, error) {
|
|
|
if inbound.Enable {
|
|
|
status = "✅"
|
|
|
}
|
|
|
- callbackData := t.encodeQuery(fmt.Sprintf("%s %d","add_client_to", inbound.Id))
|
|
|
+ callbackData := t.encodeQuery(fmt.Sprintf("%s %d", "add_client_to", inbound.Id))
|
|
|
buttons = append(buttons, tu.InlineKeyboardButton(fmt.Sprintf("%v - %v", inbound.Remark, status)).WithCallbackData(callbackData))
|
|
|
}
|
|
|
|
|
@@ -2216,20 +2200,20 @@ func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) {
|
|
|
|
|
|
protocol := inbound.Protocol
|
|
|
|
|
|
- switch protocol {
|
|
|
- case model.VMESS, model.VLESS:
|
|
|
- inlineKeyboard := tu.InlineKeyboard(
|
|
|
+ switch protocol {
|
|
|
+ case model.VMESS, model.VLESS:
|
|
|
+ inlineKeyboard := tu.InlineKeyboard(
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_email")).WithCallbackData("add_client_ch_default_email"),
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_id")).WithCallbackData("add_client_ch_default_id"),
|
|
|
- ),
|
|
|
+ ),
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.limitTraffic")).WithCallbackData("add_client_ch_default_traffic"),
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetExpire")).WithCallbackData("add_client_ch_default_exp"),
|
|
|
- ),
|
|
|
+ ),
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_comment")).WithCallbackData("add_client_ch_default_comment"),
|
|
|
- ),
|
|
|
+ ),
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
|
|
@@ -2245,11 +2229,11 @@ func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) {
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_email")).WithCallbackData("add_client_ch_default_email"),
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_password")).WithCallbackData("add_client_ch_default_pass_tr"),
|
|
|
- ),
|
|
|
+ ),
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.limitTraffic")).WithCallbackData("add_client_ch_default_traffic"),
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetExpire")).WithCallbackData("add_client_ch_default_exp"),
|
|
|
- ),
|
|
|
+ ),
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_comment")).WithCallbackData("add_client_ch_default_comment"),
|
|
|
),
|
|
@@ -2262,33 +2246,33 @@ func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) {
|
|
|
t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard)
|
|
|
} else {
|
|
|
t.SendMsgToTgbot(chatId, msg, inlineKeyboard)
|
|
|
- }
|
|
|
+ }
|
|
|
case model.Shadowsocks:
|
|
|
inlineKeyboard := tu.InlineKeyboard(
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_email")).WithCallbackData("add_client_ch_default_email"),
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_password")).WithCallbackData("add_client_ch_default_pass_sh"),
|
|
|
- ),
|
|
|
+ ),
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.limitTraffic")).WithCallbackData("add_client_ch_default_traffic"),
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetExpire")).WithCallbackData("add_client_ch_default_exp"),
|
|
|
- ),
|
|
|
+ ),
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_comment")).WithCallbackData("add_client_ch_default_comment"),
|
|
|
- ),
|
|
|
+ ),
|
|
|
tu.InlineKeyboardRow(
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
|
|
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
|
|
|
),
|
|
|
)
|
|
|
-
|
|
|
+
|
|
|
if len(messageID) > 0 {
|
|
|
t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard)
|
|
|
} else {
|
|
|
t.SendMsgToTgbot(chatId, msg, inlineKeyboard)
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
func (t *Tgbot) searchInbound(chatId int64, remark string) {
|
|
@@ -2662,43 +2646,42 @@ func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, inlin
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
func (t *Tgbot) SendMsgToTgbotDeleteAfter(chatId int64, msg string, delayInSeconds int, replyMarkup ...telego.ReplyMarkup) {
|
|
|
- // Determine if replyMarkup was passed; otherwise, set it to nil
|
|
|
- var replyMarkupParam telego.ReplyMarkup
|
|
|
- if len(replyMarkup) > 0 {
|
|
|
- replyMarkupParam = replyMarkup[0] // Use the first element
|
|
|
- }
|
|
|
-
|
|
|
- // Send the message
|
|
|
- sentMsg, err := bot.SendMessage(&telego.SendMessageParams{
|
|
|
- ChatID: tu.ID(chatId),
|
|
|
- Text: msg,
|
|
|
- ReplyMarkup: replyMarkupParam, // Use the correct replyMarkup value
|
|
|
- })
|
|
|
- if err != nil {
|
|
|
- logger.Warning("Failed to send message:", err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // Delete the sent message after the specified number of seconds
|
|
|
- go func() {
|
|
|
- time.Sleep(time.Duration(delayInSeconds) * time.Second) // Wait for the specified delay
|
|
|
- t.deleteMessageTgBot(chatId, sentMsg.MessageID) // Delete the message
|
|
|
- delete(userStates, chatId)
|
|
|
- }()
|
|
|
+ // Determine if replyMarkup was passed; otherwise, set it to nil
|
|
|
+ var replyMarkupParam telego.ReplyMarkup
|
|
|
+ if len(replyMarkup) > 0 {
|
|
|
+ replyMarkupParam = replyMarkup[0] // Use the first element
|
|
|
+ }
|
|
|
+
|
|
|
+ // Send the message
|
|
|
+ sentMsg, err := bot.SendMessage(&telego.SendMessageParams{
|
|
|
+ ChatID: tu.ID(chatId),
|
|
|
+ Text: msg,
|
|
|
+ ReplyMarkup: replyMarkupParam, // Use the correct replyMarkup value
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ logger.Warning("Failed to send message:", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // Delete the sent message after the specified number of seconds
|
|
|
+ go func() {
|
|
|
+ time.Sleep(time.Duration(delayInSeconds) * time.Second) // Wait for the specified delay
|
|
|
+ t.deleteMessageTgBot(chatId, sentMsg.MessageID) // Delete the message
|
|
|
+ delete(userStates, chatId)
|
|
|
+ }()
|
|
|
}
|
|
|
|
|
|
func (t *Tgbot) deleteMessageTgBot(chatId int64, messageID int) {
|
|
|
- params := telego.DeleteMessageParams{
|
|
|
- ChatID: tu.ID(chatId),
|
|
|
- MessageID: messageID,
|
|
|
- }
|
|
|
- if err := bot.DeleteMessage(¶ms); err != nil {
|
|
|
- logger.Warning("Failed to delete message:", err)
|
|
|
- } else {
|
|
|
- logger.Info("Message deleted successfully")
|
|
|
- }
|
|
|
+ params := telego.DeleteMessageParams{
|
|
|
+ ChatID: tu.ID(chatId),
|
|
|
+ MessageID: messageID,
|
|
|
+ }
|
|
|
+ if err := bot.DeleteMessage(¶ms); err != nil {
|
|
|
+ logger.Warning("Failed to delete message:", err)
|
|
|
+ } else {
|
|
|
+ logger.Info("Message deleted successfully")
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
func (t *Tgbot) isSingleWord(text string) bool {
|
|
@@ -2706,4 +2689,3 @@ func (t *Tgbot) isSingleWord(text string) bool {
|
|
|
re := regexp.MustCompile(`\s+`)
|
|
|
return re.MatchString(text)
|
|
|
}
|
|
|
-
|