I add command /analytics and I improve code

It's version 0.2.3
This commit is contained in:
Niken
2025-10-05 23:16:19 +03:00
parent 3ef1327b67
commit cce8c7dc70
7 changed files with 156 additions and 86 deletions
+77 -66
View File
@@ -1,88 +1,99 @@
from aiogram import types
from aiogram import types, Dispatcher, Bot
from aiogram.types import Message
from aiogram.filters import Command
from config import Config
from models.state import BotState
from utils.antispam import admin_required
from services.watcher_service import WatcherService
from storage.message_storage import load_messages, save_message, clear_messages
from logging import getLogger
from utils.analytics import create_statistics_text
logger = getLogger(__name__)
class AdminHandlers:
def register(self):
"""Регистрирует все хендлеры этого класса"""
@self.dp.message(Command("log"))
@admin_required(3)
async def send_log(message: Message):
try:
log_file = types.FSInputFile(Config.LOG_FILE)
await message.answer_document(log_file, caption="📑 Логи бота")
except FileNotFoundError:
await message.answer("Файл логов пока не создан.")
@self.dp.message(Command("status"))
@admin_required(3)
async def send_status(message: Message):
from utils.analytics import analyze_bot_logs
from utils.mac_metrics import get_macbook_battery_level
try:
stats = analyze_bot_logs(Config.LOG_FILE)
batt = await get_macbook_battery_level()
status_text = (
"🤖 СТАТУС БОТА\n"
"══════════════\n"
f"✅ Uptime: {stats.get('uptime_percentage', 0)}%\n"
f"⏱️ Слежка расписания: {'ВКЛ' if self.state.watcher_work else 'ВЫКЛ'}\n"
f"🔋 Уровень заряда: {batt}%"
)
await message.answer(status_text)
except Exception as e:
await message.answer(f"❌ Ошибка при проверке статуса: {str(e)}")
def register_handlers(dp: Dispatcher, state: BotState, bot: Bot):
@dp.message(Command("log"))
@admin_required(3)
async def send_log(message: Message):
try:
log_file = types.FSInputFile(Config.LOG_FILE)
await message.answer_document(log_file, caption="📑 Логи бота")
except FileNotFoundError:
await message.answer("Файл логов пока не создан.")
@self.dp.message(Command("del"))
@admin_required(1)
async def delete_all_messages(message: Message):
messages = load_messages()
if not messages:
sent = await message.answer("📭 Нет сохранённых сообщений для удаления.",
reply_to_message_id=message.message_id)
save_message(sent.chat.id, sent.message_id)
return
@dp.message(Command("status"))
@admin_required(3)
async def send_status(message: Message):
from utils.analytics import analyze_bot_logs
from utils.mac_metrics import get_macbook_battery_level, get_process_usage
try:
stats = analyze_bot_logs(Config.LOG_FILE)
batt = await get_macbook_battery_level()
usage = await get_process_usage()
status_text = (
"🤖 СТАТУС БОТА\n"
"══════════════\n"
f"✅ Uptime: {stats.get('uptime_percentage', 0)}%\n"
f"⏱️ Слежка расписания: {'ВКЛ' if state.watcher_work else 'ВЫКЛ'}\n"
f"🔋 Уровень заряда: {batt}%\n"
f"🖥️ Загрузка цп: {usage["cpu_percent"]}\n"
f"🧠 Загрузка оперативки: {usage["rss_mb"]:.2f} MB\n"
)
await message.answer(status_text)
except Exception as e:
await message.answer(f"❌ Ошибка при проверке статуса: {str(e)}")
deleted = 0
for chat_id, msg_id in messages:
try:
await self.bot.delete_message(chat_id, msg_id)
deleted += 1
except Exception as e:
logger.warning(f"Не удалось удалить {msg_id} в чате {chat_id}: {e}")
@dp.message(Command("analytics"))
@admin_required(1)
async def stat(message: Message):
from utils.analytics import analyze_bot_logs
stats = analyze_bot_logs(Config.LOG_FILE)
await message.answer(create_statistics_text(stats), reply_to_message_id=message.message_id)
clear_messages()
sent = await message.answer(f"✅ Удалено {deleted} сообщений (включая /rasp).",
@dp.message(Command("del"))
@admin_required(1)
async def delete_all_messages(message: Message):
messages = load_messages()
if not messages:
sent = await message.answer("📭 Нет сохранённых сообщений для удаления.",
reply_to_message_id=message.message_id)
save_message(sent.chat.id, sent.message_id)
return
@self.dp.message(Command("power"))
@admin_required(2)
async def power_control(message: types.Message):
args = message.text.split()
if len(args) < 2:
status = "включена" if self.state.watcher_work else "выключена"
await message.answer(f"⏱️ Слежка расписания: {status}")
return
deleted = 0
for chat_id, msg_id in messages:
try:
await bot.delete_message(chat_id, msg_id)
deleted += 1
except Exception as e:
logger.warning(f"Не удалось удалить {msg_id} в чате {chat_id}: {e}")
command = args[1].lower()
watcher_service = WatcherService(self.state, self.bot)
clear_messages()
sent = await message.answer(f"✅ Удалено {deleted} сообщений (включая /rasp).",
reply_to_message_id=message.message_id)
save_message(sent.chat.id, sent.message_id)
if command == "on" and not self.state.watcher_work:
await watcher_service.start()
await message.answer("✅ Слежка расписания включена")
elif command == "off" and self.state.watcher_work:
await watcher_service.stop()
await message.answer("❌ Слежка расписания выключена")
else:
await message.answer("❌ Неверная команда")
@dp.message(Command("power"))
@admin_required(2)
async def power_control(message: types.Message):
args = message.text.split()
if len(args) < 2:
status = "включена" if state.watcher_work else "выключена"
await message.answer(f"⏱️ Слежка расписания: {status}")
return
command = args[1].lower()
watcher_service = WatcherService(state, bot)
if command == "on" and not state.watcher_work:
await watcher_service.start()
await message.answer("✅ Слежка расписания включена")
elif command == "off" and state.watcher_work:
await watcher_service.stop()
await message.answer("❌ Слежка расписания выключена")
else:
await message.answer("❌ Неверная команда")
+2 -2
View File
@@ -1,4 +1,4 @@
from aiogram import types, Dispatcher, Bot
from aiogram import types, Dispatcher
from aiogram.filters import Command
from models.state import BotState
from services.schedule_service import ScheduleService
@@ -6,7 +6,7 @@ from utils.antispam import is_chat_spam
from storage.message_storage import save_message
def register_handlers(dp: Dispatcher, state: BotState, bot: Bot):
def register_handlers(dp: Dispatcher, state: BotState):
@dp.message(Command("rasp"))
async def send_schedule(message: types.Message):
"""Отправка расписания"""