Tgbot menu commands

This commit is contained in:
sergeev_ms 2025-03-08 17:27:06 +03:00
parent c6d27a4463
commit 671aa0e277
13 changed files with 122 additions and 33 deletions

View file

@ -20,7 +20,7 @@ import (
"x-ui/web/locale" "x-ui/web/locale"
"x-ui/xray" "x-ui/xray"
"github.com/mymmrac/telego" tg "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"
"github.com/valyala/fasthttp" "github.com/valyala/fasthttp"
@ -28,7 +28,7 @@ import (
) )
var ( var (
bot *telego.Bot bot *tg.Bot
botHandler *th.BotHandler botHandler *th.BotHandler
adminIds []int64 adminIds []int64
isRunning bool isRunning bool
@ -121,6 +121,11 @@ func (t *Tgbot) Start(i18nFS embed.FS) error {
return err return err
} }
err = bot.SetMyCommands(t.getMenuCommands())
if err != nil {
logger.Warning("Failed to set menu commands:", err)
}
// Start receiving Telegram bot messages // Start receiving Telegram bot messages
if !isRunning { if !isRunning {
logger.Info("Telegram bot receiver started") logger.Info("Telegram bot receiver started")
@ -131,40 +136,52 @@ func (t *Tgbot) Start(i18nFS embed.FS) error {
return nil return nil
} }
func (t *Tgbot) NewBot(token string, proxyUrl string, apiServerUrl string) (*telego.Bot, error) { func (t *Tgbot) getMenuCommands() *tg.SetMyCommandsParams {
//commands, err := bot.GetMyCommands(nil)
commandsParams := tg.SetMyCommandsParams{}
commands := []tg.BotCommand{
{"help", t.I18nBot("tgbot.menu.help")},
{"status", t.I18nBot("tgbot.menu.status")},
{"restart", t.I18nBot("tgbot.menu.restart")},
{"id", t.I18nBot("tgbot.menu.tgChatId")},
}
return commandsParams.WithCommands(commands...)
}
func (t *Tgbot) NewBot(token string, proxyUrl string, apiServerUrl string) (*tg.Bot, error) {
if proxyUrl == "" && apiServerUrl == "" { if proxyUrl == "" && apiServerUrl == "" {
return telego.NewBot(token) return tg.NewBot(token)
} }
if proxyUrl != "" { if proxyUrl != "" {
if !strings.HasPrefix(proxyUrl, "socks5://") { if !strings.HasPrefix(proxyUrl, "socks5://") {
logger.Warning("Invalid socks5 URL, using default") logger.Warning("Invalid socks5 URL, using default")
return telego.NewBot(token) return tg.NewBot(token)
} }
_, err := url.Parse(proxyUrl) _, err := url.Parse(proxyUrl)
if err != nil { if err != nil {
logger.Warningf("Can't parse proxy URL, using default instance for tgbot: %v", err) logger.Warningf("Can't parse proxy URL, using default instance for tgbot: %v", err)
return telego.NewBot(token) return tg.NewBot(token)
} }
return telego.NewBot(token, telego.WithFastHTTPClient(&fasthttp.Client{ return tg.NewBot(token, tg.WithFastHTTPClient(&fasthttp.Client{
Dial: fasthttpproxy.FasthttpSocksDialer(proxyUrl), Dial: fasthttpproxy.FasthttpSocksDialer(proxyUrl),
})) }))
} }
if !strings.HasPrefix(apiServerUrl, "http") { if !strings.HasPrefix(apiServerUrl, "http") {
logger.Warning("Invalid http(s) URL, using default") logger.Warning("Invalid http(s) URL, using default")
return telego.NewBot(token) return tg.NewBot(token)
} }
_, err := url.Parse(apiServerUrl) _, err := url.Parse(apiServerUrl)
if err != nil { if err != nil {
logger.Warningf("Can't parse API server URL, using default instance for tgbot: %v", err) logger.Warningf("Can't parse API server URL, using default instance for tgbot: %v", err)
return telego.NewBot(token) return tg.NewBot(token)
} }
return telego.NewBot(token, telego.WithAPIServer(apiServerUrl)) return tg.NewBot(token, tg.WithAPIServer(apiServerUrl))
} }
func (t *Tgbot) IsRunning() bool { func (t *Tgbot) IsRunning() bool {
@ -212,7 +229,7 @@ func (t *Tgbot) decodeQuery(query string) (string, error) {
} }
func (t *Tgbot) OnReceive() { func (t *Tgbot) OnReceive() {
params := telego.GetUpdatesParams{ params := tg.GetUpdatesParams{
Timeout: 10, Timeout: 10,
} }
@ -220,19 +237,19 @@ 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(_ *tg.Bot, message tg.Message) {
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(_ *tg.Bot, message tg.Message) {
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(_ *tg.Bot, query tg.CallbackQuery) {
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(_ *tg.Bot, message tg.Message) {
if message.UsersShared != nil { if message.UsersShared != nil {
if checkAdmin(message.From.ID) { if checkAdmin(message.From.ID) {
for _, sharedUser := range message.UsersShared.Users { for _, sharedUser := range message.UsersShared.Users {
@ -258,7 +275,7 @@ func (t *Tgbot) OnReceive() {
botHandler.Start() botHandler.Start()
} }
func (t *Tgbot) answerCommand(message *telego.Message, chatId int64, isAdmin bool) { func (t *Tgbot) answerCommand(message *tg.Message, chatId int64, isAdmin bool) {
msg, onlyMessage := "", false msg, onlyMessage := "", false
command, _, commandArgs := tu.ParseCommand(message.Text) command, _, commandArgs := tu.ParseCommand(message.Text)
@ -344,7 +361,7 @@ func (t *Tgbot) sendResponse(chatId int64, msg string, onlyMessage, isAdmin bool
} }
} }
func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) { func (t *Tgbot) answerCallback(callbackQuery *tg.CallbackQuery, isAdmin bool) {
chatId := callbackQuery.Message.GetChat().ID chatId := callbackQuery.Message.GetChat().ID
if isAdmin { if isAdmin {
@ -931,7 +948,7 @@ func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) {
), ),
) )
var ReplyMarkup telego.ReplyMarkup var ReplyMarkup tg.ReplyMarkup
if isAdmin { if isAdmin {
ReplyMarkup = numericKeyboard ReplyMarkup = numericKeyboard
} else { } else {
@ -940,7 +957,7 @@ func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) {
t.SendMsgToTgbot(chatId, msg, ReplyMarkup) t.SendMsgToTgbot(chatId, msg, ReplyMarkup)
} }
func (t *Tgbot) SendMsgToTgbot(chatId int64, msg string, replyMarkup ...telego.ReplyMarkup) { func (t *Tgbot) SendMsgToTgbot(chatId int64, msg string, replyMarkup ...tg.ReplyMarkup) {
if !isRunning { if !isRunning {
return return
} }
@ -973,7 +990,7 @@ func (t *Tgbot) SendMsgToTgbot(chatId int64, msg string, replyMarkup ...telego.R
allMessages = append(allMessages, msg) allMessages = append(allMessages, msg)
} }
for n, message := range allMessages { for n, message := range allMessages {
params := telego.SendMessageParams{ params := tg.SendMessageParams{
ChatID: tu.ID(chatId), ChatID: tu.ID(chatId),
Text: message, Text: message,
ParseMode: "HTML", ParseMode: "HTML",
@ -990,7 +1007,7 @@ func (t *Tgbot) SendMsgToTgbot(chatId int64, msg string, replyMarkup ...telego.R
} }
} }
func (t *Tgbot) SendMsgToTgbotAdmins(msg string, replyMarkup ...telego.ReplyMarkup) { func (t *Tgbot) SendMsgToTgbotAdmins(msg string, replyMarkup ...tg.ReplyMarkup) {
if len(replyMarkup) > 0 { if len(replyMarkup) > 0 {
for _, adminId := range adminIds { for _, adminId := range adminIds {
t.SendMsgToTgbot(adminId, msg, replyMarkup[0]) t.SendMsgToTgbot(adminId, msg, replyMarkup[0])
@ -1167,9 +1184,9 @@ func (t *Tgbot) getInboundUsages() string {
return info return info
} }
func (t *Tgbot) getInbounds() (*telego.InlineKeyboardMarkup, error) { func (t *Tgbot) getInbounds() (*tg.InlineKeyboardMarkup, error) {
inbounds, err := t.inboundService.GetAllInbounds() inbounds, err := t.inboundService.GetAllInbounds()
var buttons []telego.InlineKeyboardButton var buttons []tg.InlineKeyboardButton
if err != nil { if err != nil {
logger.Warning("GetAllInbounds run failed:", err) logger.Warning("GetAllInbounds run failed:", err)
@ -1199,14 +1216,14 @@ func (t *Tgbot) getInbounds() (*telego.InlineKeyboardMarkup, error) {
return keyboard, nil return keyboard, nil
} }
func (t *Tgbot) getInboundClients(id int) (*telego.InlineKeyboardMarkup, error) { func (t *Tgbot) getInboundClients(id int) (*tg.InlineKeyboardMarkup, error) {
inbound, err := t.inboundService.GetInbound(id) inbound, err := t.inboundService.GetInbound(id)
if err != nil { if err != nil {
logger.Warning("getIboundClients run failed:", err) logger.Warning("getIboundClients run failed:", err)
return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed")) return nil, errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
} }
clients, err := t.inboundService.GetClients(inbound) clients, err := t.inboundService.GetClients(inbound)
var buttons []telego.InlineKeyboardButton var buttons []tg.InlineKeyboardButton
if err != nil { if err != nil {
logger.Warning("GetInboundClients run failed:", err) logger.Warning("GetInboundClients run failed:", err)
@ -1428,7 +1445,7 @@ func (t *Tgbot) clientTelegramUserInfo(chatId int64, email string, messageID ...
t.editMessageTgBot(chatId, messageID[0], output, inlineKeyboard) t.editMessageTgBot(chatId, messageID[0], output, inlineKeyboard)
} else { } else {
t.SendMsgToTgbot(chatId, output, inlineKeyboard) t.SendMsgToTgbot(chatId, output, inlineKeyboard)
requestUser := telego.KeyboardButtonRequestUsers{ requestUser := tg.KeyboardButtonRequestUsers{
RequestID: int32(traffic.Id), RequestID: int32(traffic.Id),
UserIsBot: new(bool), UserIsBot: new(bool),
} }
@ -1601,7 +1618,7 @@ func (t *Tgbot) getExhausted(chatId int64) {
if exhaustedCC > 0 { if exhaustedCC > 0 {
output += t.I18nBot("tgbot.messages.depleteSoon", "Deplete=="+t.I18nBot("tgbot.clients")) output += t.I18nBot("tgbot.messages.depleteSoon", "Deplete=="+t.I18nBot("tgbot.clients"))
var buttons []telego.InlineKeyboardButton var buttons []tg.InlineKeyboardButton
for _, traffic := range exhaustedClients { for _, traffic := range exhaustedClients {
output += t.clientInfoMsg(&traffic, true, false, false, true, true, false) output += t.clientInfoMsg(&traffic, true, false, false, true, true, false)
output += "\r\n" output += "\r\n"
@ -1714,7 +1731,7 @@ func (t *Tgbot) onlineClients(chatId int64, messageID ...int) {
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData(t.encodeQuery("onlines_refresh")))) tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData(t.encodeQuery("onlines_refresh"))))
if onlinesCount > 0 { if onlinesCount > 0 {
var buttons []telego.InlineKeyboardButton var buttons []tg.InlineKeyboardButton
for _, online := range onlines { for _, online := range onlines {
buttons = append(buttons, tu.InlineKeyboardButton(online).WithCallbackData(t.encodeQuery("client_get_usage "+online))) buttons = append(buttons, tu.InlineKeyboardButton(online).WithCallbackData(t.encodeQuery("client_get_usage "+online)))
} }
@ -1825,7 +1842,7 @@ func (t *Tgbot) sendBanLogs(chatId int64, dt bool) {
} }
func (t *Tgbot) sendCallbackAnswerTgBot(id string, message string) { func (t *Tgbot) sendCallbackAnswerTgBot(id string, message string) {
params := telego.AnswerCallbackQueryParams{ params := tg.AnswerCallbackQueryParams{
CallbackQueryID: id, CallbackQueryID: id,
Text: message, Text: message,
} }
@ -1834,8 +1851,8 @@ func (t *Tgbot) sendCallbackAnswerTgBot(id string, message string) {
} }
} }
func (t *Tgbot) editMessageCallbackTgBot(chatId int64, messageID int, inlineKeyboard *telego.InlineKeyboardMarkup) { func (t *Tgbot) editMessageCallbackTgBot(chatId int64, messageID int, inlineKeyboard *tg.InlineKeyboardMarkup) {
params := telego.EditMessageReplyMarkupParams{ params := tg.EditMessageReplyMarkupParams{
ChatID: tu.ID(chatId), ChatID: tu.ID(chatId),
MessageID: messageID, MessageID: messageID,
ReplyMarkup: inlineKeyboard, ReplyMarkup: inlineKeyboard,
@ -1845,8 +1862,8 @@ func (t *Tgbot) editMessageCallbackTgBot(chatId int64, messageID int, inlineKeyb
} }
} }
func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, inlineKeyboard ...*telego.InlineKeyboardMarkup) { func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, inlineKeyboard ...*tg.InlineKeyboardMarkup) {
params := telego.EditMessageTextParams{ params := tg.EditMessageTextParams{
ChatID: tu.ID(chatId), ChatID: tu.ID(chatId),
MessageID: messageID, MessageID: messageID,
Text: text, Text: text,

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "Your configuration is not found!\r\nPlease ask your admin to use your Telegram ChatID in your configuration(s).\r\n\r\nYour ChatID: <code>{{ .TgUserID }}</code>" "askToAddUserId" = "Your configuration is not found!\r\nPlease ask your admin to use your Telegram ChatID in your configuration(s).\r\n\r\nYour ChatID: <code>{{ .TgUserID }}</code>"
"chooseClient" = "Choose a Client for Inbound {{ .Inbound }}" "chooseClient" = "Choose a Client for Inbound {{ .Inbound }}"
"chooseInbound" = "Choose an Inbound" "chooseInbound" = "Choose an Inbound"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "¡No se encuentra su configuración!\r\nPor favor, pídale a su administrador que use su ChatID de usuario de Telegram en su(s) configuración(es).\r\n\r\nSu ChatID de usuario: <code>{{ .TgUserID }}</code>" "askToAddUserId" = "¡No se encuentra su configuración!\r\nPor favor, pídale a su administrador que use su ChatID de usuario de Telegram en su(s) configuración(es).\r\n\r\nSu ChatID de usuario: <code>{{ .TgUserID }}</code>"
"chooseClient" = "Elige un Cliente para Inbound {{ .Inbound }}" "chooseClient" = "Elige un Cliente para Inbound {{ .Inbound }}"
"chooseInbound" = "Elige un Inbound" "chooseInbound" = "Elige un Inbound"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "پیکربندی شما یافت نشد!\r\nلطفاً از مدیر خود بخواهید که شناسه کاربر تلگرام خود را در پیکربندی (های) خود استفاده کند.\r\n\r\nشناسه کاربری شما: <code>{{ .TgUserID }}</code>" "askToAddUserId" = "پیکربندی شما یافت نشد!\r\nلطفاً از مدیر خود بخواهید که شناسه کاربر تلگرام خود را در پیکربندی (های) خود استفاده کند.\r\n\r\nشناسه کاربری شما: <code>{{ .TgUserID }}</code>"
"chooseClient" = "یک مشتری برای ورودی {{ .Inbound }} انتخاب کنید" "chooseClient" = "یک مشتری برای ورودی {{ .Inbound }} انتخاب کنید"
"chooseInbound" = "یک ورودی انتخاب کنید" "chooseInbound" = "یک ورودی انتخاب کنید"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"

View file

@ -627,3 +627,9 @@
"askToAddUserId" = "Konfigurasi Anda tidak ditemukan!\r\nSilakan minta admin Anda untuk menggunakan ChatID Telegram Anda dalam konfigurasi Anda.\r\n\r\nChatID Pengguna Anda: <code>{{ .TgUserID }}</code>" "askToAddUserId" = "Konfigurasi Anda tidak ditemukan!\r\nSilakan minta admin Anda untuk menggunakan ChatID Telegram Anda dalam konfigurasi Anda.\r\n\r\nChatID Pengguna Anda: <code>{{ .TgUserID }}</code>"
"chooseClient" = "Pilih Klien untuk Inbound {{ .Inbound }}" "chooseClient" = "Pilih Klien untuk Inbound {{ .Inbound }}"
"chooseInbound" = "Pilih Inbound" "chooseInbound" = "Pilih Inbound"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "設定が見つかりませんでした!\r\n管理者に問い合わせて、設定にTelegramユーザーのChatIDを使用してください。\r\n\r\nあなたのユーザーChatID<code>{{ .TgUserID }}</code>" "askToAddUserId" = "設定が見つかりませんでした!\r\n管理者に問い合わせて、設定にTelegramユーザーのChatIDを使用してください。\r\n\r\nあなたのユーザーChatID<code>{{ .TgUserID }}</code>"
"chooseClient" = "インバウンド {{ .Inbound }} のクライアントを選択" "chooseClient" = "インバウンド {{ .Inbound }} のクライアントを選択"
"chooseInbound" = "インバウンドを選択" "chooseInbound" = "インバウンドを選択"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "Sua configuração não foi encontrada!\r\nPeça ao seu administrador para usar seu Telegram ChatID em suas configurações.\r\n\r\nSeu ChatID: <code>{{ .TgUserID }}</code>" "askToAddUserId" = "Sua configuração não foi encontrada!\r\nPeça ao seu administrador para usar seu Telegram ChatID em suas configurações.\r\n\r\nSeu ChatID: <code>{{ .TgUserID }}</code>"
"chooseClient" = "Escolha um cliente para Inbound {{ .Inbound }}" "chooseClient" = "Escolha um cliente para Inbound {{ .Inbound }}"
"chooseInbound" = "Escolha um Inbound" "chooseInbound" = "Escolha um Inbound"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "Ваша конфигурация не найдена!\r\nПожалуйста, попросите администратора использовать ваш идентификатор пользователя Telegram в ваших конфигурациях.\r\n\r\nВаш идентификатор пользователя: <code>{{ .TgUserID }}</code>" "askToAddUserId" = "Ваша конфигурация не найдена!\r\nПожалуйста, попросите администратора использовать ваш идентификатор пользователя Telegram в ваших конфигурациях.\r\n\r\nВаш идентификатор пользователя: <code>{{ .TgUserID }}</code>"
"chooseClient" = "Выберите пользователя для подключения {{ .Inbound }}" "chooseClient" = "Выберите пользователя для подключения {{ .Inbound }}"
"chooseInbound" = "Выберите подключение" "chooseInbound" = "Выберите подключение"
[tgbot.menu]
"restart" = "Перезапуск Xray Core"
"tgChatId" = "ID чата Telegram"
"status" = "Статус бота"
"help" = "Доступные комманды бота"

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "Yapılandırmanız bulunamadı!\r\nLütfen yöneticinizden yapılandırmalarınıza Telegram ChatID'nizi eklemesini isteyin.\r\n\r\nKullanıcı ChatID'niz: <code>{{ .TgUserID }}</code>" "askToAddUserId" = "Yapılandırmanız bulunamadı!\r\nLütfen yöneticinizden yapılandırmalarınıza Telegram ChatID'nizi eklemesini isteyin.\r\n\r\nKullanıcı ChatID'niz: <code>{{ .TgUserID }}</code>"
"chooseClient" = "Gelen {{ .Inbound }} için bir Müşteri Seçin" "chooseClient" = "Gelen {{ .Inbound }} için bir Müşteri Seçin"
"chooseInbound" = "Bir Gelen Seçin" "chooseInbound" = "Bir Gelen Seçin"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "Вашу конфігурацію не знайдено!\r\nБудь ласка, попросіть свого адміністратора використовувати ваш ідентифікатор Telegram у вашій конфігурації.\r\n\r\nВаш ідентифікатор користувача: <code>{{ .TgUserID }}</code>" "askToAddUserId" = "Вашу конфігурацію не знайдено!\r\nБудь ласка, попросіть свого адміністратора використовувати ваш ідентифікатор Telegram у вашій конфігурації.\r\n\r\nВаш ідентифікатор користувача: <code>{{ .TgUserID }}</code>"
"chooseClient" = "Виберіть клієнта для Вхідного {{ .Inbound }}" "chooseClient" = "Виберіть клієнта для Вхідного {{ .Inbound }}"
"chooseInbound" = "Виберіть Вхідний" "chooseInbound" = "Виберіть Вхідний"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "Cấu hình của bạn không được tìm thấy!\r\nVui lòng yêu cầu Quản trị viên sử dụng ID người dùng telegram của bạn trong cấu hình của bạn.\r\n\r\nID người dùng của bạn: <code>{{ .TgUserID }}</code>" "askToAddUserId" = "Cấu hình của bạn không được tìm thấy!\r\nVui lòng yêu cầu Quản trị viên sử dụng ID người dùng telegram của bạn trong cấu hình của bạn.\r\n\r\nID người dùng của bạn: <code>{{ .TgUserID }}</code>"
"chooseClient" = "Chọn một Khách hàng cho Inbound {{ .Inbound }}" "chooseClient" = "Chọn một Khách hàng cho Inbound {{ .Inbound }}"
"chooseInbound" = "Chọn một Inbound" "chooseInbound" = "Chọn một Inbound"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "未找到您的配置!\r\n请向管理员询问在您的配置中使用您的 Telegram 用户 ChatID。\r\n\r\n您的用户 ChatID<code>{{ .TgUserID }}</code>" "askToAddUserId" = "未找到您的配置!\r\n请向管理员询问在您的配置中使用您的 Telegram 用户 ChatID。\r\n\r\n您的用户 ChatID<code>{{ .TgUserID }}</code>"
"chooseClient" = "为入站 {{ .Inbound }} 选择一个客户" "chooseClient" = "为入站 {{ .Inbound }} 选择一个客户"
"chooseInbound" = "选择一个入站" "chooseInbound" = "选择一个入站"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"

View file

@ -628,3 +628,9 @@
"askToAddUserId" = "未找到您的配置!\r\n請向管理員詢問在您的配置中使用您的 Telegram 使用者 ChatID。\r\n\r\n您的使用者 ChatID<code>{{ .TgUserID }}</code>" "askToAddUserId" = "未找到您的配置!\r\n請向管理員詢問在您的配置中使用您的 Telegram 使用者 ChatID。\r\n\r\n您的使用者 ChatID<code>{{ .TgUserID }}</code>"
"chooseClient" = "為入站 {{ .Inbound }} 選擇一個客戶" "chooseClient" = "為入站 {{ .Inbound }} 選擇一個客戶"
"chooseInbound" = "選擇一個入站" "chooseInbound" = "選擇一個入站"
[tgbot.menu]
"restart" = "To restart Xray Core"
"tgChatId" = "Telegram Chat ID"
"status" = "Bot status"
"help" = "Get available actions"