Files
HeXi/hexi/plugins/nonebot_plugin_group_tools/handlers/repeater.py
T

50 lines
1.6 KiB
Python
Raw Normal View History

import random
from nonebot import on_message, require
from nonebot.adapters.onebot.v11 import GroupMessageEvent
from nonebot.log import logger
require("nonebot_plugin_alconna")
from nonebot_plugin_alconna import UniMessage
PROB_A = 1.4
# group_id: (last_msg, is_repeated, p)
group_stat: dict[int, tuple[str, bool, float]] = {}
"""
不复读率 随 复读次数 指数级衰减
从第2条复读,即第3条重复消息开始有几率触发复读
a 设为一个略大于1的小数,最好不要超过2,建议1.6
复读概率计算式:p_n = 1 - 1/a^n
递推式:p_n+1 = 1 - (1 - p_n) / a
"""
repeater = on_message(block=False)
@repeater.handle()
async def repeater_handle(ev: GroupMessageEvent):
group_id = ev.group_id
msg = str(ev.message)
if group_id not in group_stat:
group_stat[group_id] = (msg, False, 0.0)
return
last_msg, is_repeated, p = group_stat[group_id]
if last_msg == msg: # 群友正在复读
if not is_repeated: # 机器人尚未复读过,开始测试复读
if random.random() < p: # 概率测试通过,复读并设 flag
try:
group_stat[group_id] = (msg, True, 0.0)
await UniMessage.text(ev.message.extract_plain_text()).send()
except Exception as e:
logger.error(f"复读失败: {type(e)}")
logger.exception(e)
else: # 概率测试失败,蓄力
p = 1 - (1 - p) / PROB_A
group_stat[group_id] = (msg, False, p)
else: # 不是复读,重置
group_stat[group_id] = (msg, False, 0.0)