feat:初版

This commit is contained in:
2025-12-03 15:48:44 +08:00
commit b4df26f61d
199 changed files with 23434 additions and 0 deletions

133
plugins/DogDiary/main.py Normal file
View File

@@ -0,0 +1,133 @@
"""
舔狗日记插件
用户发送"舔狗""舔狗日记"触发,返回随机舔狗日记
"""
import tomllib
import aiohttp
from pathlib import Path
from loguru import logger
from utils.plugin_base import PluginBase
from utils.decorators import on_text_message
from WechatHook import WechatHookClient
class DogDiary(PluginBase):
"""舔狗日记插件"""
# 插件元数据
description = "舔狗日记插件,发送舔狗日记"
author = "ShiHao"
version = "1.0.0"
def __init__(self):
super().__init__()
self.config = None
async def async_init(self):
"""插件异步初始化"""
# 读取配置
config_path = Path(__file__).parent / "config.toml"
with open(config_path, "rb") as f:
self.config = tomllib.load(f)
logger.success("[DogDiary] 舔狗日记插件已加载")
@on_text_message(priority=50)
async def handle_dog_diary(self, bot: WechatHookClient, message: dict):
"""处理舔狗日记请求"""
content = message.get("Content", "").strip()
from_wxid = message.get("FromWxid", "")
is_group = message.get("IsGroup", False)
# 检查是否是触发关键词(精确匹配)
if content not in self.config["behavior"]["keywords"]:
return
# 检查群聊/私聊过滤
if is_group:
if not self.config["behavior"]["enable_group"]:
return
if not self._should_handle_group(from_wxid):
return
else:
if not self.config["behavior"]["enable_private"]:
return
logger.info(f"[DogDiary] 收到舔狗日记请求")
# 调用 API 获取舔狗日记
try:
diary_text = await self._fetch_dog_diary()
if diary_text:
await bot.send_text(from_wxid, diary_text)
logger.success(f"[DogDiary] 发送成功: {diary_text[:30]}...")
else:
await bot.send_text(from_wxid, "❌ 获取舔狗日记失败,请稍后再试")
logger.warning("[DogDiary] 获取舔狗日记失败")
except Exception as e:
logger.error(f"[DogDiary] 处理请求失败: {e}")
import traceback
logger.error(f"详细错误: {traceback.format_exc()}")
await bot.send_text(from_wxid, "❌ 获取舔狗日记失败,请稍后再试")
# 返回 False 阻止消息继续传播
return False
async def _fetch_dog_diary(self) -> str:
"""调用 API 获取舔狗日记"""
api_url = self.config["api"]["url"]
timeout = self.config["api"]["timeout"]
try:
async with aiohttp.ClientSession() as session:
async with session.get(
api_url,
timeout=aiohttp.ClientTimeout(total=timeout)
) as response:
if response.status != 200:
logger.error(f"[DogDiary] API 请求失败: HTTP {response.status}")
return None
result = await response.json()
logger.debug(f"[DogDiary] API 返回: {result}")
# 检查返回状态
code = result.get("code")
if code != 200:
logger.error(f"[DogDiary] API 返回错误: {result.get('msg', '未知错误')}")
return None
# 提取舔狗日记内容
diary_text = result.get("data", "")
if not diary_text:
logger.error("[DogDiary] API 返回数据为空")
return None
return diary_text
except aiohttp.ClientError as e:
logger.error(f"[DogDiary] 网络请求失败: {e}")
return None
except Exception as e:
logger.error(f"[DogDiary] 获取舔狗日记失败: {e}")
import traceback
logger.error(f"详细错误: {traceback.format_exc()}")
return None
def _should_handle_group(self, room_wxid: str) -> bool:
"""判断是否应该在该群处理请求"""
enabled_groups = self.config["behavior"]["enabled_groups"]
disabled_groups = self.config["behavior"]["disabled_groups"]
# 如果在禁用列表中,不处理
if room_wxid in disabled_groups:
return False
# 如果启用列表为空,对所有群生效
if not enabled_groups:
return True
# 否则只对启用列表中的群生效
return room_wxid in enabled_groups