From 4aa1ca450d2d535eb3831f8859291128eb91c00f Mon Sep 17 00:00:00 2001 From: liuwei Date: Mon, 26 Jan 2026 08:48:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=96=97=E9=B1=BC=E5=BC=80?= =?UTF-8?q?=E6=92=AD=E4=B8=8B=E6=92=AD=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/douyu/main.py | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/plugins/douyu/main.py b/plugins/douyu/main.py index c7602f2..403d698 100644 --- a/plugins/douyu/main.py +++ b/plugins/douyu/main.py @@ -53,6 +53,22 @@ class DouyuRedisManager: res.append(gid) return res + def add_group_subscriber(self, group_id: str, user_id: str) -> bool: + key = f"{self.prefix}group:{group_id}:subscribers" + return self.redis.sadd(key, user_id) >= 0 + + def remove_group_subscriber(self, group_id: str, user_id: str) -> bool: + key = f"{self.prefix}group:{group_id}:subscribers" + return self.redis.srem(key, user_id) >= 0 + + def list_group_subscribers(self, group_id: str) -> List[str]: + key = f"{self.prefix}group:{group_id}:subscribers" + subs = self.redis.smembers(key) or set() + result = [] + for s in subs: + result.append(s.decode("utf-8") if isinstance(s, bytes) else s) + return sorted(result) + def get_room_status(self, room_id: str) -> Optional[Dict[str, Any]]: key = f"{self.prefix}room_status:{room_id}" data = self.redis.get(key) @@ -111,7 +127,7 @@ class DouyuPlugin(MessagePluginInterface): self.bot: WechatAPIClient = None self.feature = self.register_feature() self.redis_manager: Optional[DouyuRedisManager] = None - self._commands = ["斗鱼订阅", "取消斗鱼订阅", "斗鱼订阅列表"] + self._commands = ["斗鱼订阅", "取消斗鱼订阅", "斗鱼订阅列表", "斗鱼订阅提醒"] self._api_template = "https://www.douyu.com/betard/{room_id}" self._user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" self._check_interval = 5 @@ -122,7 +138,9 @@ class DouyuPlugin(MessagePluginInterface): dbm = DBConnectionManager.get_instance() self.redis_manager = DouyuRedisManager(dbm) cfg = self._config.get("Douyu", {}) - self._commands = cfg.get("command", self._commands) + cfg_cmds = cfg.get("command", []) + if isinstance(cfg_cmds, list) and cfg_cmds: + self._commands = list(dict.fromkeys(cfg_cmds + self._commands)) self._api_template = cfg.get("api_url_template", self._api_template) self._user_agent = cfg.get("user_agent", self._user_agent) self._check_interval = int(cfg.get("check_interval_minutes", self._check_interval)) @@ -164,6 +182,13 @@ class DouyuPlugin(MessagePluginInterface): text = "当前订阅的斗鱼房间:\n" + "\n".join(rooms) await self.bot.send_text_message(roomid or sender, text, sender) return True, "列表已发送" + if first_token == "斗鱼订阅提醒": + if not roomid: + await self.bot.send_text_message(sender, "请在群聊中使用该命令", sender) + return True, "仅支持群聊" + ok = self.redis_manager.add_group_subscriber(roomid, sender) + await self.bot.send_at_message(roomid, "已加入斗鱼订阅提醒名单", [sender]) + return True, "加入提醒名单成功" if ok else "加入提醒名单失败" if first_token == "斗鱼订阅": parts = content.split() if len(parts) < 2: @@ -251,7 +276,11 @@ class DouyuPlugin(MessagePluginInterface): for gid in groups: if GroupBotManager.get_group_permission(gid, self.feature) == PermissionStatus.ENABLED: try: - await self.bot.send_text_message(gid, text) + subs = self.redis_manager.list_group_subscribers(gid) + if subs: + await self.bot.send_at_message(gid, text, subs) + else: + await self.bot.send_text_message(gid, text) await self.bot.send_link_xml_message(xml_content, gid) except Exception as e: logger.error(f"发送斗鱼开播提醒失败: {e}") @@ -265,7 +294,11 @@ class DouyuPlugin(MessagePluginInterface): for gid in groups: if GroupBotManager.get_group_permission(gid, self.feature) == PermissionStatus.ENABLED: try: - await self.bot.send_text_message(gid, text) + subs = self.redis_manager.list_group_subscribers(gid) + if subs: + await self.bot.send_at_message(gid, text, subs) + else: + await self.bot.send_text_message(gid, text) except Exception as e: logger.error(f"发送斗鱼下播提醒失败: {e}") continue