diff --git a/apps/tgbot/pyproject.toml b/apps/tgbot/pyproject.toml index bec37b6..e2893b7 100644 --- a/apps/tgbot/pyproject.toml +++ b/apps/tgbot/pyproject.toml @@ -21,3 +21,6 @@ aiomysql = "^0.0.21" [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" + +[tool.poetry.scripts] +test = 'tgbot.test:run_all' diff --git a/apps/tgbot/tgbot/handlers/base.py b/apps/tgbot/tgbot/handlers/base.py index 623e850..ee77eb8 100644 --- a/apps/tgbot/tgbot/handlers/base.py +++ b/apps/tgbot/tgbot/handlers/base.py @@ -6,7 +6,7 @@ from httpx import Response from aiogram.bot import Bot from datetime import datetime from core.coretypes import APINodeInfo -from .helpers import send_api_requests, check_int +from .helpers import send_api_requests from .errors import NotEnoughArgs, InvalidPort, LocalhostForbidden from .validators import BaseValidator, LocalhostValidator from tgbot.middlewares.throttling import rate_limit @@ -103,15 +103,13 @@ class CheckerTargetPortHandler(CheckerBaseHandler): def process_args_for_host_port(text: str, default_port: int) -> list: - port = None - args = text.split() - if len(args) < 2: + port = default_port + args = text.split(' ', 1) + if len(args) != 2: raise NotEnoughArgs() - if len(args) == 2: - port = default_port - if len(args) == 3: - port = args[2] - if not check_int(port): - raise InvalidPort() host = args[1] + if ":" in host: + host, port = host.rsplit(":", 1) + elif " " in host: + host, port = host.rsplit(" ", 1) return [host, port] diff --git a/apps/tgbot/tgbot/handlers/default/minecraft.py b/apps/tgbot/tgbot/handlers/default/minecraft.py index 790acaa..4811c39 100644 --- a/apps/tgbot/tgbot/handlers/default/minecraft.py +++ b/apps/tgbot/tgbot/handlers/default/minecraft.py @@ -8,8 +8,9 @@ minecraft_help_message = """ ❓ Получает статистику о Minecraft сервере Использование: - `/minecraft ` - `/minecraft ` - автоматически выставит порт 25565 + `/minecraft ` + `/minecraft :` + `/minecraft ` - автоматически выставит порт 25565 """ diff --git a/apps/tgbot/tgbot/handlers/default/tcp.py b/apps/tgbot/tgbot/handlers/default/tcp.py index a2aa1fc..c3bf612 100644 --- a/apps/tgbot/tgbot/handlers/default/tcp.py +++ b/apps/tgbot/tgbot/handlers/default/tcp.py @@ -11,7 +11,8 @@ tcp_help_message = """ ❓ Производит проверку TCP порта, открыт ли он или нет Использование: - `/tcp ` + `/tcp ` + `/tcp :` """ invalid_port = """❗Неправильный порт. Напишите /tcp чтобы увидеть справку к данному способу проверки.""" @@ -29,15 +30,18 @@ class TCPCheckerHandler(CheckerTargetPortHandler): await super(TCPCheckerHandler, self).handler(message) async def process_args(self, text: str) -> list: - port = None - args = text.split() - if len(args) < 3: + args = text.split(' ', 1) + if len(args) != 2: raise NotEnoughArgs() - if len(args) >= 3: - port = args[2] - if not check_int(port): - raise InvalidPort() host = args[1] + if ":" in host: + host, port = host.rsplit(":", 1) + elif " " in host: + host, port = host.split(maxsplit=1) + else: + raise NotEnoughArgs() + if not check_int(port): + raise InvalidPort() return [host, port] async def prepare_message(self, res: Response): diff --git a/apps/tgbot/tgbot/handlers/default/web.py b/apps/tgbot/tgbot/handlers/default/web.py index dafc369..b0ca9aa 100644 --- a/apps/tgbot/tgbot/handlers/default/web.py +++ b/apps/tgbot/tgbot/handlers/default/web.py @@ -7,7 +7,8 @@ web_help_message = """ ❓ Производит проверку хоста по протоколу HTTP. Использование: - `/web ` + `/web ` + `/web :` `/web ` - автоматически выставит 80 порт """ diff --git a/apps/tgbot/tgbot/test/__init__.py b/apps/tgbot/tgbot/test/__init__.py new file mode 100644 index 0000000..1ba86c5 --- /dev/null +++ b/apps/tgbot/tgbot/test/__init__.py @@ -0,0 +1,2 @@ +def run_all(): + from . import port_parsers diff --git a/apps/tgbot/tgbot/test/port_parsers.py b/apps/tgbot/tgbot/test/port_parsers.py new file mode 100644 index 0000000..7f770f4 --- /dev/null +++ b/apps/tgbot/tgbot/test/port_parsers.py @@ -0,0 +1,57 @@ +import asyncio + +from ..handlers.default.tcp import TCPCheckerHandler +from ..handlers.base import process_args_for_host_port,\ + NotEnoughArgs, InvalidPort + + +try: + args = "/cmd" + process_args_for_host_port(args, 443) +except NotEnoughArgs: + pass +args = "/cmd example.com" +host, port = process_args_for_host_port(args, 443) +assert port == 443 + +args = "/cmd example.com 42" +host, port = process_args_for_host_port(args, 443) +assert port == "42" # TODO: FIX THIS SHIT + +args = "/cmd example.com:42" +host, port = process_args_for_host_port(args, 443) +assert port == "42" + +try: + args = "/cmd example.com fucktests" +except InvalidPort: + pass + +method = TCPCheckerHandler().process_args + + +async def test(): + try: + args = "/cmd" + await method(args) + args = "/cmd example.com" + await method(args) + except NotEnoughArgs: + pass + + args = "/cmd example.com 42" + host, port = await method(args) + assert port == "42" + + args = "/cmd example.com:42" + host, port = await method(args) + assert port == "42" + + try: + args = "/cmd example.com jdbnjsbndjsd" + await method(args) + except InvalidPort: + pass + + +asyncio.run(test())