mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-04-19 13:32:24 +00:00
Merge 1aff920e83
into 6545d8b61d
This commit is contained in:
commit
3faf13e45c
14 changed files with 978 additions and 49 deletions
1
go.mod
1
go.mod
|
@ -7,6 +7,7 @@ require (
|
||||||
github.com/gin-contrib/sessions v1.0.2
|
github.com/gin-contrib/sessions v1.0.2
|
||||||
github.com/gin-gonic/gin v1.10.0
|
github.com/gin-gonic/gin v1.10.0
|
||||||
github.com/goccy/go-json v0.10.5
|
github.com/goccy/go-json v0.10.5
|
||||||
|
github.com/google/uuid v1.6.0
|
||||||
github.com/mymmrac/telego v0.32.0
|
github.com/mymmrac/telego v0.32.0
|
||||||
github.com/nicksnyder/go-i18n/v2 v2.5.1
|
github.com/nicksnyder/go-i18n/v2 v2.5.1
|
||||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
|
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/rand"
|
||||||
"embed"
|
"embed"
|
||||||
|
"encoding/base64"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/big"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -20,8 +24,7 @@ import (
|
||||||
"x-ui/web/locale"
|
"x-ui/web/locale"
|
||||||
"x-ui/xray"
|
"x-ui/xray"
|
||||||
|
|
||||||
"slices"
|
"github.com/google/uuid"
|
||||||
|
|
||||||
"github.com/mymmrac/telego"
|
"github.com/mymmrac/telego"
|
||||||
th "github.com/mymmrac/telego/telegohandler"
|
th "github.com/mymmrac/telego/telegohandler"
|
||||||
tu "github.com/mymmrac/telego/telegoutil"
|
tu "github.com/mymmrac/telego/telegoutil"
|
||||||
|
@ -30,14 +33,38 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
bot *telego.Bot
|
bot *telego.Bot
|
||||||
botHandler *th.BotHandler
|
botHandler *th.BotHandler
|
||||||
adminIds []int64
|
adminIds []int64
|
||||||
isRunning bool
|
isRunning bool
|
||||||
hostname string
|
hostname string
|
||||||
hashStorage *global.HashStorage
|
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
|
||||||
|
client_ShPassword string
|
||||||
|
client_TrPassword string
|
||||||
|
client_Method string
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
var userStates = make(map[int64]string)
|
||||||
|
|
||||||
|
|
||||||
type LoginStatus byte
|
type LoginStatus byte
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -46,6 +73,8 @@ const (
|
||||||
EmptyTelegramUserID = int64(0)
|
EmptyTelegramUserID = int64(0)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const charset = "abcdefghijklmnopqrstuvwxyz0123456789"
|
||||||
|
|
||||||
type Tgbot struct {
|
type Tgbot struct {
|
||||||
inboundService InboundService
|
inboundService InboundService
|
||||||
settingService SettingService
|
settingService SettingService
|
||||||
|
@ -54,6 +83,7 @@ type Tgbot struct {
|
||||||
lastStatus *Status
|
lastStatus *Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (t *Tgbot) NewTgbot() *Tgbot {
|
func (t *Tgbot) NewTgbot() *Tgbot {
|
||||||
return new(Tgbot)
|
return new(Tgbot)
|
||||||
}
|
}
|
||||||
|
@ -223,36 +253,113 @@ func (t *Tgbot) OnReceive() {
|
||||||
botHandler, _ = th.NewBotHandler(bot, updates)
|
botHandler, _ = th.NewBotHandler(bot, updates)
|
||||||
|
|
||||||
botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) {
|
botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) {
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.keyboardClosed"), tu.ReplyKeyboardRemove())
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.keyboardClosed"), tu.ReplyKeyboardRemove())
|
||||||
}, th.TextEqual(t.I18nBot("tgbot.buttons.closeKeyboard")))
|
}, th.TextEqual(t.I18nBot("tgbot.buttons.closeKeyboard")))
|
||||||
|
|
||||||
botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) {
|
botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) {
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
t.answerCommand(&message, message.Chat.ID, checkAdmin(message.From.ID))
|
t.answerCommand(&message, message.Chat.ID, checkAdmin(message.From.ID))
|
||||||
}, th.AnyCommand())
|
}, th.AnyCommand())
|
||||||
|
|
||||||
botHandler.HandleCallbackQuery(func(_ *telego.Bot, query telego.CallbackQuery) {
|
botHandler.HandleCallbackQuery(func(_ *telego.Bot, query telego.CallbackQuery) {
|
||||||
|
delete(userStates,query.Message.GetChat().ID)
|
||||||
t.answerCallback(&query, checkAdmin(query.From.ID))
|
t.answerCallback(&query, checkAdmin(query.From.ID))
|
||||||
}, th.AnyCallbackQueryWithMessage())
|
}, th.AnyCallbackQueryWithMessage())
|
||||||
|
|
||||||
botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) {
|
botHandler.HandleMessage(func(_ *telego.Bot, message telego.Message) {
|
||||||
if message.UsersShared != nil {
|
if userState, exists := userStates[message.Chat.ID]; exists {
|
||||||
if checkAdmin(message.From.ID) {
|
switch userState {
|
||||||
for _, sharedUser := range message.UsersShared.Users {
|
case "awaiting_id":
|
||||||
userID := sharedUser.UserID
|
client_Id = strings.TrimSpace(message.Text)
|
||||||
needRestart, err := t.inboundService.SetClientTelegramUserID(message.UsersShared.RequestID, userID)
|
if t.isSingleWord(client_Id) {
|
||||||
if needRestart {
|
userStates[message.Chat.ID] = "awaiting_id"
|
||||||
t.xrayService.SetToNeedRestart()
|
|
||||||
}
|
cancel_btn_markup := tu.InlineKeyboard(
|
||||||
output := ""
|
tu.InlineKeyboardRow(
|
||||||
if err != nil {
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
|
||||||
output += t.I18nBot("tgbot.messages.selectUserFailed")
|
),
|
||||||
} else {
|
)
|
||||||
output += t.I18nBot("tgbot.messages.userSaved")
|
|
||||||
}
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
|
||||||
t.SendMsgToTgbot(message.Chat.ID, output, tu.ReplyKeyboardRemove())
|
} else {
|
||||||
|
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_id"), 3, tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
|
}
|
||||||
|
case "awaiting_password_tr":
|
||||||
|
client_TrPassword = strings.TrimSpace(message.Text)
|
||||||
|
if t.isSingleWord(client_TrPassword) {
|
||||||
|
userStates[message.Chat.ID] = "awaiting_password_tr"
|
||||||
|
|
||||||
|
cancel_btn_markup := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
|
||||||
|
} else {
|
||||||
|
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_password"), 3, tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
|
}
|
||||||
|
case "awaiting_password_sh":
|
||||||
|
client_ShPassword = strings.TrimSpace(message.Text)
|
||||||
|
if t.isSingleWord(client_ShPassword) {
|
||||||
|
userStates[message.Chat.ID] = "awaiting_password_sh"
|
||||||
|
|
||||||
|
cancel_btn_markup := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
|
||||||
|
} else {
|
||||||
|
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_password"), 3, tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
|
}
|
||||||
|
case "awaiting_email":
|
||||||
|
client_Email = strings.TrimSpace(message.Text)
|
||||||
|
if t.isSingleWord(client_Email) {
|
||||||
|
userStates[message.Chat.ID] = "awaiting_email"
|
||||||
|
|
||||||
|
cancel_btn_markup := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
|
||||||
|
} else {
|
||||||
|
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_email"), 3, tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, message.Chat.ID)
|
||||||
|
}
|
||||||
|
case "awaiting_comment":
|
||||||
|
client_Comment = strings.TrimSpace(message.Text)
|
||||||
|
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_comment"), 3, tu.ReplyKeyboardRemove())
|
||||||
|
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())
|
||||||
|
}
|
||||||
|
} 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())
|
}, th.AnyMessage())
|
||||||
|
@ -344,6 +451,27 @@ 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) randomShadowSocksPassword() string {
|
||||||
|
array := make([]byte, 32)
|
||||||
|
_, err := rand.Read(array)
|
||||||
|
if err != nil {
|
||||||
|
return t.randomLowerAndNum(32)
|
||||||
|
}
|
||||||
|
return base64.StdEncoding.EncodeToString(array)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) {
|
func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) {
|
||||||
chatId := callbackQuery.Message.GetChat().ID
|
chatId := callbackQuery.Message.GetChat().ID
|
||||||
|
|
||||||
|
@ -838,7 +966,40 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clients)
|
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_Flow = ""
|
||||||
|
client_Email = t.randomLowerAndNum(8)
|
||||||
|
client_LimitIP = 0
|
||||||
|
client_TotalGB = 0
|
||||||
|
client_ExpiryTime = 0
|
||||||
|
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=""
|
||||||
|
|
||||||
|
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_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
|
||||||
|
|
||||||
|
t.addClient(chatId, message_text)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
|
@ -892,11 +1053,267 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||||
case "commands":
|
case "commands":
|
||||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.commands"))
|
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.commands"))
|
||||||
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.helpAdminCommands"))
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.helpAdminCommands"))
|
||||||
|
case "add_client":
|
||||||
|
// assign default values to clients variables
|
||||||
|
client_Id = uuid.New().String()
|
||||||
|
client_Flow = ""
|
||||||
|
client_Email = t.randomLowerAndNum(8)
|
||||||
|
client_LimitIP = 0
|
||||||
|
client_TotalGB = 0
|
||||||
|
client_ExpiryTime = 0
|
||||||
|
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=""
|
||||||
|
|
||||||
|
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_refresh":
|
||||||
|
messageId := callbackQuery.Message.GetMessageID()
|
||||||
|
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
|
||||||
|
if err != nil {
|
||||||
|
t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
|
||||||
|
|
||||||
|
t.addClient(chatId,message_text,messageId)
|
||||||
|
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.clientRefreshSuccess", "Email=="+client_Email))
|
||||||
|
case "add_client_ch_default_email":
|
||||||
|
userStates[chatId] = "awaiting_email"
|
||||||
|
cancel_btn_markup := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
prompt_message := t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Email)
|
||||||
|
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
|
||||||
|
case "add_client_ch_default_id":
|
||||||
|
userStates[chatId] = "awaiting_id"
|
||||||
|
cancel_btn_markup := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
prompt_message := t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Id)
|
||||||
|
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
|
||||||
|
case "add_client_ch_default_pass_tr":
|
||||||
|
userStates[chatId] = "awaiting_password_tr"
|
||||||
|
cancel_btn_markup := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
prompt_message := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_TrPassword)
|
||||||
|
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
|
||||||
|
case "add_client_ch_default_pass_sh":
|
||||||
|
userStates[chatId] = "awaiting_password_sh"
|
||||||
|
cancel_btn_markup := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
prompt_message := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_ShPassword)
|
||||||
|
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
|
||||||
|
case "add_client_ch_default_comment":
|
||||||
|
userStates[chatId] = "awaiting_comment"
|
||||||
|
cancel_btn_markup := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
prompt_message := t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment)
|
||||||
|
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
|
||||||
|
case "add_client_ch_default_traffic":
|
||||||
|
userStates[chatId] = "awaiting_id"
|
||||||
|
case "add_client_ch_default_exp":
|
||||||
|
userStates[chatId] = "awaiting_id"
|
||||||
|
case "add_client_default_info":
|
||||||
|
t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
|
||||||
|
delete(userStates, chatId)
|
||||||
|
case "add_client_cancel":
|
||||||
|
delete(userStates, chatId)
|
||||||
|
t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.cancel"), 5, tu.ReplyKeyboardRemove())
|
||||||
|
case "add_client_submit_disable":
|
||||||
|
client_Enable = false
|
||||||
|
_, err := t.SubmitAddClient()
|
||||||
|
if err != nil {
|
||||||
|
errorMessage := fmt.Sprintf("%v", err)
|
||||||
|
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.error_add_client", "error=="+errorMessage), tu.ReplyKeyboardRemove())
|
||||||
|
} else {
|
||||||
|
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (t *Tgbot) BuildInboundClientDataMessage(inbound_remark string ,protocol model.Protocol) (string, error) {
|
||||||
|
var message string
|
||||||
|
|
||||||
|
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,"ClientComment=="+client_Comment)
|
||||||
|
|
||||||
|
case model.Trojan:
|
||||||
|
message = t.I18nBot("tgbot.messages.inbound_client_data_pass", "InboundRemark=="+inbound_remark,"ClientPass=="+client_TrPassword,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment)
|
||||||
|
|
||||||
|
case model.Shadowsocks:
|
||||||
|
message = t.I18nBot("tgbot.messages.inbound_client_data_pass", "InboundRemark=="+inbound_remark,"ClientPass=="+client_ShPassword,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment)
|
||||||
|
|
||||||
|
default:
|
||||||
|
return "", errors.New("unknown protocol")
|
||||||
|
}
|
||||||
|
|
||||||
|
return message, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tgbot) BuildClientDataMessage() (string, error) {
|
||||||
|
var message string
|
||||||
|
|
||||||
|
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
|
||||||
|
if err != nil {
|
||||||
|
logger.Warning("getIboundClients run failed:", err)
|
||||||
|
return "", errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
|
||||||
|
}
|
||||||
|
protocol := inbound.Protocol
|
||||||
|
|
||||||
|
|
||||||
|
switch protocol {
|
||||||
|
case model.VMESS, model.VLESS:
|
||||||
|
message = t.I18nBot("tgbot.messages.client_data_id", "ClientId=="+client_Id,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment)
|
||||||
|
|
||||||
|
case model.Trojan:
|
||||||
|
message = t.I18nBot("tgbot.messages.client_data_pass", "ClientPass=="+client_TrPassword,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment)
|
||||||
|
|
||||||
|
case model.Shadowsocks:
|
||||||
|
message = t.I18nBot("tgbot.messages.client_data_pass", "ClientPass=="+client_ShPassword,"ClientEmail=="+client_Email,"ClientComment=="+client_Comment)
|
||||||
|
|
||||||
|
default:
|
||||||
|
return "", errors.New("unknown protocol")
|
||||||
|
}
|
||||||
|
|
||||||
|
return message, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (t *Tgbot) BuildJSONForProtocol(protocol model.Protocol) (string, error) {
|
||||||
|
var jsonString string
|
||||||
|
|
||||||
|
switch protocol {
|
||||||
|
case model.VMESS:
|
||||||
|
jsonString = fmt.Sprintf(`{
|
||||||
|
"clients": [{
|
||||||
|
"id": "%s",
|
||||||
|
"security": "%s",
|
||||||
|
"email": "%s",
|
||||||
|
"limitIp": %d,
|
||||||
|
"totalGB": %d,
|
||||||
|
"expiryTime": %d,
|
||||||
|
"enable": %t,
|
||||||
|
"tgId": "%s",
|
||||||
|
"subId": "%s",
|
||||||
|
"comment": "%s",
|
||||||
|
"reset": %d
|
||||||
|
}]
|
||||||
|
}`, 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(`{
|
||||||
|
"clients": [{
|
||||||
|
"id": "%s",
|
||||||
|
"flow": "%s",
|
||||||
|
"email": "%s",
|
||||||
|
"limitIp": %d,
|
||||||
|
"totalGB": %d,
|
||||||
|
"expiryTime": %d,
|
||||||
|
"enable": %t,
|
||||||
|
"tgId": "%s",
|
||||||
|
"subId": "%s",
|
||||||
|
"comment": "%s",
|
||||||
|
"reset": %d
|
||||||
|
}]
|
||||||
|
}`, 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(`{
|
||||||
|
"clients": [{
|
||||||
|
"password": "%s",
|
||||||
|
"email": "%s",
|
||||||
|
"limitIp": %d,
|
||||||
|
"totalGB": %d,
|
||||||
|
"expiryTime": %d,
|
||||||
|
"enable": %t,
|
||||||
|
"tgId": "%s",
|
||||||
|
"subId": "%s",
|
||||||
|
"comment": "%s",
|
||||||
|
"reset": %d
|
||||||
|
}]
|
||||||
|
}`, 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(`{
|
||||||
|
"clients": [{
|
||||||
|
"method": "%s",
|
||||||
|
"password": "%s",
|
||||||
|
"email": "%s",
|
||||||
|
"limitIp": %d,
|
||||||
|
"totalGB": %d,
|
||||||
|
"expiryTime": %d,
|
||||||
|
"enable": %t,
|
||||||
|
"tgId": "%s",
|
||||||
|
"subId": "%s",
|
||||||
|
"comment": "%s",
|
||||||
|
"reset": %d
|
||||||
|
}]
|
||||||
|
}`, 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")
|
||||||
|
}
|
||||||
|
|
||||||
|
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,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return t.inboundService.AddInboundClient(newInbound)
|
||||||
|
}
|
||||||
|
|
||||||
func checkAdmin(tgId int64) bool {
|
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) {
|
func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) {
|
||||||
|
@ -915,7 +1332,10 @@ func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) {
|
||||||
tu.InlineKeyboardRow(
|
tu.InlineKeyboardRow(
|
||||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.commands")).WithCallbackData(t.encodeQuery("commands")),
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.commands")).WithCallbackData(t.encodeQuery("commands")),
|
||||||
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.onlines")).WithCallbackData(t.encodeQuery("onlines")),
|
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.allClients")).WithCallbackData(t.encodeQuery("get_inbounds")),
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.addClient")).WithCallbackData(t.encodeQuery("add_client")),
|
||||||
),
|
),
|
||||||
// TODOOOOOOOOOOOOOO: Add restart button here.
|
// TODOOOOOOOOOOOOOO: Add restart button here.
|
||||||
)
|
)
|
||||||
|
@ -1161,35 +1581,75 @@ func (t *Tgbot) getInboundUsages() string {
|
||||||
}
|
}
|
||||||
return info
|
return info
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Tgbot) getInbounds() (*telego.InlineKeyboardMarkup, error) {
|
func (t *Tgbot) getInbounds() (*telego.InlineKeyboardMarkup, error) {
|
||||||
inbounds, err := t.inboundService.GetAllInbounds()
|
inbounds, err := t.inboundService.GetAllInbounds()
|
||||||
var buttons []telego.InlineKeyboardButton
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warning("GetAllInbounds run failed:", err)
|
logger.Warning("GetAllInbounds run failed:", err)
|
||||||
return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
|
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 {
|
if len(inbounds) == 0 {
|
||||||
cols = 3
|
logger.Warning("No inbounds found")
|
||||||
} else {
|
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","get_clients", inbound.Id))
|
||||||
|
buttons = append(buttons, tu.InlineKeyboardButton(fmt.Sprintf("%v - %v", inbound.Remark, status)).WithCallbackData(callbackData))
|
||||||
|
}
|
||||||
|
|
||||||
|
cols := 1
|
||||||
|
if len(buttons) >= 6 {
|
||||||
cols = 2
|
cols = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols, buttons...))
|
||||||
|
return keyboard, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tgbot) getInboundsAddClient() (*telego.InlineKeyboardMarkup, error) {
|
||||||
|
inbounds, err := t.inboundService.GetAllInbounds()
|
||||||
|
if err != nil {
|
||||||
|
logger.Warning("GetAllInbounds run failed:", err)
|
||||||
|
return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(inbounds) == 0 {
|
||||||
|
logger.Warning("No inbounds found")
|
||||||
|
return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
|
||||||
|
}
|
||||||
|
|
||||||
|
excludedProtocols := map[model.Protocol]bool{
|
||||||
|
model.DOKODEMO: true,
|
||||||
|
model.Socks: true,
|
||||||
|
model.WireGuard: true,
|
||||||
|
model.HTTP: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
var buttons []telego.InlineKeyboardButton
|
||||||
|
for _, inbound := range inbounds {
|
||||||
|
if excludedProtocols[inbound.Protocol] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
status := "❌"
|
||||||
|
if inbound.Enable {
|
||||||
|
status = "✅"
|
||||||
|
}
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
|
||||||
|
cols := 1
|
||||||
|
if len(buttons) >= 6 {
|
||||||
|
cols = 2
|
||||||
|
}
|
||||||
|
|
||||||
keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols, buttons...))
|
keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols, buttons...))
|
||||||
return keyboard, nil
|
return keyboard, nil
|
||||||
}
|
}
|
||||||
|
@ -1484,6 +1944,100 @@ func (t *Tgbot) searchClient(chatId int64, email string, messageID ...int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) {
|
||||||
|
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
|
||||||
|
if err != nil {
|
||||||
|
t.SendMsgToTgbot(chatId, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol := inbound.Protocol
|
||||||
|
|
||||||
|
switch protocol {
|
||||||
|
case model.VMESS, model.VLESS:
|
||||||
|
inlineKeyboard := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData("add_client_refresh"),
|
||||||
|
),
|
||||||
|
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"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if len(messageID) > 0 {
|
||||||
|
t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard)
|
||||||
|
} else {
|
||||||
|
t.SendMsgToTgbot(chatId, msg, inlineKeyboard)
|
||||||
|
}
|
||||||
|
case model.Trojan:
|
||||||
|
inlineKeyboard := tu.InlineKeyboard(
|
||||||
|
tu.InlineKeyboardRow(
|
||||||
|
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData("add_client_refresh"),
|
||||||
|
),
|
||||||
|
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"),
|
||||||
|
),
|
||||||
|
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.refresh")).WithCallbackData("add_client_refresh"),
|
||||||
|
),
|
||||||
|
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) {
|
func (t *Tgbot) searchInbound(chatId int64, remark string) {
|
||||||
inbounds, err := t.inboundService.SearchInbounds(remark)
|
inbounds, err := t.inboundService.SearchInbounds(remark)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1689,7 +2243,12 @@ func (t *Tgbot) notifyExhausted() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func int64Contains(slice []int64, item int64) bool {
|
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) {
|
func (t *Tgbot) onlineClients(chatId int64, messageID ...int) {
|
||||||
|
@ -1849,3 +2408,49 @@ func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, inlin
|
||||||
logger.Warning(err)
|
logger.Warning(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tgbot) isSingleWord(text string) bool {
|
||||||
|
text = strings.TrimSpace(text)
|
||||||
|
re := regexp.MustCompile(`\s+`)
|
||||||
|
return re.MatchString(text)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -582,6 +582,23 @@
|
||||||
"yes" = "✅ Yes"
|
"yes" = "✅ Yes"
|
||||||
"no" = "❌ No"
|
"no" = "❌ No"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID updated. Press refresh to see changes."
|
||||||
|
"received_password" = "🔑📥 Password updated. Press refresh to see changes."
|
||||||
|
"received_email" = "📧📥 Email updated. Press refresh to see changes."
|
||||||
|
"received_comment" = "💬📥 Comment updated. Press refresh to see changes."
|
||||||
|
"id_prompt" = "🔑 Default ID: {{ .ClientId }}\n\nEnter your id."
|
||||||
|
"pass_prompt" = "🔑 Default Password: {{ .ClientPassword }}\n\nEnter your password."
|
||||||
|
"email_prompt" = "📧 Default Email: {{ .ClientEmail }}\n\nEnter your email."
|
||||||
|
"comment_prompt" = "💬 Default Comment: {{ .ClientComment }}\n\nEnter your Comment."
|
||||||
|
"inbound_client_data_id" = "🔄 Inbound: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!"
|
||||||
|
"inbound_client_data_pass" = "🔄 Inbound: {{ .InboundRemark }}\n\n🔑 Password: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!"
|
||||||
|
"client_data_pass" = "🔑 Password: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!"
|
||||||
|
"cancel" = "❌ Process Canceled! \n\nYou can /start again anytime. 🔄"
|
||||||
|
"error_add_client" = "⚠️ Error:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "Okay, I'll stick with the default value. 😊"
|
||||||
|
"incorrect_input" ="Your input is not valid.\nThe phrases should be continuous without spaces.\nCorrect example: aaaaaa\nIncorrect example: aaa aaa 🚫"
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Close Keyboard"
|
"closeKeyboard" = "❌ Close Keyboard"
|
||||||
"cancel" = "❌ Cancel"
|
"cancel" = "❌ Cancel"
|
||||||
|
@ -616,6 +633,14 @@
|
||||||
"getBanLogs" = "Get Ban Logs"
|
"getBanLogs" = "Get Ban Logs"
|
||||||
"allClients" = "All Clients"
|
"allClients" = "All Clients"
|
||||||
|
|
||||||
|
"addClient" = "Add Client"
|
||||||
|
"submitDisable" = "Submit As Disable ✅"
|
||||||
|
"use_default" = "🏷️ Use default"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 Password"
|
||||||
|
"change_email" = "⚙️📧 Email"
|
||||||
|
"change_comment" = "⚙️💬 Comment"
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Operation successful!"
|
"successfulOperation" = "✅ Operation successful!"
|
||||||
"errorOperation" = "❗ Error in operation."
|
"errorOperation" = "❗ Error in operation."
|
||||||
|
|
|
@ -584,6 +584,24 @@
|
||||||
"yes" = "✅ Sí"
|
"yes" = "✅ Sí"
|
||||||
"no" = "❌ No"
|
"no" = "❌ No"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID actualizada. Pulsa refrescar para ver los cambios."
|
||||||
|
"received_password" = "🔑📥 Contraseña actualizada. Pulsa refrescar para ver los cambios."
|
||||||
|
"received_email" = "📧📥 Correo electrónico actualizado. Pulsa refrescar para ver los cambios."
|
||||||
|
"received_comment" = "💬📥 Comentario actualizado. Pulsa refrescar para ver los cambios."
|
||||||
|
"id_prompt" = "🔑 ID predeterminado: {{ .ClientId }}\n\nIntroduce tu ID."
|
||||||
|
"pass_prompt" = "🔑 Contraseña predeterminada: {{ .ClientPassword }}\n\nIntroduce tu contraseña."
|
||||||
|
"email_prompt" = "📧 Correo electrónico predeterminado: {{ .ClientEmail }}\n\nIntroduce tu correo electrónico."
|
||||||
|
"comment_prompt" = "💬 Comentario predeterminado: {{ .ClientComment }}\n\nIntroduce tu comentario."
|
||||||
|
"inbound_client_data_id" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!"
|
||||||
|
"inbound_client_data_pass" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Contraseña: {{ .ClientPass }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!"
|
||||||
|
"client_data_pass" = "🔑 Contraseña: {{ .ClientPass }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!"
|
||||||
|
"cancel" = "❌ ¡Proceso cancelado! \n\nPuedes /start nuevamente en cualquier momento. 🔄"
|
||||||
|
"error_add_client" = "⚠️ Error:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "Está bien, usaré el valor predeterminado. 😊"
|
||||||
|
"incorrect_input" = "Tu entrada no es válida.\nLas frases deben ser continuas sin espacios.\nEjemplo correcto: aaaaaa\nEjemplo incorrecto: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Cerrar Teclado"
|
"closeKeyboard" = "❌ Cerrar Teclado"
|
||||||
"cancel" = "❌ Cancelar"
|
"cancel" = "❌ Cancelar"
|
||||||
|
@ -618,6 +636,15 @@
|
||||||
"getBanLogs" = "Registros de prohibición"
|
"getBanLogs" = "Registros de prohibición"
|
||||||
"allClients" = "Todos los Clientes"
|
"allClients" = "Todos los Clientes"
|
||||||
|
|
||||||
|
"addClient" = "Añadir Cliente"
|
||||||
|
"submitDisable" = "Enviar como Deshabilitado ✅"
|
||||||
|
"use_default" = "🏷️ Usar predeterminado"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 Contraseña"
|
||||||
|
"change_email" = "⚙️📧 Correo electrónico"
|
||||||
|
"change_comment" = "⚙️💬 Comentario"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ ¡Exitosa!"
|
"successfulOperation" = "✅ ¡Exitosa!"
|
||||||
"errorOperation" = "❗ Error en la Operación."
|
"errorOperation" = "❗ Error en la Operación."
|
||||||
|
|
|
@ -584,6 +584,25 @@
|
||||||
"yes" = "✅ بله"
|
"yes" = "✅ بله"
|
||||||
"no" = "❌ خیر"
|
"no" = "❌ خیر"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID بهروزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید."
|
||||||
|
"received_password" = "🔑📥 رمز عبور بهروزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید."
|
||||||
|
"received_email" = "📧📥 ایمیل بهروزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید."
|
||||||
|
"received_comment" = "💬📥 نظر بهروزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید."
|
||||||
|
"id_prompt" = "🔑 ID پیشفرض: {{ .ClientId }}\n\nلطفاً ID خود را وارد کنید."
|
||||||
|
"pass_prompt" = "🔑 رمز عبور پیشفرض: {{ .ClientPassword }}\n\nلطفاً رمز عبور خود را وارد کنید."
|
||||||
|
"email_prompt" = "📧 ایمیل پیشفرض: {{ .ClientEmail }}\n\nلطفاً ایمیل خود را وارد کنید."
|
||||||
|
"comment_prompt" = "💬 نظر پیشفرض: {{ .ClientComment }}\n\nلطفاً نظر خود را وارد کنید."
|
||||||
|
"inbound_client_data_id" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما میتوانید مشتری را به ورودی اضافه کنید!"
|
||||||
|
"inbound_client_data_pass" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما میتوانید مشتری را به ورودی اضافه کنید!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما میتوانید مشتری را به ورودی اضافه کنید!"
|
||||||
|
"client_data_pass" = "🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما میتوانید مشتری را به ورودی اضافه کنید!"
|
||||||
|
"cancel" = "❌ فرایند لغو شد! \n\nشما میتوانید هر زمان با /start دوباره شروع کنید. 🔄"
|
||||||
|
"error_add_client" = "⚠️ خطا:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "باشه، من با مقدار پیشفرض ادامه میدم. 😊"
|
||||||
|
"incorrect_input" = "ورودی شما نامعتبر است.\nعبارات باید پیوسته باشند بدون فاصله.\nمثال صحیح: aaaaaa\nمثال غلط: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ بستن کیبورد"
|
"closeKeyboard" = "❌ بستن کیبورد"
|
||||||
"cancel" = "❌ لغو"
|
"cancel" = "❌ لغو"
|
||||||
|
@ -618,6 +637,15 @@
|
||||||
"getBanLogs" = "گزارش های بلوک را دریافت کنید"
|
"getBanLogs" = "گزارش های بلوک را دریافت کنید"
|
||||||
"allClients" = "همه مشتریان"
|
"allClients" = "همه مشتریان"
|
||||||
|
|
||||||
|
"addClient" = "اضافه کردن مشتری"
|
||||||
|
"submitDisable" = "ارسال به عنوان غیرفعال ✅"
|
||||||
|
"use_default" = "🏷️ استفاده از پیشفرض"
|
||||||
|
"change_id" = "⚙️🔑 شناسه"
|
||||||
|
"change_password" = "⚙️🔑 رمز عبور"
|
||||||
|
"change_email" = "⚙️📧 ایمیل"
|
||||||
|
"change_comment" = "⚙️💬 نظر"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ انجام شد!"
|
"successfulOperation" = "✅ انجام شد!"
|
||||||
"errorOperation" = "❗ خطا در عملیات."
|
"errorOperation" = "❗ خطا در عملیات."
|
||||||
|
|
|
@ -583,6 +583,24 @@
|
||||||
"yes" = "✅ Ya"
|
"yes" = "✅ Ya"
|
||||||
"no" = "❌ Tidak"
|
"no" = "❌ Tidak"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID diperbarui. Tekan refresh untuk melihat perubahan."
|
||||||
|
"received_password" = "🔑📥 Kata sandi diperbarui. Tekan refresh untuk melihat perubahan."
|
||||||
|
"received_email" = "📧📥 Email diperbarui. Tekan refresh untuk melihat perubahan."
|
||||||
|
"received_comment" = "💬📥 Komentar diperbarui. Tekan refresh untuk melihat perubahan."
|
||||||
|
"id_prompt" = "🔑 ID default: {{ .ClientId }}\n\nMasukkan ID Anda."
|
||||||
|
"pass_prompt" = "🔑 Kata sandi default: {{ .ClientPassword }}\n\nMasukkan kata sandi Anda."
|
||||||
|
"email_prompt" = "📧 Email default: {{ .ClientEmail }}\n\nMasukkan email Anda."
|
||||||
|
"comment_prompt" = "💬 Komentar default: {{ .ClientComment }}\n\nMasukkan komentar Anda."
|
||||||
|
"inbound_client_data_id" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!"
|
||||||
|
"inbound_client_data_pass" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 Kata sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!"
|
||||||
|
"client_data_pass" = "🔑 Kata sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!"
|
||||||
|
"cancel" = "❌ Proses dibatalkan! \n\nAnda dapat /start kapan saja. 🔄"
|
||||||
|
"error_add_client" = "⚠️ Kesalahan:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "Baik, saya akan tetap dengan nilai default. 😊"
|
||||||
|
"incorrect_input" = "Input Anda tidak valid.\nFrasa harus berurutan tanpa spasi.\nContoh yang benar: aaaaaa\nContoh yang salah: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Tutup Papan Ketik"
|
"closeKeyboard" = "❌ Tutup Papan Ketik"
|
||||||
"cancel" = "❌ Batal"
|
"cancel" = "❌ Batal"
|
||||||
|
@ -617,6 +635,15 @@
|
||||||
"getBanLogs" = "Dapatkan Log Pemblokiran"
|
"getBanLogs" = "Dapatkan Log Pemblokiran"
|
||||||
"allClients" = "Semua Klien"
|
"allClients" = "Semua Klien"
|
||||||
|
|
||||||
|
"addClient" = "Tambah Klien"
|
||||||
|
"submitDisable" = "Kirim Sebagai Nonaktif ✅"
|
||||||
|
"use_default" = "🏷️ Gunakan default"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 Kata Sandi"
|
||||||
|
"change_email" = "⚙️📧 Email"
|
||||||
|
"change_comment" = "⚙️💬 Komentar"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Operasi berhasil!"
|
"successfulOperation" = "✅ Operasi berhasil!"
|
||||||
"errorOperation" = "❗ Kesalahan dalam operasi."
|
"errorOperation" = "❗ Kesalahan dalam operasi."
|
||||||
|
|
|
@ -584,6 +584,24 @@
|
||||||
"yes" = "✅ はい"
|
"yes" = "✅ はい"
|
||||||
"no" = "❌ いいえ"
|
"no" = "❌ いいえ"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 IDが更新されました。変更を見るにはリフレッシュを押してください。"
|
||||||
|
"received_password" = "🔑📥 パスワードが更新されました。変更を見るにはリフレッシュを押してください。"
|
||||||
|
"received_email" = "📧📥 メールが更新されました。変更を見るにはリフレッシュを押してください。"
|
||||||
|
"received_comment" = "💬📥 コメントが更新されました。変更を見るにはリフレッシュを押してください。"
|
||||||
|
"id_prompt" = "🔑 デフォルトID: {{ .ClientId }}\n\nIDを入力してください。"
|
||||||
|
"pass_prompt" = "🔑 デフォルトパスワード: {{ .ClientPassword }}\n\nパスワードを入力してください。"
|
||||||
|
"email_prompt" = "📧 デフォルトメール: {{ .ClientEmail }}\n\nメールアドレスを入力してください。"
|
||||||
|
"comment_prompt" = "💬 デフォルトコメント: {{ .ClientComment }}\n\nコメントを入力してください。"
|
||||||
|
"inbound_client_data_id" = "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます!"
|
||||||
|
"inbound_client_data_pass" = "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます!"
|
||||||
|
"client_data_pass" = "🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます!"
|
||||||
|
"cancel" = "❌ 処理がキャンセルされました! \n\nいつでも/startを使用して再開できます。 🔄"
|
||||||
|
"error_add_client" = "⚠️ エラー:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "わかりました、デフォルト値を使用します。😊"
|
||||||
|
"incorrect_input" = "入力が無効です。\nフレーズはスペースなしで連続している必要があります。\n正しい例: aaaaaa\n間違った例: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ キーボードを閉じる"
|
"closeKeyboard" = "❌ キーボードを閉じる"
|
||||||
"cancel" = "❌ キャンセル"
|
"cancel" = "❌ キャンセル"
|
||||||
|
@ -618,6 +636,15 @@
|
||||||
"getBanLogs" = "禁止ログ"
|
"getBanLogs" = "禁止ログ"
|
||||||
"allClients" = "すべてのクライアント"
|
"allClients" = "すべてのクライアント"
|
||||||
|
|
||||||
|
"addClient" = "クライアントを追加"
|
||||||
|
"submitDisable" = "無効として送信 ✅"
|
||||||
|
"use_default" = "🏷️ デフォルトを使用"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 パスワード"
|
||||||
|
"change_email" = "⚙️📧 メール"
|
||||||
|
"change_comment" = "⚙️💬 コメント"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ 成功!"
|
"successfulOperation" = "✅ 成功!"
|
||||||
"errorOperation" = "❗ 操作エラー。"
|
"errorOperation" = "❗ 操作エラー。"
|
||||||
|
|
|
@ -584,6 +584,24 @@
|
||||||
"yes" = "✅ Sim"
|
"yes" = "✅ Sim"
|
||||||
"no" = "❌ Não"
|
"no" = "❌ Não"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID atualizado. Pressione atualizar para ver as mudanças."
|
||||||
|
"received_password" = "🔑📥 Senha atualizada. Pressione atualizar para ver as mudanças."
|
||||||
|
"received_email" = "📧📥 Email atualizado. Pressione atualizar para ver as mudanças."
|
||||||
|
"received_comment" = "💬📥 Comentário atualizado. Pressione atualizar para ver as mudanças."
|
||||||
|
"id_prompt" = "🔑 ID padrão: {{ .ClientId }}\n\nDigite seu ID."
|
||||||
|
"pass_prompt" = "🔑 Senha padrão: {{ .ClientPassword }}\n\nDigite sua senha."
|
||||||
|
"email_prompt" = "📧 Email padrão: {{ .ClientEmail }}\n\nDigite seu email."
|
||||||
|
"comment_prompt" = "💬 Comentário padrão: {{ .ClientComment }}\n\nDigite seu comentário."
|
||||||
|
"inbound_client_data_id" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!"
|
||||||
|
"inbound_client_data_pass" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Senha: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!"
|
||||||
|
"client_data_pass" = "🔑 Senha: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!"
|
||||||
|
"cancel" = "❌ Processo cancelado! \n\nVocê pode /start novamente a qualquer momento. 🔄"
|
||||||
|
"error_add_client" = "⚠️ Erro:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "Ok, vou manter o valor padrão. 😊"
|
||||||
|
"incorrect_input" = "Sua entrada não é válida.\nAs frases devem ser contínuas sem espaços.\nExemplo correto: aaaaaa\nExemplo incorreto: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Fechar teclado"
|
"closeKeyboard" = "❌ Fechar teclado"
|
||||||
"cancel" = "❌ Cancelar"
|
"cancel" = "❌ Cancelar"
|
||||||
|
@ -618,6 +636,15 @@
|
||||||
"getBanLogs" = "Obter logs de banimento"
|
"getBanLogs" = "Obter logs de banimento"
|
||||||
"allClients" = "Todos os clientes"
|
"allClients" = "Todos os clientes"
|
||||||
|
|
||||||
|
"addClient" = "Adicionar Cliente"
|
||||||
|
"submitDisable" = "Enviar como Desativado ✅"
|
||||||
|
"use_default" = "🏷️ Usar padrão"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 Senha"
|
||||||
|
"change_email" = "⚙️📧 E-mail"
|
||||||
|
"change_comment" = "⚙️💬 Comentário"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Operação bem-sucedida!"
|
"successfulOperation" = "✅ Operação bem-sucedida!"
|
||||||
"errorOperation" = "❗ Erro na operação."
|
"errorOperation" = "❗ Erro na operação."
|
||||||
|
|
|
@ -584,6 +584,24 @@
|
||||||
"yes" = "✅ Да"
|
"yes" = "✅ Да"
|
||||||
"no" = "❌ Нет"
|
"no" = "❌ Нет"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID обновлен. Нажмите обновить, чтобы увидеть изменения."
|
||||||
|
"received_password" = "🔑📥 Пароль обновлен. Нажмите обновить, чтобы увидеть изменения."
|
||||||
|
"received_email" = "📧📥 Электронная почта обновлена. Нажмите обновить, чтобы увидеть изменения."
|
||||||
|
"received_comment" = "💬📥 Комментарий обновлен. Нажмите обновить, чтобы увидеть изменения."
|
||||||
|
"id_prompt" = "🔑 ID по умолчанию: {{ .ClientId }}\n\nВведите ваш ID."
|
||||||
|
"pass_prompt" = "🔑 Пароль по умолчанию: {{ .ClientPassword }}\n\nВведите ваш пароль."
|
||||||
|
"email_prompt" = "📧 Электронная почта по умолчанию: {{ .ClientEmail }}\n\nВведите ваш email."
|
||||||
|
"comment_prompt" = "💬 Комментарий по умолчанию: {{ .ClientComment }}\n\nВведите ваш комментарий."
|
||||||
|
"inbound_client_data_id" = "🔄 Входящие: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
|
||||||
|
"inbound_client_data_pass" = "🔄 Входящие: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
|
||||||
|
"client_data_pass" = "🔑 Пароль: {{ .ClientPass }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
|
||||||
|
"cancel" = "❌ Процесс отменен! \n\nВы можете /start снова в любое время. 🔄"
|
||||||
|
"error_add_client" = "⚠️ Ошибка:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "Хорошо, я оставлю значение по умолчанию. 😊"
|
||||||
|
"incorrect_input" = "Ваш ввод недействителен.\nФразы должны быть непрерывными без пробелов.\nПравильный пример: aaaaaa\nНеправильный пример: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Закрыть клавиатуру"
|
"closeKeyboard" = "❌ Закрыть клавиатуру"
|
||||||
"cancel" = "❌ Отмена"
|
"cancel" = "❌ Отмена"
|
||||||
|
@ -618,6 +636,15 @@
|
||||||
"getBanLogs" = "Журнал блокировок"
|
"getBanLogs" = "Журнал блокировок"
|
||||||
"allClients" = "Все клиенты"
|
"allClients" = "Все клиенты"
|
||||||
|
|
||||||
|
"addClient" = "Добавить клиента"
|
||||||
|
"submitDisable" = "Отправить как отключенный ✅"
|
||||||
|
"use_default" = "🏷️ Использовать по умолчанию"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 Пароль"
|
||||||
|
"change_email" = "⚙️📧 Электронная почта"
|
||||||
|
"change_comment" = "⚙️💬 Комментарий"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Успешно!"
|
"successfulOperation" = "✅ Успешно!"
|
||||||
"errorOperation" = "❗ Ошибка в операции."
|
"errorOperation" = "❗ Ошибка в операции."
|
||||||
|
|
|
@ -584,6 +584,24 @@
|
||||||
"yes" = "✅ Evet"
|
"yes" = "✅ Evet"
|
||||||
"no" = "❌ Hayır"
|
"no" = "❌ Hayır"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID güncellendi. Değişiklikleri görmek için yenileyin."
|
||||||
|
"received_password" = "🔑📥 Şifre güncellendi. Değişiklikleri görmek için yenileyin."
|
||||||
|
"received_email" = "📧📥 E-posta güncellendi. Değişiklikleri görmek için yenileyin."
|
||||||
|
"received_comment" = "💬📥 Yorum güncellendi. Değişiklikleri görmek için yenileyin."
|
||||||
|
"id_prompt" = "🔑 Varsayılan ID: {{ .ClientId }}\n\nID'nizi girin."
|
||||||
|
"pass_prompt" = "🔑 Varsayılan Şifre: {{ .ClientPassword }}\n\nŞifrenizi 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_id" = "🔄 Gelen: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!"
|
||||||
|
"inbound_client_data_pass" = "🔄 Gelen: {{ .InboundRemark }}\n\n🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!"
|
||||||
|
"client_data_pass" = "🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!"
|
||||||
|
"cancel" = "❌ İşlem iptal edildi! \n\nHer zaman /start ile tekrar başlayabilirsiniz. 🔄"
|
||||||
|
"error_add_client" = "⚠️ Hata:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "Tamam, varsayılan değeri kullanacağım. 😊"
|
||||||
|
"incorrect_input" = "Girdiğiniz geçersiz.\nCümleler boşluk olmadan ardışık olmalıdır.\nDoğru örnek: aaaaaa\nYanlış örnek: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Klavyeyi Kapat"
|
"closeKeyboard" = "❌ Klavyeyi Kapat"
|
||||||
"cancel" = "❌ İptal"
|
"cancel" = "❌ İptal"
|
||||||
|
@ -618,6 +636,15 @@
|
||||||
"getBanLogs" = "Yasak Günlüklerini Al"
|
"getBanLogs" = "Yasak Günlüklerini Al"
|
||||||
"allClients" = "Tüm Müşteriler"
|
"allClients" = "Tüm Müşteriler"
|
||||||
|
|
||||||
|
"addClient" = "Müşteri Ekle"
|
||||||
|
"submitDisable" = "Devre Dışı Olarak Gönder ✅"
|
||||||
|
"use_default" = "🏷️ Varsayılanı Kullan"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 Şifre"
|
||||||
|
"change_email" = "⚙️📧 E-posta"
|
||||||
|
"change_comment" = "⚙️💬 Yorum"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ İşlem başarılı!"
|
"successfulOperation" = "✅ İşlem başarılı!"
|
||||||
"errorOperation" = "❗ İşlemde hata."
|
"errorOperation" = "❗ İşlemde hata."
|
||||||
|
|
|
@ -584,6 +584,24 @@
|
||||||
"yes" = "✅ Так"
|
"yes" = "✅ Так"
|
||||||
"no" = "❌ Ні"
|
"no" = "❌ Ні"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID оновлено. Натисніть оновити, щоб побачити зміни."
|
||||||
|
"received_password" = "🔑📥 Пароль оновлено. Натисніть оновити, щоб побачити зміни."
|
||||||
|
"received_email" = "📧📥 Електронну пошту оновлено. Натисніть оновити, щоб побачити зміни."
|
||||||
|
"received_comment" = "💬📥 Коментар оновлено. Натисніть оновити, щоб побачити зміни."
|
||||||
|
"id_prompt" = "🔑 ID за замовчуванням: {{ .ClientId }}\n\nВведіть свій ID."
|
||||||
|
"pass_prompt" = "🔑 Пароль за замовчуванням: {{ .ClientPassword }}\n\nВведіть свій пароль."
|
||||||
|
"email_prompt" = "📧 Електронна пошта за замовчуванням: {{ .ClientEmail }}\n\nВведіть свою електронну пошту."
|
||||||
|
"comment_prompt" = "💬 Коментар за замовчуванням: {{ .ClientComment }}\n\nВведіть свій коментар."
|
||||||
|
"inbound_client_data_id" = "🔄 Вхідні: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
|
||||||
|
"inbound_client_data_pass" = "🔄 Вхідні: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
|
||||||
|
"client_data_pass" = "🔑 Пароль: {{ .ClientPass }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
|
||||||
|
"cancel" = "❌ Процес скасовано! \n\nВи можете /start знову в будь-який час. 🔄"
|
||||||
|
"error_add_client" = "⚠️ Помилка:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "Добре, я залишу значення за замовчуванням. 😊"
|
||||||
|
"incorrect_input" = "Ваш ввід недійсний.\nФрази повинні йти без пробілів.\nПравильний приклад: aaaaaa\nНеправильний приклад: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Закрити клавіатуру"
|
"closeKeyboard" = "❌ Закрити клавіатуру"
|
||||||
"cancel" = "❌ Скасувати"
|
"cancel" = "❌ Скасувати"
|
||||||
|
@ -618,6 +636,15 @@
|
||||||
"getBanLogs" = "Отримати журнали заборон"
|
"getBanLogs" = "Отримати журнали заборон"
|
||||||
"allClients" = "Всі Клієнти"
|
"allClients" = "Всі Клієнти"
|
||||||
|
|
||||||
|
"addClient" = "Додати клієнта"
|
||||||
|
"submitDisable" = "Надіслати як вимкнене ✅"
|
||||||
|
"use_default" = "🏷️ Використовувати за замовчуванням"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 Пароль"
|
||||||
|
"change_email" = "⚙️📧 Електронна пошта"
|
||||||
|
"change_comment" = "⚙️💬 Коментар"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Операція успішна!"
|
"successfulOperation" = "✅ Операція успішна!"
|
||||||
"errorOperation" = "❗ Помилка в роботі."
|
"errorOperation" = "❗ Помилка в роботі."
|
||||||
|
|
|
@ -584,6 +584,24 @@
|
||||||
"yes" = "✅ Có"
|
"yes" = "✅ Có"
|
||||||
"no" = "❌ Không"
|
"no" = "❌ Không"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID đã được cập nhật. Nhấn làm mới để xem thay đổi."
|
||||||
|
"received_password" = "🔑📥 Mật khẩu đã được cập nhật. Nhấn làm mới để xem thay đổi."
|
||||||
|
"received_email" = "📧📥 Email đã được cập nhật. Nhấn làm mới để xem thay đổi."
|
||||||
|
"received_comment" = "💬📥 Bình luận đã được cập nhật. Nhấn làm mới để xem thay đổi."
|
||||||
|
"id_prompt" = "🔑 ID mặc định: {{ .ClientId }}\n\nNhập ID của bạn."
|
||||||
|
"pass_prompt" = "🔑 Mật khẩu mặc định: {{ .ClientPassword }}\n\nNhập mật khẩu 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_id" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!"
|
||||||
|
"inbound_client_data_pass" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 Mật khẩu: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!"
|
||||||
|
"client_data_pass" = "🔑 Mật khẩu: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!"
|
||||||
|
"cancel" = "❌ Quá trình đã hủy! \n\nBạn có thể /start lại bất cứ lúc nào. 🔄"
|
||||||
|
"error_add_client" = "⚠️ Lỗi:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "Được rồi, tôi sẽ giữ giá trị mặc định. 😊"
|
||||||
|
"incorrect_input" = "Dữ liệu bạn nhập không hợp lệ.\nCác cụm từ phải liên tiếp mà không có khoảng trắng.\nVí dụ đúng: aaaaaa\nVí dụ sai: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ Đóng Bàn Phím"
|
"closeKeyboard" = "❌ Đóng Bàn Phím"
|
||||||
"cancel" = "❌ Hủy"
|
"cancel" = "❌ Hủy"
|
||||||
|
@ -618,6 +636,15 @@
|
||||||
"getBanLogs" = "Cấm nhật ký"
|
"getBanLogs" = "Cấm nhật ký"
|
||||||
"allClients" = "Tất cả Khách hàng"
|
"allClients" = "Tất cả Khách hàng"
|
||||||
|
|
||||||
|
"addClient" = "Thêm Khách Hàng"
|
||||||
|
"submitDisable" = "Gửi Dưới Dạng Tắt ✅"
|
||||||
|
"use_default" = "🏷️ Sử dụng mặc định"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 Mật khẩu"
|
||||||
|
"change_email" = "⚙️📧 Email"
|
||||||
|
"change_comment" = "⚙️💬 Bình luận"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ Thành công!"
|
"successfulOperation" = "✅ Thành công!"
|
||||||
"errorOperation" = "❗ Lỗi Trong Quá Trình Thực Hiện."
|
"errorOperation" = "❗ Lỗi Trong Quá Trình Thực Hiện."
|
||||||
|
|
|
@ -584,6 +584,24 @@
|
||||||
"yes" = "✅ 是的"
|
"yes" = "✅ 是的"
|
||||||
"no" = "❌ 没有"
|
"no" = "❌ 没有"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID 已更新。请点击刷新查看更改。"
|
||||||
|
"received_password" = "🔑📥 密码已更新。请点击刷新查看更改。"
|
||||||
|
"received_email" = "📧📥 电子邮件已更新。请点击刷新查看更改。"
|
||||||
|
"received_comment" = "💬📥 评论已更新。请点击刷新查看更改。"
|
||||||
|
"id_prompt" = "🔑 默认 ID: {{ .ClientId }}\n\n请输入您的 ID。"
|
||||||
|
"pass_prompt" = "🔑 默认密码: {{ .ClientPassword }}\n\n请输入您的密码。"
|
||||||
|
"email_prompt" = "📧 默认电子邮件: {{ .ClientEmail }}\n\n请输入您的电子邮件。"
|
||||||
|
"comment_prompt" = "💬 默认评论: {{ .ClientComment }}\n\n请输入您的评论。"
|
||||||
|
"inbound_client_data_id" = "🔄 传入数据: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中!"
|
||||||
|
"inbound_client_data_pass" = "🔄 传入数据: {{ .InboundRemark }}\n\n🔑 密码: {{ .ClientPass }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中!"
|
||||||
|
"client_data_pass" = "🔑 密码: {{ .ClientPass }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中!"
|
||||||
|
"cancel" = "❌ 过程已取消! \n\n您可以随时重新开始 /start。 🔄"
|
||||||
|
"error_add_client" = "⚠️ 错误:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "好的,我将使用默认值。😊"
|
||||||
|
"incorrect_input" = "您的输入无效。\n短语应连续无空格。\n正确示例: aaaaaa\n错误示例: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ 关闭键盘"
|
"closeKeyboard" = "❌ 关闭键盘"
|
||||||
"cancel" = "❌ 取消"
|
"cancel" = "❌ 取消"
|
||||||
|
@ -618,6 +636,15 @@
|
||||||
"getBanLogs" = "禁止日志"
|
"getBanLogs" = "禁止日志"
|
||||||
"allClients" = "所有客户"
|
"allClients" = "所有客户"
|
||||||
|
|
||||||
|
"addClient" = "添加客户"
|
||||||
|
"submitDisable" = "提交为禁用 ✅"
|
||||||
|
"use_default" = "🏷️ 使用默认"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 密码"
|
||||||
|
"change_email" = "⚙️📧 邮箱"
|
||||||
|
"change_comment" = "⚙️💬 评论"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ 成功!"
|
"successfulOperation" = "✅ 成功!"
|
||||||
"errorOperation" = "❗ 操作错误。"
|
"errorOperation" = "❗ 操作错误。"
|
||||||
|
|
|
@ -584,6 +584,24 @@
|
||||||
"yes" = "✅ 是的"
|
"yes" = "✅ 是的"
|
||||||
"no" = "❌ 沒有"
|
"no" = "❌ 沒有"
|
||||||
|
|
||||||
|
"received_id" = "🔑📥 ID 已更新。請按刷新查看變更。"
|
||||||
|
"received_password" = "🔑📥 密碼已更新。請按刷新查看變更。"
|
||||||
|
"received_email" = "📧📥 電子郵件已更新。請按刷新查看變更。"
|
||||||
|
"received_comment" = "💬📥 評論已更新。請按刷新查看變更。"
|
||||||
|
"id_prompt" = "🔑 預設 ID: {{ .ClientId }}\n\n請輸入您的 ID。"
|
||||||
|
"pass_prompt" = "🔑 預設密碼: {{ .ClientPassword }}\n\n請輸入您的密碼。"
|
||||||
|
"email_prompt" = "📧 預設電子郵件: {{ .ClientEmail }}\n\n請輸入您的電子郵件。"
|
||||||
|
"comment_prompt" = "💬 預設評論: {{ .ClientComment }}\n\n請輸入您的評論。"
|
||||||
|
"inbound_client_data_id" = "🔄 進來資料: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中!"
|
||||||
|
"inbound_client_data_pass" = "🔄 進來資料: {{ .InboundRemark }}\n\n🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中!"
|
||||||
|
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中!"
|
||||||
|
"client_data_pass" = "🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中!"
|
||||||
|
"cancel" = "❌ 處理已取消! \n\n您可以隨時重新開始 /start。 🔄"
|
||||||
|
"error_add_client" = "⚠️ 錯誤:\n\n {{ .error }}"
|
||||||
|
"using_default_value" = "好的,我會使用預設值。😊"
|
||||||
|
"incorrect_input" = "您的輸入無效。\n短語應該連貫而不應有空格。\n正確範例: aaaaaa\n錯誤範例: aaa aaa 🚫"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.buttons]
|
[tgbot.buttons]
|
||||||
"closeKeyboard" = "❌ 關閉鍵盤"
|
"closeKeyboard" = "❌ 關閉鍵盤"
|
||||||
"cancel" = "❌ 取消"
|
"cancel" = "❌ 取消"
|
||||||
|
@ -618,6 +636,15 @@
|
||||||
"getBanLogs" = "禁止日誌"
|
"getBanLogs" = "禁止日誌"
|
||||||
"allClients" = "所有客戶"
|
"allClients" = "所有客戶"
|
||||||
|
|
||||||
|
"addClient" = "新增客戶"
|
||||||
|
"submitDisable" = "提交為停用 ✅"
|
||||||
|
"use_default" = "🏷️ 使用預設"
|
||||||
|
"change_id" = "⚙️🔑 ID"
|
||||||
|
"change_password" = "⚙️🔑 密碼"
|
||||||
|
"change_email" = "⚙️📧 電子郵件"
|
||||||
|
"change_comment" = "⚙️💬 評論"
|
||||||
|
|
||||||
|
|
||||||
[tgbot.answers]
|
[tgbot.answers]
|
||||||
"successfulOperation" = "✅ 成功!"
|
"successfulOperation" = "✅ 成功!"
|
||||||
"errorOperation" = "❗ 操作錯誤。"
|
"errorOperation" = "❗ 操作錯誤。"
|
||||||
|
|
Loading…
Reference in a new issue