From 335074d6938cdc78882f8a4787377124e6de0abe Mon Sep 17 00:00:00 2001 From: kiriharu Date: Mon, 11 Jan 2021 12:00:26 +0300 Subject: [PATCH] added /ipcalc command, close #14 --- apps/tgbot/tgbot/handlers/default/__init__.py | 4 +- apps/tgbot/tgbot/handlers/default/ipcalc.py | 59 +++++++++++++++++++ apps/tgbot/tgbot/handlers/default/start.py | 1 + 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 apps/tgbot/tgbot/handlers/default/ipcalc.py diff --git a/apps/tgbot/tgbot/handlers/default/__init__.py b/apps/tgbot/tgbot/handlers/default/__init__.py index 19403ae..97d125a 100644 --- a/apps/tgbot/tgbot/handlers/default/__init__.py +++ b/apps/tgbot/tgbot/handlers/default/__init__.py @@ -6,6 +6,7 @@ from .whois import whois_cmd from .icmp import ICMPCheckerHandler from .tcp import TCPCheckerHandler from .minecraft import MinecraftCheckerHandler +from .ipcalc import IPCalcCommandHandler def setup(dp: Dispatcher): @@ -14,4 +15,5 @@ def setup(dp: Dispatcher): dp.register_message_handler(whois_cmd, is_forwarded=False, commands=['whois']) dp.register_message_handler(ICMPCheckerHandler().handler, is_forwarded=False, commands=['icmp', 'ping']) dp.register_message_handler(TCPCheckerHandler().handler, is_forwarded=False, commands=['tcp']) - dp.register_message_handler(MinecraftCheckerHandler().handler, is_forwarded=False, commands=['minecraft']) \ No newline at end of file + dp.register_message_handler(MinecraftCheckerHandler().handler, is_forwarded=False, commands=['minecraft']) + dp.register_message_handler(IPCalcCommandHandler().handler, is_forwarded=False, commands=['ipcalc']) diff --git a/apps/tgbot/tgbot/handlers/default/ipcalc.py b/apps/tgbot/tgbot/handlers/default/ipcalc.py new file mode 100644 index 0000000..e6cee69 --- /dev/null +++ b/apps/tgbot/tgbot/handlers/default/ipcalc.py @@ -0,0 +1,59 @@ +from aiogram.types import Message +from typing import Union +import ipaddress + +from tgbot.handlers.base import SimpleCommandHandler, NotEnoughArgs + +ipcalc_help_message = """ +❓ Калькулятор IP подсетей. + +Использование: + `/ipcalc ` + `/ipcalc ` - автоматически выставит маску 32 +""" + + +class IPCalcCommandHandler(SimpleCommandHandler): + + help_message = ipcalc_help_message + + def __init__(self): + super().__init__() + + async def handler(self, message: Message): + try: + args = await self.process_args(message.text) + network = ipaddress.ip_network(args[1], False) + except NotEnoughArgs: + await message.answer(self.help_message) + except ValueError: + await message.answer(self.help_message) + else: + msg = await self.prepare_message(network) + await message.answer(msg) + + async def process_args(self, text: str) -> list: + args = text.split(" ") + if len(args) == 1: + raise NotEnoughArgs + return args + + async def prepare_message(self, ip_net: Union[ipaddress.IPv4Network, ipaddress.IPv6Network]) -> str: + + work_adresses = ip_net.num_addresses - 2 + first_ip = "Нет доступных адресов." + last_ip = first_ip + if ip_net.num_addresses <= 2: + work_adresses = 0 + else: + first_ip = list(ip_net.hosts())[0] + last_ip = list(ip_net.hosts())[-1] + + return f"📱 IP подсети: {ip_net.with_prefixlen}\n" \ + f"📌 Маска подсети: {ip_net.netmask}\n" \ + f"📌 Обратная маска: {ip_net.hostmask}\n" \ + f"📌 Широковещательный адрес: {ip_net.broadcast_address}\n" \ + f"📌 Доступные адреса: {ip_net.num_addresses}\n" \ + f"📌 Рабочие адреса: {work_adresses}\n\n" \ + f"🔼 IP первого хоста: {first_ip}\n" \ + f"🔽 IP последнего хоста: {last_ip}" diff --git a/apps/tgbot/tgbot/handlers/default/start.py b/apps/tgbot/tgbot/handlers/default/start.py index 3513537..5cbadec 100644 --- a/apps/tgbot/tgbot/handlers/default/start.py +++ b/apps/tgbot/tgbot/handlers/default/start.py @@ -13,6 +13,7 @@ start_message = f""" 📌 /web `` - Произведёт проверку по протоколу HTTP и вернёт код ответа 📌 /whois `` - Вернёт информацию whois по домену 📌 /minecraft ` ` - Вернёт информацию связанную с Minecraft-сервером + 📌 /ipcalc `` - Калькулятор подсетей 🚩[Репозиторий бота здесь](https://github.com/catspace-dev/unicheckbot). 🚩[Предложения или замечания можно оставлять здесь](https://github.com/catspace-dev/unicheckbot/issues).