diff options
| -rw-r--r-- | web/service/tgbot.go | 55 | ||||
| -rw-r--r-- | web/translation/translate.en_US.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.es_ES.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.fa_IR.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.id_ID.toml | 8 | ||||
| -rw-r--r-- | web/translation/translate.pt_BR.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.ru_RU.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.tr_TR.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.uk_UA.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.vi_VN.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.zh_CN.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.zh_TW.toml | 6 |
12 files changed, 99 insertions, 24 deletions
diff --git a/web/service/tgbot.go b/web/service/tgbot.go index b8294620..449161d3 100644 --- a/web/service/tgbot.go +++ b/web/service/tgbot.go @@ -243,7 +243,12 @@ func (t *Tgbot) answerCommand(message *telego.Message, chatId int64, isAdmin boo command, _, commandArgs := tu.ParseCommand(message.Text) - // Extract the command from the Message. + // 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") @@ -266,9 +271,7 @@ func (t *Tgbot) answerCommand(message *telego.Message, chatId int64, isAdmin boo if isAdmin { t.searchClient(chatId, commandArgs[0]) } else { - // Convert message.From.ID to int64 - fromID := int64(message.From.ID) - t.getClientUsage(chatId, fromID, commandArgs[0]) + t.getClientUsage(chatId, int64(message.From.ID), commandArgs[0]) } } else { msg += t.I18nBot("tgbot.commands.usage") @@ -278,19 +281,46 @@ func (t *Tgbot) answerCommand(message *telego.Message, chatId int64, isAdmin boo if isAdmin && len(commandArgs) > 0 { t.searchInbound(chatId, commandArgs[0]) } else { - msg += t.I18nBot("tgbot.commands.unknown") + handleUnknownCommand() + } + case "restart": + onlyMessage = true + if isAdmin { + if len(commandArgs) == 0 { + msg += t.I18nBot("tgbot.commands.restartUsage") + } else if strings.ToLower(commandArgs[0]) == "force" { + 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: - msg += t.I18nBot("tgbot.commands.unknown") + handleUnknownCommand() } if msg != "" { - if onlyMessage { - t.SendMsgToTgbot(chatId, msg) - return - } else { - t.SendAnswer(chatId, msg, isAdmin) - } + t.sendResponse(chatId, msg, onlyMessage, isAdmin) + } +} + +// Helper function to send the message based on onlyMessage flag. +func (t *Tgbot) sendResponse(chatId int64, msg string, onlyMessage, isAdmin bool) { + if onlyMessage { + t.SendMsgToTgbot(chatId, msg) + } else { + t.SendAnswer(chatId, msg, isAdmin) } } @@ -872,6 +902,7 @@ func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) { tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.onlines")).WithCallbackData(t.encodeQuery("onlines")), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.allClients")).WithCallbackData(t.encodeQuery("get_inbounds")), ), + // TODOOOOOOOOOOOOOO: Add restart button here. ) numericKeyboardClient := tu.InlineKeyboard( tu.InlineKeyboardRow( diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml index 7e2e5eef..47c02f89 100644 --- a/web/translation/translate.en_US.toml +++ b/web/translation/translate.en_US.toml @@ -483,8 +483,12 @@ "status" = "✅ Bot is OK!" "usage" = "❗ Please provide a text to search!" "getID" = "🆔 Your ID: <code>{{ .ID }}</code>" -"helpAdminCommands" = "To search for a client email:\r\n<code>/usage [Email]</code>\r\n\r\nTo search for inbounds (with client stats):\r\n<code>/inbound [Remark]</code>\r\n\r\nTelegram Chat ID:\r\n<code>/id</code>" +"helpAdminCommands" = "To restart Xray Core:\r\n<code>/restart force</code>\r\n\r\nTo search for a client email:\r\n<code>/usage [Email]</code>\r\n\r\nTo search for inbounds (with client stats):\r\n<code>/inbound [Remark]</code>\r\n\r\nTelegram Chat ID:\r\n<code>/id</code>" "helpClientCommands" = "To search for statistics, use the following command:\r\n\r\n<code>/usage [Email]</code>\r\n\r\nTelegram Chat ID:\r\n<code>/id</code>" +"restartUsage" = "\r\n\r\n<code>/restart force</code>" +"restartSuccess" = "✅ Operation successful!" +"restartFailed" = "❗ Error in operation.\r\n\r\n<code>Error: {{ .Error }}</code>." +"xrayNotRunning" = "❗ Xray Core is not running." [tgbot.messages] "cpuThreshold" = "🔴 CPU Load {{ .Percent }}% exceeds the threshold of {{ .Threshold }}%" diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml index 1ca7a505..ef9cca1e 100644 --- a/web/translation/translate.es_ES.toml +++ b/web/translation/translate.es_ES.toml @@ -483,8 +483,12 @@ "status" = "✅ ¡El bot está bien!"
"usage" = "❗ ¡Por favor proporciona un texto para buscar!"
"getID" = "🆔 Tu ID: <code>{{ .ID }}</code>"
-"helpAdminCommands" = "Para buscar un correo electrónico de cliente:\r\n<code>/usage [Correo electrónico]</code>\r\n\r\nPara buscar entradas (con estadísticas de cliente):\r\n<code>/inbound [Observación]</code>\r\n\r\nID de Chat de Telegram:\r\n<code>/id</code>"
+"helpAdminCommands" = "Para reiniciar Xray Core:\r\n<code>/restart force</code>\r\n\r\nPara buscar un correo electrónico de cliente:\r\n<code>/usage [Correo electrónico]</code>\r\n\r\nPara buscar entradas (con estadísticas de cliente):\r\n<code>/inbound [Observación]</code>\r\n\r\nID de Chat de Telegram:\r\n<code>/id</code>"
"helpClientCommands" = "Para buscar estadísticas, utiliza el siguiente comando:\r\n<code>/usage [Correo electrónico]</code>\r\n\r\nID de Chat de Telegram:\r\n<code>/id</code>"
+"restartUsage" = "\r\n\r\n<code>/restart force</code>"
+"restartSuccess" = "✅ ¡Operación exitosa!"
+"restartFailed" = "❗ Error en la operación.\r\n\r\n<code>Error: {{ .Error }}</code>."
+"xrayNotRunning" = "❗ Xray Core no está en ejecución."
[tgbot.messages]
"cpuThreshold" = "🔴 El uso de CPU {{ .Percent }}% es mayor que el umbral {{ .Threshold }}%"
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml index a7ba4a6f..2ff9badd 100644 --- a/web/translation/translate.fa_IR.toml +++ b/web/translation/translate.fa_IR.toml @@ -483,8 +483,12 @@ "status" = "✅ ربات در حالت عادی است!" "usage" = "❗ لطفاً یک متن برای جستجو وارد کنید!" "getID" = "🆔 شناسه شما: <code>{{ .ID }}</code>" -"helpAdminCommands" = "برای جستجوی ایمیل مشتری:\r\n<code>/usage [ایمیل]</code>\r\n\r\nبرای جستجوی ورودیها (با آمار مشتری):\r\n<code>/inbound [توضیحات]</code>\r\n\r\nشناسه گفتگوی تلگرام:\r\n<code>/id</code>" +"helpAdminCommands" = "برای راهاندازی مجدد Xray Core:\r\n<code>/restart force</code>\r\n\r\nبرای جستجوی ایمیل مشتری:\r\n<code>/usage [ایمیل]</code>\r\n\r\nبرای جستجوی ورودیها (با آمار مشتری):\r\n<code>/inbound [توضیحات]</code>\r\n\r\nشناسه گفتگوی تلگرام:\r\n<code>/id</code>" "helpClientCommands" = "برای جستجوی آمار، از دستور زیر استفاده کنید:\r\n<code>/usage [ایمیل]</code>\r\n\r\nشناسه گفتگوی تلگرام:\r\n<code>/id</code>" +"restartUsage" = "\r\n\r\n<code>/restart force</code>" +"restartSuccess" = "✅ عملیات با موفقیت انجام شد!" +"restartFailed" = "❗ خطا در عملیات.\r\n\r\n<code>خطا: {{ .Error }}</code>." +"xrayNotRunning" = "❗ Xray Core در حال اجرا نیست." [tgbot.messages] "cpuThreshold" = "🔴 بار پردازنده {{ .Percent }}% بیشتر از آستانه است {{ .Threshold }}%" diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml index f543971b..00862888 100644 --- a/web/translation/translate.id_ID.toml +++ b/web/translation/translate.id_ID.toml @@ -482,9 +482,13 @@ "welcome" = "🤖 Selamat datang di <b>{{.Hostname }}</b> bot managemen.\r\n" "status" = "✅ Bot dalam keadaan baik!" "usage" = "❗ Harap berikan teks untuk mencari!" -"getID" = "🆔 ID Anda:<code>{{.ID }}</code>" -"helpAdminCommands" = "Untuk mencari email klien:\r\n<code>/usage [Email]</code>\r\n\r\nUntuk mencari inbound (dengan statistik klien):\r\n<code>/inbound [Catatan]</code>\r\n\r\nID Obrolan Telegram:\r\n<code>/id</code>" +"getID" = "🆔 ID Anda: <code>{{ .ID }}</code>" +"helpAdminCommands" = "Untuk memulai ulang Xray Core:\r\n<code>/restart force</code>\r\n\r\nUntuk mencari email klien:\r\n<code>/usage [Email]</code>\r\n\r\nUntuk mencari inbound (dengan statistik klien):\r\n<code>/inbound [Catatan]</code>\r\n\r\nID Obrolan Telegram:\r\n<code>/id</code>" "helpClientCommands" = "Untuk mencari statistik, gunakan perintah berikut:\r\n<code>/usage [Email]</code>\r\n\r\nID Obrolan Telegram:\r\n<code>/id</code>" +"restartUsage" = "\r\n\r\n<code>/restart force</code>" +"restartSuccess" = "✅ Operasi berhasil!" +"restartFailed" = "❗ Kesalahan dalam operasi.\r\n\r\n<code>Error: {{ .Error }}</code>." +"xrayNotRunning" = "❗ Xray Core tidak berjalan." [tgbot.messages] "cpuThreshold" = "🔴 Beban CPU {{ .Percent }}% melebihi batas {{ .Threshold }}%" diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml index f201df66..7e64369a 100644 --- a/web/translation/translate.pt_BR.toml +++ b/web/translation/translate.pt_BR.toml @@ -483,8 +483,12 @@ "status" = "✅ Bot está OK!" "usage" = "❗ Por favor, forneça um texto para pesquisar!" "getID" = "🆔 Seu ID: <code>{{ .ID }}</code>" -"helpAdminCommands" = "Para pesquisar por um email de cliente:\r\n<code>/usage [Email]</code>\r\n\r\nPara pesquisar por inbounds (com estatísticas do cliente):\r\n<code>/inbound [Remark]</code>\r\n\r\nTelegram Chat ID:\r\n<code>/id</code>" +"helpAdminCommands" = "Para reiniciar o Xray Core:\r\n<code>/restart force</code>\r\n\r\nPara pesquisar por um email de cliente:\r\n<code>/usage [Email]</code>\r\n\r\nPara pesquisar por inbounds (com estatísticas do cliente):\r\n<code>/inbound [Remark]</code>\r\n\r\nTelegram Chat ID:\r\n<code>/id</code>" "helpClientCommands" = "Para pesquisar por estatísticas, use o seguinte comando:\r\n\r\n<code>/usage [Email]</code>\r\n\r\nTelegram Chat ID:\r\n<code>/id</code>" +"restartUsage" = "\r\n\r\n<code>/restart force</code>" +"restartSuccess" = "✅ Operação bem-sucedida!" +"restartFailed" = "❗ Erro na operação.\r\n\r\n<code>Erro: {{ .Error }}</code>." +"xrayNotRunning" = "❗ Xray Core não está em execução." [tgbot.messages] "cpuThreshold" = "🔴 A carga da CPU {{ .Percent }}% excede o limite de {{ .Threshold }}%" diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml index a5eae4b8..f9905bdb 100644 --- a/web/translation/translate.ru_RU.toml +++ b/web/translation/translate.ru_RU.toml @@ -483,8 +483,12 @@ "status" = "✅ Бот работает нормально!" "usage" = "❗ Пожалуйста, укажите текст для поиска!" "getID" = "🆔 Ваш ID: <code>{{ .ID }}</code>" -"helpAdminCommands" = "Для поиска электронной почты клиента:\r\n<code>/usage [Email]</code>\r\n\r\nДля поиска входящих (со статистикой клиента):\r\n<code>/inbound [Примечание]</code>\r\n\r\nID чата Telegram:\r\n<code>/id</code>" +"helpAdminCommands" = "Для перезапуска Xray Core:\r\n<code>/restart force</code>\r\n\r\nДля поиска электронной почты клиента:\r\n<code>/usage [Email]</code>\r\n\r\nДля поиска входящих (со статистикой клиента):\r\n<code>/inbound [Примечание]</code>\r\n\r\nID чата Telegram:\r\n<code>/id</code>" "helpClientCommands" = "Для поиска статистики используйте следующую команду:\r\n<code>/usage [Email]</code>\r\n\r\nID чата Telegram:\r\n<code>/id</code>" +"restartUsage" = "\r\n\r\n<code>/restart force</code>" +"restartSuccess" = "✅ Операция успешно завершена!" +"restartFailed" = "❗ Ошибка в операции.\r\n\r\n<code>Ошибка: {{ .Error }}</code>." +"xrayNotRunning" = "❗ Xray Core не запущен." [tgbot.messages] "cpuThreshold" = "🔴 Загрузка процессора составляет {{ .Percent }}%, что превышает пороговое значение {{ .Threshold }}%" diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml index 9816111f..f917d176 100644 --- a/web/translation/translate.tr_TR.toml +++ b/web/translation/translate.tr_TR.toml @@ -483,8 +483,12 @@ "status" = "✅ Bot çalışıyor!" "usage" = "❗ Lütfen aramak için bir metin sağlayın!" "getID" = "🆔 Kimliğiniz: <code>{{ .ID }}</code>" -"helpAdminCommands" = "Bir müşteri e-postasını aramak için:\r\n<code>/usage [E-posta]</code>\r\n\r\nGelenleri aramak için (müşteri istatistikleri ile):\r\n<code>/inbound [Açıklama]</code>\r\n\r\nTelegram Sohbet Kimliği:\r\n<code>/id</code>" +"helpAdminCommands" = "Xray Core'u yeniden başlatmak için:\r\n<code>/restart force</code>\r\n\r\nBir müşteri e-postasını aramak için:\r\n<code>/usage [E-posta]</code>\r\n\r\nGelenleri aramak için (müşteri istatistikleri ile):\r\n<code>/inbound [Açıklama]</code>\r\n\r\nTelegram Sohbet Kimliği:\r\n<code>/id</code>" "helpClientCommands" = "İstatistikleri aramak için şu komutu kullanın:\r\n\r\n<code>/usage [E-posta]</code>\r\n\r\nTelegram Sohbet Kimliği:\r\n<code>/id</code>" +"restartUsage" = "\r\n\r\n<code>/restart force</code>" +"restartSuccess" = "✅ İşlem başarılı!" +"restartFailed" = "❗ İşlem hatası.\r\n\r\n<code>Hata: {{ .Error }}</code>." +"xrayNotRunning" = "❗ Xray Core çalışmıyor." [tgbot.messages] "cpuThreshold" = "🔴 CPU Yükü {{ .Percent }}% eşiği {{ .Threshold }}%'yi aşıyor" diff --git a/web/translation/translate.uk_UA.toml b/web/translation/translate.uk_UA.toml index d99b6908..eefb4448 100644 --- a/web/translation/translate.uk_UA.toml +++ b/web/translation/translate.uk_UA.toml @@ -483,8 +483,12 @@ "status" = "✅ Бот в порядку!" "usage" = "❗ Введіть текст для пошуку!" "getID" = "🆔 Ваш ідентифікатор: <code>{{ .ID }}</code>" -"helpAdminCommands" = "Для пошуку електронної пошти клієнта:\r\n<code>/usage [Електронна пошта]</code>\r\n\r\nДля пошуку вхідних (зі статистикою клієнта):\r\n<code>/inbound [Примітка]</code>\r\n\r\nID чату Telegram:\r\n<code>/id</code>" +"helpAdminCommands" = "Для перезапуску Xray Core:\r\n<code>/restart force</code>\r\n\r\nДля пошуку електронної пошти клієнта:\r\n<code>/usage [Електронна пошта]</code>\r\n\r\nДля пошуку вхідних (зі статистикою клієнта):\r\n<code>/inbound [Примітка]</code>\r\n\r\nID чату Telegram:\r\n<code>/id</code>" "helpClientCommands" = "Для пошуку статистики використовуйте наступну команду:\r\n<code>/usage [Електронна пошта]</code>\r\n\r\nID чату Telegram:\r\n<code>/id</code>" +"restartUsage" = "\r\n\r\n<code>/restart force</code>" +"restartSuccess" = "✅ Операція успішна!" +"restartFailed" = "❗ Помилка в операції.\r\n\r\n<code>Помилка: {{ .Error }}</code>." +"xrayNotRunning" = "❗ Xray Core не запущений." [tgbot.messages] "cpuThreshold" = "🔴 Навантаження ЦП {{ .Percent }}% перевищує порогове значення {{ .Threshold }}%" diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml index 2e082ead..ce68064a 100644 --- a/web/translation/translate.vi_VN.toml +++ b/web/translation/translate.vi_VN.toml @@ -483,8 +483,12 @@ "status" = "✅ Bot hoạt động bình thường!"
"usage" = "❗ Vui lòng cung cấp văn bản để tìm kiếm!"
"getID" = "🆔 ID của bạn: <code>{{ .ID }}</code>"
-"helpAdminCommands" = "Để tìm kiếm email của khách hàng:\r\n<code>/usage [Email]</code>\r\n\r\nĐể tìm kiếm các nhập (với số liệu thống kê của khách hàng):\r\n<code>/inbound [Ghi chú]</code>\r\n\r\nID Trò chuyện Telegram:\r\n<code>/id</code>"
+"helpAdminCommands" = "Để khởi động lại Xray Core:\r\n<code>/restart force</code>\r\n\r\nĐể tìm kiếm email của khách hàng:\r\n<code>/usage [Email]</code>\r\n\r\nĐể tìm kiếm các nhập (với số liệu thống kê của khách hàng):\r\n<code>/inbound [Ghi chú]</code>\r\n\r\nID Trò chuyện Telegram:\r\n<code>/id</code>"
"helpClientCommands" = "Để tìm kiếm thống kê, sử dụng lệnh sau:\r\n<code>/usage [Email]</code>\r\n\r\nID Trò chuyện Telegram:\r\n<code>/id</code>"
+"restartUsage" = "\r\n\r\n<code>/restart force</code>"
+"restartSuccess" = "✅ Hoạt động thành công!"
+"restartFailed" = "❗ Lỗi trong quá trình hoạt động.\r\n\r\n<code>Lỗi: {{ .Error }}</code>."
+"xrayNotRunning" = "❗ Xray Core không chạy."
[tgbot.messages]
"cpuThreshold" = "🔴 Sử dụng CPU {{ .Percent }}% vượt quá ngưỡng {{ .Threshold }}%"
diff --git a/web/translation/translate.zh_CN.toml b/web/translation/translate.zh_CN.toml index d271b6b4..6d4b5978 100644 --- a/web/translation/translate.zh_CN.toml +++ b/web/translation/translate.zh_CN.toml @@ -483,8 +483,12 @@ "status" = "✅ 机器人正常运行!" "usage" = "❗ 请输入要搜索的文本!" "getID" = "🆔 您的 ID 为:<code>{{ .ID }}</code>" -"helpAdminCommands" = "要搜索客户电子邮件:\r\n<code>/usage [电子邮件]</code>\r\n\r\n要搜索入站(带有客户统计数据):\r\n<code>/inbound [备注]</code>\r\n\r\nTelegram聊天ID:\r\n<code>/id</code>" +"helpAdminCommands" = "要重新启动 Xray Core:\r\n<code>/restart force</code>\r\n\r\n要搜索客户电子邮件:\r\n<code>/usage [电子邮件]</code>\r\n\r\n要搜索入站(带有客户统计数据):\r\n<code>/inbound [备注]</code>\r\n\r\nTelegram聊天ID:\r\n<code>/id</code>" "helpClientCommands" = "要搜索统计数据,请使用以下命令:\r\n<code>/usage [电子邮件]</code>\r\n\r\nTelegram聊天ID:\r\n<code>/id</code>" +"restartUsage" = "\r\n\r\n<code>/restart force</code>" +"restartSuccess" = "✅ 操作成功!" +"restartFailed" = "❗ 操作错误。\r\n\r\n<code>错误: {{ .Error }}</code>." +"xrayNotRunning" = "❗ Xray Core 未运行。" [tgbot.messages] "cpuThreshold" = "🔴 CPU 使用率为 {{ .Percent }}%,超过阈值 {{ .Threshold }}%" diff --git a/web/translation/translate.zh_TW.toml b/web/translation/translate.zh_TW.toml index 93478845..ad960931 100644 --- a/web/translation/translate.zh_TW.toml +++ b/web/translation/translate.zh_TW.toml @@ -483,8 +483,12 @@ "status" = "✅ 機器人正常執行!" "usage" = "❗ 請輸入要搜尋的文字!" "getID" = "🆔 您的 ID 為:<code>{{ .ID }}</code>" -"helpAdminCommands" = "要搜尋客戶電子郵件:\r\n<code>/usage [電子郵件]</code>\r\n\r\n要搜尋入站(帶有客戶統計資料):\r\n<code>/inbound [備註]</code>\r\n\r\nTelegram聊天ID:\r\n<code>/id</code>" +"helpAdminCommands" = "要重新啟動 Xray Core:\r\n<code>/restart force</code>\r\n\r\n要搜尋客戶電子郵件:\r\n<code>/usage [電子郵件]</code>\r\n\r\n要搜尋入站(帶有客戶統計資料):\r\n<code>/inbound [備註]</code>\r\n\r\nTelegram聊天ID:\r\n<code>/id</code>" "helpClientCommands" = "要搜尋統計資料,請使用以下命令:\r\n<code>/usage [電子郵件]</code>\r\n\r\nTelegram聊天ID:\r\n<code>/id</code>" +"restartUsage" = "\r\n\r\n<code>/restart force</code>" +"restartSuccess" = "✅ 操作成功!" +"restartFailed" = "❗ 操作錯誤。\r\n\r\n<code>錯誤: {{ .Error }}</code>." +"xrayNotRunning" = "❗ Xray Core 未運行。" [tgbot.messages] "cpuThreshold" = "🔴 CPU 使用率為 {{ .Percent }}%,超過閾值 {{ .Threshold }}%" |
