txlyre 1 an în urmă
părinte
comite
566778ee6e
7 a modificat fișierele cu 233 adăugiri și 7 ștergeri
  1. 85 2
      actions.py
  2. 118 4
      commands.py
  3. 14 0
      models.py
  4. 6 1
      openkriemy.py
  5. 1 0
      requirements.txt
  6. 0 0
      resources/.nomedia
  7. 9 0
      utils.py

+ 85 - 2
actions.py

@@ -7,8 +7,11 @@ from telethon.tl.functions.messages import UploadMediaRequest, GetStickerSetRequ
 from telethon.tl.types import InputStickerSetID, InputStickerSetShortName, InputStickerSetItem, InputMediaUploadedDocument, InputPeerSelf
 from tortoise.expressions import F
 
-from models import Action, Gif, StickerPack, Admin, BirthDay
-from utils import is_valid_name
+from models import Action, Gif, StickerPack, Admin, BirthDay, VPNServer, AllowedChat
+from utils import (
+  is_valid_name,
+  is_valid_ip
+)
 from config import config
 
 async def is_admin(bot, user):
@@ -140,3 +143,83 @@ async def add_or_update_birthday(peer_id, user, date):
 
 async def get_all_birthdays():
   return await BirthDay.all()
+
+async def add_server(name, ip):
+  if not is_valid_ip(ip):
+    raise ValueError
+
+  await VPNServer(
+    name=name,
+    ip=ip
+  ).save()
+
+async def add_server(name, ip):
+  if not is_valid_name(name):
+    raise SyntaxError
+
+  if not is_valid_ip(ip):
+    raise ValueError
+
+  await VPNServer(
+    name=name,
+    ip=ip
+  ).save()
+
+async def delete_server(name):
+  if not is_valid_name(name):
+    raise SyntaxError
+
+  server = await VPNServer.filter(
+    name=name
+  ).first()
+
+  if not server:
+    raise IndexError
+
+  await server.delete()
+
+async def list_servers():
+  servers = await VPNServer.all()
+
+  if not servers:
+    return '*пусто*'
+
+  return ', '.join(
+    map(
+      lambda server: server.name,
+      servers
+    )
+  )
+
+async def get_server_ip(name):
+  if not is_valid_name(name):
+    raise SyntaxError
+
+  server = await VPNServer.filter(
+    name=name
+  ).first()
+
+  if not server:
+    raise IndexError
+
+  return server.ip
+
+async def add_allowed(peer_id):
+  await AllowedChat(
+    peer_id=peer_id
+  ).create()
+
+async def delete_allowed(peer_id):
+  chat = await AllowedChat.filter(
+    peer_id=peer_id
+  ).first()
+
+  if not chat:
+    raise IndexError
+
+  await chat.delete()
+
+async def is_allowed(peer_id):
+  return await AllowedChat.filter(
+    peer_id=peer_id
+  ).exists()

+ 118 - 4
commands.py

@@ -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)
 }

+ 14 - 0
models.py

@@ -29,3 +29,17 @@ class BirthDay(Model):
   peer_id = BigIntField()
   user_id = IntField()
   date = DateField()
+
+class BirtDayNotify(Model):
+  id = IntField(pk=True)
+  user_id = IntField()
+  date = DateField()
+
+class VPNServer(Model):
+  id = IntField(pk=True)
+  name = CharField(max_length=64, unique=True)
+  ip = CharField(max_length=15, unique=True)
+
+class AllowedChat(Model):
+  id = IntField(pk=True)
+  peer_id = BigIntField(unique=True)

+ 6 - 1
openkriemy.py

@@ -16,7 +16,8 @@ from db import init_db
 from actions import (
   find_action, 
   get_random_gif,
-  is_admin
+  is_admin,
+  is_allowed
 )
 from commands import COMMANDS
 
@@ -35,6 +36,10 @@ async def on_message(event):
 
   handler = COMMANDS.get(command.name, None)
 
+  if not await is_allowed(event.peer_id):
+    if not handler or not handler.is_restricted:
+      return
+
   if handler:
     if handler.is_restricted\
    and not await is_admin(bot, event.sender):

+ 1 - 0
requirements.txt

@@ -1,5 +1,6 @@
 tortoise-orm[asyncpg]
 pyyaml
+aiohttp
 aiofiles
 telethon
 emoji

+ 0 - 0
resources/.nomedia


+ 9 - 0
utils.py

@@ -1,6 +1,7 @@
 from uuid import uuid4
 from enum import IntEnum
 from datetime import datetime
+from ipaddress import ip_address
 from collections import namedtuple
 
 from aiofiles.os import mkdir
@@ -220,3 +221,11 @@ def unparse(text, entities):
     table.insert(entity)
 
   return table.process(text)
+
+def is_valid_ip(ip):
+  try:
+    ip_address(ip)
+  except:
+    return False
+
+  return True