| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515 |
- package tgbot
- import (
- "context"
- "fmt"
- "html"
- "slices"
- "strconv"
- "strings"
- "time"
- "github.com/mhsanaei/3x-ui/v3/internal/logger"
- "github.com/mymmrac/telego"
- th "github.com/mymmrac/telego/telegohandler"
- tu "github.com/mymmrac/telego/telegoutil"
- )
- // OnReceive starts the message receiving loop for the Telegram bot.
- func (t *Tgbot) OnReceive() {
- params := telego.GetUpdatesParams{
- Timeout: 20, // Reduced timeout to detect connection issues faster
- }
- // Strict singleton: never start a second long-polling loop.
- tgBotMutex.Lock()
- if botCancel != nil || isRunning {
- tgBotMutex.Unlock()
- logger.Warning("TgBot OnReceive called while already running; ignoring.")
- return
- }
- ctx, cancel := context.WithCancel(context.Background())
- botCancel = cancel
- isRunning = true
- // Add to WaitGroup before releasing the lock so StopBot() can't return
- // before this receiver goroutine is accounted for.
- botWG.Add(1)
- tgBotMutex.Unlock()
- // Get updates channel using the context with shorter timeout for better error recovery
- updates, _ := bot.UpdatesViaLongPolling(ctx, ¶ms)
- go func() {
- defer botWG.Done()
- h, _ := th.NewBotHandler(bot, updates)
- tgBotMutex.Lock()
- botHandler = h
- tgBotMutex.Unlock()
- h.HandleMessage(func(ctx *th.Context, message telego.Message) error {
- delete(userStates, message.Chat.ID)
- t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.keyboardClosed"), tu.ReplyKeyboardRemove())
- return nil
- }, th.TextEqual(t.I18nBot("tgbot.buttons.closeKeyboard")))
- h.HandleMessage(func(ctx *th.Context, message telego.Message) error {
- if !t.isCommandForCurrentBot(&message) {
- return nil
- }
- // Use goroutine with worker pool for concurrent command processing
- go func() {
- messageWorkerPool <- struct{}{} // Acquire worker
- defer func() { <-messageWorkerPool }() // Release worker
- delete(userStates, message.Chat.ID)
- t.answerCommand(&message, message.Chat.ID, checkAdmin(message.From.ID))
- }()
- return nil
- }, th.AnyCommand())
- h.HandleCallbackQuery(func(ctx *th.Context, query telego.CallbackQuery) error {
- // Use goroutine with worker pool for concurrent callback processing
- go func() {
- messageWorkerPool <- struct{}{} // Acquire worker
- defer func() { <-messageWorkerPool }() // Release worker
- delete(userStates, query.Message.GetChat().ID)
- t.answerCallback(&query, checkAdmin(query.From.ID))
- }()
- return nil
- }, th.AnyCallbackQueryWithMessage())
- h.HandleMessage(func(ctx *th.Context, message telego.Message) error {
- if userState, exists := userStates[message.Chat.ID]; exists {
- switch userState {
- case "awaiting_email":
- if client_Email == strings.TrimSpace(message.Text) {
- t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
- delete(userStates, message.Chat.ID)
- return nil
- }
- 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)
- t.addClient(message.Chat.ID, t.BuildClientDraftMessage())
- }
- case "awaiting_comment":
- if client_Comment == strings.TrimSpace(message.Text) {
- t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
- delete(userStates, message.Chat.ID)
- return nil
- }
- 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)
- t.addClient(message.Chat.ID, t.BuildClientDraftMessage())
- case "awaiting_tg_id":
- input := strings.TrimSpace(message.Text)
- if input == "" || input == "-" || strings.EqualFold(input, "none") {
- client_TgID = ""
- t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
- delete(userStates, message.Chat.ID)
- t.addClient(message.Chat.ID, t.BuildClientDraftMessage())
- return nil
- }
- if _, err := strconv.ParseInt(input, 10, 64); err != nil {
- 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)
- return nil
- }
- client_TgID = input
- t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.userSaved"), 3, tu.ReplyKeyboardRemove())
- delete(userStates, message.Chat.ID)
- t.addClient(message.Chat.ID, t.BuildClientDraftMessage())
- }
- } else {
- if message.UsersShared != nil {
- if checkAdmin(message.From.ID) {
- for _, sharedUser := range message.UsersShared.Users {
- userID := sharedUser.UserID
- needRestart, err := t.clientService.SetClientTelegramUserID(&t.inboundService, 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())
- }
- }
- }
- return nil
- }, th.AnyMessage())
- h.Start()
- }()
- }
- // answerCommand processes incoming command messages from Telegram users.
- func (t *Tgbot) answerCommand(message *telego.Message, chatId int64, isAdmin bool) {
- msg, onlyMessage := "", false
- command, _, commandArgs := tu.ParseCommand(message.Text)
- // Helper function to handle unknown commands.
- handleUnknownCommand := func() {
- msg += t.I18nBot("tgbot.commands.unknown")
- }
- // Handle the command.
- switch command {
- case "help":
- msg += t.I18nBot("tgbot.commands.help")
- msg += t.I18nBot("tgbot.commands.pleaseChoose")
- case "start":
- msg += t.I18nBot("tgbot.commands.start", "Firstname=="+html.EscapeString(message.From.FirstName))
- if isAdmin {
- msg += t.I18nBot("tgbot.commands.welcome", "Hostname=="+hostname)
- }
- msg += "\n\n" + t.I18nBot("tgbot.commands.pleaseChoose")
- case "status":
- onlyMessage = true
- msg += t.I18nBot("tgbot.commands.status")
- case "id":
- onlyMessage = true
- msg += t.I18nBot("tgbot.commands.getID", "ID=="+strconv.FormatInt(message.From.ID, 10))
- case "usage":
- onlyMessage = true
- if len(commandArgs) > 0 {
- if isAdmin {
- t.searchClient(chatId, commandArgs[0])
- } else {
- t.getClientUsage(chatId, int64(message.From.ID), commandArgs[0])
- }
- } else {
- msg += t.I18nBot("tgbot.commands.usage")
- }
- case "inbound":
- onlyMessage = true
- if isAdmin && len(commandArgs) > 0 {
- t.searchInbound(chatId, commandArgs[0])
- } else {
- handleUnknownCommand()
- }
- case "restart":
- onlyMessage = true
- if isAdmin {
- if len(commandArgs) == 0 {
- if t.xrayService.IsXrayRunning() {
- err := t.xrayService.RestartXray(true)
- if err != nil {
- msg += t.I18nBot("tgbot.commands.restartFailed", "Error=="+err.Error())
- } else {
- msg += t.I18nBot("tgbot.commands.restartSuccess")
- }
- } else {
- msg += t.I18nBot("tgbot.commands.xrayNotRunning")
- }
- } else {
- handleUnknownCommand()
- msg += t.I18nBot("tgbot.commands.restartUsage")
- }
- } else {
- handleUnknownCommand()
- }
- default:
- handleUnknownCommand()
- }
- if msg != "" {
- t.sendResponse(chatId, msg, onlyMessage, isAdmin)
- }
- }
- func (t *Tgbot) isCommandForCurrentBot(message *telego.Message) bool {
- return isCommandForBot(message.Text, botUsername())
- }
- func botUsername() string {
- if bot == nil {
- return ""
- }
- return bot.Username()
- }
- func isCommandForBot(text string, username string) bool {
- _, commandUsername, _ := tu.ParseCommand(text)
- return commandUsername == "" || username == "" || strings.EqualFold(commandUsername, username)
- }
- // answerCallback processes callback queries from inline keyboards.
- func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) {
- chatId := callbackQuery.Message.GetChat().ID
- if isAdmin {
- // get query from hash storage
- decodedQuery, err := t.decodeQuery(callbackQuery.Data)
- if err != nil {
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.noQuery"))
- return
- }
- dataArray := strings.Split(decodedQuery, " ")
- if len(dataArray) >= 2 && len(dataArray[1]) > 0 {
- email := dataArray[1]
- switch dataArray[0] {
- case "get_clients_for_sub":
- inboundId := dataArray[1]
- inboundIdInt, err := strconv.Atoi(inboundId)
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- clientsKB, err := t.getInboundClientsFor(inboundIdInt, "client_sub_links")
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- inbound, _ := t.inboundService.GetInbound(inboundIdInt)
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clientsKB)
- case "get_clients_for_individual":
- inboundId := dataArray[1]
- inboundIdInt, err := strconv.Atoi(inboundId)
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- clientsKB, err := t.getInboundClientsFor(inboundIdInt, "client_individual_links")
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- inbound, _ := t.inboundService.GetInbound(inboundIdInt)
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clientsKB)
- case "get_clients_for_qr":
- inboundId := dataArray[1]
- inboundIdInt, err := strconv.Atoi(inboundId)
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- clientsKB, err := t.getInboundClientsFor(inboundIdInt, "client_qr_links")
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- inbound, _ := t.inboundService.GetInbound(inboundIdInt)
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clientsKB)
- case "client_sub_links":
- t.sendClientSubLinks(chatId, email)
- return
- case "client_individual_links":
- t.sendClientIndividualLinks(chatId, email)
- return
- case "client_qr_links":
- t.sendClientQRLinks(chatId, email)
- return
- case "client_get_usage":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.messages.email", "Email=="+email))
- t.searchClient(chatId, email)
- case "client_refresh":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.clientRefreshSuccess", "Email=="+email))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- case "client_cancel":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+email))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- case "ips_refresh":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.IpRefreshSuccess", "Email=="+email))
- t.searchClientIps(chatId, email, callbackQuery.Message.GetMessageID())
- case "ips_cancel":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+email))
- t.searchClientIps(chatId, email, callbackQuery.Message.GetMessageID())
- case "tgid_refresh":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.TGIdRefreshSuccess", "Email=="+email))
- t.clientTelegramUserInfo(chatId, email, callbackQuery.Message.GetMessageID())
- case "tgid_cancel":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+email))
- t.clientTelegramUserInfo(chatId, email, callbackQuery.Message.GetMessageID())
- case "reset_traffic":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancelReset")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmResetTraffic")).WithCallbackData(t.encodeQuery("reset_traffic_c "+email)),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- case "reset_traffic_c":
- err := t.inboundService.ResetClientTrafficByEmail(email)
- if err == nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.resetTrafficSuccess", "Email=="+email))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- } else {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- }
- case "limit_traffic":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 0")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" 0")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("1 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 1")),
- tu.InlineKeyboardButton("5 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 5")),
- tu.InlineKeyboardButton("10 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 10")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("20 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 20")),
- tu.InlineKeyboardButton("30 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 30")),
- tu.InlineKeyboardButton("40 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 40")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("50 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 50")),
- tu.InlineKeyboardButton("60 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 60")),
- tu.InlineKeyboardButton("80 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 80")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("100 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 100")),
- tu.InlineKeyboardButton("150 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 150")),
- tu.InlineKeyboardButton("200 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 200")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- case "limit_traffic_c":
- if len(dataArray) == 3 {
- limitTraffic, err := strconv.Atoi(dataArray[2])
- if err == nil {
- needRestart, err := t.clientService.ResetClientTrafficLimitByEmail(&t.inboundService, email, limitTraffic)
- if needRestart {
- t.xrayService.SetToNeedRestart()
- }
- if err == nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.setTrafficLimitSuccess", "Email=="+email))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- return
- }
- }
- }
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- case "limit_traffic_in":
- if len(dataArray) >= 3 {
- oldInputNumber, err := strconv.Atoi(dataArray[2])
- inputNumber := oldInputNumber
- if err == nil {
- if len(dataArray) == 4 {
- num, err := strconv.Atoi(dataArray[3])
- if err == nil {
- switch num {
- case -2:
- inputNumber = 0
- case -1:
- if inputNumber > 0 {
- inputNumber = (inputNumber / 10)
- }
- default:
- inputNumber = (inputNumber * 10) + num
- }
- }
- if inputNumber == oldInputNumber {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- return
- }
- if inputNumber >= 999999 {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- return
- }
- }
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumberAdd", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" "+strconv.Itoa(inputNumber))),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 1")),
- tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 2")),
- tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 3")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 4")),
- tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 5")),
- tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 6")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 7")),
- tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 8")),
- tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 9")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" -2")),
- tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 0")),
- tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" -1")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- return
- }
- }
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- case "add_client_limit_traffic_c":
- limitTraffic, _ := strconv.ParseInt(dataArray[1], 10, 64)
- client_TotalGB = limitTraffic * 1024 * 1024 * 1024
- messageId := callbackQuery.Message.GetMessageID()
- message_text := t.BuildClientDraftMessage()
- t.addClient(callbackQuery.Message.GetChat().ID, message_text, messageId)
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- case "add_client_limit_traffic_in":
- if len(dataArray) >= 2 {
- oldInputNumber, err := strconv.Atoi(dataArray[1])
- inputNumber := oldInputNumber
- if err == nil {
- if len(dataArray) == 3 {
- num, err := strconv.Atoi(dataArray[2])
- if err == nil {
- switch num {
- case -2:
- inputNumber = 0
- case -1:
- if inputNumber > 0 {
- inputNumber = (inputNumber / 10)
- }
- default:
- inputNumber = (inputNumber * 10) + num
- }
- }
- if inputNumber == oldInputNumber {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- return
- }
- if inputNumber >= 999999 {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- return
- }
- }
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_traffic_exp")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumberAdd", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("add_client_limit_traffic_c "+strconv.Itoa(inputNumber))),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 1")),
- tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 2")),
- tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 3")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 4")),
- tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 5")),
- tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 6")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 7")),
- tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 8")),
- tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 9")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" -2")),
- tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 0")),
- tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" -1")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- return
- }
- }
- case "reset_exp":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancelReset")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 0")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("reset_exp_in "+email+" 0")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 7 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 7")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 10 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 10")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 14 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 14")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 20 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 20")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 1 "+t.I18nBot("tgbot.month")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 30")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 3 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 90")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 6 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 180")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 12 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 365")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- case "reset_exp_c":
- if len(dataArray) == 3 {
- days, err := strconv.ParseInt(dataArray[2], 10, 64)
- if err == nil {
- var date int64
- if days > 0 {
- traffic, err := t.inboundService.GetClientTrafficByEmail(email)
- if err != nil {
- logger.Warning(err)
- msg := t.I18nBot("tgbot.wentWrong")
- t.SendMsgToTgbot(chatId, msg)
- return
- }
- if traffic == nil {
- msg := t.I18nBot("tgbot.noResult")
- t.SendMsgToTgbot(chatId, msg)
- return
- }
- if traffic.ExpiryTime > 0 {
- if traffic.ExpiryTime-time.Now().Unix()*1000 < 0 {
- date = -int64(days * 24 * 60 * 60000)
- } else {
- date = traffic.ExpiryTime + int64(days*24*60*60000)
- }
- } else {
- date = traffic.ExpiryTime - int64(days*24*60*60000)
- }
- }
- needRestart, err := t.clientService.ResetClientExpiryTimeByEmail(&t.inboundService, email, date)
- if needRestart {
- t.xrayService.SetToNeedRestart()
- }
- if err == nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.expireResetSuccess", "Email=="+email))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- return
- }
- }
- }
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- case "reset_exp_in":
- if len(dataArray) >= 3 {
- oldInputNumber, err := strconv.Atoi(dataArray[2])
- inputNumber := oldInputNumber
- if err == nil {
- if len(dataArray) == 4 {
- num, err := strconv.Atoi(dataArray[3])
- if err == nil {
- switch num {
- case -2:
- inputNumber = 0
- case -1:
- if inputNumber > 0 {
- inputNumber = (inputNumber / 10)
- }
- default:
- inputNumber = (inputNumber * 10) + num
- }
- }
- if inputNumber == oldInputNumber {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- return
- }
- if inputNumber >= 999999 {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- return
- }
- }
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumber", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" "+strconv.Itoa(inputNumber))),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 1")),
- tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 2")),
- tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 3")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 4")),
- tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 5")),
- tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 6")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 7")),
- tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 8")),
- tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 9")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" -2")),
- tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 0")),
- tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" -1")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- return
- }
- }
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- case "add_client_reset_exp_c":
- client_ExpiryTime = 0
- days, _ := strconv.ParseInt(dataArray[1], 10, 64)
- var date int64
- if client_ExpiryTime > 0 {
- if client_ExpiryTime-time.Now().Unix()*1000 < 0 {
- date = -int64(days * 24 * 60 * 60000)
- } else {
- date = client_ExpiryTime + int64(days*24*60*60000)
- }
- } else {
- date = client_ExpiryTime - int64(days*24*60*60000)
- }
- client_ExpiryTime = date
- messageId := callbackQuery.Message.GetMessageID()
- message_text := t.BuildClientDraftMessage()
- t.addClient(callbackQuery.Message.GetChat().ID, message_text, messageId)
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- case "add_client_reset_exp_in":
- if len(dataArray) >= 2 {
- oldInputNumber, err := strconv.Atoi(dataArray[1])
- inputNumber := oldInputNumber
- if err == nil {
- if len(dataArray) == 3 {
- num, err := strconv.Atoi(dataArray[2])
- if err == nil {
- switch num {
- case -2:
- inputNumber = 0
- case -1:
- if inputNumber > 0 {
- inputNumber = (inputNumber / 10)
- }
- default:
- inputNumber = (inputNumber * 10) + num
- }
- }
- if inputNumber == oldInputNumber {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- return
- }
- if inputNumber >= 999999 {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- return
- }
- }
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_traffic_exp")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumberAdd", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("add_client_reset_exp_c "+strconv.Itoa(inputNumber))),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 1")),
- tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 2")),
- tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 3")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 4")),
- tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 5")),
- tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 6")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 7")),
- tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 8")),
- tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 9")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" -2")),
- tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 0")),
- tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" -1")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- return
- }
- }
- case "ip_limit":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancelIpLimit")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 0")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("ip_limit_in "+email+" 0")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 1")),
- tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 2")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 3")),
- tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 4")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 5")),
- tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 6")),
- tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 7")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 8")),
- tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 9")),
- tu.InlineKeyboardButton("10").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 10")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- case "ip_limit_c":
- if len(dataArray) == 3 {
- count, err := strconv.Atoi(dataArray[2])
- if err == nil {
- needRestart, err := t.clientService.ResetClientIpLimitByEmail(&t.inboundService, email, count)
- if needRestart {
- t.xrayService.SetToNeedRestart()
- }
- if err == nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.resetIpSuccess", "Email=="+email, "Count=="+strconv.Itoa(count)))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- return
- }
- }
- }
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- case "ip_limit_in":
- if len(dataArray) >= 3 {
- oldInputNumber, err := strconv.Atoi(dataArray[2])
- inputNumber := oldInputNumber
- if err == nil {
- if len(dataArray) == 4 {
- num, err := strconv.Atoi(dataArray[3])
- if err == nil {
- switch num {
- case -2:
- inputNumber = 0
- case -1:
- if inputNumber > 0 {
- inputNumber = (inputNumber / 10)
- }
- default:
- inputNumber = (inputNumber * 10) + num
- }
- }
- if inputNumber == oldInputNumber {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- return
- }
- if inputNumber >= 999999 {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- return
- }
- }
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumber", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("ip_limit_c "+email+" "+strconv.Itoa(inputNumber))),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 1")),
- tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 2")),
- tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 3")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 4")),
- tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 5")),
- tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 6")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 7")),
- tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 8")),
- tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 9")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" -2")),
- tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 0")),
- tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" -1")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- return
- }
- }
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- case "add_client_ip_limit_c":
- if len(dataArray) == 2 {
- count, _ := strconv.Atoi(dataArray[1])
- client_LimitIP = count
- }
- messageId := callbackQuery.Message.GetMessageID()
- message_text := t.BuildClientDraftMessage()
- t.addClient(callbackQuery.Message.GetChat().ID, message_text, messageId)
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- case "add_client_ip_limit_in":
- if len(dataArray) >= 2 {
- oldInputNumber, err := strconv.Atoi(dataArray[1])
- inputNumber := oldInputNumber
- if err == nil {
- if len(dataArray) == 3 {
- num, err := strconv.Atoi(dataArray[2])
- if err == nil {
- switch num {
- case -2:
- inputNumber = 0
- case -1:
- if inputNumber > 0 {
- inputNumber = (inputNumber / 10)
- }
- default:
- inputNumber = (inputNumber * 10) + num
- }
- }
- if inputNumber == oldInputNumber {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- return
- }
- if inputNumber >= 999999 {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- return
- }
- }
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_ip_limit")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumber", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("add_client_ip_limit_c "+strconv.Itoa(inputNumber))),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 1")),
- tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 2")),
- tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 3")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 4")),
- tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 5")),
- tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 6")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 7")),
- tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 8")),
- tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 9")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" -2")),
- tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 0")),
- tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" -1")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- return
- }
- }
- case "clear_ips":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("ips_cancel "+email)),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmClearIps")).WithCallbackData(t.encodeQuery("clear_ips_c "+email)),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- case "clear_ips_c":
- err := t.inboundService.ClearClientIps(email)
- if err == nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.clearIpSuccess", "Email=="+email))
- t.searchClientIps(chatId, email, callbackQuery.Message.GetMessageID())
- } else {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- }
- case "ip_log":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.getIpLog", "Email=="+email))
- t.searchClientIps(chatId, email)
- case "tg_user":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.getUserInfo", "Email=="+email))
- t.clientTelegramUserInfo(chatId, email)
- case "tgid_remove":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("tgid_cancel "+email)),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmRemoveTGUser")).WithCallbackData(t.encodeQuery("tgid_remove_c "+email)),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- case "tgid_remove_c":
- traffic, err := t.inboundService.GetClientTrafficByEmail(email)
- if err != nil || traffic == nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- return
- }
- needRestart, err := t.clientService.SetClientTelegramUserID(&t.inboundService, traffic.Id, EmptyTelegramUserID)
- if needRestart {
- t.xrayService.SetToNeedRestart()
- }
- if err == nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.removedTGUserSuccess", "Email=="+email))
- t.clientTelegramUserInfo(chatId, email, callbackQuery.Message.GetMessageID())
- } else {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- }
- case "toggle_enable":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmToggle")).WithCallbackData(t.encodeQuery("toggle_enable_c "+email)),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- case "toggle_enable_c":
- enabled, needRestart, err := t.clientService.ToggleClientEnableByEmail(&t.inboundService, email)
- if needRestart {
- t.xrayService.SetToNeedRestart()
- }
- if err == nil {
- if enabled {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.enableSuccess", "Email=="+email))
- } else {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.disableSuccess", "Email=="+email))
- }
- t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
- } else {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
- }
- case "get_clients":
- inboundId := dataArray[1]
- inboundIdInt, err := strconv.Atoi(inboundId)
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- inbound, err := t.inboundService.GetInbound(inboundIdInt)
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- clients, err := t.getInboundClients(inboundIdInt)
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clients)
- case "add_client_to":
- 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
- inboundId := dataArray[1]
- inboundIdInt, err := strconv.Atoi(inboundId)
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- receiver_inbound_ID = inboundIdInt
- receiver_inbound_IDs = []int{inboundIdInt}
- t.addClient(callbackQuery.Message.GetChat().ID, t.BuildClientDraftMessage())
- case "add_client_toggle_attach":
- inboundIdStr := dataArray[1]
- inboundIdInt, err := strconv.Atoi(inboundIdStr)
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- found := -1
- for i, id := range receiver_inbound_IDs {
- if id == inboundIdInt {
- found = i
- break
- }
- }
- if found >= 0 {
- receiver_inbound_IDs = append(receiver_inbound_IDs[:found], receiver_inbound_IDs[found+1:]...)
- } else {
- receiver_inbound_IDs = append(receiver_inbound_IDs, inboundIdInt)
- }
- picker, err := t.getInboundsAttachPicker()
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- t.editMessageCallbackTgBot(callbackQuery.Message.GetChat().ID, callbackQuery.Message.GetMessageID(), picker)
- }
- return
- } else {
- switch callbackQuery.Data {
- case "get_inbounds":
- inbounds, err := t.getInbounds()
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.allClients"))
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
- case "admin_client_sub_links":
- inbounds, err := t.getInboundsFor("get_clients_for_sub")
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
- case "admin_client_individual_links":
- inbounds, err := t.getInboundsFor("get_clients_for_individual")
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
- case "admin_client_qr_links":
- inbounds, err := t.getInboundsFor("get_clients_for_qr")
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
- }
- }
- }
- switch callbackQuery.Data {
- case "get_usage":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.serverUsage"))
- t.getServerUsage(chatId)
- case "usage_refresh":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- t.getServerUsage(chatId, callbackQuery.Message.GetMessageID())
- case "inbounds":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.getInbounds"))
- t.SendMsgToTgbot(chatId, t.getInboundUsages())
- case "deplete_soon":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.depleteSoon"))
- t.getExhausted(chatId)
- case "get_backup":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.dbBackup"))
- t.sendBackup(chatId)
- case "get_banlogs":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.getBanLogs"))
- t.sendBanLogs(chatId, true)
- case "client_traffic":
- tgUserID := callbackQuery.From.ID
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.clientUsage"))
- t.getClientUsage(chatId, tgUserID)
- case "client_commands":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.commands"))
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.helpClientCommands"))
- case "client_sub_links":
- // show user's own clients to choose one for sub links
- tgUserID := callbackQuery.From.ID
- traffics, err := t.inboundService.GetClientTrafficTgBot(tgUserID)
- if err != nil {
- // fallback to message
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation")+"\r\n"+err.Error())
- return
- }
- if len(traffics) == 0 {
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.askToAddUserId", "TgUserID=="+strconv.FormatInt(tgUserID, 10)))
- return
- }
- var buttons []telego.InlineKeyboardButton
- for _, tr := range traffics {
- buttons = append(buttons, tu.InlineKeyboardButton(tr.Email).WithCallbackData(t.encodeQuery("client_sub_links "+tr.Email)))
- }
- cols := 1
- if len(buttons) >= 6 {
- cols = 2
- }
- keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols, buttons...))
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.pleaseChoose"), keyboard)
- case "client_individual_links":
- // show user's clients to choose for individual links
- tgUserID := callbackQuery.From.ID
- traffics, err := t.inboundService.GetClientTrafficTgBot(tgUserID)
- if err != nil {
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation")+"\r\n"+err.Error())
- return
- }
- if len(traffics) == 0 {
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.askToAddUserId", "TgUserID=="+strconv.FormatInt(tgUserID, 10)))
- return
- }
- var buttons2 []telego.InlineKeyboardButton
- for _, tr := range traffics {
- buttons2 = append(buttons2, tu.InlineKeyboardButton(tr.Email).WithCallbackData(t.encodeQuery("client_individual_links "+tr.Email)))
- }
- cols2 := 1
- if len(buttons2) >= 6 {
- cols2 = 2
- }
- keyboard2 := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols2, buttons2...))
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.pleaseChoose"), keyboard2)
- case "client_qr_links":
- // show user's clients to choose for QR codes
- tgUserID := callbackQuery.From.ID
- traffics, err := t.inboundService.GetClientTrafficTgBot(tgUserID)
- if err != nil {
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOccurred")+"\r\n"+err.Error())
- return
- }
- if len(traffics) == 0 {
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.askToAddUserId", "TgUserID=="+strconv.FormatInt(tgUserID, 10)))
- return
- }
- var buttons3 []telego.InlineKeyboardButton
- for _, tr := range traffics {
- buttons3 = append(buttons3, tu.InlineKeyboardButton(tr.Email).WithCallbackData(t.encodeQuery("client_qr_links "+tr.Email)))
- }
- cols3 := 1
- if len(buttons3) >= 6 {
- cols3 = 2
- }
- keyboard3 := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols3, buttons3...))
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.pleaseChoose"), keyboard3)
- case "onlines":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.onlines"))
- t.onlineClients(chatId)
- case "onlines_refresh":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
- t.onlineClients(chatId, callbackQuery.Message.GetMessageID())
- case "commands":
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.commands"))
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.helpAdminCommands"))
- case "add_client":
- 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
- inbounds, err := t.getInboundsAddClient()
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.addClient"))
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
- case "add_client_ch_default_email":
- t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- 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.email_prompt", "ClientEmail=="+client_Email)
- t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
- case "add_client_ch_default_comment":
- t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- 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_tg_id":
- t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- userStates[chatId] = "awaiting_tg_id"
- cancel_btn_markup := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
- ),
- )
- current := client_TgID
- if current == "" {
- current = "—"
- }
- t.SendMsgToTgbot(chatId, fmt.Sprintf("Send the Telegram user id (numeric) to attach to this client, or send `-` / `none` to clear.\nCurrent: `%s`", current), cancel_btn_markup)
- case "add_client_ch_default_traffic":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_traffic_exp")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 0")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("add_client_limit_traffic_in 0")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("1 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 1")),
- tu.InlineKeyboardButton("5 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 5")),
- tu.InlineKeyboardButton("10 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 10")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("20 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 20")),
- tu.InlineKeyboardButton("30 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 30")),
- tu.InlineKeyboardButton("40 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 40")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("50 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 50")),
- tu.InlineKeyboardButton("60 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 60")),
- tu.InlineKeyboardButton("80 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 80")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("100 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 100")),
- tu.InlineKeyboardButton("150 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 150")),
- tu.InlineKeyboardButton("200 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 200")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- case "add_client_ch_default_exp":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_traffic_exp")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 0")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("add_client_reset_exp_in 0")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 7 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 7")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 10 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 10")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 14 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 14")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 20 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 20")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 1 "+t.I18nBot("tgbot.month")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 30")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 3 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 90")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 6 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 180")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 12 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 365")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- case "add_client_ch_default_ip_limit":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_ip_limit")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("add_client_ip_limit_c 0")),
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("add_client_ip_limit_in 0")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 1")),
- tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 2")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 3")),
- tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 4")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 5")),
- tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 6")),
- tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 7")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 8")),
- tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 9")),
- tu.InlineKeyboardButton("10").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 10")),
- ),
- )
- t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
- case "add_client_default_info":
- t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
- delete(userStates, chatId)
- t.addClient(chatId, t.BuildClientDraftMessage())
- case "add_client_cancel":
- delete(userStates, chatId)
- receiver_inbound_ID = 0
- receiver_inbound_IDs = nil
- t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.cancel"), 3, tu.ReplyKeyboardRemove())
- case "add_client_default_traffic_exp":
- messageId := callbackQuery.Message.GetMessageID()
- message_text := t.BuildClientDraftMessage()
- t.addClient(chatId, message_text, messageId)
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+client_Email))
- case "add_client_default_ip_limit":
- messageId := callbackQuery.Message.GetMessageID()
- message_text := t.BuildClientDraftMessage()
- t.addClient(chatId, message_text, messageId)
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+client_Email))
- case "add_client_attach_more":
- picker, err := t.getInboundsAttachPicker()
- if err != nil {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
- return
- }
- t.SendMsgToTgbot(chatId, "Pick inbound(s) to attach:", picker)
- case "add_client_attach_done":
- if receiver_inbound_ID == 0 && len(receiver_inbound_IDs) > 0 {
- receiver_inbound_ID = receiver_inbound_IDs[0]
- }
- if receiver_inbound_ID == 0 {
- t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.getInboundsFailed"))
- return
- }
- message_text := t.BuildClientDraftMessage()
- t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- t.addClient(chatId, message_text)
- 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.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.successfulOperation"), tu.ReplyKeyboardRemove())
- t.sendClientIndividualLinks(chatId, client_Email)
- t.sendClientQRLinks(chatId, client_Email)
- receiver_inbound_ID = 0
- receiver_inbound_IDs = nil
- }
- case "add_client_submit_enable":
- client_Enable = true
- _, 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.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.successfulOperation"), tu.ReplyKeyboardRemove())
- t.sendClientIndividualLinks(chatId, client_Email)
- t.sendClientQRLinks(chatId, client_Email)
- receiver_inbound_ID = 0
- receiver_inbound_IDs = nil
- }
- case "reset_all_traffics_cancel":
- t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.cancel"), 1, tu.ReplyKeyboardRemove())
- case "reset_all_traffics":
- inlineKeyboard := tu.InlineKeyboard(
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancelReset")).WithCallbackData(t.encodeQuery("reset_all_traffics_cancel")),
- ),
- tu.InlineKeyboardRow(
- tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmResetTraffic")).WithCallbackData(t.encodeQuery("reset_all_traffics_c")),
- ),
- )
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.AreYouSure"), inlineKeyboard)
- case "reset_all_traffics_c":
- t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- emails, err := t.inboundService.GetAllEmails()
- if err != nil {
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation"), tu.ReplyKeyboardRemove())
- return
- }
- for _, email := range emails {
- err := t.inboundService.ResetClientTrafficByEmail(email)
- if err == nil {
- msg := t.I18nBot("tgbot.messages.SuccessResetTraffic", "ClientEmail=="+email)
- t.SendMsgToTgbot(chatId, msg, tu.ReplyKeyboardRemove())
- } else {
- msg := t.I18nBot("tgbot.messages.FailedResetTraffic", "ClientEmail=="+email, "ErrorMessage=="+err.Error())
- t.SendMsgToTgbot(chatId, msg, tu.ReplyKeyboardRemove())
- }
- }
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.FinishProcess"), tu.ReplyKeyboardRemove())
- case "get_sorted_traffic_usage_report":
- t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
- emails, err := t.inboundService.GetAllEmails()
- if err != nil {
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation"), tu.ReplyKeyboardRemove())
- return
- }
- valid_emails, extra_emails, err := t.inboundService.FilterAndSortClientEmails(emails)
- if err != nil {
- t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation"), tu.ReplyKeyboardRemove())
- return
- }
- for _, valid_emails := range valid_emails {
- traffic, err := t.inboundService.GetClientTrafficByEmail(valid_emails)
- if err != nil {
- logger.Warning(err)
- msg := t.I18nBot("tgbot.wentWrong")
- t.SendMsgToTgbot(chatId, msg)
- continue
- }
- if traffic == nil {
- msg := t.I18nBot("tgbot.noResult")
- t.SendMsgToTgbot(chatId, msg)
- continue
- }
- output := t.clientInfoMsg(traffic, false, false, false, false, true, false)
- t.SendMsgToTgbot(chatId, output, tu.ReplyKeyboardRemove())
- }
- for _, extra_emails := range extra_emails {
- msg := fmt.Sprintf("📧 %s\n%s", extra_emails, t.I18nBot("tgbot.noResult"))
- t.SendMsgToTgbot(chatId, msg, tu.ReplyKeyboardRemove())
- }
- default:
- if after, ok := strings.CutPrefix(callbackQuery.Data, "client_sub_links "); ok {
- email := after
- t.sendClientSubLinks(chatId, email)
- return
- }
- if after, ok := strings.CutPrefix(callbackQuery.Data, "client_individual_links "); ok {
- email := after
- t.sendClientIndividualLinks(chatId, email)
- return
- }
- if after, ok := strings.CutPrefix(callbackQuery.Data, "client_qr_links "); ok {
- email := after
- t.sendClientQRLinks(chatId, email)
- return
- }
- }
- }
- // checkAdmin checks if the given Telegram ID is an admin.
- func checkAdmin(tgId int64) bool {
- return slices.Contains(adminIds, tgId)
- }
|