diff --git a/web/service/tgbot.go b/web/service/tgbot.go index 9e217124..5189dc13 100644 --- a/web/service/tgbot.go +++ b/web/service/tgbot.go @@ -1,6 +1,8 @@ package service import ( + "crypto/rand" + "math/big" "embed" "errors" "fmt" @@ -20,8 +22,7 @@ import ( "x-ui/web/locale" "x-ui/xray" - "slices" - + "github.com/google/uuid" "github.com/mymmrac/telego" th "github.com/mymmrac/telego/telegohandler" tu "github.com/mymmrac/telego/telegoutil" @@ -30,14 +31,33 @@ import ( ) var ( - bot *telego.Bot - botHandler *th.BotHandler - adminIds []int64 - isRunning bool - hostname string - hashStorage *global.HashStorage + 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 ) + +var userStates = make(map[int64]string) + + type LoginStatus byte const ( @@ -46,6 +66,8 @@ const ( EmptyTelegramUserID = int64(0) ) +const charset = "abcdefghijklmnopqrstuvwxyz0123456789" + type Tgbot struct { inboundService InboundService settingService SettingService @@ -54,6 +76,7 @@ type Tgbot struct { lastStatus *Status } + func (t *Tgbot) NewTgbot() *Tgbot { return new(Tgbot) } @@ -223,36 +246,83 @@ func (t *Tgbot) OnReceive() { botHandler, _ = th.NewBotHandler(bot, updates) botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) { + delete(userStates, message.Chat.ID) t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.keyboardClosed"), tu.ReplyKeyboardRemove()) }, th.TextEqual(t.I18nBot("tgbot.buttons.closeKeyboard"))) botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) { + delete(userStates, message.Chat.ID) t.answerCommand(&message, message.Chat.ID, checkAdmin(message.From.ID)) }, th.AnyCommand()) botHandler.HandleCallbackQuery(func(_ *telego.Bot, query telego.CallbackQuery) { + delete(userStates,query.Message.GetChat().ID) t.answerCallback(&query, checkAdmin(query.From.ID)) }, th.AnyCallbackQueryWithMessage()) botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) { - if message.UsersShared != nil { - if checkAdmin(message.From.ID) { - for _, sharedUser := range message.UsersShared.Users { - userID := sharedUser.UserID - needRestart, err := t.inboundService.SetClientTelegramUserID(message.UsersShared.RequestID, userID) - if needRestart { - t.xrayService.SetToNeedRestart() + if userState, exists := userStates[message.Chat.ID]; exists { + switch userState { + case "awaiting_id": + client_Id = message.Text + userStates[message.Chat.ID] = "awaiting_email" + t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_id", "ClientId=="+client_Id), tu.ReplyKeyboardRemove()) + cancel_btn_markup := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_email"), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"), + ), + ) + t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email), cancel_btn_markup) + case "awaiting_email": + client_Email = message.Text + userStates[message.Chat.ID] = "awaiting_comment" + t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_email", "ClientEmail=="+client_Email), tu.ReplyKeyboardRemove()) + cancel_btn_markup := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_comment"), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"), + ), + ) + t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment), cancel_btn_markup) + case "awaiting_comment": + client_Comment = message.Text + t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_comment", "ClientComment=="+client_Comment), tu.ReplyKeyboardRemove()) + message_text := t.I18nBot("tgbot.messages.client_data", "ClientId=="+client_Id,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment) + + inlineKeyboard := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitEnable")).WithCallbackData("add_client_submit_enable"), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"), + ), + ) + t.SendMsgToTgbot(message.Chat.ID, message_text, inlineKeyboard) + delete(userStates, message.Chat.ID) + } + + } else { + if message.UsersShared != nil { + if checkAdmin(message.From.ID) { + for _, sharedUser := range message.UsersShared.Users { + userID := sharedUser.UserID + needRestart, err := t.inboundService.SetClientTelegramUserID(message.UsersShared.RequestID, userID) + if needRestart { + t.xrayService.SetToNeedRestart() + } + output := "" + if err != nil { + output += t.I18nBot("tgbot.messages.selectUserFailed") + } else { + output += t.I18nBot("tgbot.messages.userSaved") + } + t.SendMsgToTgbot(message.Chat.ID, output, tu.ReplyKeyboardRemove()) } - output := "" - if err != nil { - output += t.I18nBot("tgbot.messages.selectUserFailed") - } else { - output += t.I18nBot("tgbot.messages.userSaved") - } - t.SendMsgToTgbot(message.Chat.ID, output, tu.ReplyKeyboardRemove()) + } else { + t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.noResult"), tu.ReplyKeyboardRemove()) } - } else { - t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.noResult"), tu.ReplyKeyboardRemove()) } } }, th.AnyMessage()) @@ -344,6 +414,16 @@ func (t *Tgbot) sendResponse(chatId int64, msg string, onlyMessage, isAdmin bool } } + +func (t *Tgbot) randomLowerAndNum(length int) string { + bytes := make([]byte, length) + for i := range bytes { + randomIndex, _ := rand.Int(rand.Reader, big.NewInt(int64(len(charset)))) + bytes[i] = charset[randomIndex.Int64()] + } + return string(bytes) +} + func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) { chatId := callbackQuery.Message.GetChat().ID @@ -838,7 +918,23 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool return } t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clients) - + case "add_client_to": + inboundId := dataArray[1] + inboundIdInt, err := strconv.Atoi(inboundId) + if err != nil { + t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) + return + } + receiver_inbound_ID = inboundIdInt + inbound, err := t.inboundService.GetInbound(inboundIdInt) + if err != nil { + t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) + return + } + + message := t.I18nBot("tgbot.messages.inbound_client_data", "InboundRemark=="+inbound.Remark,"ClientId=="+client_Id,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment) + + t.addClient(chatId, message) } return } else { @@ -892,11 +988,82 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool case "commands": t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.commands")) t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.helpAdminCommands")) + case "add_client": + // assign default values to clients variables + client_Id = uuid.New().String() // button + client_Flow = "" + client_Email = t.randomLowerAndNum(8) // button + client_LimitIP = 0 + client_TotalGB = 0 + client_ExpiryTime = 0 + client_Enable = true // button + client_TgID = "" + client_SubID = t.randomLowerAndNum(16) + client_Comment = "" // button + client_Reset = 0 // button + + inbounds, err := t.getInboundsAddClient() + if err != nil { + t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error()) + return + } + t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.addClient")) + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds) + case "add_client_ch_default": + cancel_btn_markup := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_id"), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"), + ), + ) + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Id),cancel_btn_markup) + userStates[chatId] = "awaiting_id" + case "default_client_id": + cancel_btn_markup := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_email"), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"), + ), + ) + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email),cancel_btn_markup) + userStates[chatId] = "awaiting_email" + case "default_client_email": + inlineKeyboard := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_comment"), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"), + ), + ) + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment),inlineKeyboard) + userStates[chatId] = "awaiting_comment" + case "default_client_comment": + message_text := t.I18nBot("tgbot.messages.client_data", "ClientId=="+client_Id,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment) + + inlineKeyboard := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitEnable")).WithCallbackData("add_client_submit_enable"), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"), + ), + ) + + t.SendMsgToTgbot(chatId, message_text, inlineKeyboard) + delete(userStates, chatId) + case "add_client_cancel": + delete(userStates, chatId) + t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.cancel"), tu.ReplyKeyboardRemove()) } } func checkAdmin(tgId int64) bool { - return slices.Contains(adminIds, tgId) + for _, adminId := range adminIds { + if adminId == tgId { + return true + } + } + return false } func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) { @@ -915,7 +1082,10 @@ func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) { tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.commands")).WithCallbackData(t.encodeQuery("commands")), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.onlines")).WithCallbackData(t.encodeQuery("onlines")), + ), + tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.allClients")).WithCallbackData(t.encodeQuery("get_inbounds")), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.addClient")).WithCallbackData(t.encodeQuery("add_client")), ), // TODOOOOOOOOOOOOOO: Add restart button here. ) @@ -1161,39 +1331,45 @@ func (t *Tgbot) getInboundUsages() string { } return info } - -func (t *Tgbot) getInbounds() (*telego.InlineKeyboardMarkup, error) { +func (t *Tgbot) getInboundsKeyboard(action string) (*telego.InlineKeyboardMarkup, error) { inbounds, err := t.inboundService.GetAllInbounds() - var buttons []telego.InlineKeyboardButton - if err != nil { logger.Warning("GetAllInbounds run failed:", err) return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed")) - } else { - if len(inbounds) > 0 { - for _, inbound := range inbounds { - status := "❌" - if inbound.Enable { - status = "✅" - } - buttons = append(buttons, tu.InlineKeyboardButton(fmt.Sprintf("%v - %v", inbound.Remark, status)).WithCallbackData(t.encodeQuery("get_clients "+strconv.Itoa(inbound.Id)))) - } - } else { - logger.Warning("GetAllInbounds run failed:", err) - return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed")) - } - } - cols := 0 - if len(buttons) < 6 { - cols = 3 - } else { + + if len(inbounds) == 0 { + logger.Warning("No inbounds found") + return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed")) + } + + var buttons []telego.InlineKeyboardButton + for _, inbound := range inbounds { + status := "❌" + if inbound.Enable { + status = "✅" + } + callbackData := t.encodeQuery(fmt.Sprintf("%s %d", action, inbound.Id)) + buttons = append(buttons, tu.InlineKeyboardButton(fmt.Sprintf("%v - %v", inbound.Remark, status)).WithCallbackData(callbackData)) + } + + cols := 3 + if len(buttons) >= 6 { cols = 2 } + keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols, buttons...)) return keyboard, nil } +func (t *Tgbot) getInbounds() (*telego.InlineKeyboardMarkup, error) { + return t.getInboundsKeyboard("get_clients") +} + +func (t *Tgbot) getInboundsAddClient() (*telego.InlineKeyboardMarkup, error) { + return t.getInboundsKeyboard("add_client_to") +} + func (t *Tgbot) getInboundClients(id int) (*telego.InlineKeyboardMarkup, error) { inbound, err := t.inboundService.GetInbound(id) if err != nil { @@ -1484,6 +1660,28 @@ func (t *Tgbot) searchClient(chatId int64, email string, messageID ...int) { } } + +func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) { + + inlineKeyboard := tu.InlineKeyboard( + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_default")).WithCallbackData("add_client_ch_default"), + ), + tu.InlineKeyboardRow( + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitEnable")).WithCallbackData("add_client_submit_enable"), + tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"), + ), + tu.InlineKeyboardRow( + 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) { inbounds, err := t.inboundService.SearchInbounds(remark) if err != nil { @@ -1689,7 +1887,12 @@ func (t *Tgbot) notifyExhausted() { } func int64Contains(slice []int64, item int64) bool { - return slices.Contains(slice, item) + for _, s := range slice { + if s == item { + return true + } + } + return false } func (t *Tgbot) onlineClients(chatId int64, messageID ...int) { @@ -1848,4 +2051,4 @@ func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, inlin if _, err := bot.EditMessageText(¶ms); err != nil { logger.Warning(err) } -} +} \ No newline at end of file diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml index f06e2cad..96b6b8a9 100644 --- a/web/translation/translate.en_US.toml +++ b/web/translation/translate.en_US.toml @@ -572,6 +572,16 @@ "yes" = "✅ Yes" "no" = "❌ No" +"received_id" = "🔑📥 Received ID: {{ .ClientId }}" +"received_email" = "📧📥 Received Email: {{ .ClientEmail }}" +"received_comment" = "💬📥 Received Comment: {{ .ClientComment }}" +"id_prompt" = "🔑 Default ID: {{ .ClientId }}\n\nEnter your id." +"email_prompt" = "📧 Default Email: {{ .ClientEmail }}\n\nEnter your email." +"comment_prompt" = "💬 Default Comment: {{ .ClientComment }}\n\nEnter your Comment." +"inbound_client_data" = "🔄 Inbound: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!" +"cancel" = "❌ Process Canceled! \n\nYou can /start again anytime. 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ Close Keyboard" "cancel" = "❌ Cancel" @@ -606,6 +616,12 @@ "getBanLogs" = "Get Ban Logs" "allClients" = "All Clients" +"addClient" = "Add Client" +"submitEnable" = "Submit As Enable ✅" +"submitDisable" = "Submit As Disable 🚫" +"use_default" = "🏷️ Use default" +"change_default" = "🔄⚙️ Change Default" + [tgbot.answers] "successfulOperation" = "✅ Operation successful!" "errorOperation" = "❗ Error in operation." diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml index 81ba9c20..b9081d90 100644 --- a/web/translation/translate.es_ES.toml +++ b/web/translation/translate.es_ES.toml @@ -572,6 +572,16 @@ "yes" = "✅ Sí" "no" = "❌ No" +"received_id" = "🔑📥 ID recibido: {{ .ClientId }}" +"received_email" = "📧📥 Correo recibido: {{ .ClientEmail }}" +"received_comment" = "💬📥 Comentario recibido: {{ .ClientComment }}" +"id_prompt" = "🔑 ID predeterminado: {{ .ClientId }}\n\nIntroduce tu ID." +"email_prompt" = "📧 Correo predeterminado: {{ .ClientEmail }}\n\nIntroduce tu correo." +"comment_prompt" = "💬 Comentario predeterminado: {{ .ClientComment }}\n\nIntroduce tu comentario." +"inbound_client_data" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Correo: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Correo: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!" +"cancel" = "❌ ¡Proceso cancelado! \n\nPuedes /start de nuevo en cualquier momento. 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ Cerrar Teclado" "cancel" = "❌ Cancelar" @@ -606,6 +616,12 @@ "getBanLogs" = "Registros de prohibición" "allClients" = "Todos los Clientes" +"addClient" = "Añadir Cliente" +"submitEnable" = "Enviar como Habilitado ✅" +"submitDisable" = "Enviar como Deshabilitado 🚫" +"use_default" = "🏷️ Usar por defecto" +"change_default" = "🔄⚙️ Cambiar por defecto" + [tgbot.answers] "successfulOperation" = "✅ ¡Exitosa!" "errorOperation" = "❗ Error en la Operación." diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml index a50bf960..75057f07 100644 --- a/web/translation/translate.fa_IR.toml +++ b/web/translation/translate.fa_IR.toml @@ -572,6 +572,16 @@ "yes" = "✅ بله" "no" = "❌ خیر" +"received_id" = "🔑📥 شناسه دریافت شده: {{ .ClientId }}" +"received_email" = "📧📥 ایمیل دریافت شده: {{ .ClientEmail }}" +"received_comment" = "💬📥 کامنت دریافت شده: {{ .ClientComment }}" +"id_prompt" = "🔑 شناسه پیش‌فرض: {{ .ClientId }}\n\nشناسه خود را وارد کنید." +"email_prompt" = "📧 ایمیل پیش‌فرض: {{ .ClientEmail }}\n\nایمیل خود را وارد کنید." +"comment_prompt" = "💬 کامنت پیش‌فرض: {{ .ClientComment }}\n\nکامنت خود را وارد کنید." +"inbound_client_data" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 شناسه: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 کامنت: {{ .ClientComment }}\n\nهم‌اکنون می‌توانید مشتری را به ورودی اضافه کنید!" +"client_data" = "🔑 شناسه: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 کامنت: {{ .ClientComment }}\n\nهم‌اکنون می‌توانید مشتری را به ورودی اضافه کنید!" +"cancel" = "❌ فرآیند لغو شد! \n\nشما می‌توانید هر زمان دوباره /start کنید. 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ بستن کیبورد" "cancel" = "❌ لغو" @@ -606,6 +616,12 @@ "getBanLogs" = "گزارش های بلوک را دریافت کنید" "allClients" = "همه مشتریان" +"addClient" = "افزودن مشتری" +"submitEnable" = "ارسال به عنوان فعال ✅" +"submitDisable" = "ارسال به عنوان غیرفعال 🚫" +"use_default" = "🏷️ استفاده از پیش‌فرض" +"change_default" = "🔄⚙️ تغییر پیش‌فرض" + [tgbot.answers] "successfulOperation" = "✅ انجام شد!" "errorOperation" = "❗ خطا در عملیات." diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml index 95222495..84e8fb22 100644 --- a/web/translation/translate.id_ID.toml +++ b/web/translation/translate.id_ID.toml @@ -571,6 +571,17 @@ "yes" = "✅ Ya" "no" = "❌ Tidak" + +"received_id" = "🔑📥 ID diterima: {{ .ClientId }}" +"received_email" = "📧📥 Email diterima: {{ .ClientEmail }}" +"received_comment" = "💬📥 Komentar diterima: {{ .ClientComment }}" +"id_prompt" = "🔑 ID default: {{ .ClientId }}\n\nMasukkan ID Anda." +"email_prompt" = "📧 Email default: {{ .ClientEmail }}\n\nMasukkan email Anda." +"comment_prompt" = "💬 Komentar default: {{ .ClientComment }}\n\nMasukkan komentar Anda." +"inbound_client_data" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda bisa menambahkan klien ke inbound!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda bisa menambahkan klien ke inbound!" +"cancel" = "❌ Proses dibatalkan! \n\nAnda bisa /start lagi kapan saja. 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ Tutup Papan Ketik" "cancel" = "❌ Batal" @@ -605,6 +616,12 @@ "getBanLogs" = "Dapatkan Log Pemblokiran" "allClients" = "Semua Klien" +"addClient" = "Tambah Klien" +"submitEnable" = "Kirim Sebagai Aktif ✅" +"submitDisable" = "Kirim Sebagai Nonaktif 🚫" +"use_default" = "🏷️ Gunakan Default" +"change_default" = "🔄⚙️ Ubah Default" + [tgbot.answers] "successfulOperation" = "✅ Operasi berhasil!" "errorOperation" = "❗ Kesalahan dalam operasi." diff --git a/web/translation/translate.ja_JP.toml b/web/translation/translate.ja_JP.toml index 1b116564..102ea429 100644 --- a/web/translation/translate.ja_JP.toml +++ b/web/translation/translate.ja_JP.toml @@ -572,6 +572,16 @@ "yes" = "✅ はい" "no" = "❌ いいえ" +"received_id" = "🔑📥 受け取ったID: {{ .ClientId }}" +"received_email" = "📧📥 受け取ったメール: {{ .ClientEmail }}" +"received_comment" = "💬📥 受け取ったコメント: {{ .ClientComment }}" +"id_prompt" = "🔑 デフォルトID: {{ .ClientId }}\n\nIDを入力してください。" +"email_prompt" = "📧 デフォルトメール: {{ .ClientEmail }}\n\nメールアドレスを入力してください。" +"comment_prompt" = "💬 デフォルトコメント: {{ .ClientComment }}\n\nコメントを入力してください。" +"inbound_client_data" = "🔄 受信データ: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\nクライアントを受信リストに追加できます!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\nクライアントを受信リストに追加できます!" +"cancel" = "❌ 処理がキャンセルされました! \n\nいつでも/startでやり直せます。 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ キーボードを閉じる" "cancel" = "❌ キャンセル" @@ -606,6 +616,12 @@ "getBanLogs" = "禁止ログ" "allClients" = "すべてのクライアント" +"addClient" = "クライアントを追加" +"submitEnable" = "有効として送信 ✅" +"submitDisable" = "無効として送信 🚫" +"use_default" = "🏷️ デフォルトを使用" +"change_default" = "🔄⚙️ デフォルトを変更" + [tgbot.answers] "successfulOperation" = "✅ 成功!" "errorOperation" = "❗ 操作エラー。" diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml index 24b40474..f3a2bb9f 100644 --- a/web/translation/translate.pt_BR.toml +++ b/web/translation/translate.pt_BR.toml @@ -572,6 +572,16 @@ "yes" = "✅ Sim" "no" = "❌ Não" +"received_id" = "🔑📥 ID recebido: {{ .ClientId }}" +"received_email" = "📧📥 E-mail recebido: {{ .ClientEmail }}" +"received_comment" = "💬📥 Comentário recebido: {{ .ClientComment }}" +"id_prompt" = "🔑 ID padrão: {{ .ClientId }}\n\nDigite seu ID." +"email_prompt" = "📧 E-mail padrão: {{ .ClientEmail }}\n\nDigite seu e-mail." +"comment_prompt" = "💬 Comentário padrão: {{ .ClientComment }}\n\nDigite seu comentário." +"inbound_client_data" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!" +"cancel" = "❌ Processo cancelado! \n\nVocê pode /start novamente a qualquer momento. 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ Fechar teclado" "cancel" = "❌ Cancelar" @@ -606,6 +616,12 @@ "getBanLogs" = "Obter logs de banimento" "allClients" = "Todos os clientes" +"addClient" = "Adicionar Cliente" +"submitEnable" = "Enviar como Ativado ✅" +"submitDisable" = "Enviar como Desativado 🚫" +"use_default" = "🏷️ Usar padrão" +"change_default" = "🔄⚙️ Alterar Padrão" + [tgbot.answers] "successfulOperation" = "✅ Operação bem-sucedida!" "errorOperation" = "❗ Erro na operação." diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml index 86150ff8..4cd2abe3 100644 --- a/web/translation/translate.ru_RU.toml +++ b/web/translation/translate.ru_RU.toml @@ -572,6 +572,16 @@ "yes" = "✅ Да" "no" = "❌ Нет" +"received_id" = "🔑📥 Полученный ID: {{ .ClientId }}" +"received_email" = "📧📥 Полученный email: {{ .ClientEmail }}" +"received_comment" = "💬📥 Полученный комментарий: {{ .ClientComment }}" +"id_prompt" = "🔑 Стандартный ID: {{ .ClientId }}\n\nВведите ваш ID." +"email_prompt" = "📧 Стандартный email: {{ .ClientEmail }}\n\nВведите ваш email." +"comment_prompt" = "💬 Стандартный комментарий: {{ .ClientComment }}\n\nВведите ваш комментарий." +"inbound_client_data" = "🔄 Входящие: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента в входящие!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента в входящие!" +"cancel" = "❌ Процесс отменен! \n\nВы можете снова запустить /start в любое время. 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ Закрыть клавиатуру" "cancel" = "❌ Отмена" @@ -606,6 +616,12 @@ "getBanLogs" = "Логи блокировок" "allClients" = "Все клиенты" +"addClient" = "Добавить клиента" +"submitEnable" = "Отправить как включено ✅" +"submitDisable" = "Отправить как отключено 🚫" +"use_default" = "🏷️ Использовать по умолчанию" +"change_default" = "🔄⚙️ Изменить по умолчанию" + [tgbot.answers] "successfulOperation" = "✅ Успешно!" "errorOperation" = "❗ Ошибка в операции." diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml index f033e440..e5ee0a95 100644 --- a/web/translation/translate.tr_TR.toml +++ b/web/translation/translate.tr_TR.toml @@ -572,6 +572,16 @@ "yes" = "✅ Evet" "no" = "❌ Hayır" +"received_id" = "🔑📥 Alınan ID: {{ .ClientId }}" +"received_email" = "📧📥 Alınan E-posta: {{ .ClientEmail }}" +"received_comment" = "💬📥 Alınan Yorum: {{ .ClientComment }}" +"id_prompt" = "🔑 Varsayılan ID: {{ .ClientId }}\n\nID'nizi girin." +"email_prompt" = "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-posta adresinizi girin." +"comment_prompt" = "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin." +"inbound_client_data" = "🔄 Giriş: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri girişine ekleyebilirsiniz!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri girişine ekleyebilirsiniz!" +"cancel" = "❌ İşlem iptal edildi! \n\nİstediğiniz zaman /start komutunu tekrar verebilirsiniz. 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ Klavyeyi Kapat" "cancel" = "❌ İptal" @@ -606,6 +616,12 @@ "getBanLogs" = "Yasak Günlüklerini Al" "allClients" = "Tüm Müşteriler" +"addClient" = "Müşteri Ekle" +"submitEnable" = "Etkin Olarak Gönder ✅" +"submitDisable" = "Devre Dışı Olarak Gönder 🚫" +"use_default" = "🏷️ Varsayılanı Kullan" +"change_default" = "🔄⚙️ Varsayılanı Değiştir" + [tgbot.answers] "successfulOperation" = "✅ İşlem başarılı!" "errorOperation" = "❗ İşlemde hata." diff --git a/web/translation/translate.uk_UA.toml b/web/translation/translate.uk_UA.toml index 29bf6c63..c3d66b54 100644 --- a/web/translation/translate.uk_UA.toml +++ b/web/translation/translate.uk_UA.toml @@ -572,6 +572,16 @@ "yes" = "✅ Так" "no" = "❌ Ні" +"received_id" = "🔑📥 Отриманий ID: {{ .ClientId }}" +"received_email" = "📧📥 Отриманий Email: {{ .ClientEmail }}" +"received_comment" = "💬📥 Отриманий коментар: {{ .ClientComment }}" +"id_prompt" = "🔑 За замовчуванням ID: {{ .ClientId }}\n\nВведіть ваш ID." +"email_prompt" = "📧 За замовчуванням Email: {{ .ClientEmail }}\n\nВведіть ваш email." +"comment_prompt" = "💬 За замовчуванням коментар: {{ .ClientComment }}\n\nВведіть ваш коментар." +"inbound_client_data" = "🔄 Вхідні дані: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nЗараз ви можете додати клієнта до вхідних!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nЗараз ви можете додати клієнта до вхідних!" +"cancel" = "❌ Процес скасовано! \n\nВи можете /start знову в будь-який час. 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ Закрити клавіатуру" "cancel" = "❌ Скасувати" @@ -606,6 +616,12 @@ "getBanLogs" = "Отримати журнали заборон" "allClients" = "Всі Клієнти" +"addClient" = "Додати клієнта" +"submitEnable" = "Надіслати як увімкнено ✅" +"submitDisable" = "Надіслати як вимкнено 🚫" +"use_default" = "🏷️ Використати за замовчуванням" +"change_default" = "🔄⚙️ Змінити за замовчуванням" + [tgbot.answers] "successfulOperation" = "✅ Операція успішна!" "errorOperation" = "❗ Помилка в роботі." diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml index ec9f9485..2b450ab3 100644 --- a/web/translation/translate.vi_VN.toml +++ b/web/translation/translate.vi_VN.toml @@ -572,6 +572,16 @@ "yes" = "✅ Có" "no" = "❌ Không" +"received_id" = "🔑📥 ID nhận được: {{ .ClientId }}" +"received_email" = "📧📥 Email nhận được: {{ .ClientEmail }}" +"received_comment" = "💬📥 Nhận được bình luận: {{ .ClientComment }}" +"id_prompt" = "🔑 ID mặc định: {{ .ClientId }}\n\nNhập ID của bạn." +"email_prompt" = "📧 Email mặc định: {{ .ClientEmail }}\n\nNhập email của bạn." +"comment_prompt" = "💬 Bình luận mặc định: {{ .ClientComment }}\n\nNhập bình luận của bạn." +"inbound_client_data" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBây giờ bạn có thể thêm khách hàng vào danh sách đến!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBây giờ bạn có thể thêm khách hàng vào danh sách đến!" +"cancel" = "❌ Quá trình bị hủy! \n\nBạn có thể /start lại bất cứ lúc nào. 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ Đóng Bàn Phím" "cancel" = "❌ Hủy" @@ -606,6 +616,12 @@ "getBanLogs" = "Cấm nhật ký" "allClients" = "Tất cả Khách hàng" +"addClient" = "Thêm Khách Hàng" +"submitEnable" = "Gửi Dưới Dạng Bật ✅" +"submitDisable" = "Gửi Dưới Dạng Tắt 🚫" +"use_default" = "🏷️ Sử dụng mặc định" +"change_default" = "🔄⚙️ Thay đổi mặc định" + [tgbot.answers] "successfulOperation" = "✅ Thành công!" "errorOperation" = "❗ Lỗi Trong Quá Trình Thực Hiện." diff --git a/web/translation/translate.zh_CN.toml b/web/translation/translate.zh_CN.toml index a4a0dc4e..dd60be9e 100644 --- a/web/translation/translate.zh_CN.toml +++ b/web/translation/translate.zh_CN.toml @@ -572,6 +572,16 @@ "yes" = "✅ 是的" "no" = "❌ 没有" +"received_id" = "🔑📥 接收到的ID: {{ .ClientId }}" +"received_email" = "📧📥 接收到的邮件: {{ .ClientEmail }}" +"received_comment" = "💬📥 接收到的评论: {{ .ClientComment }}" +"id_prompt" = "🔑 默认ID: {{ .ClientId }}\n\n请输入您的ID。" +"email_prompt" = "📧 默认邮件: {{ .ClientEmail }}\n\n请输入您的邮箱。" +"comment_prompt" = "💬 默认评论: {{ .ClientComment }}\n\n请输入您的评论。" +"inbound_client_data" = "🔄 入站数据: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在您可以将客户添加到入站!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在您可以将客户添加到入站!" +"cancel" = "❌ 过程已取消! \n\n您可以随时 /start 重新开始。 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ 关闭键盘" "cancel" = "❌ 取消" @@ -606,6 +616,12 @@ "getBanLogs" = "禁止日志" "allClients" = "所有客户" +"addClient" = "添加客户" +"submitEnable" = "提交为启用 ✅" +"submitDisable" = "提交为禁用 🚫" +"use_default" = "🏷️ 使用默认" +"change_default" = "🔄⚙️ 更改默认" + [tgbot.answers] "successfulOperation" = "✅ 成功!" "errorOperation" = "❗ 操作错误。" diff --git a/web/translation/translate.zh_TW.toml b/web/translation/translate.zh_TW.toml index f12f6d5b..8dd8d96c 100644 --- a/web/translation/translate.zh_TW.toml +++ b/web/translation/translate.zh_TW.toml @@ -572,6 +572,16 @@ "yes" = "✅ 是的" "no" = "❌ 沒有" +"received_id" = "🔑📥 接收到的ID: {{ .ClientId }}" +"received_email" = "📧📥 接收到的電子郵件: {{ .ClientEmail }}" +"received_comment" = "💬📥 接收到的評論: {{ .ClientComment }}" +"id_prompt" = "🔑 預設ID: {{ .ClientId }}\n\n請輸入您的ID。" +"email_prompt" = "📧 預設電子郵件: {{ .ClientEmail }}\n\n請輸入您的電子郵件。" +"comment_prompt" = "💬 預設評論: {{ .ClientComment }}\n\n請輸入您的評論。" +"inbound_client_data" = "🔄 進站數據: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶加入進站!" +"client_data" = "🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶加入進站!" +"cancel" = "❌ 處理已取消! \n\n您隨時可以 /start 再次開始。 🔄" + [tgbot.buttons] "closeKeyboard" = "❌ 關閉鍵盤" "cancel" = "❌ 取消" @@ -606,6 +616,12 @@ "getBanLogs" = "禁止日誌" "allClients" = "所有客戶" +"addClient" = "新增客戶" +"submitEnable" = "提交為啟用 ✅" +"submitDisable" = "提交為停用 🚫" +"use_default" = "🏷️ 使用預設" +"change_default" = "🔄⚙️ 更改預設" + [tgbot.answers] "successfulOperation" = "✅ 成功!" "errorOperation" = "❗ 操作錯誤。"