Этот коммит содержится в:
stevefoxru
2025-03-01 00:41:07 +03:00
коммит произвёл GitHub
родитель f01784191f
Коммит f16b5e3d41
+50 -7
Просмотреть файл
@@ -10,6 +10,7 @@ from datetime import datetime
EXPIRATIONS_FILE = 'files/expirations.json' EXPIRATIONS_FILE = 'files/expirations.json'
PAYMENTS_FILE = 'files/payments.json' PAYMENTS_FILE = 'files/payments.json'
ADMINS_FILE = 'files/admins.json' # Новый файл для хранения админов
UTC = pytz.UTC UTC = pytz.UTC
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
@@ -34,7 +35,8 @@ def create_config(path='files/setting.ini'):
config.add_section("setting") config.add_section("setting")
bot_token = input('Введите токен Telegram бота: ').strip() bot_token = input('Введите токен Telegram бота: ').strip()
admin_id = input('Введите Telegram ID администратора: ').strip() admin_ids_input = input('Введите Telegram ID администраторов через запятую (например, 12345, 67890): ').strip()
admin_ids = [admin_id.strip() for admin_id in admin_ids_input.split(',')] # Список ID
docker_container = get_amnezia_container() docker_container = get_amnezia_container()
logger.info(f"Найден Docker-контейнер: {docker_container}") logger.info(f"Найден Docker-контейнер: {docker_container}")
@@ -43,7 +45,7 @@ def create_config(path='files/setting.ini'):
try: try:
wg_config_file = subprocess.check_output(cmd, shell=True).decode().strip() wg_config_file = subprocess.check_output(cmd, shell=True).decode().strip()
if not wg_config_file: if not wg_config_file:
logger.warning("Не удалось найти файл конфигурации WireGuard 'wg0.conf' в контейнере. Используется путь по умолчанию.") logger.warning("Не удалось найти файл конфигурации WireGuard 'wg0.conf'. Используется путь по умолчанию.")
wg_config_file = '/opt/amnezia/awg/wg0.conf' wg_config_file = '/opt/amnezia/awg/wg0.conf'
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
logger.warning("Ошибка при определении пути к файлу конфигурации WireGuard. Используется путь по умолчанию.") logger.warning("Ошибка при определении пути к файлу конфигурации WireGuard. Используется путь по умолчанию.")
@@ -54,10 +56,10 @@ def create_config(path='files/setting.ini'):
socket.inet_aton(endpoint) socket.inet_aton(endpoint)
except (subprocess.CalledProcessError, socket.error): except (subprocess.CalledProcessError, socket.error):
logger.error("Ошибка при определении внешнего IP-адреса сервера.") logger.error("Ошибка при определении внешнего IP-адреса сервера.")
endpoint = input('Не удалось автоматически определить внешний IP-адрес. Пожалуйста, введите его вручную: ').strip() endpoint = input('Не удалось автоматически определить внешний IP-адрес. Введите его вручную: ').strip()
config.set("setting", "bot_token", bot_token) config.set("setting", "bot_token", bot_token)
config.set("setting", "admin_id", admin_id) config.set("setting", "admin_ids", ','.join(admin_ids)) # Сохраняем как строку с разделителем
config.set("setting", "docker_container", docker_container) config.set("setting", "docker_container", docker_container)
config.set("setting", "wg_config_file", wg_config_file) config.set("setting", "wg_config_file", wg_config_file)
config.set("setting", "endpoint", endpoint) config.set("setting", "endpoint", endpoint)
@@ -66,6 +68,9 @@ def create_config(path='files/setting.ini'):
config.write(config_file) config.write(config_file)
logger.info(f"Конфигурация сохранена в {path}") logger.info(f"Конфигурация сохранена в {path}")
# Инициализируем admins.json с начальными администраторами
save_admins(admin_ids)
def ensure_peer_names(): def ensure_peer_names():
setting = get_config() setting = get_config()
wg_config_file = setting['wg_config_file'] wg_config_file = setting['wg_config_file']
@@ -149,8 +154,10 @@ def get_config(path='files/setting.ini'):
config.read(path) config.read(path)
out = {} out = {}
for key in config['setting']: for key in config['setting']:
out[key] = config['setting'][key] if key == 'admin_ids':
out[key] = config['setting'][key].split(',') # Парсим строку в список
else:
out[key] = config['setting'][key]
return out return out
def save_client_endpoint(username, endpoint): def save_client_endpoint(username, endpoint):
@@ -428,4 +435,40 @@ def get_user_payments(user_id: int):
return payments.get(str(user_id), []) return payments.get(str(user_id), [])
def get_all_payments(): def get_all_payments():
return load_payments() payments = load_payments()
flat_payments = []
for user_id, user_payments in payments.items():
flat_payments.extend(user_payments)
return flat_payments
# Методы для управления администраторами
def load_admins():
os.makedirs(os.path.dirname(ADMINS_FILE), exist_ok=True)
if not os.path.exists(ADMINS_FILE):
return []
with open(ADMINS_FILE, 'r') as f:
try:
return json.load(f)
except json.JSONDecodeError:
logger.error("Ошибка при загрузке admins.json.")
return []
def save_admins(admin_ids):
os.makedirs(os.path.dirname(ADMINS_FILE), exist_ok=True)
with open(ADMINS_FILE, 'w') as f:
json.dump(admin_ids, f)
def get_admins():
return load_admins()
def add_admin(user_id):
admin_ids = load_admins()
if str(user_id) not in admin_ids:
admin_ids.append(str(user_id))
save_admins(admin_ids)
def remove_admin(user_id):
admin_ids = load_admins()
if str(user_id) in admin_ids:
admin_ids.remove(str(user_id))
save_admins(admin_ids)