zhenxun_bot/zhenxun/utils/withdraw_manage.py
2024-05-26 15:22:55 +08:00

112 lines
3.2 KiB
Python

import asyncio
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_session import EventSession
from ruamel.yaml.comments import CommentedSeq
from zhenxun.services.log import logger
class WithdrawManager:
_data = {}
_index = 0
@classmethod
def check(cls, session: EventSession, withdraw_time: tuple[int, int]) -> bool:
"""配置项检查
参数:
session: Session
withdraw_time: 配置项数据, (0, 1)
返回:
bool: 是否允许撤回
"""
if withdraw_time[0] and withdraw_time[0] > 0:
if withdraw_time[1] == 2:
return True
if withdraw_time[1] == 1 and (session.id2 or session.id3):
return True
if withdraw_time[1] == 0 and not (session.id2 or session.id3):
return True
return False
@classmethod
def append(cls, bot: Bot, message_id: str | int, time: int):
"""添加消息撤回
参数:
bot: Bot
message_id: 消息Id
time: 延迟时间
"""
cls._data[cls._index] = (
bot,
message_id,
time,
)
cls._index += 1
@classmethod
def remove(cls, index: int):
"""移除
参数:
index: index
"""
if index in cls._data:
del cls._data[index]
@classmethod
async def withdraw_message(
cls,
bot: Bot,
message_id: str | int,
time: int | tuple[int, int] | None = None,
session: EventSession | None = None,
):
"""消息撤回
参数:
bot: Bot
message_id: 消息Id
time: 延迟时间
"""
if time:
gid = None
_time = 1
if isinstance(time, (tuple, CommentedSeq)):
if time[0] == 0:
return
if session:
gid = session.id3 or session.id2
if not gid and int(time[1]) not in [0, 2]:
return
if gid and int(time[1]) not in [1, 2]:
return
_time = time[0]
else:
_time = time
logger.debug(
f"将在 {_time}秒 内撤回消息ID: {message_id}", "WithdrawManager"
)
await asyncio.sleep(_time)
if isinstance(bot, v11Bot):
logger.debug(f"v11Bot 撤回消息ID: {message_id}", "WithdrawManager")
await bot.delete_msg(message_id=int(message_id))
elif isinstance(bot, v12Bot):
logger.debug(f"v12Bot 撤回消息ID: {message_id}", "WithdrawManager")
await bot.delete_message(message_id=str(message_id))
elif isinstance(bot, KaiheilaBot):
pass
elif isinstance(bot, DodoBot):
pass
elif isinstance(bot, DiscordBot):
pass