89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
管理员专用的广播插件
|
||
功能:
|
||
- 仅限管理员在私聊中调用。
|
||
- 通过回复一条消息并发送指令,将该消息转发给机器人所在的所有群聊。
|
||
- 此插件不写入 __plugin_meta__,保持隐藏。
|
||
"""
|
||
from core.command_manager import matcher
|
||
from models import MessageEvent
|
||
from core.permission_manager import ADMIN
|
||
from core.logger import logger
|
||
|
||
@matcher.command("broadcast", "广播", permission=ADMIN)
|
||
async def broadcast_message(event: MessageEvent):
|
||
"""
|
||
广播指令处理器。
|
||
|
||
:param event: 消息事件对象。
|
||
"""
|
||
# 1. 检查是否为私聊消息
|
||
# 使用 hasattr 安全地检查 group_id 属性,避免 AttributeError
|
||
if hasattr(event, 'group_id') and event.group_id:
|
||
# 在群聊中调用时,静默处理,不予响应
|
||
return
|
||
|
||
# 2. 检查是否回复了某条消息
|
||
reply = event.reply
|
||
if not reply:
|
||
await event.reply("请通过“回复”一条您想广播的消息来使用此功能。")
|
||
return
|
||
|
||
# 3. 获取机器人所在的群聊列表
|
||
bot = event.bot
|
||
try:
|
||
group_list = await bot.get_group_list()
|
||
if not group_list:
|
||
await event.reply("机器人目前没有加入任何群聊。")
|
||
return
|
||
except Exception as e:
|
||
logger.error(f"[Broadcast] 获取群聊列表失败: {e}")
|
||
await event.reply(f"获取群聊列表时发生错误,无法广播。错误信息: {e}")
|
||
return
|
||
|
||
# 4. 获取被回复的消息内容
|
||
try:
|
||
message_data = await bot.get_msg(reply.message_id)
|
||
message_content = message_data.get("message", "")
|
||
if not message_content:
|
||
await event.reply("无法获取被回复的消息内容,广播失败。")
|
||
return
|
||
except Exception as e:
|
||
logger.error(f"[Broadcast] 获取消息内容失败: {e}")
|
||
await event.reply(f"获取消息内容时发生错误: {e}")
|
||
return
|
||
|
||
# 5. 遍历所有群聊并发送消息
|
||
success_count = 0
|
||
failed_count = 0
|
||
total_groups = len(group_list)
|
||
|
||
await event.reply(f"准备向 {total_groups} 个群聊广播消息,请稍候...")
|
||
|
||
for group in group_list:
|
||
group_id = group.group_id
|
||
if not group_id:
|
||
continue
|
||
|
||
try:
|
||
# 发送消息到群聊
|
||
await bot.send_group_msg(
|
||
group_id=group_id,
|
||
message=message_content
|
||
)
|
||
success_count += 1
|
||
logger.info(f"[Broadcast] 已成功将消息发送至群聊: {group_id}")
|
||
except Exception as e:
|
||
failed_count += 1
|
||
logger.error(f"[Broadcast] 发送消息至群聊 {group_id} 失败: {e}")
|
||
|
||
# 6. 向管理员报告结果
|
||
report_message = (
|
||
f"广播任务完成。\n"
|
||
f"总群聊数: {total_groups}\n"
|
||
f"成功: {success_count}\n"
|
||
f"失败: {failed_count}"
|
||
)
|
||
await event.reply(report_message)
|