diff --git a/.gitignore b/.gitignore index 32f90dc2..a6a8cf38 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,6 @@ # Ignore log files *.log -access.log -error.log # Ignore temporary files tmp/ @@ -36,4 +34,4 @@ Thumbs.db *.exe~ # Ignore Docker specific files -docker-compose.override.yml +docker-compose.override.yml \ No newline at end of file diff --git a/web/html/settings.html b/web/html/settings.html index c8bfabad..ab72bca7 100644 --- a/web/html/settings.html +++ b/web/html/settings.html @@ -56,6 +56,9 @@ .dark .ant-input-password-icon { color: var(--dark-color-text-primary); } + .ant-collapse-content-box .ant-alert { + margin-block-end: 12px; + } diff --git a/web/html/xray.html b/web/html/xray.html index 1e9103fa..68c71523 100644 --- a/web/html/xray.html +++ b/web/html/xray.html @@ -42,6 +42,9 @@ .ant-list-item>li { padding: 10px 20px !important; } + .ant-collapse-content-box .ant-alert { + margin-block-end: 12px; +} diff --git a/web/service/tgbot.go b/web/service/tgbot.go index 3764d71a..2fbe6cb4 100644 --- a/web/service/tgbot.go +++ b/web/service/tgbot.go @@ -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"), ), @@ -2258,37 +2242,37 @@ func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) { 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) - } - 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) } - } - + 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 - } + // 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 - } + // 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) - }() + // 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) } -