zhenxun_bot/zhenxun/builtin_plugins/superuser/broadcast/_data_source.py

71 lines
2.7 KiB
Python
Raw Normal View History

2024-02-25 03:18:34 +08:00
import nonebot_plugin_alconna as alc
from nonebot.adapters import Bot
from nonebot.adapters.discord import Bot as DiscordBot
from nonebot.adapters.dodo import Bot as DodoBot
from nonebot.adapters.kaiheila import Bot as KaiheilaBot
from nonebot.adapters.onebot.v11 import Bot as v11Bot
from nonebot.adapters.onebot.v12 import Bot as v12Bot
from nonebot_plugin_alconna import UniMsg
2024-03-18 16:10:44 +08:00
from nonebot_plugin_saa import Image, MessageFactory, Text
2024-02-25 03:18:34 +08:00
from nonebot_plugin_session import EventSession
from zhenxun.models.group_console import GroupConsole
from zhenxun.services.log import logger
2024-03-27 20:09:30 +08:00
from zhenxun.utils.platform import PlatformUtils
2024-02-25 03:18:34 +08:00
class BroadcastManage:
@classmethod
async def send(
cls, bot: Bot, message: UniMsg, session: EventSession
) -> tuple[int, int]:
"""发送广播消息
参数:
bot: Bot
message: 消息内容
session: Session
返回:
tuple[int, int]: 发送成功的群组数量, 发送失败的群组数量
"""
message_list = []
for msg in message:
if isinstance(msg, alc.Image) and msg.url:
message_list.append(Image(msg.url))
elif isinstance(msg, alc.Text):
message_list.append(Text(msg.text))
2024-03-27 20:09:30 +08:00
group_list, _ = await PlatformUtils.get_group_list(bot)
if group_list:
2024-02-25 03:18:34 +08:00
error_count = 0
for group in group_list:
try:
if not await GroupConsole.is_block_task(
group.group_id, "broadcast", group.channel_id
):
2024-03-27 20:09:30 +08:00
target = PlatformUtils.get_target(
2024-07-28 20:29:03 +08:00
bot, None, group.channel_id or group.group_id
2024-02-25 03:18:34 +08:00
)
if target:
await MessageFactory(message_list).send_to(target, bot)
logger.debug(
"发送成功",
"广播",
session=session,
target=f"{group.group_id}:{group.channel_id}",
)
else:
logger.warning("target为空", "广播", session=session)
2024-02-25 03:18:34 +08:00
except Exception as e:
error_count += 1
logger.error(
"发送失败",
"广播",
session=session,
target=f"{group.group_id}:{group.channel_id}",
e=e,
)
return len(group_list) - error_count, error_count
return 0, 0