From 3a52652b4a3607aa3342d246215e5413939b9e19 Mon Sep 17 00:00:00 2001 From: K2CRO4 <2221577113@qq.com> Date: Fri, 15 May 2026 13:52:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(plugins,models):=20=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E4=BB=8A=E6=97=A5=E8=80=81=E5=A9=86=E6=8F=92=E4=BB=B6=E8=BF=98?= =?UTF-8?q?=E6=9C=89=E7=BE=A4=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增daily_wife插件,群里每天随机配对群友 2. 给GroupMemberInfo加了QQ等级和是否机器人的字段 3. 改了群成员API的缓存和字段过滤逻辑 4. 更新了反馈数据和更新日志页面 --- main.py | 2 +- requirements.txt | Bin 356 -> 30 bytes src/neobot/core/api/group.py | 28 ++------- src/neobot/core/data/feedback.json | 18 ++++++ src/neobot/models/objects.py | 6 ++ src/neobot/plugins/__init__.py | 1 + src/neobot/plugins/daily_wife.py | 89 +++++++++++++++++++++++++++ src/neobot/web_static/changelog.html | 5 ++ 8 files changed, 125 insertions(+), 24 deletions(-) create mode 100644 src/neobot/plugins/daily_wife.py diff --git a/main.py b/main.py index 9bdbb7b..dabb266 100644 --- a/main.py +++ b/main.py @@ -15,7 +15,7 @@ ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) SRC_DIR = os.path.join(ROOT_DIR, "src") sys.path.insert(0, SRC_DIR) -# 初始化日志系统,必须在其他 neobot 模块导入之前执行 +# 初始化日志系统,必须在其他 neobot 模块导入之前执行,改了我就操死你 from neobot.core.utils.logger import logger # 核心模块导入 diff --git a/requirements.txt b/requirements.txt index 51d506bc07bc62eeae979076629831203ff14dc2..7fdc4d1eac2fee2f9a45de0b070bd61ee3690471 100644 GIT binary patch literal 30 fcmezWuZkg)p#TVNfzX&ikHH8`8Zz)Qa4`S?eBK3j literal 356 zcmW+yF>-`34D9s^W>TL31IHyZD$?c`#`a)e4EEV348Mrmz~a2Cb(7KE z;#F+eiTW8w>_JIoO$otgq8U4!K-t9RdSMDq_y8T$uSpf{v4bDCKcyfVxVwW7>yeJ? zGvfduJ#&?2tmnm$GaC|39Abp%ybmXf3KXmpy}ZukR$Jaak2=anaU6PPf`E8wx$_H% z1org`4sJ5DKRM+9$!PbEJo08TuY)n}1rF>Er!30quoB&w-N9*=T+gVKo=5Nx(AsVr diff --git a/src/neobot/core/api/group.py b/src/neobot/core/api/group.py index 23d532e..c808b65 100644 --- a/src/neobot/core/api/group.py +++ b/src/neobot/core/api/group.py @@ -217,17 +217,6 @@ class GroupAPI(BaseAPI): return [] async def get_group_member_info(self, group_id: int, user_id: int, no_cache: bool = False) -> GroupMemberInfo: - """ - 获取指定群组成员的详细信息。 - - Args: - group_id (int): 目标群组的群号。 - user_id (int): 目标成员的 QQ 号。 - no_cache (bool, optional): 是否不使用缓存。Defaults to False. - - Returns: - GroupMemberInfo: 包含群成员信息的 `GroupMemberInfo` 数据对象。 - """ cache_key = f"neobot:cache:get_group_member_info:{group_id}:{user_id}" if not no_cache: cached_data = await redis_manager.redis.get(cache_key) @@ -235,21 +224,14 @@ class GroupAPI(BaseAPI): return GroupMemberInfo(**orjson.loads(cached_data)) res = await self.call_api("get_group_member_info", {"group_id": group_id, "user_id": user_id}) - await redis_manager.redis.set(cache_key, orjson.dumps(res), ex=3600) # 缓存 1 小时 - return GroupMemberInfo(**res) + await redis_manager.redis.set(cache_key, orjson.dumps(res), ex=3600) + valid_fields = GroupMemberInfo.__dataclass_fields__ + return GroupMemberInfo(**{k: v for k, v in res.items() if k in valid_fields}) async def get_group_member_list(self, group_id: int) -> List[GroupMemberInfo]: - """ - 获取一个群组的所有成员列表。 - - Args: - group_id (int): 目标群组的群号。 - - Returns: - List[GroupMemberInfo]: 包含所有群成员信息的 `GroupMemberInfo` 对象列表。 - """ res = await self.call_api("get_group_member_list", {"group_id": group_id}) - return [GroupMemberInfo(**item) for item in res] + valid_fields = GroupMemberInfo.__dataclass_fields__ + return [GroupMemberInfo(**{k: v for k, v in item.items() if k in valid_fields}) for item in res] async def get_group_honor_info(self, group_id: int, type: str) -> GroupHonorInfo: """ diff --git a/src/neobot/core/data/feedback.json b/src/neobot/core/data/feedback.json index 70c49aa..e871c88 100644 --- a/src/neobot/core/data/feedback.json +++ b/src/neobot/core/data/feedback.json @@ -52,5 +52,23 @@ "time": 1778727344, "time_str": "2026-05-14 10:55:44", "done": false + }, + { + "id": 7, + "user_id": 3678069648, + "nickname": "awedwd", + "content": "添加一个v我50自动打50块钱进我银行卡功能", + "time": 1778815461, + "time_str": "2026-05-15 11:24:21", + "done": false + }, + { + "id": 8, + "user_id": 2771135787, + "nickname": "数无形时少直觉,形少数时", + "content": "<玩原神>", + "time": 1778816520, + "time_str": "2026-05-15 11:42:00", + "done": false } ] \ No newline at end of file diff --git a/src/neobot/models/objects.py b/src/neobot/models/objects.py index a48fc01..b943539 100644 --- a/src/neobot/models/objects.py +++ b/src/neobot/models/objects.py @@ -81,6 +81,12 @@ class GroupMemberInfo: card_changeable: bool = False """是否允许修改群名片""" + qq_level: str = "" + """QQ 等级""" + + is_robot: bool = False + """是否为机器人""" + @dataclass(slots=True) class FriendInfo: diff --git a/src/neobot/plugins/__init__.py b/src/neobot/plugins/__init__.py index 614eb42..8731daf 100644 --- a/src/neobot/plugins/__init__.py +++ b/src/neobot/plugins/__init__.py @@ -22,6 +22,7 @@ VERIFIED_PLUGINS = ( "bot_status", "broadcast", "code_py", + "daily_wife", "echo", "feedback", "furry", diff --git a/src/neobot/plugins/daily_wife.py b/src/neobot/plugins/daily_wife.py new file mode 100644 index 0000000..71fcd43 --- /dev/null +++ b/src/neobot/plugins/daily_wife.py @@ -0,0 +1,89 @@ +import json +import random +from datetime import datetime, timezone, timedelta +from neobot.core.managers.command_manager import matcher +from neobot.models.events.message import GroupMessageEvent +from neobot.core.managers.redis_manager import redis_manager +from neobot.models.message import MessageSegment + +CST = timezone(timedelta(hours=8)) + +__plugin_meta__ = { + "name": "今日老婆", + "description": "每天随机和群友凑成一对夫妻", + "usage": "/wife 或 /今日老婆 - 看看今天的老婆是谁", +} + +_REDIS_KEY = "neobot:daily_wife:{}" # format with group_id + +def _today_str() -> str: + return datetime.now(CST).strftime("%Y-%m-%d") + +def _ttl_until_midnight() -> int: + now = datetime.now(CST) + midnight = (now + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0) + return int((midnight - now).total_seconds()) + +@matcher.command("wife", "今日老婆") +async def handle_wife(event: GroupMessageEvent, args: list[str]): + if not isinstance(event, GroupMessageEvent): + await event.reply("这个指令只能在群聊里用嗷") + return + + group_id = str(event.group_id) + user_id = str(event.user_id) + today = _today_str() + redis_key = _REDIS_KEY.format(group_id) + + pairs = await redis_manager.redis.hgetall(redis_key) + stored_date = pairs.pop("_date", None) + + if stored_date != today: + await redis_manager.redis.delete(redis_key) + pairs = {} + + if user_id in pairs: + partner = json.loads(pairs[user_id]) + partner_nick = partner.get("nickname", str(partner["user_id"])) + partner_id = partner["user_id"] + avatar_url = f"https://q1.qlogo.cn/g?b=qq&nk={partner_id}&s=640" + await event.reply([ + MessageSegment.text(f"你今天的另一半已经有啦,是 {partner_nick}({partner_id})~\n"), + MessageSegment.image(avatar_url), + ]) + return + + try: + members = await event.bot.get_group_member_list(event.group_id) + except Exception as e: + await event.reply(f"获取群成员列表失败了: {e}") + return + + paired_ids = set(user_id) + for v in pairs.values(): + paired_ids.add(str(json.loads(v)["user_id"])) + + other_members = [m for m in members if str(m.user_id) not in paired_ids] + if not other_members: + await event.reply("群里没有其他可以配对的群友了……") + return + + chosen = random.choice(other_members) + chosen_nick = chosen.card or chosen.nickname + my_nick = event.sender.nickname if event.sender else user_id + + pairs[user_id] = json.dumps({"user_id": chosen.user_id, "nickname": chosen_nick}) + pairs[str(chosen.user_id)] = json.dumps({"user_id": event.user_id, "nickname": my_nick}) + pairs["_date"] = today + + ttl = _ttl_until_midnight() + await redis_manager.redis.hset(redis_key, mapping=pairs) + await redis_manager.redis.expire(redis_key, ttl) + + avatar_url = f"https://q1.qlogo.cn/g?b=qq&nk={chosen.user_id}&s=640" + + await event.reply([ + MessageSegment.text(f"今日老婆分配结果:\n你是 {my_nick}\n你今天的另一半是 {chosen_nick}({chosen.user_id})\n"), + MessageSegment.image(avatar_url), + MessageSegment.text(f"\n有效期至今天午夜,好好相处吧~"), + ]) diff --git a/src/neobot/web_static/changelog.html b/src/neobot/web_static/changelog.html index 86e253b..50d4019 100644 --- a/src/neobot/web_static/changelog.html +++ b/src/neobot/web_static/changelog.html @@ -147,6 +147,11 @@ plugins/feedback.py 功能反馈插件,/feedback 提交建议,管理员能查看管理 +
  • + ADD + plugins/daily_wife.py /wife 今日老婆,每天和群友随机凑对 +
  • +
  • FIX config_models.py reverse_ws 没配 default_factory,用户不写 [reverse_ws] 直接启动就炸