tgbot_router.go 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515
  1. package tgbot
  2. import (
  3. "context"
  4. "fmt"
  5. "html"
  6. "slices"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "github.com/mhsanaei/3x-ui/v3/internal/logger"
  11. "github.com/mymmrac/telego"
  12. th "github.com/mymmrac/telego/telegohandler"
  13. tu "github.com/mymmrac/telego/telegoutil"
  14. )
  15. // OnReceive starts the message receiving loop for the Telegram bot.
  16. func (t *Tgbot) OnReceive() {
  17. params := telego.GetUpdatesParams{
  18. Timeout: 20, // Reduced timeout to detect connection issues faster
  19. }
  20. // Strict singleton: never start a second long-polling loop.
  21. tgBotMutex.Lock()
  22. if botCancel != nil || isRunning {
  23. tgBotMutex.Unlock()
  24. logger.Warning("TgBot OnReceive called while already running; ignoring.")
  25. return
  26. }
  27. ctx, cancel := context.WithCancel(context.Background())
  28. botCancel = cancel
  29. isRunning = true
  30. // Add to WaitGroup before releasing the lock so StopBot() can't return
  31. // before this receiver goroutine is accounted for.
  32. botWG.Add(1)
  33. tgBotMutex.Unlock()
  34. // Get updates channel using the context with shorter timeout for better error recovery
  35. updates, _ := bot.UpdatesViaLongPolling(ctx, &params)
  36. go func() {
  37. defer botWG.Done()
  38. h, _ := th.NewBotHandler(bot, updates)
  39. tgBotMutex.Lock()
  40. botHandler = h
  41. tgBotMutex.Unlock()
  42. h.HandleMessage(func(ctx *th.Context, message telego.Message) error {
  43. delete(userStates, message.Chat.ID)
  44. t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.keyboardClosed"), tu.ReplyKeyboardRemove())
  45. return nil
  46. }, th.TextEqual(t.I18nBot("tgbot.buttons.closeKeyboard")))
  47. h.HandleMessage(func(ctx *th.Context, message telego.Message) error {
  48. if !t.isCommandForCurrentBot(&message) {
  49. return nil
  50. }
  51. // Use goroutine with worker pool for concurrent command processing
  52. go func() {
  53. messageWorkerPool <- struct{}{} // Acquire worker
  54. defer func() { <-messageWorkerPool }() // Release worker
  55. delete(userStates, message.Chat.ID)
  56. t.answerCommand(&message, message.Chat.ID, checkAdmin(message.From.ID))
  57. }()
  58. return nil
  59. }, th.AnyCommand())
  60. h.HandleCallbackQuery(func(ctx *th.Context, query telego.CallbackQuery) error {
  61. // Use goroutine with worker pool for concurrent callback processing
  62. go func() {
  63. messageWorkerPool <- struct{}{} // Acquire worker
  64. defer func() { <-messageWorkerPool }() // Release worker
  65. delete(userStates, query.Message.GetChat().ID)
  66. t.answerCallback(&query, checkAdmin(query.From.ID))
  67. }()
  68. return nil
  69. }, th.AnyCallbackQueryWithMessage())
  70. h.HandleMessage(func(ctx *th.Context, message telego.Message) error {
  71. if userState, exists := userStates[message.Chat.ID]; exists {
  72. switch userState {
  73. case "awaiting_email":
  74. if client_Email == strings.TrimSpace(message.Text) {
  75. t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
  76. delete(userStates, message.Chat.ID)
  77. return nil
  78. }
  79. client_Email = strings.TrimSpace(message.Text)
  80. if t.isSingleWord(client_Email) {
  81. userStates[message.Chat.ID] = "awaiting_email"
  82. cancel_btn_markup := tu.InlineKeyboard(
  83. tu.InlineKeyboardRow(
  84. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
  85. ),
  86. )
  87. t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
  88. } else {
  89. t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_email"), 3, tu.ReplyKeyboardRemove())
  90. delete(userStates, message.Chat.ID)
  91. t.addClient(message.Chat.ID, t.BuildClientDraftMessage())
  92. }
  93. case "awaiting_comment":
  94. if client_Comment == strings.TrimSpace(message.Text) {
  95. t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
  96. delete(userStates, message.Chat.ID)
  97. return nil
  98. }
  99. client_Comment = strings.TrimSpace(message.Text)
  100. t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_comment"), 3, tu.ReplyKeyboardRemove())
  101. delete(userStates, message.Chat.ID)
  102. t.addClient(message.Chat.ID, t.BuildClientDraftMessage())
  103. case "awaiting_tg_id":
  104. input := strings.TrimSpace(message.Text)
  105. if input == "" || input == "-" || strings.EqualFold(input, "none") {
  106. client_TgID = ""
  107. t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
  108. delete(userStates, message.Chat.ID)
  109. t.addClient(message.Chat.ID, t.BuildClientDraftMessage())
  110. return nil
  111. }
  112. if _, err := strconv.ParseInt(input, 10, 64); err != nil {
  113. cancel_btn_markup := tu.InlineKeyboard(
  114. tu.InlineKeyboardRow(
  115. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
  116. ),
  117. )
  118. t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
  119. return nil
  120. }
  121. client_TgID = input
  122. t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.userSaved"), 3, tu.ReplyKeyboardRemove())
  123. delete(userStates, message.Chat.ID)
  124. t.addClient(message.Chat.ID, t.BuildClientDraftMessage())
  125. }
  126. } else {
  127. if message.UsersShared != nil {
  128. if checkAdmin(message.From.ID) {
  129. for _, sharedUser := range message.UsersShared.Users {
  130. userID := sharedUser.UserID
  131. needRestart, err := t.clientService.SetClientTelegramUserID(&t.inboundService, message.UsersShared.RequestID, userID)
  132. if needRestart {
  133. t.xrayService.SetToNeedRestart()
  134. }
  135. output := ""
  136. if err != nil {
  137. output += t.I18nBot("tgbot.messages.selectUserFailed")
  138. } else {
  139. output += t.I18nBot("tgbot.messages.userSaved")
  140. }
  141. t.SendMsgToTgbot(message.Chat.ID, output, tu.ReplyKeyboardRemove())
  142. }
  143. } else {
  144. t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.noResult"), tu.ReplyKeyboardRemove())
  145. }
  146. }
  147. }
  148. return nil
  149. }, th.AnyMessage())
  150. h.Start()
  151. }()
  152. }
  153. // answerCommand processes incoming command messages from Telegram users.
  154. func (t *Tgbot) answerCommand(message *telego.Message, chatId int64, isAdmin bool) {
  155. msg, onlyMessage := "", false
  156. command, _, commandArgs := tu.ParseCommand(message.Text)
  157. // Helper function to handle unknown commands.
  158. handleUnknownCommand := func() {
  159. msg += t.I18nBot("tgbot.commands.unknown")
  160. }
  161. // Handle the command.
  162. switch command {
  163. case "help":
  164. msg += t.I18nBot("tgbot.commands.help")
  165. msg += t.I18nBot("tgbot.commands.pleaseChoose")
  166. case "start":
  167. msg += t.I18nBot("tgbot.commands.start", "Firstname=="+html.EscapeString(message.From.FirstName))
  168. if isAdmin {
  169. msg += t.I18nBot("tgbot.commands.welcome", "Hostname=="+hostname)
  170. }
  171. msg += "\n\n" + t.I18nBot("tgbot.commands.pleaseChoose")
  172. case "status":
  173. onlyMessage = true
  174. msg += t.I18nBot("tgbot.commands.status")
  175. case "id":
  176. onlyMessage = true
  177. msg += t.I18nBot("tgbot.commands.getID", "ID=="+strconv.FormatInt(message.From.ID, 10))
  178. case "usage":
  179. onlyMessage = true
  180. if len(commandArgs) > 0 {
  181. if isAdmin {
  182. t.searchClient(chatId, commandArgs[0])
  183. } else {
  184. t.getClientUsage(chatId, int64(message.From.ID), commandArgs[0])
  185. }
  186. } else {
  187. msg += t.I18nBot("tgbot.commands.usage")
  188. }
  189. case "inbound":
  190. onlyMessage = true
  191. if isAdmin && len(commandArgs) > 0 {
  192. t.searchInbound(chatId, commandArgs[0])
  193. } else {
  194. handleUnknownCommand()
  195. }
  196. case "restart":
  197. onlyMessage = true
  198. if isAdmin {
  199. if len(commandArgs) == 0 {
  200. if t.xrayService.IsXrayRunning() {
  201. err := t.xrayService.RestartXray(true)
  202. if err != nil {
  203. msg += t.I18nBot("tgbot.commands.restartFailed", "Error=="+err.Error())
  204. } else {
  205. msg += t.I18nBot("tgbot.commands.restartSuccess")
  206. }
  207. } else {
  208. msg += t.I18nBot("tgbot.commands.xrayNotRunning")
  209. }
  210. } else {
  211. handleUnknownCommand()
  212. msg += t.I18nBot("tgbot.commands.restartUsage")
  213. }
  214. } else {
  215. handleUnknownCommand()
  216. }
  217. default:
  218. handleUnknownCommand()
  219. }
  220. if msg != "" {
  221. t.sendResponse(chatId, msg, onlyMessage, isAdmin)
  222. }
  223. }
  224. func (t *Tgbot) isCommandForCurrentBot(message *telego.Message) bool {
  225. return isCommandForBot(message.Text, botUsername())
  226. }
  227. func botUsername() string {
  228. if bot == nil {
  229. return ""
  230. }
  231. return bot.Username()
  232. }
  233. func isCommandForBot(text string, username string) bool {
  234. _, commandUsername, _ := tu.ParseCommand(text)
  235. return commandUsername == "" || username == "" || strings.EqualFold(commandUsername, username)
  236. }
  237. // answerCallback processes callback queries from inline keyboards.
  238. func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) {
  239. chatId := callbackQuery.Message.GetChat().ID
  240. if isAdmin {
  241. // get query from hash storage
  242. decodedQuery, err := t.decodeQuery(callbackQuery.Data)
  243. if err != nil {
  244. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.noQuery"))
  245. return
  246. }
  247. dataArray := strings.Split(decodedQuery, " ")
  248. if len(dataArray) >= 2 && len(dataArray[1]) > 0 {
  249. email := dataArray[1]
  250. switch dataArray[0] {
  251. case "get_clients_for_sub":
  252. inboundId := dataArray[1]
  253. inboundIdInt, err := strconv.Atoi(inboundId)
  254. if err != nil {
  255. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  256. return
  257. }
  258. clientsKB, err := t.getInboundClientsFor(inboundIdInt, "client_sub_links")
  259. if err != nil {
  260. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  261. return
  262. }
  263. inbound, _ := t.inboundService.GetInbound(inboundIdInt)
  264. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clientsKB)
  265. case "get_clients_for_individual":
  266. inboundId := dataArray[1]
  267. inboundIdInt, err := strconv.Atoi(inboundId)
  268. if err != nil {
  269. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  270. return
  271. }
  272. clientsKB, err := t.getInboundClientsFor(inboundIdInt, "client_individual_links")
  273. if err != nil {
  274. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  275. return
  276. }
  277. inbound, _ := t.inboundService.GetInbound(inboundIdInt)
  278. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clientsKB)
  279. case "get_clients_for_qr":
  280. inboundId := dataArray[1]
  281. inboundIdInt, err := strconv.Atoi(inboundId)
  282. if err != nil {
  283. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  284. return
  285. }
  286. clientsKB, err := t.getInboundClientsFor(inboundIdInt, "client_qr_links")
  287. if err != nil {
  288. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  289. return
  290. }
  291. inbound, _ := t.inboundService.GetInbound(inboundIdInt)
  292. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clientsKB)
  293. case "client_sub_links":
  294. t.sendClientSubLinks(chatId, email)
  295. return
  296. case "client_individual_links":
  297. t.sendClientIndividualLinks(chatId, email)
  298. return
  299. case "client_qr_links":
  300. t.sendClientQRLinks(chatId, email)
  301. return
  302. case "client_get_usage":
  303. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.messages.email", "Email=="+email))
  304. t.searchClient(chatId, email)
  305. case "client_refresh":
  306. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.clientRefreshSuccess", "Email=="+email))
  307. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  308. case "client_cancel":
  309. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+email))
  310. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  311. case "ips_refresh":
  312. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.IpRefreshSuccess", "Email=="+email))
  313. t.searchClientIps(chatId, email, callbackQuery.Message.GetMessageID())
  314. case "ips_cancel":
  315. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+email))
  316. t.searchClientIps(chatId, email, callbackQuery.Message.GetMessageID())
  317. case "tgid_refresh":
  318. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.TGIdRefreshSuccess", "Email=="+email))
  319. t.clientTelegramUserInfo(chatId, email, callbackQuery.Message.GetMessageID())
  320. case "tgid_cancel":
  321. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+email))
  322. t.clientTelegramUserInfo(chatId, email, callbackQuery.Message.GetMessageID())
  323. case "reset_traffic":
  324. inlineKeyboard := tu.InlineKeyboard(
  325. tu.InlineKeyboardRow(
  326. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancelReset")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
  327. ),
  328. tu.InlineKeyboardRow(
  329. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmResetTraffic")).WithCallbackData(t.encodeQuery("reset_traffic_c "+email)),
  330. ),
  331. )
  332. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  333. case "reset_traffic_c":
  334. err := t.inboundService.ResetClientTrafficByEmail(email)
  335. if err == nil {
  336. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.resetTrafficSuccess", "Email=="+email))
  337. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  338. } else {
  339. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  340. }
  341. case "limit_traffic":
  342. inlineKeyboard := tu.InlineKeyboard(
  343. tu.InlineKeyboardRow(
  344. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
  345. ),
  346. tu.InlineKeyboardRow(
  347. tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 0")),
  348. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" 0")),
  349. ),
  350. tu.InlineKeyboardRow(
  351. tu.InlineKeyboardButton("1 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 1")),
  352. tu.InlineKeyboardButton("5 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 5")),
  353. tu.InlineKeyboardButton("10 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 10")),
  354. ),
  355. tu.InlineKeyboardRow(
  356. tu.InlineKeyboardButton("20 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 20")),
  357. tu.InlineKeyboardButton("30 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 30")),
  358. tu.InlineKeyboardButton("40 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 40")),
  359. ),
  360. tu.InlineKeyboardRow(
  361. tu.InlineKeyboardButton("50 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 50")),
  362. tu.InlineKeyboardButton("60 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 60")),
  363. tu.InlineKeyboardButton("80 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 80")),
  364. ),
  365. tu.InlineKeyboardRow(
  366. tu.InlineKeyboardButton("100 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 100")),
  367. tu.InlineKeyboardButton("150 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 150")),
  368. tu.InlineKeyboardButton("200 GB").WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" 200")),
  369. ),
  370. )
  371. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  372. case "limit_traffic_c":
  373. if len(dataArray) == 3 {
  374. limitTraffic, err := strconv.Atoi(dataArray[2])
  375. if err == nil {
  376. needRestart, err := t.clientService.ResetClientTrafficLimitByEmail(&t.inboundService, email, limitTraffic)
  377. if needRestart {
  378. t.xrayService.SetToNeedRestart()
  379. }
  380. if err == nil {
  381. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.setTrafficLimitSuccess", "Email=="+email))
  382. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  383. return
  384. }
  385. }
  386. }
  387. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  388. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  389. case "limit_traffic_in":
  390. if len(dataArray) >= 3 {
  391. oldInputNumber, err := strconv.Atoi(dataArray[2])
  392. inputNumber := oldInputNumber
  393. if err == nil {
  394. if len(dataArray) == 4 {
  395. num, err := strconv.Atoi(dataArray[3])
  396. if err == nil {
  397. switch num {
  398. case -2:
  399. inputNumber = 0
  400. case -1:
  401. if inputNumber > 0 {
  402. inputNumber = (inputNumber / 10)
  403. }
  404. default:
  405. inputNumber = (inputNumber * 10) + num
  406. }
  407. }
  408. if inputNumber == oldInputNumber {
  409. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  410. return
  411. }
  412. if inputNumber >= 999999 {
  413. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  414. return
  415. }
  416. }
  417. inlineKeyboard := tu.InlineKeyboard(
  418. tu.InlineKeyboardRow(
  419. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
  420. ),
  421. tu.InlineKeyboardRow(
  422. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumberAdd", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("limit_traffic_c "+email+" "+strconv.Itoa(inputNumber))),
  423. ),
  424. tu.InlineKeyboardRow(
  425. tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 1")),
  426. tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 2")),
  427. tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 3")),
  428. ),
  429. tu.InlineKeyboardRow(
  430. tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 4")),
  431. tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 5")),
  432. tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 6")),
  433. ),
  434. tu.InlineKeyboardRow(
  435. tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 7")),
  436. tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 8")),
  437. tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 9")),
  438. ),
  439. tu.InlineKeyboardRow(
  440. tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" -2")),
  441. tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" 0")),
  442. tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("limit_traffic_in "+email+" "+strconv.Itoa(inputNumber)+" -1")),
  443. ),
  444. )
  445. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  446. return
  447. }
  448. }
  449. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  450. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  451. case "add_client_limit_traffic_c":
  452. limitTraffic, _ := strconv.ParseInt(dataArray[1], 10, 64)
  453. client_TotalGB = limitTraffic * 1024 * 1024 * 1024
  454. messageId := callbackQuery.Message.GetMessageID()
  455. message_text := t.BuildClientDraftMessage()
  456. t.addClient(callbackQuery.Message.GetChat().ID, message_text, messageId)
  457. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  458. case "add_client_limit_traffic_in":
  459. if len(dataArray) >= 2 {
  460. oldInputNumber, err := strconv.Atoi(dataArray[1])
  461. inputNumber := oldInputNumber
  462. if err == nil {
  463. if len(dataArray) == 3 {
  464. num, err := strconv.Atoi(dataArray[2])
  465. if err == nil {
  466. switch num {
  467. case -2:
  468. inputNumber = 0
  469. case -1:
  470. if inputNumber > 0 {
  471. inputNumber = (inputNumber / 10)
  472. }
  473. default:
  474. inputNumber = (inputNumber * 10) + num
  475. }
  476. }
  477. if inputNumber == oldInputNumber {
  478. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  479. return
  480. }
  481. if inputNumber >= 999999 {
  482. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  483. return
  484. }
  485. }
  486. inlineKeyboard := tu.InlineKeyboard(
  487. tu.InlineKeyboardRow(
  488. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_traffic_exp")),
  489. ),
  490. tu.InlineKeyboardRow(
  491. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumberAdd", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("add_client_limit_traffic_c "+strconv.Itoa(inputNumber))),
  492. ),
  493. tu.InlineKeyboardRow(
  494. tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 1")),
  495. tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 2")),
  496. tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 3")),
  497. ),
  498. tu.InlineKeyboardRow(
  499. tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 4")),
  500. tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 5")),
  501. tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 6")),
  502. ),
  503. tu.InlineKeyboardRow(
  504. tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 7")),
  505. tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 8")),
  506. tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 9")),
  507. ),
  508. tu.InlineKeyboardRow(
  509. tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" -2")),
  510. tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" 0")),
  511. tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("add_client_limit_traffic_in "+strconv.Itoa(inputNumber)+" -1")),
  512. ),
  513. )
  514. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  515. return
  516. }
  517. }
  518. case "reset_exp":
  519. inlineKeyboard := tu.InlineKeyboard(
  520. tu.InlineKeyboardRow(
  521. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancelReset")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
  522. ),
  523. tu.InlineKeyboardRow(
  524. tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 0")),
  525. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("reset_exp_in "+email+" 0")),
  526. ),
  527. tu.InlineKeyboardRow(
  528. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 7 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 7")),
  529. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 10 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 10")),
  530. ),
  531. tu.InlineKeyboardRow(
  532. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 14 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 14")),
  533. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 20 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 20")),
  534. ),
  535. tu.InlineKeyboardRow(
  536. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 1 "+t.I18nBot("tgbot.month")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 30")),
  537. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 3 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 90")),
  538. ),
  539. tu.InlineKeyboardRow(
  540. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 6 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 180")),
  541. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 12 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" 365")),
  542. ),
  543. )
  544. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  545. case "reset_exp_c":
  546. if len(dataArray) == 3 {
  547. days, err := strconv.ParseInt(dataArray[2], 10, 64)
  548. if err == nil {
  549. var date int64
  550. if days > 0 {
  551. traffic, err := t.inboundService.GetClientTrafficByEmail(email)
  552. if err != nil {
  553. logger.Warning(err)
  554. msg := t.I18nBot("tgbot.wentWrong")
  555. t.SendMsgToTgbot(chatId, msg)
  556. return
  557. }
  558. if traffic == nil {
  559. msg := t.I18nBot("tgbot.noResult")
  560. t.SendMsgToTgbot(chatId, msg)
  561. return
  562. }
  563. if traffic.ExpiryTime > 0 {
  564. if traffic.ExpiryTime-time.Now().Unix()*1000 < 0 {
  565. date = -int64(days * 24 * 60 * 60000)
  566. } else {
  567. date = traffic.ExpiryTime + int64(days*24*60*60000)
  568. }
  569. } else {
  570. date = traffic.ExpiryTime - int64(days*24*60*60000)
  571. }
  572. }
  573. needRestart, err := t.clientService.ResetClientExpiryTimeByEmail(&t.inboundService, email, date)
  574. if needRestart {
  575. t.xrayService.SetToNeedRestart()
  576. }
  577. if err == nil {
  578. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.expireResetSuccess", "Email=="+email))
  579. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  580. return
  581. }
  582. }
  583. }
  584. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  585. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  586. case "reset_exp_in":
  587. if len(dataArray) >= 3 {
  588. oldInputNumber, err := strconv.Atoi(dataArray[2])
  589. inputNumber := oldInputNumber
  590. if err == nil {
  591. if len(dataArray) == 4 {
  592. num, err := strconv.Atoi(dataArray[3])
  593. if err == nil {
  594. switch num {
  595. case -2:
  596. inputNumber = 0
  597. case -1:
  598. if inputNumber > 0 {
  599. inputNumber = (inputNumber / 10)
  600. }
  601. default:
  602. inputNumber = (inputNumber * 10) + num
  603. }
  604. }
  605. if inputNumber == oldInputNumber {
  606. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  607. return
  608. }
  609. if inputNumber >= 999999 {
  610. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  611. return
  612. }
  613. }
  614. inlineKeyboard := tu.InlineKeyboard(
  615. tu.InlineKeyboardRow(
  616. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
  617. ),
  618. tu.InlineKeyboardRow(
  619. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumber", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("reset_exp_c "+email+" "+strconv.Itoa(inputNumber))),
  620. ),
  621. tu.InlineKeyboardRow(
  622. tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 1")),
  623. tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 2")),
  624. tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 3")),
  625. ),
  626. tu.InlineKeyboardRow(
  627. tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 4")),
  628. tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 5")),
  629. tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 6")),
  630. ),
  631. tu.InlineKeyboardRow(
  632. tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 7")),
  633. tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 8")),
  634. tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 9")),
  635. ),
  636. tu.InlineKeyboardRow(
  637. tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" -2")),
  638. tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" 0")),
  639. tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("reset_exp_in "+email+" "+strconv.Itoa(inputNumber)+" -1")),
  640. ),
  641. )
  642. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  643. return
  644. }
  645. }
  646. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  647. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  648. case "add_client_reset_exp_c":
  649. client_ExpiryTime = 0
  650. days, _ := strconv.ParseInt(dataArray[1], 10, 64)
  651. var date int64
  652. if client_ExpiryTime > 0 {
  653. if client_ExpiryTime-time.Now().Unix()*1000 < 0 {
  654. date = -int64(days * 24 * 60 * 60000)
  655. } else {
  656. date = client_ExpiryTime + int64(days*24*60*60000)
  657. }
  658. } else {
  659. date = client_ExpiryTime - int64(days*24*60*60000)
  660. }
  661. client_ExpiryTime = date
  662. messageId := callbackQuery.Message.GetMessageID()
  663. message_text := t.BuildClientDraftMessage()
  664. t.addClient(callbackQuery.Message.GetChat().ID, message_text, messageId)
  665. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  666. case "add_client_reset_exp_in":
  667. if len(dataArray) >= 2 {
  668. oldInputNumber, err := strconv.Atoi(dataArray[1])
  669. inputNumber := oldInputNumber
  670. if err == nil {
  671. if len(dataArray) == 3 {
  672. num, err := strconv.Atoi(dataArray[2])
  673. if err == nil {
  674. switch num {
  675. case -2:
  676. inputNumber = 0
  677. case -1:
  678. if inputNumber > 0 {
  679. inputNumber = (inputNumber / 10)
  680. }
  681. default:
  682. inputNumber = (inputNumber * 10) + num
  683. }
  684. }
  685. if inputNumber == oldInputNumber {
  686. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  687. return
  688. }
  689. if inputNumber >= 999999 {
  690. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  691. return
  692. }
  693. }
  694. inlineKeyboard := tu.InlineKeyboard(
  695. tu.InlineKeyboardRow(
  696. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_traffic_exp")),
  697. ),
  698. tu.InlineKeyboardRow(
  699. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumberAdd", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("add_client_reset_exp_c "+strconv.Itoa(inputNumber))),
  700. ),
  701. tu.InlineKeyboardRow(
  702. tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 1")),
  703. tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 2")),
  704. tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 3")),
  705. ),
  706. tu.InlineKeyboardRow(
  707. tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 4")),
  708. tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 5")),
  709. tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 6")),
  710. ),
  711. tu.InlineKeyboardRow(
  712. tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 7")),
  713. tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 8")),
  714. tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 9")),
  715. ),
  716. tu.InlineKeyboardRow(
  717. tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" -2")),
  718. tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" 0")),
  719. tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("add_client_reset_exp_in "+strconv.Itoa(inputNumber)+" -1")),
  720. ),
  721. )
  722. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  723. return
  724. }
  725. }
  726. case "ip_limit":
  727. inlineKeyboard := tu.InlineKeyboard(
  728. tu.InlineKeyboardRow(
  729. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancelIpLimit")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
  730. ),
  731. tu.InlineKeyboardRow(
  732. tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 0")),
  733. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("ip_limit_in "+email+" 0")),
  734. ),
  735. tu.InlineKeyboardRow(
  736. tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 1")),
  737. tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 2")),
  738. ),
  739. tu.InlineKeyboardRow(
  740. tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 3")),
  741. tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 4")),
  742. ),
  743. tu.InlineKeyboardRow(
  744. tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 5")),
  745. tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 6")),
  746. tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 7")),
  747. ),
  748. tu.InlineKeyboardRow(
  749. tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 8")),
  750. tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 9")),
  751. tu.InlineKeyboardButton("10").WithCallbackData(t.encodeQuery("ip_limit_c "+email+" 10")),
  752. ),
  753. )
  754. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  755. case "ip_limit_c":
  756. if len(dataArray) == 3 {
  757. count, err := strconv.Atoi(dataArray[2])
  758. if err == nil {
  759. needRestart, err := t.clientService.ResetClientIpLimitByEmail(&t.inboundService, email, count)
  760. if needRestart {
  761. t.xrayService.SetToNeedRestart()
  762. }
  763. if err == nil {
  764. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.resetIpSuccess", "Email=="+email, "Count=="+strconv.Itoa(count)))
  765. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  766. return
  767. }
  768. }
  769. }
  770. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  771. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  772. case "ip_limit_in":
  773. if len(dataArray) >= 3 {
  774. oldInputNumber, err := strconv.Atoi(dataArray[2])
  775. inputNumber := oldInputNumber
  776. if err == nil {
  777. if len(dataArray) == 4 {
  778. num, err := strconv.Atoi(dataArray[3])
  779. if err == nil {
  780. switch num {
  781. case -2:
  782. inputNumber = 0
  783. case -1:
  784. if inputNumber > 0 {
  785. inputNumber = (inputNumber / 10)
  786. }
  787. default:
  788. inputNumber = (inputNumber * 10) + num
  789. }
  790. }
  791. if inputNumber == oldInputNumber {
  792. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  793. return
  794. }
  795. if inputNumber >= 999999 {
  796. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  797. return
  798. }
  799. }
  800. inlineKeyboard := tu.InlineKeyboard(
  801. tu.InlineKeyboardRow(
  802. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
  803. ),
  804. tu.InlineKeyboardRow(
  805. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumber", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("ip_limit_c "+email+" "+strconv.Itoa(inputNumber))),
  806. ),
  807. tu.InlineKeyboardRow(
  808. tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 1")),
  809. tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 2")),
  810. tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 3")),
  811. ),
  812. tu.InlineKeyboardRow(
  813. tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 4")),
  814. tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 5")),
  815. tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 6")),
  816. ),
  817. tu.InlineKeyboardRow(
  818. tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 7")),
  819. tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 8")),
  820. tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 9")),
  821. ),
  822. tu.InlineKeyboardRow(
  823. tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" -2")),
  824. tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" 0")),
  825. tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("ip_limit_in "+email+" "+strconv.Itoa(inputNumber)+" -1")),
  826. ),
  827. )
  828. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  829. return
  830. }
  831. }
  832. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  833. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  834. case "add_client_ip_limit_c":
  835. if len(dataArray) == 2 {
  836. count, _ := strconv.Atoi(dataArray[1])
  837. client_LimitIP = count
  838. }
  839. messageId := callbackQuery.Message.GetMessageID()
  840. message_text := t.BuildClientDraftMessage()
  841. t.addClient(callbackQuery.Message.GetChat().ID, message_text, messageId)
  842. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  843. case "add_client_ip_limit_in":
  844. if len(dataArray) >= 2 {
  845. oldInputNumber, err := strconv.Atoi(dataArray[1])
  846. inputNumber := oldInputNumber
  847. if err == nil {
  848. if len(dataArray) == 3 {
  849. num, err := strconv.Atoi(dataArray[2])
  850. if err == nil {
  851. switch num {
  852. case -2:
  853. inputNumber = 0
  854. case -1:
  855. if inputNumber > 0 {
  856. inputNumber = (inputNumber / 10)
  857. }
  858. default:
  859. inputNumber = (inputNumber * 10) + num
  860. }
  861. }
  862. if inputNumber == oldInputNumber {
  863. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  864. return
  865. }
  866. if inputNumber >= 999999 {
  867. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  868. return
  869. }
  870. }
  871. inlineKeyboard := tu.InlineKeyboard(
  872. tu.InlineKeyboardRow(
  873. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_ip_limit")),
  874. ),
  875. tu.InlineKeyboardRow(
  876. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmNumber", "Num=="+strconv.Itoa(inputNumber))).WithCallbackData(t.encodeQuery("add_client_ip_limit_c "+strconv.Itoa(inputNumber))),
  877. ),
  878. tu.InlineKeyboardRow(
  879. tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 1")),
  880. tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 2")),
  881. tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 3")),
  882. ),
  883. tu.InlineKeyboardRow(
  884. tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 4")),
  885. tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 5")),
  886. tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 6")),
  887. ),
  888. tu.InlineKeyboardRow(
  889. tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 7")),
  890. tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 8")),
  891. tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 9")),
  892. ),
  893. tu.InlineKeyboardRow(
  894. tu.InlineKeyboardButton("🔄").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" -2")),
  895. tu.InlineKeyboardButton("0").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" 0")),
  896. tu.InlineKeyboardButton("⬅️").WithCallbackData(t.encodeQuery("add_client_ip_limit_in "+strconv.Itoa(inputNumber)+" -1")),
  897. ),
  898. )
  899. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  900. return
  901. }
  902. }
  903. case "clear_ips":
  904. inlineKeyboard := tu.InlineKeyboard(
  905. tu.InlineKeyboardRow(
  906. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("ips_cancel "+email)),
  907. ),
  908. tu.InlineKeyboardRow(
  909. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmClearIps")).WithCallbackData(t.encodeQuery("clear_ips_c "+email)),
  910. ),
  911. )
  912. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  913. case "clear_ips_c":
  914. err := t.inboundService.ClearClientIps(email)
  915. if err == nil {
  916. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.clearIpSuccess", "Email=="+email))
  917. t.searchClientIps(chatId, email, callbackQuery.Message.GetMessageID())
  918. } else {
  919. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  920. }
  921. case "ip_log":
  922. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.getIpLog", "Email=="+email))
  923. t.searchClientIps(chatId, email)
  924. case "tg_user":
  925. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.getUserInfo", "Email=="+email))
  926. t.clientTelegramUserInfo(chatId, email)
  927. case "tgid_remove":
  928. inlineKeyboard := tu.InlineKeyboard(
  929. tu.InlineKeyboardRow(
  930. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("tgid_cancel "+email)),
  931. ),
  932. tu.InlineKeyboardRow(
  933. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmRemoveTGUser")).WithCallbackData(t.encodeQuery("tgid_remove_c "+email)),
  934. ),
  935. )
  936. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  937. case "tgid_remove_c":
  938. traffic, err := t.inboundService.GetClientTrafficByEmail(email)
  939. if err != nil || traffic == nil {
  940. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  941. return
  942. }
  943. needRestart, err := t.clientService.SetClientTelegramUserID(&t.inboundService, traffic.Id, EmptyTelegramUserID)
  944. if needRestart {
  945. t.xrayService.SetToNeedRestart()
  946. }
  947. if err == nil {
  948. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.removedTGUserSuccess", "Email=="+email))
  949. t.clientTelegramUserInfo(chatId, email, callbackQuery.Message.GetMessageID())
  950. } else {
  951. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  952. }
  953. case "toggle_enable":
  954. inlineKeyboard := tu.InlineKeyboard(
  955. tu.InlineKeyboardRow(
  956. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("client_cancel "+email)),
  957. ),
  958. tu.InlineKeyboardRow(
  959. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmToggle")).WithCallbackData(t.encodeQuery("toggle_enable_c "+email)),
  960. ),
  961. )
  962. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  963. case "toggle_enable_c":
  964. enabled, needRestart, err := t.clientService.ToggleClientEnableByEmail(&t.inboundService, email)
  965. if needRestart {
  966. t.xrayService.SetToNeedRestart()
  967. }
  968. if err == nil {
  969. if enabled {
  970. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.enableSuccess", "Email=="+email))
  971. } else {
  972. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.disableSuccess", "Email=="+email))
  973. }
  974. t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
  975. } else {
  976. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
  977. }
  978. case "get_clients":
  979. inboundId := dataArray[1]
  980. inboundIdInt, err := strconv.Atoi(inboundId)
  981. if err != nil {
  982. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  983. return
  984. }
  985. inbound, err := t.inboundService.GetInbound(inboundIdInt)
  986. if err != nil {
  987. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  988. return
  989. }
  990. clients, err := t.getInboundClients(inboundIdInt)
  991. if err != nil {
  992. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  993. return
  994. }
  995. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseClient", "Inbound=="+inbound.Remark), clients)
  996. case "add_client_to":
  997. client_Email = t.randomLowerAndNum(8)
  998. client_LimitIP = 0
  999. client_TotalGB = 0
  1000. client_ExpiryTime = 0
  1001. client_Enable = true
  1002. client_TgID = ""
  1003. client_SubID = t.randomLowerAndNum(16)
  1004. client_Comment = ""
  1005. client_Reset = 0
  1006. inboundId := dataArray[1]
  1007. inboundIdInt, err := strconv.Atoi(inboundId)
  1008. if err != nil {
  1009. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  1010. return
  1011. }
  1012. receiver_inbound_ID = inboundIdInt
  1013. receiver_inbound_IDs = []int{inboundIdInt}
  1014. t.addClient(callbackQuery.Message.GetChat().ID, t.BuildClientDraftMessage())
  1015. case "add_client_toggle_attach":
  1016. inboundIdStr := dataArray[1]
  1017. inboundIdInt, err := strconv.Atoi(inboundIdStr)
  1018. if err != nil {
  1019. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  1020. return
  1021. }
  1022. found := -1
  1023. for i, id := range receiver_inbound_IDs {
  1024. if id == inboundIdInt {
  1025. found = i
  1026. break
  1027. }
  1028. }
  1029. if found >= 0 {
  1030. receiver_inbound_IDs = append(receiver_inbound_IDs[:found], receiver_inbound_IDs[found+1:]...)
  1031. } else {
  1032. receiver_inbound_IDs = append(receiver_inbound_IDs, inboundIdInt)
  1033. }
  1034. picker, err := t.getInboundsAttachPicker()
  1035. if err != nil {
  1036. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  1037. return
  1038. }
  1039. t.editMessageCallbackTgBot(callbackQuery.Message.GetChat().ID, callbackQuery.Message.GetMessageID(), picker)
  1040. }
  1041. return
  1042. } else {
  1043. switch callbackQuery.Data {
  1044. case "get_inbounds":
  1045. inbounds, err := t.getInbounds()
  1046. if err != nil {
  1047. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  1048. return
  1049. }
  1050. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.allClients"))
  1051. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
  1052. case "admin_client_sub_links":
  1053. inbounds, err := t.getInboundsFor("get_clients_for_sub")
  1054. if err != nil {
  1055. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  1056. return
  1057. }
  1058. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
  1059. case "admin_client_individual_links":
  1060. inbounds, err := t.getInboundsFor("get_clients_for_individual")
  1061. if err != nil {
  1062. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  1063. return
  1064. }
  1065. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
  1066. case "admin_client_qr_links":
  1067. inbounds, err := t.getInboundsFor("get_clients_for_qr")
  1068. if err != nil {
  1069. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  1070. return
  1071. }
  1072. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
  1073. }
  1074. }
  1075. }
  1076. switch callbackQuery.Data {
  1077. case "get_usage":
  1078. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.serverUsage"))
  1079. t.getServerUsage(chatId)
  1080. case "usage_refresh":
  1081. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  1082. t.getServerUsage(chatId, callbackQuery.Message.GetMessageID())
  1083. case "inbounds":
  1084. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.getInbounds"))
  1085. t.SendMsgToTgbot(chatId, t.getInboundUsages())
  1086. case "deplete_soon":
  1087. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.depleteSoon"))
  1088. t.getExhausted(chatId)
  1089. case "get_backup":
  1090. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.dbBackup"))
  1091. t.sendBackup(chatId)
  1092. case "get_banlogs":
  1093. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.getBanLogs"))
  1094. t.sendBanLogs(chatId, true)
  1095. case "client_traffic":
  1096. tgUserID := callbackQuery.From.ID
  1097. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.clientUsage"))
  1098. t.getClientUsage(chatId, tgUserID)
  1099. case "client_commands":
  1100. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.commands"))
  1101. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.helpClientCommands"))
  1102. case "client_sub_links":
  1103. // show user's own clients to choose one for sub links
  1104. tgUserID := callbackQuery.From.ID
  1105. traffics, err := t.inboundService.GetClientTrafficTgBot(tgUserID)
  1106. if err != nil {
  1107. // fallback to message
  1108. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation")+"\r\n"+err.Error())
  1109. return
  1110. }
  1111. if len(traffics) == 0 {
  1112. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.askToAddUserId", "TgUserID=="+strconv.FormatInt(tgUserID, 10)))
  1113. return
  1114. }
  1115. var buttons []telego.InlineKeyboardButton
  1116. for _, tr := range traffics {
  1117. buttons = append(buttons, tu.InlineKeyboardButton(tr.Email).WithCallbackData(t.encodeQuery("client_sub_links "+tr.Email)))
  1118. }
  1119. cols := 1
  1120. if len(buttons) >= 6 {
  1121. cols = 2
  1122. }
  1123. keyboard := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols, buttons...))
  1124. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.pleaseChoose"), keyboard)
  1125. case "client_individual_links":
  1126. // show user's clients to choose for individual links
  1127. tgUserID := callbackQuery.From.ID
  1128. traffics, err := t.inboundService.GetClientTrafficTgBot(tgUserID)
  1129. if err != nil {
  1130. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation")+"\r\n"+err.Error())
  1131. return
  1132. }
  1133. if len(traffics) == 0 {
  1134. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.askToAddUserId", "TgUserID=="+strconv.FormatInt(tgUserID, 10)))
  1135. return
  1136. }
  1137. var buttons2 []telego.InlineKeyboardButton
  1138. for _, tr := range traffics {
  1139. buttons2 = append(buttons2, tu.InlineKeyboardButton(tr.Email).WithCallbackData(t.encodeQuery("client_individual_links "+tr.Email)))
  1140. }
  1141. cols2 := 1
  1142. if len(buttons2) >= 6 {
  1143. cols2 = 2
  1144. }
  1145. keyboard2 := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols2, buttons2...))
  1146. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.pleaseChoose"), keyboard2)
  1147. case "client_qr_links":
  1148. // show user's clients to choose for QR codes
  1149. tgUserID := callbackQuery.From.ID
  1150. traffics, err := t.inboundService.GetClientTrafficTgBot(tgUserID)
  1151. if err != nil {
  1152. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOccurred")+"\r\n"+err.Error())
  1153. return
  1154. }
  1155. if len(traffics) == 0 {
  1156. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.askToAddUserId", "TgUserID=="+strconv.FormatInt(tgUserID, 10)))
  1157. return
  1158. }
  1159. var buttons3 []telego.InlineKeyboardButton
  1160. for _, tr := range traffics {
  1161. buttons3 = append(buttons3, tu.InlineKeyboardButton(tr.Email).WithCallbackData(t.encodeQuery("client_qr_links "+tr.Email)))
  1162. }
  1163. cols3 := 1
  1164. if len(buttons3) >= 6 {
  1165. cols3 = 2
  1166. }
  1167. keyboard3 := tu.InlineKeyboardGrid(tu.InlineKeyboardCols(cols3, buttons3...))
  1168. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.pleaseChoose"), keyboard3)
  1169. case "onlines":
  1170. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.onlines"))
  1171. t.onlineClients(chatId)
  1172. case "onlines_refresh":
  1173. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
  1174. t.onlineClients(chatId, callbackQuery.Message.GetMessageID())
  1175. case "commands":
  1176. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.commands"))
  1177. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.commands.helpAdminCommands"))
  1178. case "add_client":
  1179. client_Email = t.randomLowerAndNum(8)
  1180. client_LimitIP = 0
  1181. client_TotalGB = 0
  1182. client_ExpiryTime = 0
  1183. client_Enable = true
  1184. client_TgID = ""
  1185. client_SubID = t.randomLowerAndNum(16)
  1186. client_Comment = ""
  1187. client_Reset = 0
  1188. inbounds, err := t.getInboundsAddClient()
  1189. if err != nil {
  1190. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  1191. return
  1192. }
  1193. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.addClient"))
  1194. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
  1195. case "add_client_ch_default_email":
  1196. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1197. userStates[chatId] = "awaiting_email"
  1198. cancel_btn_markup := tu.InlineKeyboard(
  1199. tu.InlineKeyboardRow(
  1200. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
  1201. ),
  1202. )
  1203. prompt_message := t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email)
  1204. t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
  1205. case "add_client_ch_default_comment":
  1206. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1207. userStates[chatId] = "awaiting_comment"
  1208. cancel_btn_markup := tu.InlineKeyboard(
  1209. tu.InlineKeyboardRow(
  1210. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
  1211. ),
  1212. )
  1213. prompt_message := t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment)
  1214. t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
  1215. case "add_client_ch_default_tg_id":
  1216. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1217. userStates[chatId] = "awaiting_tg_id"
  1218. cancel_btn_markup := tu.InlineKeyboard(
  1219. tu.InlineKeyboardRow(
  1220. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
  1221. ),
  1222. )
  1223. current := client_TgID
  1224. if current == "" {
  1225. current = "—"
  1226. }
  1227. 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)
  1228. case "add_client_ch_default_traffic":
  1229. inlineKeyboard := tu.InlineKeyboard(
  1230. tu.InlineKeyboardRow(
  1231. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_traffic_exp")),
  1232. ),
  1233. tu.InlineKeyboardRow(
  1234. tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 0")),
  1235. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("add_client_limit_traffic_in 0")),
  1236. ),
  1237. tu.InlineKeyboardRow(
  1238. tu.InlineKeyboardButton("1 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 1")),
  1239. tu.InlineKeyboardButton("5 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 5")),
  1240. tu.InlineKeyboardButton("10 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 10")),
  1241. ),
  1242. tu.InlineKeyboardRow(
  1243. tu.InlineKeyboardButton("20 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 20")),
  1244. tu.InlineKeyboardButton("30 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 30")),
  1245. tu.InlineKeyboardButton("40 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 40")),
  1246. ),
  1247. tu.InlineKeyboardRow(
  1248. tu.InlineKeyboardButton("50 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 50")),
  1249. tu.InlineKeyboardButton("60 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 60")),
  1250. tu.InlineKeyboardButton("80 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 80")),
  1251. ),
  1252. tu.InlineKeyboardRow(
  1253. tu.InlineKeyboardButton("100 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 100")),
  1254. tu.InlineKeyboardButton("150 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 150")),
  1255. tu.InlineKeyboardButton("200 GB").WithCallbackData(t.encodeQuery("add_client_limit_traffic_c 200")),
  1256. ),
  1257. )
  1258. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  1259. case "add_client_ch_default_exp":
  1260. inlineKeyboard := tu.InlineKeyboard(
  1261. tu.InlineKeyboardRow(
  1262. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_traffic_exp")),
  1263. ),
  1264. tu.InlineKeyboardRow(
  1265. tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 0")),
  1266. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("add_client_reset_exp_in 0")),
  1267. ),
  1268. tu.InlineKeyboardRow(
  1269. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 7 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 7")),
  1270. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 10 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 10")),
  1271. ),
  1272. tu.InlineKeyboardRow(
  1273. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 14 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 14")),
  1274. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 20 "+t.I18nBot("tgbot.days")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 20")),
  1275. ),
  1276. tu.InlineKeyboardRow(
  1277. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 1 "+t.I18nBot("tgbot.month")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 30")),
  1278. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 3 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 90")),
  1279. ),
  1280. tu.InlineKeyboardRow(
  1281. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 6 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 180")),
  1282. tu.InlineKeyboardButton(t.I18nBot("tgbot.add")+" 12 "+t.I18nBot("tgbot.months")).WithCallbackData(t.encodeQuery("add_client_reset_exp_c 365")),
  1283. ),
  1284. )
  1285. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  1286. case "add_client_ch_default_ip_limit":
  1287. inlineKeyboard := tu.InlineKeyboard(
  1288. tu.InlineKeyboardRow(
  1289. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData(t.encodeQuery("add_client_default_ip_limit")),
  1290. ),
  1291. tu.InlineKeyboardRow(
  1292. tu.InlineKeyboardButton(t.I18nBot("tgbot.unlimited")).WithCallbackData(t.encodeQuery("add_client_ip_limit_c 0")),
  1293. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.custom")).WithCallbackData(t.encodeQuery("add_client_ip_limit_in 0")),
  1294. ),
  1295. tu.InlineKeyboardRow(
  1296. tu.InlineKeyboardButton("1").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 1")),
  1297. tu.InlineKeyboardButton("2").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 2")),
  1298. ),
  1299. tu.InlineKeyboardRow(
  1300. tu.InlineKeyboardButton("3").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 3")),
  1301. tu.InlineKeyboardButton("4").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 4")),
  1302. ),
  1303. tu.InlineKeyboardRow(
  1304. tu.InlineKeyboardButton("5").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 5")),
  1305. tu.InlineKeyboardButton("6").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 6")),
  1306. tu.InlineKeyboardButton("7").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 7")),
  1307. ),
  1308. tu.InlineKeyboardRow(
  1309. tu.InlineKeyboardButton("8").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 8")),
  1310. tu.InlineKeyboardButton("9").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 9")),
  1311. tu.InlineKeyboardButton("10").WithCallbackData(t.encodeQuery("add_client_ip_limit_c 10")),
  1312. ),
  1313. )
  1314. t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
  1315. case "add_client_default_info":
  1316. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1317. t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
  1318. delete(userStates, chatId)
  1319. t.addClient(chatId, t.BuildClientDraftMessage())
  1320. case "add_client_cancel":
  1321. delete(userStates, chatId)
  1322. receiver_inbound_ID = 0
  1323. receiver_inbound_IDs = nil
  1324. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1325. t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.cancel"), 3, tu.ReplyKeyboardRemove())
  1326. case "add_client_default_traffic_exp":
  1327. messageId := callbackQuery.Message.GetMessageID()
  1328. message_text := t.BuildClientDraftMessage()
  1329. t.addClient(chatId, message_text, messageId)
  1330. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+client_Email))
  1331. case "add_client_default_ip_limit":
  1332. messageId := callbackQuery.Message.GetMessageID()
  1333. message_text := t.BuildClientDraftMessage()
  1334. t.addClient(chatId, message_text, messageId)
  1335. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.canceled", "Email=="+client_Email))
  1336. case "add_client_attach_more":
  1337. picker, err := t.getInboundsAttachPicker()
  1338. if err != nil {
  1339. t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
  1340. return
  1341. }
  1342. t.SendMsgToTgbot(chatId, "Pick inbound(s) to attach:", picker)
  1343. case "add_client_attach_done":
  1344. if receiver_inbound_ID == 0 && len(receiver_inbound_IDs) > 0 {
  1345. receiver_inbound_ID = receiver_inbound_IDs[0]
  1346. }
  1347. if receiver_inbound_ID == 0 {
  1348. t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.getInboundsFailed"))
  1349. return
  1350. }
  1351. message_text := t.BuildClientDraftMessage()
  1352. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1353. t.addClient(chatId, message_text)
  1354. case "add_client_submit_disable":
  1355. client_Enable = false
  1356. _, err := t.SubmitAddClient()
  1357. if err != nil {
  1358. errorMessage := fmt.Sprintf("%v", err)
  1359. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.error_add_client", "error=="+errorMessage), tu.ReplyKeyboardRemove())
  1360. } else {
  1361. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1362. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.successfulOperation"), tu.ReplyKeyboardRemove())
  1363. t.sendClientIndividualLinks(chatId, client_Email)
  1364. t.sendClientQRLinks(chatId, client_Email)
  1365. receiver_inbound_ID = 0
  1366. receiver_inbound_IDs = nil
  1367. }
  1368. case "add_client_submit_enable":
  1369. client_Enable = true
  1370. _, err := t.SubmitAddClient()
  1371. if err != nil {
  1372. errorMessage := fmt.Sprintf("%v", err)
  1373. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.error_add_client", "error=="+errorMessage), tu.ReplyKeyboardRemove())
  1374. } else {
  1375. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1376. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.successfulOperation"), tu.ReplyKeyboardRemove())
  1377. t.sendClientIndividualLinks(chatId, client_Email)
  1378. t.sendClientQRLinks(chatId, client_Email)
  1379. receiver_inbound_ID = 0
  1380. receiver_inbound_IDs = nil
  1381. }
  1382. case "reset_all_traffics_cancel":
  1383. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1384. t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.cancel"), 1, tu.ReplyKeyboardRemove())
  1385. case "reset_all_traffics":
  1386. inlineKeyboard := tu.InlineKeyboard(
  1387. tu.InlineKeyboardRow(
  1388. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancelReset")).WithCallbackData(t.encodeQuery("reset_all_traffics_cancel")),
  1389. ),
  1390. tu.InlineKeyboardRow(
  1391. tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.confirmResetTraffic")).WithCallbackData(t.encodeQuery("reset_all_traffics_c")),
  1392. ),
  1393. )
  1394. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.AreYouSure"), inlineKeyboard)
  1395. case "reset_all_traffics_c":
  1396. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1397. emails, err := t.inboundService.GetAllEmails()
  1398. if err != nil {
  1399. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation"), tu.ReplyKeyboardRemove())
  1400. return
  1401. }
  1402. for _, email := range emails {
  1403. err := t.inboundService.ResetClientTrafficByEmail(email)
  1404. if err == nil {
  1405. msg := t.I18nBot("tgbot.messages.SuccessResetTraffic", "ClientEmail=="+email)
  1406. t.SendMsgToTgbot(chatId, msg, tu.ReplyKeyboardRemove())
  1407. } else {
  1408. msg := t.I18nBot("tgbot.messages.FailedResetTraffic", "ClientEmail=="+email, "ErrorMessage=="+err.Error())
  1409. t.SendMsgToTgbot(chatId, msg, tu.ReplyKeyboardRemove())
  1410. }
  1411. }
  1412. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.FinishProcess"), tu.ReplyKeyboardRemove())
  1413. case "get_sorted_traffic_usage_report":
  1414. t.deleteMessageTgBot(chatId, callbackQuery.Message.GetMessageID())
  1415. emails, err := t.inboundService.GetAllEmails()
  1416. if err != nil {
  1417. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation"), tu.ReplyKeyboardRemove())
  1418. return
  1419. }
  1420. valid_emails, extra_emails, err := t.inboundService.FilterAndSortClientEmails(emails)
  1421. if err != nil {
  1422. t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.errorOperation"), tu.ReplyKeyboardRemove())
  1423. return
  1424. }
  1425. for _, valid_emails := range valid_emails {
  1426. traffic, err := t.inboundService.GetClientTrafficByEmail(valid_emails)
  1427. if err != nil {
  1428. logger.Warning(err)
  1429. msg := t.I18nBot("tgbot.wentWrong")
  1430. t.SendMsgToTgbot(chatId, msg)
  1431. continue
  1432. }
  1433. if traffic == nil {
  1434. msg := t.I18nBot("tgbot.noResult")
  1435. t.SendMsgToTgbot(chatId, msg)
  1436. continue
  1437. }
  1438. output := t.clientInfoMsg(traffic, false, false, false, false, true, false)
  1439. t.SendMsgToTgbot(chatId, output, tu.ReplyKeyboardRemove())
  1440. }
  1441. for _, extra_emails := range extra_emails {
  1442. msg := fmt.Sprintf("📧 %s\n%s", extra_emails, t.I18nBot("tgbot.noResult"))
  1443. t.SendMsgToTgbot(chatId, msg, tu.ReplyKeyboardRemove())
  1444. }
  1445. default:
  1446. if after, ok := strings.CutPrefix(callbackQuery.Data, "client_sub_links "); ok {
  1447. email := after
  1448. t.sendClientSubLinks(chatId, email)
  1449. return
  1450. }
  1451. if after, ok := strings.CutPrefix(callbackQuery.Data, "client_individual_links "); ok {
  1452. email := after
  1453. t.sendClientIndividualLinks(chatId, email)
  1454. return
  1455. }
  1456. if after, ok := strings.CutPrefix(callbackQuery.Data, "client_qr_links "); ok {
  1457. email := after
  1458. t.sendClientQRLinks(chatId, email)
  1459. return
  1460. }
  1461. }
  1462. }
  1463. // checkAdmin checks if the given Telegram ID is an admin.
  1464. func checkAdmin(tgId int64) bool {
  1465. return slices.Contains(adminIds, tgId)
  1466. }