mirror of
https://github.com/anten-ka/gotelegram_pro.git
synced 2026-05-22 22:06:02 +00:00
Compare commits
3 Commits
v2.3.0
...
a21d2ebea2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a21d2ebea2 | ||
|
|
96cbd243d9 | ||
|
|
3f136ec8a0 |
@@ -50,7 +50,7 @@ logger = logging.getLogger(__name__)
|
|||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
GOTELEGRAM_VERSION = "2.3.0"
|
GOTELEGRAM_VERSION = "2.3.1"
|
||||||
GOTELEGRAM_CONFIG = "/opt/gotelegram/config.json"
|
GOTELEGRAM_CONFIG = "/opt/gotelegram/config.json"
|
||||||
TELEMT_CONFIG = "/etc/telemt/config.toml"
|
TELEMT_CONFIG = "/etc/telemt/config.toml"
|
||||||
TELEMT_SERVICE = "telemt"
|
TELEMT_SERVICE = "telemt"
|
||||||
@@ -58,8 +58,10 @@ WEBSITE_ROOT = "/var/www/gotelegram-site"
|
|||||||
BACKUP_DIR = "/opt/gotelegram/backups"
|
BACKUP_DIR = "/opt/gotelegram/backups"
|
||||||
TEMPLATES_CATALOG = "/opt/gotelegram/templates_catalog.json"
|
TEMPLATES_CATALOG = "/opt/gotelegram/templates_catalog.json"
|
||||||
|
|
||||||
PROMO_LINK = "https://vk.cc/ct29NQ"
|
PROMO_LINK_1 = "https://vk.cc/ct29NQ"
|
||||||
|
PROMO_LINK_2 = "https://vk.cc/cUxAhj"
|
||||||
TIP_LINK = "https://pay.cloudtips.ru/p/7410814f"
|
TIP_LINK = "https://pay.cloudtips.ru/p/7410814f"
|
||||||
|
PROMO_STAMP_FILE = "/opt/gotelegram/.promo_bot_last_shown"
|
||||||
|
|
||||||
BOT_TOKEN = os.getenv("BOT_TOKEN")
|
BOT_TOKEN = os.getenv("BOT_TOKEN")
|
||||||
ALLOWED_IDS_STR = os.getenv("ALLOWED_IDS", "")
|
ALLOWED_IDS_STR = os.getenv("ALLOWED_IDS", "")
|
||||||
@@ -277,7 +279,7 @@ def get_main_menu() -> InlineKeyboardMarkup:
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton("🌐 Website/SSL", callback_data="menu_website"),
|
InlineKeyboardButton("🌐 Website/SSL", callback_data="menu_website"),
|
||||||
InlineKeyboardButton("🎁 Promo", callback_data="menu_promo"),
|
InlineKeyboardButton("🎁 Промо", callback_data="menu_promo"),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton("📊 Traffic Stats", callback_data="menu_stats"),
|
InlineKeyboardButton("📊 Traffic Stats", callback_data="menu_stats"),
|
||||||
@@ -297,7 +299,7 @@ def get_main_menu() -> InlineKeyboardMarkup:
|
|||||||
|
|
||||||
|
|
||||||
async def cmd_start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
async def cmd_start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||||
"""Start command - show main menu."""
|
"""Start command - show main menu, promo once per day."""
|
||||||
if not await require_auth(update, context):
|
if not await require_auth(update, context):
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -311,6 +313,13 @@ async def cmd_start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
|||||||
welcome, reply_markup=get_main_menu(), parse_mode="HTML"
|
welcome, reply_markup=get_main_menu(), parse_mode="HTML"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Промо раз в сутки
|
||||||
|
if should_show_promo_bot():
|
||||||
|
mark_promo_shown_bot()
|
||||||
|
await update.message.reply_text(
|
||||||
|
get_promo_text(), parse_mode="HTML"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def cmd_help(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
async def cmd_help(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||||
"""Help command - show available commands."""
|
"""Help command - show available commands."""
|
||||||
@@ -826,7 +835,7 @@ async def cb_pro_confirm(update: Update, context: ContextTypes.DEFAULT_TYPE) ->
|
|||||||
|
|
||||||
|
|
||||||
async def get_proxy_link() -> Optional[str]:
|
async def get_proxy_link() -> Optional[str]:
|
||||||
"""Generate proxy link from config."""
|
"""Generate proxy link from config. Pro-mode uses domain + fake-TLS secret."""
|
||||||
config = load_json(GOTELEGRAM_CONFIG)
|
config = load_json(GOTELEGRAM_CONFIG)
|
||||||
if not config:
|
if not config:
|
||||||
return None
|
return None
|
||||||
@@ -842,12 +851,20 @@ async def get_proxy_link() -> Optional[str]:
|
|||||||
if not secret:
|
if not secret:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Get server IP
|
mode = config.get("mode", "lite")
|
||||||
|
domain = config.get("domain", "")
|
||||||
|
port = config.get("port", 443)
|
||||||
|
|
||||||
|
# Pro-режим: ссылка с доменом и fake-TLS секретом (ee + secret + hex domain)
|
||||||
|
if mode == "pro" and domain:
|
||||||
|
domain_hex = domain.encode().hex()
|
||||||
|
faketls_secret = f"ee{secret}{domain_hex}"
|
||||||
|
return f"tg://proxy?server={domain}&port={port}&secret={faketls_secret}"
|
||||||
|
|
||||||
|
# Lite-режим: IP
|
||||||
code, stdout, _ = await sh("curl", "-s", "-4", "--max-time", "5", "https://api.ipify.org")
|
code, stdout, _ = await sh("curl", "-s", "-4", "--max-time", "5", "https://api.ipify.org")
|
||||||
server = stdout.strip() if code == 0 and stdout.strip() else "0.0.0.0"
|
server = stdout.strip() if code == 0 and stdout.strip() else "0.0.0.0"
|
||||||
|
|
||||||
port = config.get("port", 443)
|
|
||||||
|
|
||||||
return f"tg://proxy?server={server}&port={port}&secret={secret}"
|
return f"tg://proxy?server={server}&port={port}&secret={secret}"
|
||||||
|
|
||||||
|
|
||||||
@@ -1310,23 +1327,57 @@ async def cb_ssl_status(update: Update, context: ContextTypes.DEFAULT_TYPE) -> N
|
|||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
def get_promo_text() -> str:
|
||||||
|
"""Return promo text with 2 hosters + donate."""
|
||||||
|
return (
|
||||||
|
"<b>💰 Хостинг #1 — скидка до 60%</b>\n"
|
||||||
|
f"<a href='{PROMO_LINK_1}'>{PROMO_LINK_1}</a>\n\n"
|
||||||
|
"<b>Промокоды:</b>\n"
|
||||||
|
" <code>OFF60</code> — 60% на первый месяц\n"
|
||||||
|
" <code>antenka20</code> — 20% + 3% за 3 мес\n"
|
||||||
|
" <code>antenka6</code> — 15% + 5% за 6 мес\n\n"
|
||||||
|
"━━━━━━━━━━━━━━━━━━━━━━━━━\n\n"
|
||||||
|
"<b>💰 Хостинг #2 — скидка до 60%</b>\n"
|
||||||
|
f"<a href='{PROMO_LINK_2}'>{PROMO_LINK_2}</a>\n\n"
|
||||||
|
"<b>Промокод:</b>\n"
|
||||||
|
" <code>OFF60</code> — 60% на первый месяц\n\n"
|
||||||
|
"━━━━━━━━━━━━━━━━━━━━━━━━━\n\n"
|
||||||
|
"<b>☕ Донат / Чаевые</b>\n"
|
||||||
|
f"<a href='{TIP_LINK}'>{TIP_LINK}</a>"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def should_show_promo_bot() -> bool:
|
||||||
|
"""Check if promo should be shown (once per 24h)."""
|
||||||
|
try:
|
||||||
|
if not os.path.exists(PROMO_STAMP_FILE):
|
||||||
|
return True
|
||||||
|
with open(PROMO_STAMP_FILE, "r") as f:
|
||||||
|
last_ts = int(f.read().strip())
|
||||||
|
return (int(time.time()) - last_ts) >= 86400
|
||||||
|
except (ValueError, OSError):
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def mark_promo_shown_bot() -> None:
|
||||||
|
"""Mark promo as shown."""
|
||||||
|
try:
|
||||||
|
os.makedirs(os.path.dirname(PROMO_STAMP_FILE), exist_ok=True)
|
||||||
|
with open(PROMO_STAMP_FILE, "w") as f:
|
||||||
|
f.write(str(int(time.time())))
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
async def cb_menu_promo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
async def cb_menu_promo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||||
"""Promo information."""
|
"""Promo information — always shown from menu."""
|
||||||
query = update.callback_query
|
query = update.callback_query
|
||||||
await query.answer()
|
await query.answer()
|
||||||
|
|
||||||
text = (
|
|
||||||
f"<b>🎁 GoTelegram Promo</b>\n\n"
|
|
||||||
f"Share the love! Invite friends to use GoTelegram.\n\n"
|
|
||||||
f"<a href='{PROMO_LINK}'>Promo Link</a>\n\n"
|
|
||||||
f"Support development:\n"
|
|
||||||
f"<a href='{TIP_LINK}'>Send a Tip</a>"
|
|
||||||
)
|
|
||||||
|
|
||||||
keyboard = InlineKeyboardMarkup(
|
keyboard = InlineKeyboardMarkup(
|
||||||
[[InlineKeyboardButton("« Back", callback_data="menu_main")]]
|
[[InlineKeyboardButton("« Назад", callback_data="menu_main")]]
|
||||||
)
|
)
|
||||||
await safe_edit_message(query,text, reply_markup=keyboard, parse_mode="HTML")
|
await safe_edit_message(query, get_promo_text(), reply_markup=keyboard, parse_mode="HTML")
|
||||||
|
|
||||||
|
|
||||||
async def cb_menu_credits(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
async def cb_menu_credits(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||||
|
|||||||
121
install.sh
121
install.sh
@@ -112,8 +112,7 @@ show_main_menu() {
|
|||||||
|
|
||||||
if command -v qrencode &>/dev/null; then
|
if command -v qrencode &>/dev/null; then
|
||||||
echo ""
|
echo ""
|
||||||
echo ""
|
qrencode -t UTF8 -m 2 "$link" 2>/dev/null | while IFS= read -r qr_line; do
|
||||||
qrencode -t UTF8 -m 1 "$link" 2>/dev/null | while IFS= read -r qr_line; do
|
|
||||||
echo " ${qr_line}"
|
echo " ${qr_line}"
|
||||||
done
|
done
|
||||||
echo ""
|
echo ""
|
||||||
@@ -455,11 +454,21 @@ menu_status() {
|
|||||||
|
|
||||||
# ── Ссылка ───────────────────────────────────────────────────────────────────
|
# ── Ссылка ───────────────────────────────────────────────────────────────────
|
||||||
menu_link() {
|
menu_link() {
|
||||||
local secret port ip link
|
local secret port ip link mode domain
|
||||||
secret=$(get_config_value secret)
|
secret=$(get_config_value secret)
|
||||||
port=$(get_config_value port)
|
port=$(get_config_value port)
|
||||||
ip=$(get_server_ip)
|
ip=$(get_server_ip)
|
||||||
link=$(generate_proxy_link "$ip" "$port" "$secret")
|
mode=$(config_get mode 2>/dev/null || echo "lite")
|
||||||
|
domain=$(config_get domain 2>/dev/null || echo "")
|
||||||
|
|
||||||
|
if [ "$mode" = "pro" ] && [ -n "$domain" ]; then
|
||||||
|
local domain_hex faketls_secret
|
||||||
|
domain_hex=$(printf '%s' "$domain" | xxd -p | tr -d '\n')
|
||||||
|
faketls_secret="ee${secret}${domain_hex}"
|
||||||
|
link="tg://proxy?server=${domain}&port=${port}&secret=${faketls_secret}"
|
||||||
|
else
|
||||||
|
link=$(generate_proxy_link "$ip" "$port" "$secret")
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${BOLD}${WHITE}🔗 Ссылка для подключения:${NC}"
|
echo -e " ${BOLD}${WHITE}🔗 Ссылка для подключения:${NC}"
|
||||||
@@ -474,18 +483,30 @@ menu_link() {
|
|||||||
|
|
||||||
# ── Поделиться ───────────────────────────────────────────────────────────────
|
# ── Поделиться ───────────────────────────────────────────────────────────────
|
||||||
menu_share() {
|
menu_share() {
|
||||||
local secret port ip link
|
local secret port ip link mode domain server_display
|
||||||
secret=$(get_config_value secret)
|
secret=$(get_config_value secret)
|
||||||
port=$(get_config_value port)
|
port=$(get_config_value port)
|
||||||
ip=$(get_server_ip)
|
ip=$(get_server_ip)
|
||||||
link=$(generate_proxy_link "$ip" "$port" "$secret")
|
mode=$(config_get mode 2>/dev/null || echo "lite")
|
||||||
|
domain=$(config_get domain 2>/dev/null || echo "")
|
||||||
|
|
||||||
|
if [ "$mode" = "pro" ] && [ -n "$domain" ]; then
|
||||||
|
local domain_hex faketls_secret
|
||||||
|
domain_hex=$(printf '%s' "$domain" | xxd -p | tr -d '\n')
|
||||||
|
faketls_secret="ee${secret}${domain_hex}"
|
||||||
|
link="tg://proxy?server=${domain}&port=${port}&secret=${faketls_secret}"
|
||||||
|
server_display="$domain"
|
||||||
|
else
|
||||||
|
link=$(generate_proxy_link "$ip" "$port" "$secret")
|
||||||
|
server_display="$ip"
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${BOLD}📤 Перешлите это сообщение:${NC}"
|
echo -e " ${BOLD}📤 Перешлите это сообщение:${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
echo "🔐 MTProxy для Telegram (GoTelegram v${GOTELEGRAM_VERSION})"
|
echo "🔐 MTProxy для Telegram (GoTelegram v${GOTELEGRAM_VERSION})"
|
||||||
echo ""
|
echo ""
|
||||||
echo "🌍 Сервер: $ip"
|
echo "🌍 Сервер: $server_display"
|
||||||
echo "🔌 Порт: $port"
|
echo "🔌 Порт: $port"
|
||||||
echo ""
|
echo ""
|
||||||
echo "👉 Подключиться одним нажатием:"
|
echo "👉 Подключиться одним нажатием:"
|
||||||
@@ -924,16 +945,91 @@ bot_remove() {
|
|||||||
menu_promo() {
|
menu_promo() {
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${YELLOW}╔══════════════════════════════════════════════════════╗${NC}"
|
echo -e " ${YELLOW}╔══════════════════════════════════════════════════════╗${NC}"
|
||||||
echo -e " ${YELLOW}║${NC} ${BOLD}💰 ХОСТИНГ СО СКИДКОЙ ДО -60%${NC} ${YELLOW}║${NC}"
|
echo -e " ${YELLOW}║${NC} ${BOLD}💰 ХОСТИНГ #1 — СКИДКА ДО 60%${NC} ${YELLOW}║${NC}"
|
||||||
echo -e " ${YELLOW}║${NC} Ссылка: ${CYAN}https://vk.cc/ct29NQ${NC} ${YELLOW}║${NC}"
|
echo -e " ${YELLOW}║${NC} Ссылка: ${CYAN}https://vk.cc/ct29NQ${NC} ${YELLOW}║${NC}"
|
||||||
echo -e " ${YELLOW}║${NC} ${YELLOW}║${NC}"
|
echo -e " ${YELLOW}║${NC} ${YELLOW}║${NC}"
|
||||||
echo -e " ${YELLOW}║${NC} Промокоды: OFF60, antenka20, antenka6, antenka12 ${YELLOW}║${NC}"
|
echo -e " ${YELLOW}║${NC} ${WHITE}OFF60${NC} — 60% скидки на первый месяц ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${WHITE}antenka20${NC} — 20% + 3% при оплате за 3 месяца ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${WHITE}antenka6${NC} — 15% + 5% при оплате за 6 месяцев ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}╟──────────────────────────────────────────────────────╢${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${BOLD}💰 ХОСТИНГ #2 — СКИДКА ДО 60%${NC} ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} Ссылка: ${CYAN}https://vk.cc/cUxAhj${NC} ${YELLOW}║${NC}"
|
||||||
echo -e " ${YELLOW}║${NC} ${YELLOW}║${NC}"
|
echo -e " ${YELLOW}║${NC} ${YELLOW}║${NC}"
|
||||||
echo -e " ${YELLOW}║${NC} Донат: ${CYAN}https://pay.cloudtips.ru/p/7410814f${NC} ${YELLOW}║${NC}"
|
echo -e " ${YELLOW}║${NC} ${WHITE}OFF60${NC} — 60% скидки на первый месяц ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}╟──────────────────────────────────────────────────────╢${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${BOLD}☕ Донат / Чаевые${NC} ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${CYAN}https://pay.cloudtips.ru/p/7410814f${NC} ${YELLOW}║${NC}"
|
||||||
echo -e " ${YELLOW}╚══════════════════════════════════════════════════════╝${NC}"
|
echo -e " ${YELLOW}╚══════════════════════════════════════════════════════╝${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ── Проверка: показывать ли промо (раз в сутки) ────────────────────────────
|
||||||
|
should_show_promo() {
|
||||||
|
local stamp_file="$GOTELEGRAM_DIR/.promo_last_shown"
|
||||||
|
if [ ! -f "$stamp_file" ]; then
|
||||||
|
return 0 # никогда не показывали
|
||||||
|
fi
|
||||||
|
local last_shown now diff
|
||||||
|
last_shown=$(cat "$stamp_file" 2>/dev/null || echo "0")
|
||||||
|
last_shown="${last_shown//[^0-9]/}"
|
||||||
|
last_shown="${last_shown:-0}"
|
||||||
|
now=$(date +%s)
|
||||||
|
diff=$(( now - last_shown ))
|
||||||
|
# 86400 = 24 часа
|
||||||
|
[ "$diff" -ge 86400 ]
|
||||||
|
}
|
||||||
|
|
||||||
|
mark_promo_shown() {
|
||||||
|
mkdir -p "$GOTELEGRAM_DIR"
|
||||||
|
date +%s > "$GOTELEGRAM_DIR/.promo_last_shown"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── Промо с QR и задержкой (при установке + раз в сутки) ───────────────────
|
||||||
|
show_promo_with_qr() {
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}╔══════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${BOLD}💰 ХОСТИНГ #1 — СКИДКА ДО 60%${NC} ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} Ссылка: ${CYAN}https://vk.cc/ct29NQ${NC} ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${WHITE}OFF60${NC} — 60% скидки на первый месяц ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${WHITE}antenka20${NC} — 20% + 3% при оплате за 3 месяца ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${WHITE}antenka6${NC} — 15% + 5% при оплате за 6 месяцев ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}╟──────────────────────────────────────────────────────╢${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${BOLD}💰 ХОСТИНГ #2 — СКИДКА ДО 60%${NC} ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} Ссылка: ${CYAN}https://vk.cc/cUxAhj${NC} ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${WHITE}OFF60${NC} — 60% скидки на первый месяц ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}╚══════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# QR-коды
|
||||||
|
if command -v qrencode &>/dev/null; then
|
||||||
|
echo -e " ${DIM}── QR: Хостинг #1 ──${NC}"
|
||||||
|
qrencode -t UTF8 -m 1 "https://vk.cc/ct29NQ" 2>/dev/null | while IFS= read -r qr_line; do
|
||||||
|
echo " $qr_line"
|
||||||
|
done
|
||||||
|
echo ""
|
||||||
|
echo -e " ${DIM}── QR: Хостинг #2 ──${NC}"
|
||||||
|
qrencode -t UTF8 -m 1 "https://vk.cc/cUxAhj" 2>/dev/null | while IFS= read -r qr_line; do
|
||||||
|
echo " $qr_line"
|
||||||
|
done
|
||||||
|
echo ""
|
||||||
|
echo -e " ${DIM}── QR: Чаевые / Донат ──${NC}"
|
||||||
|
qrencode -t UTF8 -m 1 "https://pay.cloudtips.ru/p/7410814f" 2>/dev/null | while IFS= read -r qr_line; do
|
||||||
|
echo " $qr_line"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
mark_promo_shown
|
||||||
|
|
||||||
|
# 5-секундная задержка с обратным отсчётом
|
||||||
|
for i in 5 4 3 2 1; do
|
||||||
|
echo -ne "\r ${DIM}Меню через ${i} сек...${NC} "
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
echo -ne "\r \r"
|
||||||
|
}
|
||||||
|
|
||||||
# ── Точка входа ──────────────────────────────────────────────────────────────
|
# ── Точка входа ──────────────────────────────────────────────────────────────
|
||||||
main() {
|
main() {
|
||||||
check_root
|
check_root
|
||||||
@@ -944,6 +1040,11 @@ main() {
|
|||||||
check_os
|
check_os
|
||||||
check_disk_space 500
|
check_disk_space 500
|
||||||
|
|
||||||
|
# Промо раз в сутки
|
||||||
|
if should_show_promo; then
|
||||||
|
show_promo_with_qr
|
||||||
|
fi
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
clear
|
clear
|
||||||
show_main_menu
|
show_main_menu
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
# Цвета, логирование, спиннер, системные функции, совместимость с v1
|
# Цвета, логирование, спиннер, системные функции, совместимость с v1
|
||||||
|
|
||||||
# ── Версия ────────────────────────────────────────────────────────────────────
|
# ── Версия ────────────────────────────────────────────────────────────────────
|
||||||
GOTELEGRAM_VERSION="2.3.0"
|
GOTELEGRAM_VERSION="2.3.1"
|
||||||
GOTELEGRAM_NAME="GoTelegram"
|
GOTELEGRAM_NAME="GoTelegram"
|
||||||
|
|
||||||
# ── Пути ──────────────────────────────────────────────────────────────────────
|
# ── Пути ──────────────────────────────────────────────────────────────────────
|
||||||
|
|||||||
@@ -257,11 +257,21 @@ show_proxy_info() {
|
|||||||
port=$(get_config_value port "$config")
|
port=$(get_config_value port "$config")
|
||||||
mask_host=$(get_config_value mask_host "$config")
|
mask_host=$(get_config_value mask_host "$config")
|
||||||
ip=$(get_server_ip)
|
ip=$(get_server_ip)
|
||||||
link=$(generate_proxy_link "$ip" "$port" "$secret")
|
|
||||||
status=$(telemt_status)
|
status=$(telemt_status)
|
||||||
|
|
||||||
local mode
|
local mode domain
|
||||||
mode=$(config_get mode 2>/dev/null || echo "lite")
|
mode=$(config_get mode 2>/dev/null || echo "lite")
|
||||||
|
domain=$(config_get domain 2>/dev/null || echo "")
|
||||||
|
|
||||||
|
# Pro-режим: ссылка с доменом и fake-TLS секретом
|
||||||
|
if [ "$mode" = "pro" ] && [ -n "$domain" ]; then
|
||||||
|
local domain_hex faketls_secret
|
||||||
|
domain_hex=$(printf '%s' "$domain" | xxd -p | tr -d '\n')
|
||||||
|
faketls_secret="ee${secret}${domain_hex}"
|
||||||
|
link="tg://proxy?server=${domain}&port=${port}&secret=${faketls_secret}"
|
||||||
|
else
|
||||||
|
link=$(generate_proxy_link "$ip" "$port" "$secret")
|
||||||
|
fi
|
||||||
|
|
||||||
local status_icon status_text
|
local status_icon status_text
|
||||||
case "$status" in
|
case "$status" in
|
||||||
@@ -274,7 +284,11 @@ show_proxy_info() {
|
|||||||
echo -e " ${BOLD}${WHITE}${status_icon} Статус прокси: ${status_text}${NC}"
|
echo -e " ${BOLD}${WHITE}${status_icon} Статус прокси: ${status_text}${NC}"
|
||||||
echo -e " ${DIM}$(printf '─%.0s' {1..50})${NC}"
|
echo -e " ${DIM}$(printf '─%.0s' {1..50})${NC}"
|
||||||
echo -e " ${WHITE}Ядро:${NC} telemt (Rust)"
|
echo -e " ${WHITE}Ядро:${NC} telemt (Rust)"
|
||||||
echo -e " ${WHITE}IP:${NC} ${CYAN}${ip}${NC}"
|
if [ "$mode" = "pro" ] && [ -n "$domain" ]; then
|
||||||
|
echo -e " ${WHITE}Домен:${NC} ${CYAN}${domain}${NC}"
|
||||||
|
else
|
||||||
|
echo -e " ${WHITE}IP:${NC} ${CYAN}${ip}${NC}"
|
||||||
|
fi
|
||||||
echo -e " ${WHITE}Порт:${NC} ${CYAN}${port}${NC}"
|
echo -e " ${WHITE}Порт:${NC} ${CYAN}${port}${NC}"
|
||||||
echo -e " ${WHITE}Режим:${NC} ${CYAN}${mode}${NC}"
|
echo -e " ${WHITE}Режим:${NC} ${CYAN}${mode}${NC}"
|
||||||
echo -e " ${WHITE}Маскировка:${NC} ${CYAN}${mask_host}${NC}"
|
echo -e " ${WHITE}Маскировка:${NC} ${CYAN}${mask_host}${NC}"
|
||||||
|
|||||||
Reference in New Issue
Block a user