from telegram import Update, InlineKeyboardMarkup, InlineKeyboardButton, Bot
from telegram.ext import CommandHandler, MessageHandler, filters, CallbackContext, ContextTypes
from telegram.error import TelegramError
from utils.logger import logger
from utils.user_data import get_user_info
from utils.admin_utils import is_admin
from utils.message_sender import send_message
from utils.admin_utils import ADMINS, count_memorial_notes, has_records
from utils.database import USER_DATA, save_database
from utils.formating import format_names
from telegram.error import BadRequest
# Новая функция для админов
admin_keyboard = InlineKeyboardMarkup([
[InlineKeyboardButton("О здравии", callback_data='admin_life'),
InlineKeyboardButton("За упокой", callback_data='admin_dead')],
[InlineKeyboardButton("Статистика", callback_data='admin_stats')]
])
admin_view_keyboard = InlineKeyboardMarkup([
[InlineKeyboardButton("Прочитано", callback_data='admin_done')],
[InlineKeyboardButton("Предидущее", callback_data='admin_prev'),
InlineKeyboardButton("Следующее", callback_data='admin_next')],
[InlineKeyboardButton("Закрыть", callback_data='admin_close')]
])
async def get_chat_members(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.effective_chat.id
try:
async for member in context.bot.get_chat_members(chat_id):
logger.info(f"Пользователь: {member.user.username} - {member.user.first_name} {member.user.last_name}")
except Exception as e:
logger.error(f"Ошибка при получении участников: {e}")
async def remove_notes(update: Update, context: CallbackContext)-> None:
global USER_DATA
logger.info("Функция удаления записки вызвана")
if 'typer' in context.user_data:
typer = context.user_data['typer']
logger.info("Тип записки есть")
if 'current' in context.user_data:
logger.info("Номер записки есть")
current = context.user_data['current']
idlist=list(USER_DATA)
id_list=[]
for user_id in idlist:
if typer in USER_DATA[user_id]:
id_list.append(user_id)
if not id_list:
send_message(update, context, "Нет записей")
return
id=id_list[current]
if typer in USER_DATA[id]:
message = f"✅ Ваша записка \"{typer}\" прочитана"
logger.info(message)
await send_message(update, context, message, chat_id = int(id))
del USER_DATA[id][typer]
save_database(USER_DATA)
else:
logger.info("Номер записки не задан")
else:
logger.info("Тип записки не задан")
async def get_members_count(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.effective_chat.id
try:
count = await context.bot.get_chat_members_count(chat_id)
logger.info(f"Количество пользователей бота: {count}")
except Exception as e:
logger.error(f"Ошибка при получении количества участников: {e}")
async def admin_start(update: Update, context: CallbackContext) -> None: # handlers/admin_handlers.py
user_info = await get_user_info(update, context)
if is_admin(user_info["id"]):
user_name = user_info["name"]
await send_message(update, context, f"Здравствуйте, админ {user_name}!")
await send_message(update, context, "Это админ-панель")
await notify_admins(update, context)
await send_message(update, context, "Выберите действие:",reply_markup=admin_keyboard)
async def admin_view(update: Update, context: CallbackContext) -> None:
global USER_DATA
if 'typer' not in context.user_data:
logger.error("Тип чтения записки не задан!")
return
else:
typer = context.user_data['typer']
idlist=list(USER_DATA)
id_list=[]
for user_id in idlist:
if typer in USER_DATA[user_id]:
id_list.append(user_id)
if not id_list:
send_message(update, context, "Нет записей")
return
if 'current' in context.user_data:
current=context.user_data['current']
else:
current=0
logger.info(f"Len of id_list: {len(id_list)}")
if len(id_list) <= current:
current = len(id_list) -1
id=id_list[current]
logger.info(f"ID of USER:{id}")
try:
cur = await context.bot.get_chat_member(update.effective_chat.id, id)
user = cur.user.username
except BadRequest as e:
if str(e) == "Member not found":
logger.error(f"Error by get_chat_member: {e}")
user = id
message=f"Пользователь @{user}\n"
if 'Комментарий' in USER_DATA[id]:
message+=f"Комментарий:\n"
message+=f"{USER_DATA[id]['Комментарий']}\n"
message+=f"{typer}:\n"
message+=f"{format_names(USER_DATA[id][typer],numbering_type='•')}\n"
await send_message(update, context, message, reply_markup=admin_view_keyboard)
async def notify_admins(update: Update, context: CallbackContext, current_user:int = 0):
global USER_DATA
get_users_count = len(USER_DATA) # Функция получения количества непрочитанных
unread_count = count_memorial_notes(USER_DATA)
if unread_count > 0:
for admin_id in ADMINS:
try:
message=""
if current_user != 0:
try:
cur = await context.bot.get_chat_member(update.effective_chat.id, current_user)
user = cur.user.username
except BadRequest as e:
if str(e) == "Member not found":
logger.error(f"Error by get_chat_member: {e}")
user = id
message=f"@{user} добавил записки.\n"
if str(current_user) in USER_DATA:
if "Комментарий" in USER_DATA[str(current_user)]:
message+=f"Комментарий пользователя:\n"
message+=f"{USER_DATA[str(current_user)]['Комментарий']}\n"
message+=f"⚠️ У вас {unread_count} непрочитанных записок\n"
message+=f"От {get_users_count} пользователей\n"
logger.info(f"Message: {message}")
await send_message(update, context, message, chat_id=admin_id)
except TelegramError as e:
logger.error(f"Ошибка отправки уведомления админу {admin_id}: {e}")
def register_handlers(app):
# Здесь можно добавить функционал админ-панели
app.add_handler(CommandHandler("admin", admin_start))