hiddifypanel 10.20.2__py3-none-any.whl → 10.20.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. hiddifypanel/VERSION +1 -1
  2. hiddifypanel/VERSION.py +2 -2
  3. hiddifypanel/hutils/proxy/xray.py +27 -29
  4. hiddifypanel/hutils/proxy/xrayjson.py +72 -35
  5. hiddifypanel/panel/admin/SettingAdmin.py +1 -1
  6. hiddifypanel/panel/user/user.py +3 -3
  7. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  8. hiddifypanel/translations/en/LC_MESSAGES/messages.po +3 -3
  9. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  10. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +3 -3
  11. hiddifypanel/translations/pt/LC_MESSAGES/messages.mo +0 -0
  12. hiddifypanel/translations/pt/LC_MESSAGES/messages.po +3 -3
  13. hiddifypanel/translations/ru/LC_MESSAGES/messages.mo +0 -0
  14. hiddifypanel/translations/ru/LC_MESSAGES/messages.po +3 -3
  15. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  16. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +3 -3
  17. hiddifypanel/translations.i18n/en.json +2 -2
  18. hiddifypanel/translations.i18n/fa.json +2 -2
  19. hiddifypanel/translations.i18n/pt.json +2 -2
  20. hiddifypanel/translations.i18n/ru.json +2 -2
  21. hiddifypanel/translations.i18n/zh.json +2 -2
  22. {hiddifypanel-10.20.2.dist-info → hiddifypanel-10.20.4.dist-info}/METADATA +1 -1
  23. {hiddifypanel-10.20.2.dist-info → hiddifypanel-10.20.4.dist-info}/RECORD +27 -27
  24. {hiddifypanel-10.20.2.dist-info → hiddifypanel-10.20.4.dist-info}/LICENSE.md +0 -0
  25. {hiddifypanel-10.20.2.dist-info → hiddifypanel-10.20.4.dist-info}/WHEEL +0 -0
  26. {hiddifypanel-10.20.2.dist-info → hiddifypanel-10.20.4.dist-info}/entry_points.txt +0 -0
  27. {hiddifypanel-10.20.2.dist-info → hiddifypanel-10.20.4.dist-info}/top_level.txt +0 -0
hiddifypanel/VERSION CHANGED
@@ -1 +1 @@
1
- 10.20.2
1
+ 10.20.4
hiddifypanel/VERSION.py CHANGED
@@ -1,3 +1,3 @@
1
- __version__='10.20.2'
1
+ __version__='10.20.4'
2
2
  from datetime import datetime
3
- __release_date__= datetime.strptime('2024-04-12','%Y-%m-%d')
3
+ __release_date__= datetime.strptime('2024-04-13','%Y-%m-%d')
@@ -3,7 +3,7 @@ import json
3
3
  import copy
4
4
  from flask import render_template, request, g
5
5
  from hiddifypanel import hutils
6
- from hiddifypanel.models import Proxy, ProxyTransport, ProxyL3, ProxyCDN, ProxyProto, Domain, ConfigEnum, DomainType, hconfig
6
+ from hiddifypanel.models import ProxyTransport, ProxyL3, ProxyProto, Domain, User, ConfigEnum, hconfig
7
7
  from flask_babel import gettext as _
8
8
 
9
9
  OUTBOUND_LEVEL = 8
@@ -145,46 +145,44 @@ def to_link(proxy: dict) -> str | dict:
145
145
  return proxy
146
146
 
147
147
 
148
- def make_v2ray_configs(user, user_activate, domains: list[Domain], expire_days, ip_debug, db_domain, has_auto_cdn, asn, profile_title, **kwargs) -> str:
148
+ def make_v2ray_configs(domains: list[Domain], user: User, expire_days: int, ip_debug=None) -> str:
149
149
  res = []
150
150
 
151
- ua = hutils.flask.get_user_agent()
152
- if hconfig(ConfigEnum.show_usage_in_sublink):
151
+ if hconfig(ConfigEnum.show_usage_in_sublink) and not g.user_agent.get('is_hiddify'):
153
152
 
154
- if not ua['is_hiddify']:
153
+ fake_ip_for_sub_link = datetime.datetime.now().strftime(f"%H.%M--%Y.%m.%d.time:%H%M")
154
+ # if ua['app'] == "Fair1":
155
+ # res.append(f'trojan://1@{fake_ip_for_sub_link}?sni=fake_ip_for_sub_link&security=tls#{round(user.current_usage_GB,3)}/{user.usage_limit_GB}GB_Remain:{expire_days}days')
156
+ # else:
155
157
 
156
- fake_ip_for_sub_link = datetime.datetime.now().strftime(f"%H.%M--%Y.%m.%d.time:%H%M")
157
- # if ua['app'] == "Fair1":
158
- # res.append(f'trojan://1@{fake_ip_for_sub_link}?sni=fake_ip_for_sub_link&security=tls#{round(user.current_usage_GB,3)}/{user.usage_limit_GB}GB_Remain:{expire_days}days')
159
- # else:
158
+ # res.append(f'trojan://1@{fake_ip_for_sub_link}?sni=fake_ip_for_sub_link&security=tls#{hutils.encode.url_encode(profile_title)}')
160
159
 
161
- # res.append(f'trojan://1@{fake_ip_for_sub_link}?sni=fake_ip_for_sub_link&security=tls#{hutils.encode.url_encode(profile_title)}')
162
-
163
- name = '' if user_activate else '✖'
164
- if user.usage_limit_GB < 1000:
165
- name += f'{round(user.current_usage_GB,3)}/{str(user.usage_limit_GB).replace(".0","")}GB'
166
- elif user.usage_limit_GB < 100000:
167
- name += f'{round(user.current_usage_GB/1000,3)}/{str(round(user.usage_limit_GB/1000,1)).replace(".0","")}TB'
168
- else:
169
- res.append("#No Usage Limit")
170
- if expire_days < 1000:
171
- name += " " + _(f'📅%(expire_days)s days', expire_days=expire_days)
172
- else:
173
- res.append("#No Time Limit")
160
+ name = '⏳ ' if user.is_active else '✖ '
161
+ if user.usage_limit_GB < 1000:
162
+ name += f'{round(user.current_usage_GB,3)}/{str(user.usage_limit_GB).replace(".0","")}GB'
163
+ elif user.usage_limit_GB < 100000:
164
+ name += f'{round(user.current_usage_GB/1000,3)}/{str(round(user.usage_limit_GB/1000,1)).replace(".0","")}TB'
165
+ else:
166
+ res.append("#No Usage Limit")
167
+ name += " 📅 "
168
+ if expire_days < 1000:
169
+ name += _(f'%(expire_days)s days', expire_days=expire_days)
170
+ else:
171
+ res.append("#No Time Limit")
174
172
 
175
- name = name.strip()
176
- if len(name) > 3:
177
- res.append(f'trojan://1@{fake_ip_for_sub_link}?sni=fake_ip_for_sub_link&security=tls#{hutils.encode.url_encode(name)}')
173
+ name = name.strip()
174
+ if len(name) > 3:
175
+ res.append(f'trojan://1@{fake_ip_for_sub_link}?sni=fake_ip_for_sub_link&security=tls#{hutils.encode.url_encode(name)}')
178
176
 
179
- if ua['is_browser']:
177
+ if g.user_agent.get('is_browser') and ip_debug:
180
178
  res.append(f'#Hiddify auto ip: {ip_debug}')
181
179
 
182
- if not user_activate:
180
+ if not user.is_active:
183
181
 
184
182
  if hconfig(ConfigEnum.lang) == 'fa':
185
- res.append('trojan://1@1.1.1.1#' + hutils.encode.url_encode('✖بسته شما به پایان رسید'))
183
+ res.append('trojan://1@1.1.1.1#' + hutils.encode.url_encode(' بسته شما به پایان رسید'))
186
184
  else:
187
- res.append('trojan://1@1.1.1.1#' + hutils.encode.url_encode('✖Package_Ended'))
185
+ res.append('trojan://1@1.1.1.1#' + hutils.encode.url_encode('✖ Package Ended'))
188
186
  return "\n".join(res)
189
187
 
190
188
  for pinfo in hutils.proxy.get_valid_proxies(domains):
@@ -2,55 +2,87 @@ import json
2
2
  import copy
3
3
  from flask import render_template, g
4
4
  from hiddifypanel import hutils
5
- from hiddifypanel.models import ProxyTransport, ProxyL3, ProxyProto, Domain
5
+ from hiddifypanel.models import ProxyTransport, ProxyL3, ProxyProto, Domain, User
6
6
  from flask_babel import gettext as _
7
+ from hiddifypanel.models import hconfig, ConfigEnum
7
8
  from .xray import is_muxable_agent
8
9
  OUTBOUND_LEVEL = 8
9
10
 
10
11
 
11
- def configs_as_json(domains: list[Domain], remarks: str) -> str:
12
+ def configs_as_json(domains: list[Domain], user: User, expire_days: int, remarks: str) -> str:
12
13
  '''Returns xray configs as json'''
13
- outbounds = []
14
-
15
- # TODO: check what are unsupported protocols in other apps
16
- unsupported_protos = {}
17
- if g.user_agent.get('is_v2rayng'):
18
- # TODO: ensure which protocols are not supported in v2rayng
19
- unsupported_protos = {ProxyProto.wireguard, ProxyProto.hysteria, ProxyProto.hysteria2, ProxyProto.tuic, ProxyProto.ss, ProxyProto.ssr, ProxyProto.ssh}
20
-
21
- for proxy in hutils.proxy.get_valid_proxies(domains):
22
- if unsupported_protos and proxy['proto'] in unsupported_protos:
23
- continue
24
- outbound = to_xray(proxy)
25
- if 'msg' not in outbound:
26
- outbounds.append(outbound)
27
-
28
- outbounds_len = len(outbounds)
29
- # reutrn no outbound
30
- if outbounds_len < 1:
31
- return ''
32
14
 
33
15
  all_configs = []
34
- base_config = json.loads(render_template('base_xray_config.json.j2', remarks=remarks))
35
- # multiple outbounds needs multiple whole base config not just one with multiple outbounds (at least for v2rayng)
36
- # https://github.com/2dust/v2rayNG/pull/2827#issue-2127534078
37
- if outbounds_len > 1:
38
- for out in outbounds:
39
- base_config['remarks'] = out['tag']
40
- base_config['outbounds'].insert(0, out)
41
- all_configs.append(copy.deepcopy(base_config))
42
- del base_config['outbounds'][0]
43
- else: # single outbound
44
- base_config['outbounds'].insert(0, outbounds[0])
45
- all_configs = base_config
46
-
16
+ if hconfig(ConfigEnum.show_usage_in_sublink) and not g.user_agent.get('is_hiddify'):
17
+ # determine usages
18
+ tag = '⏳ ' if user.is_active else '✖ '
19
+ if user.usage_limit_GB < 1000:
20
+ tag += f'{round(user.current_usage_GB,3)}/{str(user.usage_limit_GB).replace(".0","")}GB'
21
+ elif user.usage_limit_GB < 100000:
22
+ tag += f'{round(user.current_usage_GB/1000,3)}/{str(round(user.usage_limit_GB/1000,1)).replace(".0","")}TB'
23
+ else:
24
+ tag += '#No Usage Limit'
25
+ tag += ' 📅 '
26
+ if expire_days < 1000:
27
+ tag += _(f'%(expire_days)s days', expire_days=expire_days)
28
+ else:
29
+ tag += '#No Time Limit'
30
+ tag = tag.strip()
31
+
32
+ # add usage as a config
33
+ all_configs.append(
34
+ null_config(tag)
35
+ )
36
+
37
+ active = True
38
+ if not user.is_active:
39
+ tag = '✖ ' + (hutils.encode.url_encode('بسته شما به پایان رسید') if hconfig(ConfigEnum.lang) == 'fa' else 'Package Ended')
40
+ # add user status
41
+ all_configs.append(
42
+ null_config(tag)
43
+ )
44
+ active = False
45
+
46
+ if active:
47
+ # TODO: check what are unsupported protocols in other apps
48
+ unsupported_protos = {}
49
+ if g.user_agent.get('is_v2rayng'):
50
+ # TODO: ensure which protocols are not supported in v2rayng
51
+ unsupported_protos = {ProxyProto.wireguard, ProxyProto.hysteria, ProxyProto.hysteria2, ProxyProto.tuic, ProxyProto.ss, ProxyProto.ssr, ProxyProto.ssh}
52
+
53
+ # multiple outbounds needs multiple whole base config not just one with multiple outbounds (at least for v2rayng)
54
+ # https://github.com/2dust/v2rayNG/pull/2827#issue-2127534078
55
+ outbounds = []
56
+ for proxy in hutils.proxy.get_valid_proxies(domains):
57
+ if unsupported_protos and proxy['proto'] in unsupported_protos:
58
+ continue
59
+ outbound = to_xray(proxy)
60
+ if 'msg' not in outbound:
61
+ outbounds.append(outbound)
62
+
63
+ base_config = json.loads(render_template('base_xray_config.json.j2', remarks=remarks))
64
+ if len(outbounds) > 1:
65
+ for out in outbounds:
66
+ base_config['remarks'] = out['tag']
67
+ base_config['outbounds'].insert(0, out)
68
+ if all_configs:
69
+ all_configs.insert(0, copy.deepcopy(base_config))
70
+ else:
71
+ all_configs.append(copy.deepcopy(base_config))
72
+ del base_config['outbounds'][0]
73
+ else: # single outbound
74
+ base_config['outbounds'].insert(0, outbounds[0])
75
+ all_configs = base_config
76
+
77
+ if not all_configs:
78
+ return ''
47
79
  json_configs = json.dumps(all_configs, indent=2, cls=hutils.proxy.ProxyJsonEncoder)
48
80
  return json_configs
49
81
 
50
82
 
51
83
  def to_xray(proxy: dict) -> dict:
52
84
  outbound = {
53
- 'tag': f'{proxy["extra_info"]} {proxy["name"]} § {proxy["port"]} {proxy["dbdomain"].id}',
85
+ 'tag': f'{proxy["extra_info"]} {proxy["name"]}',
54
86
  'protocol': str(proxy['proto']),
55
87
  'settings': {},
56
88
  'streamSettings': {},
@@ -397,3 +429,8 @@ def add_mux_to_link(proxy: dict) -> str:
397
429
  out = {}
398
430
  add_mux_to_dict(out, proxy)
399
431
  return hutils.encode.convert_dict_to_url(out)
432
+
433
+
434
+ def null_config(tag: str) -> dict:
435
+ base_config = json.loads(render_template('base_xray_config.json.j2', remarks=tag))
436
+ return base_config
@@ -251,7 +251,7 @@ def get_config_form():
251
251
 
252
252
  elif c.key == ConfigEnum.warp_sites:
253
253
  validators = [wtf.validators.Length(max=2048),
254
- wtf.validators.Regexp(r'^[\w.-]+\.\w+(?:\.\w+)?(?:\r?\n|$)', re.IGNORECASE, _("config.invalid-pattern-for-warp-sites") + f' {c.key}')
254
+ wtf.validators.Regexp(r'^(?:[\w.-]+\.\w+(?:\.\w+)?(?:\r?\n|$)|^$)', 0, _("config.invalid-pattern-for-warp-sites") + f' {c.key}')
255
255
  ]
256
256
  render_kw = {'class': "ltr", 'maxlength': 2048}
257
257
  field = wtf.TextAreaField(_(f'config.{c.key}.label'), validators, default=c.value,
@@ -57,8 +57,8 @@ class UserView(FlaskView):
57
57
  @route("/xray")
58
58
  @login_required(roles={Role.user})
59
59
  def xray(self):
60
- c = c = get_common_data(g.account.uuid, mode="new")
61
- configs = hutils.proxy.xrayjson.configs_as_json(c['domains'], c['profile_title'])
60
+ c = get_common_data(g.account.uuid, mode="new")
61
+ configs = hutils.proxy.xrayjson.configs_as_json(c['domains'], c['user'], c['expire_days'], c['profile_title'])
62
62
  return add_headers(configs, c, 'application/json')
63
63
 
64
64
  @route("/singbox/")
@@ -230,7 +230,7 @@ class UserView(FlaskView):
230
230
  resp = ""
231
231
  else:
232
232
  # render_template('all_configs.txt', **c, base64=hutils.encode.do_base_64)
233
- resp = hutils.proxy.xray.make_v2ray_configs(**c)
233
+ resp = hutils.proxy.xray.make_v2ray_configs(c['domains'], c['user'], c['expire_days'], c['ip_debug'])
234
234
 
235
235
  if base64:
236
236
  resp = hutils.encode.do_base_64(resp)
@@ -11,6 +11,9 @@ msgstr "%(count)s records were successfully disabled."
11
11
  msgid "%(count)s records were successfully enabled."
12
12
  msgstr "%(count)s records were successfully enabled."
13
13
 
14
+ msgid "%(expire_days)s days"
15
+ msgstr "%(expire_days)s days"
16
+
14
17
  msgid "%(placeholder)s"
15
18
  msgstr "%(placeholder)s"
16
19
 
@@ -2815,6 +2818,3 @@ msgstr "📅 Weekly"
2815
2818
 
2816
2819
  msgid "worker"
2817
2820
  msgstr "✴️ Cloudflare Worker"
2818
-
2819
- msgid "📅%(expire_days)s days"
2820
- msgstr "📅%(expire_days)s Days Remain"
@@ -11,6 +11,9 @@ msgstr "%(count)s رکورد با موفقیت غیرفعال شد."
11
11
  msgid "%(count)s records were successfully enabled."
12
12
  msgstr "%(count)s رکوردها با موفقیت فعال شد."
13
13
 
14
+ msgid "%(expire_days)s days"
15
+ msgstr ""
16
+
14
17
  msgid "%(placeholder)s"
15
18
  msgstr "%(placeholder)s"
16
19
 
@@ -2815,6 +2818,3 @@ msgstr "📅 هفتگی"
2815
2818
 
2816
2819
  msgid "worker"
2817
2820
  msgstr "✴️ ورکر کلودفلر"
2818
-
2819
- msgid "📅%(expire_days)s days"
2820
- msgstr "📅%(expire_days)s روز اعتبار"
@@ -11,6 +11,9 @@ msgstr "%(count)s registros foram desativados com sucesso."
11
11
  msgid "%(count)s records were successfully enabled."
12
12
  msgstr "%(count)s registros foram ativados com sucesso."
13
13
 
14
+ msgid "%(expire_days)s days"
15
+ msgstr ""
16
+
14
17
  msgid "%(placeholder)s"
15
18
  msgstr "%(placeholder)s"
16
19
 
@@ -2708,6 +2711,3 @@ msgstr "📅 Semanal"
2708
2711
 
2709
2712
  msgid "worker"
2710
2713
  msgstr "✴️ Cloudflare Worker"
2711
-
2712
- msgid "📅%(expire_days)s days"
2713
- msgstr "📅Remanescem: %(expire_days)s dias"
@@ -11,6 +11,9 @@ msgstr "%(count)s записей были успешно отключены."
11
11
  msgid "%(count)s records were successfully enabled."
12
12
  msgstr "%(count)s записей были успешно включены."
13
13
 
14
+ msgid "%(expire_days)s days"
15
+ msgstr ""
16
+
14
17
  msgid "%(placeholder)s"
15
18
  msgstr "%(placeholder)s"
16
19
 
@@ -2815,6 +2818,3 @@ msgstr "📅 Еженедельно"
2815
2818
 
2816
2819
  msgid "worker"
2817
2820
  msgstr "✴️ Cloudflare Worker"
2818
-
2819
- msgid "📅%(expire_days)s days"
2820
- msgstr "Осталось 📅%(expire_days)s дней"
@@ -11,6 +11,9 @@ msgstr "%(count)s 条记录已成功禁用。"
11
11
  msgid "%(count)s records were successfully enabled."
12
12
  msgstr "%(count)s 条记录已成功启用。"
13
13
 
14
+ msgid "%(expire_days)s days"
15
+ msgstr ""
16
+
14
17
  msgid "%(placeholder)s"
15
18
  msgstr "%(placeholder)s"
16
19
 
@@ -2626,6 +2629,3 @@ msgstr "📅每周"
2626
2629
 
2627
2630
  msgid "worker"
2628
2631
  msgstr "✴️ Cloudflare 工作人员"
2629
-
2630
- msgid "📅%(expire_days)s days"
2631
- msgstr "📅%(expire_days)s 天剩余"
@@ -2,6 +2,7 @@
2
2
  " Search Settings": " Search Settings",
3
3
  "%(count)s records were successfully disabled.": "%(count)s records were successfully disabled.",
4
4
  "%(count)s records were successfully enabled.": "%(count)s records were successfully enabled.",
5
+ "%(expire_days)s days": "%(expire_days)s days",
5
6
  "%(placeholder)s": "%(placeholder)s",
6
7
  "0 - Last day": "Last Day",
7
8
  "Access Denied!": "Access Denied",
@@ -1171,6 +1172,5 @@
1171
1172
  "user.home.select os": "Please Select Your Operating System.",
1172
1173
  "user.home.select tool": "Please select the item.",
1173
1174
  "weekly": "📅 Weekly",
1174
- "worker": "✴️ Cloudflare Worker",
1175
- "📅%(expire_days)s days": "📅%(expire_days)s Days Remain"
1175
+ "worker": "✴️ Cloudflare Worker"
1176
1176
  }
@@ -2,6 +2,7 @@
2
2
  " Search Settings": " تنظیمات جستجو",
3
3
  "%(count)s records were successfully disabled.": "%(count)s رکورد با موفقیت غیرفعال شد.",
4
4
  "%(count)s records were successfully enabled.": "%(count)s رکوردها با موفقیت فعال شد.",
5
+ "%(expire_days)s days": "",
5
6
  "%(placeholder)s": "%(placeholder)s",
6
7
  "0 - Last day": "آخرین روز",
7
8
  "Access Denied!": "دسترسی غیرمجاز",
@@ -1171,6 +1172,5 @@
1171
1172
  "user.home.select os": "لطفا سیستم عامل خود را انتخاب کنید.",
1172
1173
  "user.home.select tool": "لطفا یکی از موارد زیر را انتخاب کنید.",
1173
1174
  "weekly": "📅 هفتگی",
1174
- "worker": "✴️ ورکر کلودفلر",
1175
- "📅%(expire_days)s days": "📅%(expire_days)s روز اعتبار"
1175
+ "worker": "✴️ ورکر کلودفلر"
1176
1176
  }
@@ -2,6 +2,7 @@
2
2
  " Search Settings": " Configurações de pesquisa",
3
3
  "%(count)s records were successfully disabled.": "%(count)s registros foram desativados com sucesso.",
4
4
  "%(count)s records were successfully enabled.": "%(count)s registros foram ativados com sucesso.",
5
+ "%(expire_days)s days": "",
5
6
  "%(placeholder)s": "%(placeholder)s",
6
7
  "0 - Last day": "Último dia",
7
8
  "Access Denied!": "Acesso negado",
@@ -1171,6 +1172,5 @@
1171
1172
  "user.home.select os": "Selecione seu sistema operacional.",
1172
1173
  "user.home.select tool": "Selecione o item.",
1173
1174
  "weekly": "📅 Semanal",
1174
- "worker": "✴️ Cloudflare Worker",
1175
- "📅%(expire_days)s days": "📅Remanescem: %(expire_days)s dias"
1175
+ "worker": "✴️ Cloudflare Worker"
1176
1176
  }
@@ -2,6 +2,7 @@
2
2
  " Search Settings": " Настройки поиска",
3
3
  "%(count)s records were successfully disabled.": "%(count)s записей были успешно отключены.",
4
4
  "%(count)s records were successfully enabled.": "%(count)s записей были успешно включены.",
5
+ "%(expire_days)s days": "",
5
6
  "%(placeholder)s": "%(placeholder)s",
6
7
  "0 - Last day": "Последний день",
7
8
  "Access Denied!": "Доступ запрещен",
@@ -1171,6 +1172,5 @@
1171
1172
  "user.home.select os": "Пожалуйста, выберите вашу операционную систему",
1172
1173
  "user.home.select tool": "Пожалуйста, выберите",
1173
1174
  "weekly": "📅 Еженедельно",
1174
- "worker": "✴️ Cloudflare Worker",
1175
- "📅%(expire_days)s days": "Осталось 📅%(expire_days)s дней"
1175
+ "worker": "✴️ Cloudflare Worker"
1176
1176
  }
@@ -2,6 +2,7 @@
2
2
  " Search Settings": "搜索设置",
3
3
  "%(count)s records were successfully disabled.": "%(count)s 条记录已成功禁用。",
4
4
  "%(count)s records were successfully enabled.": "%(count)s 条记录已成功启用。",
5
+ "%(expire_days)s days": "",
5
6
  "%(placeholder)s": "%(placeholder)s",
6
7
  "0 - Last day": "最后一天",
7
8
  "Access Denied!": "拒绝访问",
@@ -1171,6 +1172,5 @@
1171
1172
  "user.home.select os": "请选择您的操作系统。",
1172
1173
  "user.home.select tool": "请选择该项目。",
1173
1174
  "weekly": "📅每周",
1174
- "worker": "✴️ Cloudflare 工作人员",
1175
- "📅%(expire_days)s days": "📅%(expire_days)s 天剩余"
1175
+ "worker": "✴️ Cloudflare 工作人员"
1176
1176
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hiddifypanel
3
- Version: 10.20.2
3
+ Version: 10.20.4
4
4
  Summary: hiddifypanel multi proxy panel
5
5
  Home-page: https://github.com/hiddify/hiddify-manager/
6
6
  Author: hiddify
@@ -1,6 +1,6 @@
1
1
  hiddifypanel/Events.py,sha256=AlnRdjVul0jP-NCT4-zoaQgowoOo-JhdQB4ytetAFKA,723
2
- hiddifypanel/VERSION,sha256=0SC9RKpQrAqGCi5LhmbuaCLtJoXeaRObzKcKkId5sc4,8
3
- hiddifypanel/VERSION.py,sha256=JwcG-AYqf2L_n7GXU9SwecibZKg0_YS9sU8XEkXOMb0,113
2
+ hiddifypanel/VERSION,sha256=cKXX_1kacCWWNYirR9EkZy_0rvuMgVu2Ef-oy1t7Liw,8
3
+ hiddifypanel/VERSION.py,sha256=dBAYJCObXB1dM5-pWfh9hzj49HbEcRAhNAggT2H-Q80,113
4
4
  hiddifypanel/__init__.py,sha256=aLukp3ORszdcH4G9J-MlxhjHN6yFlOuOE6mm-L3aG_g,266
5
5
  hiddifypanel/__main__.py,sha256=IVchnXpK6bm8T3N--mN17HBQNLMeLAjyP7iwzULexB4,218
6
6
  hiddifypanel/auth.py,sha256=5GUwwKCRY90RS0WTKPfqzuOYuLuwGLpNLpnKmubf7DE,7405
@@ -38,8 +38,8 @@ hiddifypanel/hutils/proxy/__init__.py,sha256=xXBa83kjYT_b-BNseEykfQYyJBQHTq1Zosf
38
38
  hiddifypanel/hutils/proxy/clash.py,sha256=ERyiuUZibOUYvkyC1HPLCRPNB1lrZpuuafey2St7XtI,5820
39
39
  hiddifypanel/hutils/proxy/shared.py,sha256=w6RWpPrcZpOauXotfbzC70QTrrvO26tyNbTDrtFyXIk,21801
40
40
  hiddifypanel/hutils/proxy/singbox.py,sha256=ssaO5lCK6CmZ3BIHgAdlD7GcMZljJSF8DaMissgw_Jw,10800
41
- hiddifypanel/hutils/proxy/xray.py,sha256=HDK4PsyY8qnnmQ51hNiP4UKJVXE-nMjIRuFjF1ZcHOY,10769
42
- hiddifypanel/hutils/proxy/xrayjson.py,sha256=to71KVhsh9scmRyQjgS19QYWKze2GjE4seQJM4_rIVk,13402
41
+ hiddifypanel/hutils/proxy/xray.py,sha256=AlhgNgGS-D2TPrZvhlk2-wWVR1wpt4o0Aa4hNpult1o,10630
42
+ hiddifypanel/hutils/proxy/xrayjson.py,sha256=GTtGkWiZHmOsIyg267f_VcmxcyBR3durIP1iIvGlFtM,14910
43
43
  hiddifypanel/models/__init__.py,sha256=W7lWG_7jNNPn-cdXV5wMmuPv1unHUFVlMd9OmwDn2gM,860
44
44
  hiddifypanel/models/admin.py,sha256=W1C0R9fhLtwjnIzgPgiVcaNXc6YzzIolAsyy4QaqQKw,6936
45
45
  hiddifypanel/models/base_account.py,sha256=T2vllZo1QTGzYos3njgdYtAlnYB77LYrfzpEoO8yRk8,3060
@@ -75,7 +75,7 @@ hiddifypanel/panel/admin/DomainAdmin.py,sha256=n6vNX58Bc7LxYwkXcAIOKf8GZuES3-AgW
75
75
  hiddifypanel/panel/admin/NodeAdmin.py,sha256=QAHQjF7e7F4KqsWNWpMt7SoLANlFEborVtWQV9OXJ2E,3102
76
76
  hiddifypanel/panel/admin/ProxyAdmin.py,sha256=e-tCTfsEjqjbRezhVJvFyQZHh-uluvHFZXXwc4aFRDE,5319
77
77
  hiddifypanel/panel/admin/QuickSetup.py,sha256=X8d492PLQu8vNtabh-X2R2IDZVs_5pmWeyn-Qz5_qXk,7560
78
- hiddifypanel/panel/admin/SettingAdmin.py,sha256=U0gQoinXb0ZNVQ44Z_PudQJS7Zao1fsdAFNCDgYnbuE,19120
78
+ hiddifypanel/panel/admin/SettingAdmin.py,sha256=NJr4ow2bTGf8w2mDmTlct_B4-2dd3w2E7BoJdepb1mQ,19115
79
79
  hiddifypanel/panel/admin/Terminal.py,sha256=fjLVLspXYHOwZGyMU_KbytWe1zf-m6KbmvBPEDps45w,1737
80
80
  hiddifypanel/panel/admin/UserAdmin.py,sha256=pAiZRoDxQRjcZOUhGu5nRqglTuippeXgiGxTOf-Thv4,17145
81
81
  hiddifypanel/panel/admin/__init__.py,sha256=hb0A2HuK_nBZRCNPumwahXX-25FMxODKYlNbk2ItF08,3015
@@ -177,7 +177,7 @@ hiddifypanel/panel/common_bp/login.py,sha256=eDynKaUI6Q015E8cByMNT9twBw7xIiFL6TD
177
177
  hiddifypanel/panel/common_bp/templates/login.html,sha256=jDl9-Nh2qMuCsLQmXm7e5jvSaRAlBxReVVCbNSTTHJw,1312
178
178
  hiddifypanel/panel/user/__init__.py,sha256=E9RxA2YGc0eXLGjfJbyryeLG3bXEWJ3DoVOyIpVaDIo,1859
179
179
  hiddifypanel/panel/user/link_maker.html,sha256=g420NAm_fUI8asYjyfCiXyUOIwEQfDPonZA9xh3p0-8,177
180
- hiddifypanel/panel/user/user.py,sha256=PU0PWsa4AoS1MKtr-8wvZObfIFg6385q7LD3B8xRHg8,13868
180
+ hiddifypanel/panel/user/user.py,sha256=3xtEdHjogJomrgDflhSDG7_QERi9S9v6YO-KSjU0r6Q,13946
181
181
  hiddifypanel/panel/user/templates/all_configs copy.txt,sha256=u5jhAgjhH07_0csdIisuXy2HNCC9SWlP0whBAGFXA78,564
182
182
  hiddifypanel/panel/user/templates/all_configs.txt,sha256=i8I6g9ujOr3RIuRoGRqY2Q75I89mbHko_JVPvQt4E_g,1260
183
183
  hiddifypanel/panel/user/templates/base_singbox_config.json.j2,sha256=xhvQpm0fp2w3VA8N7zXbYs8RWlRgdyApiedFH_sRTfM,7107
@@ -820,24 +820,24 @@ hiddifypanel/templates/redirect.html,sha256=K9x_O4P96vEkqBhOXIhoGrWw1KIqd2bL0BjI
820
820
  hiddifypanel/templates/static.html,sha256=jp6q4wtx-k2A_cjqJoNiMS7Ee30arE45qI3ev4d5ky4,165
821
821
  hiddifypanel/templates/hiddify-flask-admin/actions.html,sha256=2NeITe2e-lPKCk_o511tCIqVtrPu8LYHE1wTCtrFUrI,1331
822
822
  hiddifypanel/templates/hiddify-flask-admin/list.html,sha256=MBGrTqZpzNLe4sZy0RozvXNr8seFUQc2C6v88BJtNWc,11095
823
- hiddifypanel/translations/en/LC_MESSAGES/messages.mo,sha256=tHp0sFfOsNXw6RNjZnLpCyc_A0q6EYmtByGaCkvcsRY,74693
824
- hiddifypanel/translations/en/LC_MESSAGES/messages.po,sha256=v6PlLU1eIxR_h5cYw4pBPv9L7iZxw6Wdv0S4g1eTvjU,77879
825
- hiddifypanel/translations/fa/LC_MESSAGES/messages.mo,sha256=HLaQ3qXNSTxMgF3W4wAqhOscILImnLvvOi_MtsjcIJY,96482
826
- hiddifypanel/translations/fa/LC_MESSAGES/messages.po,sha256=PMC66aQd9rokd1oWeBe5l5VssaEC288-jlXyzA3HxLg,101121
827
- hiddifypanel/translations/pt/LC_MESSAGES/messages.mo,sha256=VMQNpZ23_-Xui8kE2FGOXL-gn2PCeE6O0BAmJFD8ZHc,60612
828
- hiddifypanel/translations/pt/LC_MESSAGES/messages.po,sha256=Qbrt9R8Tcrw5BAVTwJBmxqcxe3yhSn0JkZXa05L_inU,69927
829
- hiddifypanel/translations/ru/LC_MESSAGES/messages.mo,sha256=dXr3Sc9GFB6MpmvovU8DMmCprjAjhL1YKTHY_z5mX4w,95543
830
- hiddifypanel/translations/ru/LC_MESSAGES/messages.po,sha256=fGsvedAEIZDbVaHPt4oL-KmfuM_rm1neeThVjud1Zsk,102065
831
- hiddifypanel/translations/zh/LC_MESSAGES/messages.mo,sha256=_426sp5py_wQAdi2G_QbYvamjdAGl63-KAcJlB1fjiI,60878
832
- hiddifypanel/translations/zh/LC_MESSAGES/messages.po,sha256=xug8Baflp7o2JGSWqFk0bztqhv6SYGT9jFQcMuMPwDY,69098
833
- hiddifypanel/translations.i18n/en.json,sha256=G7WBuSM8YUhaaoMgeFg87C5WNbPajna_ERxfpi9QlPs,67845
834
- hiddifypanel/translations.i18n/fa.json,sha256=Vn1QdRtRCWTpEzvaZD9KahTmuxKX-UAJe_NgQaIuL2g,91087
835
- hiddifypanel/translations.i18n/pt.json,sha256=oKPEk8FEtsSdQyas1VNf6R_AhCXdspIpPws_VdmDUX8,60214
836
- hiddifypanel/translations.i18n/ru.json,sha256=mIS8ADcBgUfO4B3XSAlMTg2RkWIJdxk1b_vpkt3USGI,92031
837
- hiddifypanel/translations.i18n/zh.json,sha256=VJOeR3-PrlCTks3kqMiAYH5FFq1GWUW5251Ulqx1Hww,59631
838
- hiddifypanel-10.20.2.dist-info/LICENSE.md,sha256=oDrt-cUsyiDGnRPjEJh-3dH2ddAuK_bIVBD8ntkOtZw,19807
839
- hiddifypanel-10.20.2.dist-info/METADATA,sha256=W65SUgp-0DIU0FMtuHwdIL7zoC9-L2sMaQJ3ASYQO0k,4009
840
- hiddifypanel-10.20.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
841
- hiddifypanel-10.20.2.dist-info/entry_points.txt,sha256=Xzpqlh3nwBtZhoV9AANJykano056VJvYzaujxPztJaM,60
842
- hiddifypanel-10.20.2.dist-info/top_level.txt,sha256=rv-b3qFWUZQTBy0kyBfsr7L6tPpeO7AaQlLHXn-HI5M,13
843
- hiddifypanel-10.20.2.dist-info/RECORD,,
823
+ hiddifypanel/translations/en/LC_MESSAGES/messages.mo,sha256=gvECIeKN0BmWqDIxx6LHlbTPd0QfNd0eFKg_SX_U4eg,74678
824
+ hiddifypanel/translations/en/LC_MESSAGES/messages.po,sha256=8tJG6Ax9Pufa8Mf80afoWBIAN8zomLn_HxEi-Y_MhWw,77864
825
+ hiddifypanel/translations/fa/LC_MESSAGES/messages.mo,sha256=Tl0MiITTl2ujt6d-ZmmAk_76tupB2XYrag85mjUpOww,96401
826
+ hiddifypanel/translations/fa/LC_MESSAGES/messages.po,sha256=QNcaCNYTAn5HgZLdSal9Oxp9wpXANcfgRpBFJaCcHPk,101078
827
+ hiddifypanel/translations/pt/LC_MESSAGES/messages.mo,sha256=2NjRvnZQAPCZgDAAAf4T6yxKcHLWDvIAYdVQOMzQdpc,60534
828
+ hiddifypanel/translations/pt/LC_MESSAGES/messages.po,sha256=6-lVK4mB0qvYLwaduBpgxY1DE_DDKFVNZ-dUBPsOhJo,69887
829
+ hiddifypanel/translations/ru/LC_MESSAGES/messages.mo,sha256=3sSo2jE7Q4BhggO3EIpF4bvjRU5Up_0Ew2_uxuC0--Y,95456
830
+ hiddifypanel/translations/ru/LC_MESSAGES/messages.po,sha256=2Xd_RMn2dvdHmL9KCwY2-DN-W76OuMTISQD_a0KToyc,102016
831
+ hiddifypanel/translations/zh/LC_MESSAGES/messages.mo,sha256=In0zBRstun97EJJFa-4uBirDv-4ohxkxkUqpmPylMTQ,60807
832
+ hiddifypanel/translations/zh/LC_MESSAGES/messages.po,sha256=oE-v6foE3j8oECylwq1ovNkpoL7v6gDoLzjozZ2KmX0,69065
833
+ hiddifypanel/translations.i18n/en.json,sha256=Qr2eumDQXKhcppbJuo9psZ_cJHVCTtj6ZOflGNig6dk,67830
834
+ hiddifypanel/translations.i18n/fa.json,sha256=R9As455CkWu9d89_MYiypZvT-j2w282zje3Ygm_3qYA,91044
835
+ hiddifypanel/translations.i18n/pt.json,sha256=DgHKvk-p0mJzm8RwHB7m0-JiOkgmv5YK65Wv3iydJqY,60174
836
+ hiddifypanel/translations.i18n/ru.json,sha256=6NavdAs1-19oKWQfrIpkf0tKdP4vN4pwEx1c1r2nfYQ,91982
837
+ hiddifypanel/translations.i18n/zh.json,sha256=jRezlHlG4PjDa4RxvIvsU_ByswoyQ1prn5O7KSFpGDM,59598
838
+ hiddifypanel-10.20.4.dist-info/LICENSE.md,sha256=oDrt-cUsyiDGnRPjEJh-3dH2ddAuK_bIVBD8ntkOtZw,19807
839
+ hiddifypanel-10.20.4.dist-info/METADATA,sha256=ullCUHQBoSzEYsBKyCim-7cn25LQBNqs37NekcsajNY,4009
840
+ hiddifypanel-10.20.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
841
+ hiddifypanel-10.20.4.dist-info/entry_points.txt,sha256=Xzpqlh3nwBtZhoV9AANJykano056VJvYzaujxPztJaM,60
842
+ hiddifypanel-10.20.4.dist-info/top_level.txt,sha256=rv-b3qFWUZQTBy0kyBfsr7L6tPpeO7AaQlLHXn-HI5M,13
843
+ hiddifypanel-10.20.4.dist-info/RECORD,,