Этот коммит содержится в:
stevefoxru
2025-03-01 01:10:38 +03:00
коммит произвёл GitHub
родитель 9497ce0db6
Коммит 37ff8df649
+64 -4
Просмотреть файл
@@ -75,7 +75,8 @@ main_menu_markup = InlineKeyboardMarkup(row_width=1).add(
InlineKeyboardButton("Получить конфигурацию пользователя", callback_data="get_config"), InlineKeyboardButton("Получить конфигурацию пользователя", callback_data="get_config"),
InlineKeyboardButton("Список клиентов", callback_data="list_users"), InlineKeyboardButton("Список клиентов", callback_data="list_users"),
InlineKeyboardButton("Создать бекап", callback_data="create_backup"), InlineKeyboardButton("Создать бекап", callback_data="create_backup"),
InlineKeyboardButton("Список админов", callback_data="list_admins") # Новая кнопка InlineKeyboardButton("Список админов", callback_data="list_admins"),
InlineKeyboardButton("Добавить администратора", callback_data="add_admin") # Новая кнопка
) )
user_main_messages = {} user_main_messages = {}
@@ -266,6 +267,7 @@ async def handle_messages(message: types.Message):
return return
user_state = user_main_messages.get(message.from_user.id, {}).get('state') user_state = user_main_messages.get(message.from_user.id, {}).get('state')
if user_state == 'waiting_for_user_name': if user_state == 'waiting_for_user_name':
# Существующий код для добавления пользователя
user_name = message.text.strip() user_name = message.text.strip()
if not all(c.isalnum() or c in "-_" for c in user_name): if not all(c.isalnum() or c in "-_" for c in user_name):
await message.reply("Имя пользователя может содержать только буквы, цифры, дефисы и подчёркивания.") await message.reply("Имя пользователя может содержать только буквы, цифры, дефисы и подчёркивания.")
@@ -294,10 +296,66 @@ async def handle_messages(message: types.Message):
) )
else: else:
await message.answer("Ошибка: главное сообщение не найдено.") await message.answer("Ошибка: главное сообщение не найдено.")
elif user_state == 'waiting_for_admin_id':
try:
new_admin_id = int(message.text.strip())
if new_admin_id in admins:
await message.reply(f"Пользователь {new_admin_id} уже является администратором.")
asyncio.create_task(delete_message_after_delay(message.chat.id, message.message_id, delay=2))
return
db.add_admin(new_admin_id)
admins.append(new_admin_id)
await message.reply(f"Пользователь {new_admin_id} добавлен в администраторы.")
await bot.send_message(new_admin_id, "Вы были назначены администратором бота!")
logger.info(f"Админ {message.from_user.id} добавил администратора {new_admin_id} через интерфейс")
# Возвращаем главное меню
main_chat_id = user_main_messages[message.from_user.id].get('chat_id')
main_message_id = user_main_messages[message.from_user.id].get('message_id')
if main_chat_id and main_message_id:
user_main_messages[message.from_user.id]['state'] = None
await bot.edit_message_text(
chat_id=main_chat_id,
message_id=main_message_id,
text="Выберите действие:",
reply_markup=main_menu_markup
)
except ValueError:
await message.reply("Пожалуйста, введите корректный Telegram ID (число).")
asyncio.create_task(delete_message_after_delay(message.chat.id, message.message_id, delay=2))
return
except Exception as e:
logger.error(f"Ошибка при добавлении администратора: {e}")
await message.reply("Произошла ошибка при добавлении администратора.")
asyncio.create_task(delete_message_after_delay(message.chat.id, message.message_id, delay=2))
else: else:
await message.reply("Неизвестная команда или действие.") await message.reply("Неизвестная команда или действие.")
asyncio.create_task(delete_message_after_delay(message.chat.id, message.message_id, delay=2)) asyncio.create_task(delete_message_after_delay(message.chat.id, message.message_id, delay=2))
@dp.callback_query_handler(lambda c: c.data == "add_admin")
async def prompt_for_admin_id(callback_query: types.CallbackQuery):
if callback_query.from_user.id not in admins:
await callback_query.answer("У вас нет прав для выполнения этого действия.", show_alert=True)
return
main_chat_id = user_main_messages.get(callback_query.from_user.id, {}).get('chat_id')
main_message_id = user_main_messages.get(callback_query.from_user.id, {}).get('message_id')
if main_chat_id and main_message_id:
await bot.edit_message_text(
chat_id=main_chat_id,
message_id=main_message_id,
text="Введите Telegram ID нового администратора:",
reply_markup=InlineKeyboardMarkup().add(
InlineKeyboardButton("Домой", callback_data="home")
)
)
user_main_messages[callback_query.from_user.id]['state'] = 'waiting_for_admin_id'
else:
await callback_query.answer("Ошибка: главное сообщение не найдено.", show_alert=True)
await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data.startswith('add_user')) @dp.callback_query_handler(lambda c: c.data.startswith('add_user'))
async def prompt_for_user_name(callback_query: types.CallbackQuery): async def prompt_for_user_name(callback_query: types.CallbackQuery):
if callback_query.from_user.id not in admins: if callback_query.from_user.id not in admins:
@@ -665,13 +723,15 @@ async def list_admins_callback(callback_query: types.CallbackQuery):
return return
admin_list = "\n".join([f"- {admin_id}" for admin_id in admins]) admin_list = "\n".join([f"- {admin_id}" for admin_id in admins])
text = f"Список администраторов:\n{admin_list}" text = f"Список администраторов:\n{admin_list}"
keyboard = InlineKeyboardMarkup(row_width=2)
for admin_id in admins:
keyboard.insert(InlineKeyboardButton(f"Удалить {admin_id}", callback_data=f"remove_admin_{admin_id}"))
keyboard.add(InlineKeyboardButton("Домой", callback_data="home"))
await bot.edit_message_text( await bot.edit_message_text(
chat_id=callback_query.message.chat.id, chat_id=callback_query.message.chat.id,
message_id=callback_query.message.message_id, message_id=callback_query.message.message_id,
text=text, text=text,
reply_markup=InlineKeyboardMarkup().add( reply_markup=keyboard
InlineKeyboardButton("Домой", callback_data="home")
)
) )
await callback_query.answer() await callback_query.answer()