diff --git a/hiddifypanel/drivers/telegram_metrics.py b/hiddifypanel/drivers/telegram_metrics.py new file mode 100644 index 000000000..3faa69d31 --- /dev/null +++ b/hiddifypanel/drivers/telegram_metrics.py @@ -0,0 +1,36 @@ +import re +from decimal import Decimal + +_PROMETHEUS_NUMBER = r"([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)" +_TELEMT_PATTERN = re.compile( + r'telemt_user_octets_(from_client|to_client)\{user="([^"]+)"\}\s+' + + _PROMETHEUS_NUMBER +) +_TELEGO_PATTERN = re.compile( + r'telego_traffic_(in|out)_bytes_total\{[^}]*user="([^"]+)"[^}]*\}\s+' + + _PROMETHEUS_NUMBER +) + + +def parse_usage_metrics(raw_output: str, telegram_lib: str) -> dict[str, dict[str, int]]: + if telegram_lib == "telemt": + pattern = _TELEMT_PATTERN + upload_direction = "from_client" + elif telegram_lib == "telego": + pattern = _TELEGO_PATTERN + upload_direction = "in" + else: + return {} + + data = {} + for line in raw_output.splitlines(): + match = pattern.search(line) + if not match: + continue + + direction, user, raw_value = match.groups() + usage = data.setdefault(user, {"down": 0, "up": 0}) + key = "up" if direction == upload_direction else "down" + usage[key] = int(Decimal(raw_value)) + + return data diff --git a/hiddifypanel/drivers/telemt_api.py b/hiddifypanel/drivers/telemt_api.py index 6e65e0bcf..0c77e6546 100644 --- a/hiddifypanel/drivers/telemt_api.py +++ b/hiddifypanel/drivers/telemt_api.py @@ -1,10 +1,10 @@ import json import os -import re import requests from .abstract_driver import DriverABS +from .telegram_metrics import parse_usage_metrics from hiddifypanel.models import User, hconfig, ConfigEnum from hiddifypanel.panel.run_commander import Command, commander import redis @@ -21,7 +21,7 @@ def get_redis_client(self): return self.redis_client def is_enabled(self) -> bool: - return hconfig(ConfigEnum.telegram_enable) and hconfig(ConfigEnum.telegram_lib)=="telemt" + return hconfig(ConfigEnum.telegram_enable) and hconfig(ConfigEnum.telegram_lib) in {"telemt", "telego"} def __init__(self) -> None: super().__init__() @@ -50,34 +50,7 @@ def get_metric(self): return resp.text def __get_tg_usages(self) -> dict: - raw_output = self.get_metric() - data = {} - - # Example lines: - # telemt_user_octets_from_client{user="uuid"} 1983 - # telemt_user_octets_to_client{user="uuid"} 2171 - - pattern = re.compile( - r'telemt_user_octets_(from_client|to_client)\{user="([^"]+)"\}\s+(\d+)' - ) - - for line in raw_output.splitlines(): - match = pattern.search(line) - if not match: - continue - - direction, user, value = match.groups() - value = int(value) - - if user not in data: - data[user] = {"down": 0, "up": 0} - - if direction == "from_client": - data[user]["up"] = value - else: # to_client - data[user]["down"] = value - - return data + return parse_usage_metrics(self.get_metric(), hconfig(ConfigEnum.telegram_lib)) def __get_local_usage(self) -> dict: usage_data = self.get_redis_client() .get(USERS_USAGE) diff --git a/hiddifypanel/panel/admin/SettingAdmin.py b/hiddifypanel/panel/admin/SettingAdmin.py index a0961e19e..b856dd8ec 100644 --- a/hiddifypanel/panel/admin/SettingAdmin.py +++ b/hiddifypanel/panel/admin/SettingAdmin.py @@ -255,6 +255,7 @@ class Meta: ("python", _("lib.telegram.python")), ("tgo", _("lib.telegram.go")), ("telemt", _("lib.telegram.telemt")), + ("telego", "telEgo (no ad tag)"), # ("orig", _("lib.telegram.orignal")), ] field = wtf.SelectField(_("config.telegram_lib.label"), choices=libs, description=_("config.telegram_lib.description"), default=hconfig(ConfigEnum.telegram_lib)) diff --git a/hiddifypanel/panel/commercial/restapi/v2/user/mtproxies.py b/hiddifypanel/panel/commercial/restapi/v2/user/mtproxies.py index c79545ef8..5ec18d184 100644 --- a/hiddifypanel/panel/commercial/restapi/v2/user/mtproxies.py +++ b/hiddifypanel/panel/commercial/restapi/v2/user/mtproxies.py @@ -36,7 +36,7 @@ def get(self): # make mtproxy link raw_sec = hconfig(ConfigEnum.shared_secret, d.child_id) - if hconfig(ConfigEnum.telegram_lib)=="telemt": + if hconfig(ConfigEnum.telegram_lib) in {"telemt", "telego"}: raw_sec=g.account.uuid secret_hex = str(raw_sec).replace('-', '') telegram_faketls_domain_hex = hconfig(ConfigEnum.telegram_fakedomain, d.child_id).encode('utf-8').hex() diff --git a/hiddifypanel/panel/user/templates/home/telegram.html b/hiddifypanel/panel/user/templates/home/telegram.html index 6fbb422af..0a2c06bba 100644 --- a/hiddifypanel/panel/user/templates/home/telegram.html +++ b/hiddifypanel/panel/user/templates/home/telegram.html @@ -1,6 +1,10 @@ {% macro tg_proxy_btn(d) -%}
- {% set hexuuid=hconfigs[ConfigEnum.shared_secret].replace("-","") %} + {% if hconfigs[ConfigEnum.telegram_lib] in ["telemt", "telego"] %} + {% set hexuuid=user.uuid.replace("-", "") %} + {% else %} + {% set hexuuid=hconfigs[ConfigEnum.shared_secret].replace("-", "") %} + {% endif %} {{_("user.home.telegram.clickbtn")}} {{d.alias or d.domain}}
@@ -13,4 +17,4 @@ {% if d.mode =='direct' or d.mode =='relay' %} {{tg_proxy_btn(d)}} {% endif %} -{% endfor %} \ No newline at end of file +{% endfor %}