From c5eb83cb8833800e9b54b2a988ef87424d0f1ea8 Mon Sep 17 00:00:00 2001 From: g1331 Date: Mon, 17 Feb 2025 14:48:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(Tarot):=20=E4=BC=98=E5=8C=96=E5=A1=94?= =?UTF-8?q?=E7=BD=97=E7=89=8C=E6=8A=BD=E5=8F=96=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=94=A8=E6=88=B7=E6=AF=8F=E6=97=A5=E6=8A=BD?= =?UTF-8?q?=E7=89=8C=E5=B9=B6=E8=AE=B0=E5=BD=95=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/self_contained/tarot/__init__.py | 58 ++++++++++++++++-------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/modules/self_contained/tarot/__init__.py b/modules/self_contained/tarot/__init__.py index 1b29a366..ed7a7f4a 100644 --- a/modules/self_contained/tarot/__init__.py +++ b/modules/self_contained/tarot/__init__.py @@ -1,41 +1,32 @@ import json import os import random +from datetime import datetime from pathlib import Path +from typing import Dict, Tuple from graia.ariadne.app import Ariadne -from graia.ariadne.event.message import Group, GroupMessage +from graia.ariadne.event.message import Group, GroupMessage, Member from graia.ariadne.message.chain import MessageChain from graia.ariadne.message.element import Plain, Image, Source from graia.ariadne.message.parser.twilight import Twilight, FullMatch, SpacePolicy from graia.ariadne.util.saya import listen, decorate, dispatch from graia.saya import Saya, Channel -from core.control import ( - Permission, - Function, - FrequencyLimitation, - Distribute -) +from core.control import Permission, Function, FrequencyLimitation, Distribute from core.models import saya_model module_controller = saya_model.get_module_controller() saya = Saya.current() channel = Channel.current() -channel.meta["name"] = ("Tarot") -channel.meta["author"] = ("SAGIRI-kawaii") -channel.meta["description"] = ("可以抽塔罗牌的插件,在群中发送 `-塔罗牌` 即可") +channel.meta["name"] = "Tarot" +channel.meta["author"] = "SAGIRI-kawaii" +channel.meta["description"] = "可以抽塔罗牌的插件,在群中发送 `-塔罗牌` 即可" channel.metadata = module_controller.get_metadata_from_path(Path(__file__)) @listen(GroupMessage) -@dispatch( - Twilight( - [ - FullMatch("-塔罗牌").space(SpacePolicy.PRESERVE) - ] - ) -) +@dispatch(Twilight([FullMatch("-塔罗牌").space(SpacePolicy.PRESERVE)])) @decorate( Distribute.require(), Function.require(channel.module), @@ -43,15 +34,42 @@ Permission.group_require(channel.metadata.level), Permission.user_require(Permission.User), ) -async def tarot(app: Ariadne, group: Group, source: Source): - await app.send_group_message(group, Tarot.get_tarot(), quote=source) +async def tarot(app: Ariadne, group: Group, sender: Member, source: Source): + await app.send_group_message(group, await Tarot.get_tarot(sender.id), quote=source) class Tarot(object): + # Store user daily results: {user_id: (date, card_info, filename)} + _user_draws: Dict[int, Tuple[str, dict, str]] = {} + @staticmethod - def get_tarot() -> MessageChain: + async def get_tarot(user_id: int) -> MessageChain: + today = datetime.now().strftime("%Y-%m-%d") + + # Check if user already drew today + if user_id in Tarot._user_draws: + last_date, card, filename = Tarot._user_draws[user_id] + if last_date == today: + card_dir = ( + "normal" + if card["meaning"]["normal"] in card["meaning"].get("current", "") + else "reverse" + ) + card_type = "正位" if card_dir == "normal" else "逆位" + content = f"[重复] {card['name']} ({card['name-en']}) {card_type}\n牌意:{card['meaning'][card_dir]}" + elements = [] + img_path = f"{os.getcwd()}/statics/tarot/{card_dir}/{filename}.jpg" + if filename and os.path.exists(img_path): + elements.append(Image(path=img_path)) + elements.append(Plain(text=content)) + return MessageChain(elements) + + # Draw new card card, filename = Tarot.get_random_tarot() card_dir = random.choice(["normal", "reverse"]) + card["meaning"]["current"] = card["meaning"][card_dir] # Store current meaning + Tarot._user_draws[user_id] = (today, card, filename) + card_type = "正位" if card_dir == "normal" else "逆位" content = f"{card['name']} ({card['name-en']}) {card_type}\n牌意:{card['meaning'][card_dir]}" elements = []