diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +__pycache__ diff --git a/docker-compose.yml b/docker-compose.yml index 6ccb38e..a3f241e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,7 @@ services: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_DB: ${POSTGRES_DB:-postgres} ports: - - 5432 + - "127.0.0.1:${POSTGRES_PORT}:5432" healthcheck: test: ["CMD", "pg_isready"] interval: 10s diff --git a/main.py b/main.py index 8c2a805..9c81504 100644 --- a/main.py +++ b/main.py @@ -5,7 +5,7 @@ from sys import exit import uvloop from nwxraybot import NwXrayBot, Settings -from nwxraybot.handlers import HelloHandler +from nwxraybot.handlers import * from nwxraybot.models import User if __name__ == "__main__": @@ -19,7 +19,11 @@ if __name__ == "__main__": User.create_table() + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + loop = uvloop.new_event_loop() + asyncio.set_event_loop(loop) + # Start bot bot = NwXrayBot(config.bot_token.get_secret_value()) - bot.include_routers(HelloHandler(bot)()) - uvloop.run(bot.start(skip_updates=True)) + bot.include_routers(HelloHandler(), MenuHandler(), AdminHandler(bot.bot)) + loop.run_until_complete(bot.start(skip_updates=True)) diff --git a/nwxraybot/__init__.py b/nwxraybot/__init__.py index 667fdf5..4621279 100644 --- a/nwxraybot/__init__.py +++ b/nwxraybot/__init__.py @@ -1,2 +1,3 @@ from nwxraybot.bot import NwXrayBot from nwxraybot.config import Settings +from nwxraybot.utils import get_code, get_subscription_info diff --git a/nwxraybot/bot.py b/nwxraybot/bot.py index 6d558fa..ff4d5e2 100644 --- a/nwxraybot/bot.py +++ b/nwxraybot/bot.py @@ -1,14 +1,23 @@ from aiogram import Bot, Dispatcher, Router +from aiogram.utils.callback_answer import CallbackAnswerMiddleware + +from nwxraybot.middlewares import UserMiddleware +from nwxraybot.notifiers import setup_subscription_notifier + +from .meta import Handler class NwXrayBot: def __init__(self, token: str) -> None: self.bot = Bot(token=token) self.dp = Dispatcher() + self.dp.message.middleware(UserMiddleware()) + self.dp.message.middleware(CallbackAnswerMiddleware()) + setup_subscription_notifier(self.bot) - def include_routers(self, *routers: Router): + def include_routers(self, *routers: Handler): for router in routers: - self.dp.include_router(router) + self.dp.include_router(router()) async def start(self, skip_updates: bool = False) -> None: await self.dp.start_polling(self.bot, skip_updates=skip_updates) diff --git a/nwxraybot/fsm/__init__.py b/nwxraybot/fsm/__init__.py new file mode 100644 index 0000000..dca75b7 --- /dev/null +++ b/nwxraybot/fsm/__init__.py @@ -0,0 +1 @@ +from nwxraybot.fsm.broadcast import BroadcastStates diff --git a/nwxraybot/fsm/broadcast.py b/nwxraybot/fsm/broadcast.py new file mode 100644 index 0000000..70a7aca --- /dev/null +++ b/nwxraybot/fsm/broadcast.py @@ -0,0 +1,6 @@ +from aiogram.fsm.state import State, StatesGroup + + +class BroadcastStates(StatesGroup): + waiting_for_message = State() + confirming_message = State() diff --git a/nwxraybot/handlers/__init__.py b/nwxraybot/handlers/__init__.py index a03cc0c..0dde1e6 100644 --- a/nwxraybot/handlers/__init__.py +++ b/nwxraybot/handlers/__init__.py @@ -1 +1,3 @@ +from nwxraybot.handlers.admin import AdminHandler from nwxraybot.handlers.hello import HelloHandler +from nwxraybot.handlers.menu import MenuHandler diff --git a/nwxraybot/handlers/admin.py b/nwxraybot/handlers/admin.py new file mode 100644 index 0000000..09f603b --- /dev/null +++ b/nwxraybot/handlers/admin.py @@ -0,0 +1,103 @@ +import asyncio +import logging +import re +from datetime import datetime +from typing import Optional + +from aiogram import Bot, F +from aiogram.enums import ParseMode +from aiogram.filters import Command +from aiogram.fsm.context import FSMContext +from aiogram.types import (CallbackQuery, InlineKeyboardButton, + InlineKeyboardMarkup, Message) + +from nwxraybot import get_code +from nwxraybot.fsm import BroadcastStates +from nwxraybot.meta import Handler +from nwxraybot.middlewares import AdminMiddleware +from nwxraybot.models import User + + +class AdminHandler(Handler): + def __init__(self, bot: Optional[Bot] = None) -> None: + super().__init__(bot) + + self.router.message.middleware(AdminMiddleware()) + + @self.router.message(Command('adduser')) + async def add_user(message: Message): + mask = r"^(?P[a-zA-Z0-9]+)\s(?Pvless://[^\s]+)($|\s(?P[0-9]{2}\.[0-9]{2}\.[0-9]{4})\s(?P