zhenxun_bot/plugins/fudu.py

114 lines
3.7 KiB
Python
Raw Normal View History

2021-05-20 20:13:49 +08:00
from nonebot.adapters.cqhttp.permission import GROUP
from configs.path_config import IMAGE_PATH
2021-07-30 21:21:51 +08:00
from utils.image_utils import get_img_hash
2021-05-20 20:13:49 +08:00
import random
2021-07-30 21:21:51 +08:00
from utils.message_builder import image
2021-05-20 20:13:49 +08:00
from nonebot import on_message
2021-06-30 19:50:55 +08:00
from utils.utils import get_message_text, get_message_imgs, get_local_proxy
2021-05-20 20:13:49 +08:00
from nonebot.typing import T_State
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
import aiohttp
import aiofiles
2021-07-30 21:21:51 +08:00
from asyncio.exceptions import TimeoutError
2021-05-20 20:13:49 +08:00
from configs.config import FUDU_PROBABILITY
class Fudu:
def __init__(self):
2021-08-17 23:17:08 +08:00
self.data = {}
2021-05-20 20:13:49 +08:00
def append(self, key, content):
2021-08-17 23:17:08 +08:00
self._create(key)
2021-09-05 02:21:38 +08:00
self.data[key]["data"].append(content)
2021-05-20 20:13:49 +08:00
def clear(self, key):
2021-08-17 23:17:08 +08:00
self._create(key)
2021-09-05 02:21:38 +08:00
self.data[key]["data"] = []
self.data[key]["is_repeater"] = False
2021-05-20 20:13:49 +08:00
def size(self, key) -> int:
2021-08-17 23:17:08 +08:00
self._create(key)
2021-09-05 02:21:38 +08:00
return len(self.data[key]["data"])
2021-05-20 20:13:49 +08:00
def check(self, key, content) -> bool:
2021-08-17 23:17:08 +08:00
self._create(key)
2021-09-05 02:21:38 +08:00
return self.data[key]["data"][0] == content
2021-05-20 20:13:49 +08:00
def get(self, key):
2021-08-17 23:17:08 +08:00
self._create(key)
2021-09-05 02:21:38 +08:00
return self.data[key]["data"][0]
2021-08-17 23:17:08 +08:00
def is_repeater(self, key):
self._create(key)
2021-09-05 02:21:38 +08:00
return self.data[key]["is_repeater"]
2021-08-17 23:17:08 +08:00
def set_repeater(self, key):
self._create(key)
2021-09-05 02:21:38 +08:00
self.data[key]["is_repeater"] = True
2021-08-17 23:17:08 +08:00
def _create(self, key):
if self.data.get(key) is None:
2021-09-05 02:21:38 +08:00
self.data[key] = {"is_repeater": False, "data": []}
2021-05-20 20:13:49 +08:00
2021-09-05 02:21:38 +08:00
_fudu_list = Fudu()
2021-05-20 20:13:49 +08:00
fudu = on_message(permission=GROUP, priority=9)
@fudu.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
if event.is_tome() or state["_prefix"]["raw_command"]:
return
if get_message_text(event.json()):
2021-07-30 21:21:51 +08:00
if get_message_text(event.json()).find("@可爱的小真寻") != -1:
await fudu.finish("复制粘贴的虚空艾特?", at_sender=True)
2021-05-20 20:13:49 +08:00
imgs = get_message_imgs(event.json())
msg = get_message_text(event.json())
if not imgs and not msg:
return
if imgs:
img_hash = await get_fudu_img_hash(imgs[0], event.group_id)
else:
2021-07-30 21:21:51 +08:00
img_hash = ""
add_msg = msg + "|-|" + img_hash
2021-09-05 02:21:38 +08:00
if _fudu_list.size(event.group_id) == 0:
_fudu_list.append(event.group_id, add_msg)
elif _fudu_list.check(event.group_id, add_msg):
_fudu_list.append(event.group_id, add_msg)
2021-05-20 20:13:49 +08:00
else:
2021-09-05 02:21:38 +08:00
_fudu_list.clear(event.group_id)
_fudu_list.append(event.group_id, add_msg)
if _fudu_list.size(event.group_id) > 2:
if random.random() < FUDU_PROBABILITY and not _fudu_list.is_repeater(
event.group_id
):
2021-05-20 20:13:49 +08:00
if random.random() < 0.2:
await fudu.finish("打断施法!")
2021-09-05 02:21:38 +08:00
_fudu_list.set_repeater(event.group_id)
2021-05-20 20:13:49 +08:00
if imgs and msg:
2021-07-30 21:21:51 +08:00
rst = msg + image(f"compare_{event.group_id}_img.jpg", "temp")
2021-05-20 20:13:49 +08:00
elif imgs:
2021-07-30 21:21:51 +08:00
rst = image(f"compare_{event.group_id}_img.jpg", "temp")
2021-05-20 20:13:49 +08:00
elif msg:
rst = msg
else:
2021-07-30 21:21:51 +08:00
rst = ""
2021-05-20 20:13:49 +08:00
if rst:
await fudu.send(rst)
async def get_fudu_img_hash(url, group_id):
2021-07-30 21:21:51 +08:00
try:
async with aiohttp.ClientSession() as session:
async with session.get(url, proxy=get_local_proxy(), timeout=5) as response:
async with aiofiles.open(
IMAGE_PATH + f"temp/compare_{group_id}_img.jpg", "wb"
) as f:
await f.write(await response.read())
img_hash = get_img_hash(IMAGE_PATH + f"temp/compare_{group_id}_img.jpg")
return str(img_hash)
except TimeoutError:
2021-09-05 02:21:38 +08:00
return ""