feat(tgbot): rebuild the Telegram bot around editable screens and inline lists (#6760)

The bot answered every action with a new message, so a chat filled with stale
menus whose buttons still acted, and long client or inbound lists were paged
through dozens of buttons. Each chat now has one live screen that is edited in
place: the menu is grouped into Server, Clients, Traffic and Maintenance, lists
open through inline search, the add-client flow starts from a draft card, QR
codes arrive as one labelled sheet, and repeated notices collapse into one with
a counter. A client's /start and /usage show only that client's own links and
usage, groups are refused, and the settings page warns when the bot's inline
mode is off. Admin topics, the indexed Telegram lookup and every locale,
Slovak included, carry over.
This commit is contained in:
DIMFLIX
2026-10-24 13:39:56 +03:00
committed by GitHub
parent bc1b750e00
commit 15fee2a035
62 changed files with 7449 additions and 1945 deletions
+82 -31
View File
@@ -85,7 +85,6 @@
"uploaded": "Yüklenen",
"expiry": "Son Kullanma",
"totalQuota": "Toplam Kota",
"individualLinks": "Bireysel Bağlantılar",
"active": "Aktif",
"inactive": "Pasif",
"unlimited": "Sınırsız",
@@ -1830,6 +1829,11 @@
"subIncyResolveDnsIp": "DoH sunucu IP'si",
"subIncyResolveDnsIpDesc": "Bootstrap için DoH sunucu IP'si.",
"subIncyGroupRouting": "Yönlendirme",
"tgInlineMissing": "Inline mode is disabled",
"tgInlineMissingDesc": "Lists in the bot open through inline search. Enable it in @BotFather with /setinline, otherwise tapping a search button does nothing.",
"tgInlineRecheck": "Check again",
"tgPrivacyOn": "Grup gizliliği açık",
"tgPrivacyOnDesc": "Bu bot yalnızca özel sohbette yanıt verir, bu yüzden grupları bilerek yok sayar. Grup gizliliği yalnızca botun grup mesajlarını okuyup okuyamayacağını belirler; bot bunu kullanmaz.",
"subHostSortMode": "Abonelik düğümü sıralaması",
"subHostSortInbound": "Gelen bağlantı sırası (varsayılan)",
"subHostSortHosts": "Ana bilgisayar sırası",
@@ -2486,7 +2490,6 @@
}
},
"tgbot": {
"keyboardClosed": "❌ Klavye kapatıldı!",
"noResult": "❗ Sonuç yok!",
"noQuery": "❌ Sorgu bulunamadı! Lütfen komutu tekrar kullanın!",
"wentWrong": "❌ Bir şeyler yanlış gitti!",
@@ -2508,10 +2511,6 @@
"unknown": "❗ Bilinmeyen komut.",
"pleaseChoose": "👇 Lütfen seçin:\r\n",
"help": "🤖 Bu bota hoş geldiniz! Web panelinden belirli verileri sunmak ve gerektiğinde değişiklik yapmanıza olanak tanımak için tasarlanmıştır.\r\n\r\n",
"start": "👋 Merhaba <i>{{ .Firstname }}</i>.\r\n",
"welcome": "🤖 <b>{{ .Hostname }}</b> yönetim botuna hoş geldiniz.\r\n",
"status": "✅ Bot çalışıyor!",
"usage": "❗ Lütfen aramak için bir metin sağlayın!",
"getID": "🆔 Kimliğiniz: <code>{{ .ID }}</code>",
"helpAdminCommands": "Xray Core'u yeniden başlatmak için:\r\n<code>/restart</code>\r\n\r\nBir kullanıcının istatistiklerini aramak için:\r\n<code>/usage [E-posta]</code>\r\n\r\nGelen bağlantılarnı aramak için (kullanıcı istatistikleri ile):\r\n<code>/inbound [Açıklama]</code>\r\n\r\nTelegram Sohbet Kimliği (Chat ID):\r\n<code>/id</code>",
"helpClientCommands": "İstatistiklerinizi görmek 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>",
@@ -2520,14 +2519,7 @@
"restartFailed": "❗ İşlem hatası.\r\n\r\n<code>Hata: {{ .Error }}</code>.",
"xrayNotRunning": "❗ Xray Core çalışmıyor.",
"startDesc": "Ana menüyü göster",
"helpDesc": "Bot yardımı",
"statusDesc": "Bot durumunu kontrol et",
"idDesc": "Telegram Kimliğinizi gösterir",
"usageDesc": "İstemci kullanımını göster: /usage e-posta",
"inboundDesc": "Gelenleri ara: /inbound ad (yönetici)",
"restartDesc": "Xray çekirdeğini yeniden başlat (yönetici)",
"broadcastDesc": "Tüm istemcilere mesaj gönder (yönetici)",
"clearallDesc": "Tüm istemcilerin trafiğini sıfırla (yönetici)"
"statusOk": "✅ Bot çalışıyor!"
},
"messages": {
"cpuThreshold": "CPU Yükü ({{ .Percent }}%), {{ .Threshold }}% eşiğini aşıyor",
@@ -2571,7 +2563,6 @@
"inviteInvalid": "❗ Bu davet bağlantısı geçersiz veya daha önce kullanılmış.\r\n",
"inviteRateLimited": "⏳ Çok fazla davet denemesi. Lütfen daha sonra tekrar deneyin.\r\n",
"inviteRateLimitedAdmin": "⚠️ {{ .User }} (<code>{{ .ID }}</code>) için davet denemeleri engellendi: bir saatte {{ .Limit }} denemeden fazla. Birisi abonelik kimliklerini tahmin etmeye çalışıyor olabilir.",
"inviteLink": "🔗 <code>{{ .Email }}</code> için davet bağlantısı:\r\n<code>{{ .Link }}</code>\r\n\r\nBağlantıyı ilk açan kişi bu istemciye bağlanır.\r\n",
"exhaustedCount": "🚨 Limiti Dolan {{ .Type }} sayısı:\r\n",
"onlinesCount": "🌐 Çevrimiçi Kullanıcılar: {{ .Count }}\r\n",
"disabled": "🛑 Devre Dışı: {{ .Disabled }}\r\n",
@@ -2580,13 +2571,11 @@
"refreshedOn": "\r\n📋🔄 Yenilendi: {{ .Time }}\r\n\r\n",
"yes": "✅ Evet",
"no": "❌ Hayır",
"received_email": "📧📥 E-posta güncellendi.",
"received_comment": "💬📥 Yorum güncellendi.",
"email_prompt": "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-postanızı girin.",
"comment_prompt": "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin.",
"tgid_prompt": "🆔 Varsayılan TG kullanıcısı: {{ .ClientTGID }}\n\nBu istemciye bağlamak için kullanıcının sayısal id'sini gönderin veya temizlemek için - / none gönderin.",
"cancel": "❌ İşlem iptal edildi! \n\nİstediğiniz zaman /start ile yeniden başlayabilirsiniz. 🔄",
"error_add_client": "⚠️ Hata:\n\n {{ .error }}",
"using_default_value": "Tamam, varsayılan değeri kullanacağım. 😊",
"incorrect_input": "Geçersiz değer girdiniz.\nİfadeler arasında boşluk olmamalıdır.\nDoğru örnek: aaaaaa\nYanlış örnek: aaa aaa 🚫",
"broadcastAskText": "📤 Toplu gönderim: istemcilerinize iletmek istediğiniz mesajı bana gönderin — metin, fotoğraf, video, dosya veya bir albüm.",
"broadcastAlreadyRunning": "❗ Zaten devam eden bir toplu gönderim var, bitmesini bekleyin.",
@@ -2610,7 +2599,23 @@
"eventNodeDown": "{{ .Name }} düğümü ÇEVRİMDIŞI",
"eventNodeUp": "{{ .Name }} düğümü ÇEVRİMİÇİ",
"eventLoginFallback": "{{ .Source }} adresinden oturum açma başarısız",
"memoryThreshold": "Bellek kullanımı {{ .Percent }}% eşiği {{ .Threshold }}% aşıyor"
"memoryThreshold": "Bellek kullanımı {{ .Percent }}% eşiği {{ .Threshold }}% aşıyor",
"inboundsCount": "🔌 Inbounds: {{ .Count }}\r\n",
"clientsCount": "👥 Clients: {{ .Count }}\r\n",
"category_server": "🖥 Sunucu",
"category_clients": "👥 İstemciler",
"category_traffic": "🚦 Trafik",
"category_maintenance": "⚙️ Bakım",
"inlineHint": "\r\n🔍 The list opens through search: tap Find and start typing.",
"subURL": "🔗 Subscription: <code>{{ .URL }}</code>\r\n",
"jsonURL": "🧩 JSON: <code>{{ .URL }}</code>\r\n",
"inviteHint": "Send this link to the client: the first Telegram account to open it is bound to the client.",
"qrLegendHeader": "🔳 QR kodları:",
"qrLegendSubscription": "{{ .Code }}. Abonelik",
"qrLegendJSON": "{{ .Code }}. JSON abonelik",
"qrLegendLink": "{{ .Code }}. Uygulama bağlantısı {{ .App }}",
"backupFailed": "Veritabanı okunamadı; yedek gönderilmedi.",
"privateOnly": "🤖 Bu bot yalnızca özel sohbette çalışır. Lütfen doğrudan mesajda açın."
},
"buttons": {
"closeKeyboard": "❌ Klavyeyi Kapat",
@@ -2622,13 +2627,15 @@
"confirmClearIps": "✅ IP'leri Temizlemeyi Onayla?",
"confirmRemoveTGUser": "✅ Telegram Kullanıcısını Kaldırmayı Onayla?",
"confirmToggle": "✅ Kullanıcıyı Etkinleştirme/Devre Dışı Bırakmayı Onayla?",
"dbBackup": "Veritabanı Yedeği Al",
"serverUsage": "Sunucu Kullanımı",
"getInbounds": "Gelen Bağlantılarnı Al",
"depleteSoon": "Kotası Dolmak Üzere",
"clientUsage": "Kullanıcı İstatistikleri",
"onlines": "Çevrimiçi Kullanıcılar",
"commands": "Komutlar",
"dbBackup": "💾 Veritabanı Yedeği Al",
"serverUsage": "📊 Sunucu Kullanımı",
"getInbounds": "🔌 Gelen Bağlantılarnı Al",
"depleteSoon": "⚠️ Kotası Dolmak Üzere",
"onlines": "🟢 Çevrimiçi Kullanıcılar",
"catServer": "🖥 Sunucu",
"catClients": "👥 İstemciler",
"catTraffic": "🚦 Trafik",
"catMaintenance": "⚙️ Bakım",
"refresh": "🔄 Yenile",
"clearIPs": "❌ IP'leri Temizle",
"removeTGUser": "❌ Telegram Kullanıcısını Kaldır",
@@ -2645,16 +2652,30 @@
"confirmNumber": "✅ Onayla: {{ .Num }}",
"confirmNumberAdd": "✅ Ekleme onayı: {{ .Num }}",
"limitTraffic": "🚧 Trafik Sınırı",
"getBanLogs": "Yasak Günlüklerini Al",
"allClients": "Tüm Kullanıcılar",
"addClient": "Kullanıcı Ekle",
"getBanLogs": "📄 Yasak Günlüklerini Al",
"allClients": "👥 Tüm Kullanıcılar",
"addClient": "➕ Kullanıcı Ekle",
"submitDisable": "Devre Dışı Olarak Gönder ☑️",
"submitEnable": "Etkin Olarak Gönder ✅",
"use_default": "🏷️ Varsayılanı Kullan",
"change_email": "⚙️📧 E-posta",
"change_comment": "⚙️💬 Yorum",
"ResetAllTraffics": "Tüm Trafikleri Sıfırla",
"SortedTrafficUsageReport": "Sıralı Trafik Kullanım Raporu"
"ResetAllTraffics": "♻️ Tüm Trafikleri Sıfırla",
"SortedTrafficUsageReport": "📈 Sıralı Trafik Kullanım Raporu",
"restartXray": "♻️ Restart Xray",
"back": "⬅️ Back",
"hide": "🙈 Hide",
"page": "Page {{ .Page }} of {{ .Pages }}",
"searchInbounds": "🔍 Find inbound…",
"searchClients": "🔍 Find client…",
"inlineDisabled": "⚠️ Inline mode is off",
"clientCard": "⬅️ Client card",
"links": "🔗 Links",
"individualLinks": "🔗 Individual links",
"qrCode": "🔳 QR code",
"broadcast": "📢 Yayın",
"attachInbound": "Inbound ekle ({{ .Count }})",
"attachDone": "✅ Tamam"
},
"answers": {
"broadcastStarted": "🚀 Toplu gönderim başladı.",
@@ -2682,6 +2703,36 @@
"chooseClient": "Gelen Bağlantı {{ .Inbound }} için bir Kullanıcı Seçin",
"chooseInbound": "Bir Gelen Bağlantı Seçin",
"qrCodeForClient": "{{ .Email }} istemcisi için QR Kodu:"
},
"screens": {
"panel": "Panel",
"main": "Main",
"status": "Server",
"inbounds": "Inbounds",
"clients": "Clients",
"client": "Client",
"links": "Links",
"qr": "QR code",
"wizard": "New client",
"reports": "Report",
"backup": "Backup",
"onlines": "Online",
"deplete": "Running out",
"commands": "Commands",
"broadcast": "Broadcast"
},
"inline": {
"noneTitle": "Nothing found",
"noneDesc": "Use @BotFather /setinline to enable the list.",
"offTitle": "⚠️ Inline mode is disabled for this bot",
"offBody": "Lists are browsed in inline mode. Enable it in @BotFather: /setinline, then tap Check again.",
"recheck": "Check again",
"expired": "süresi doldu",
"fromFirstUse": "ilk kullanımdan"
},
"noValue": "—",
"notices": {
"repeat": "\r\n\r\n🔁 repeated {{ .Count }}× · last {{ .Time }}"
}
},
"discord": {