|  | @@ -7,8 +7,11 @@ from datetime import datetime
 | 
	
		
			
				|  |  |  from ujson import dumps
 | 
	
		
			
				|  |  |  from tortoise.exceptions import IntegrityError
 | 
	
		
			
				|  |  |  from telethon.utils import get_display_name, get_peer_id
 | 
	
		
			
				|  |  | -from aiofiles.os import remove
 | 
	
		
			
				|  |  | -from aiofiles.os import path
 | 
	
		
			
				|  |  | +from aiofiles.os import (
 | 
	
		
			
				|  |  | +  remove,
 | 
	
		
			
				|  |  | +  path
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +from aiohttp import ClientSession
 | 
	
		
			
				|  |  |  from emoji import is_emoji
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from actions import (
 | 
	
	
		
			
				|  | @@ -20,7 +23,12 @@ from actions import (
 | 
	
		
			
				|  |  |    add_admin,
 | 
	
		
			
				|  |  |    delete_admin,
 | 
	
		
			
				|  |  |    add_or_update_birthday,
 | 
	
		
			
				|  |  | -  get_birthdays
 | 
	
		
			
				|  |  | +  get_birthdays,
 | 
	
		
			
				|  |  | +  add_server,
 | 
	
		
			
				|  |  | +  delete_server,
 | 
	
		
			
				|  |  | +  add_allowed,
 | 
	
		
			
				|  |  | +  delete_allowed,
 | 
	
		
			
				|  |  | +  list_servers
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  from utils import (
 | 
	
		
			
				|  |  |    WORDS_TABLE,
 | 
	
	
		
			
				|  | @@ -154,6 +162,68 @@ async def addgif_handler(bot, event, command):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    await event.reply('Готово!~~')
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +async def addserver_handler(bot, event, command):
 | 
	
		
			
				|  |  | +  if command.argc < 2:
 | 
	
		
			
				|  |  | +    await event.reply('Пожалуйста, укажите имя и адрес сервера!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  try:
 | 
	
		
			
				|  |  | +    await add_server(command.args[0], command.args[1])
 | 
	
		
			
				|  |  | +  except SyntaxError:
 | 
	
		
			
				|  |  | +    await event.reply('Недопустимое имя сервера!!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +  except ValueError:
 | 
	
		
			
				|  |  | +    await event.reply('Пожалуйста, введите корректный IPv4-/IPv6-адрес!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +  except IntegrityError:
 | 
	
		
			
				|  |  | +    await event.reply('Данный сервер уже был добавлен ранее!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  await event.reply('Готово!~~')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def delserver_handler(bot, event, command):
 | 
	
		
			
				|  |  | +  if command.argc < 1:
 | 
	
		
			
				|  |  | +    await event.reply('Пожалуйста, укажите имя сервера!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  try:
 | 
	
		
			
				|  |  | +    await delete_server(command.args[0])
 | 
	
		
			
				|  |  | +  except SyntaxError:
 | 
	
		
			
				|  |  | +    await event.reply('Недопустимое имя сервера!!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +  except IndexError:
 | 
	
		
			
				|  |  | +    await event.reply('Сервер с таким именем не найден!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  await event.reply('Готово!~~')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def allow_handler(bot, event, command):
 | 
	
		
			
				|  |  | +  try:
 | 
	
		
			
				|  |  | +    await add_allowed(event.peer_id)
 | 
	
		
			
				|  |  | +  except IntegrityError:
 | 
	
		
			
				|  |  | +    await event.reply('Данный чат уже добавлен в список разрешённых!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  await event.reply('Готово!~~')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def disallow_handler(bot, event, command):
 | 
	
		
			
				|  |  | +  try:
 | 
	
		
			
				|  |  | +    await delete_allowed(event.peer_id)
 | 
	
		
			
				|  |  | +  except IndexError:
 | 
	
		
			
				|  |  | +    await event.reply('Данный чат не найден в списке разрешённых!!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  await event.reply('Готово!~~')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  # Very, very, VERY evil code...
 | 
	
		
			
				|  |  |  async def make_message_shot(bot, message):
 | 
	
		
			
				|  |  |    if message.sender is None:
 | 
	
	
		
			
				|  | @@ -288,14 +358,58 @@ async def bday_handler(bot, event, command):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    await event.reply(f'Дни рождения:\n\n{birthdays_list}')
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +async def vpn_handler(bot, event, command):
 | 
	
		
			
				|  |  | +  if command.argc < 1:
 | 
	
		
			
				|  |  | +    await event.reply(f'Пожалуйста, укажите имя сервера! Доступные сервера: {await list_servers()}')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  try:
 | 
	
		
			
				|  |  | +    ip = await get_server_ip(commands.args[0])
 | 
	
		
			
				|  |  | +  except SyntaxError:
 | 
	
		
			
				|  |  | +    await event.reply('Недопустимое имя сервера!!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +  except IndexError:
 | 
	
		
			
				|  |  | +    await event.reply('Сервер с таким именем не найден!')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if event.sender is None:
 | 
	
		
			
				|  |  | +    sender_id = event.peer_id.channel_id
 | 
	
		
			
				|  |  | +  else:
 | 
	
		
			
				|  |  | +    sender_id = event.sender.id
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async with ClientSession() as session:
 | 
	
		
			
				|  |  | +    try:
 | 
	
		
			
				|  |  | +      async with session.post(
 | 
	
		
			
				|  |  | +        f'http://{ip}:9217/api/obtain',
 | 
	
		
			
				|  |  | +        data={'user_id': sender_id}
 | 
	
		
			
				|  |  | +      ) as resp:
 | 
	
		
			
				|  |  | +        data = await resp.json()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        profile = data['profile']
 | 
	
		
			
				|  |  | +    except:
 | 
	
		
			
				|  |  | +      await event.reply('Произошла ошибка при попытке обращения к API сервера… :(')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  await event.reply(f'Ваш файл конфигурации WireGuard:\n``` {profile}```'))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  COMMANDS = {
 | 
	
		
			
				|  |  |    'newadmin':  Handler(newadmin_handler,  is_restricted=True),
 | 
	
		
			
				|  |  |    'deladmin':  Handler(deladmin_handler,  is_restricted=True),
 | 
	
		
			
				|  |  |    'newaction': Handler(newaction_handler, is_restricted=True),
 | 
	
		
			
				|  |  |    'delaction': Handler(delaction_handler, is_restricted=True),
 | 
	
		
			
				|  |  |    'addgif':    Handler(addgif_handler,    is_restricted=True),
 | 
	
		
			
				|  |  | +  'addserver': Handler(addserver_handler, is_restricted=True),
 | 
	
		
			
				|  |  | +  'delserver': Handler(delserver_handler, is_restricted=True),
 | 
	
		
			
				|  |  | +  'allow':     Handler(allow_handler,     is_restricted=True),
 | 
	
		
			
				|  |  | +  'disallow':  Handler(disallow_handler, is_restricted=True),a
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    'save':      Handler(save_handler),
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  'bday':      Handler(bday_handler)
 | 
	
		
			
				|  |  | +  'bday':      Handler(bday_handler),
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  'vpn':       Handler(vpn_handler)
 | 
	
		
			
				|  |  |  }
 |