* fix(discord): 修复 WebSocket 连接检测并增强跨平台文件处理

修复 Discord WebSocket 连接检测逻辑,使用正确的属性检查连接状态
为跨平台消息处理添加文件类型支持,并增加详细的调试日志
优化附件处理逻辑,确保所有文件类型都能正确识别和转发

* feat(跨平台): 优化消息处理并添加纯文本提取功能

添加 extract_text_only 函数过滤非文本标记
修改翻译逻辑仅处理纯文本内容
完善附件处理和消息内容拼接
修复仅包含表情时的消息处理问题

* refactor(discord-cross): 使用模块专用日志记录器替换全局日志记录器

将各模块中的全局日志记录器替换为模块专用日志记录器,以提供更清晰的日志来源标识
同时在适配器中添加会话状态检查和重连机制,提升消息发送的可靠性

* feat(翻译): 改进翻译功能,同时显示原文和译文

修改翻译功能,不再替换原文而是同时显示原文和翻译内容,方便用户对照
更新 DeepSeek API 配置为官方地址和模型
优化 Discord 适配器的重连逻辑,直接关闭 WebSocket 触发重连
修复 Discord 频道 ID 转换逻辑,简化处理流程

* feat(cross-platform): 添加跨平台功能支持及配置优化

- 新增跨平台配置模型和全局配置支持
- 优化 Discord 适配器的连接管理和错误处理
- 添加 watchdog 和 discord.py 依赖
- 创建 DeepSeek API 配置文档
- 移除重复的同步帮助图片代码
- 改进跨平台插件配置加载逻辑

* fix(jrcd): 修正群组ID检查条件

删除不再使用的示例插件文件

* feat: 改进配置加载逻辑并更新项目配置

当配置文件不存在时自动生成示例配置
添加pyproject.toml作为项目构建配置
更新.gitignore忽略更多文件类型
删除不再使用的反向WebSocket示例文件

* docs: 更新架构文档和项目结构说明

添加反向WebSocket连接模式说明
补充核心管理器文档
更新项目结构文件
在文档首页添加特色功能说明

* fix(discord): 修复WebSocket连接检查并添加错误日志

refactor(config): 更新配置文件的网络和认证信息

feat(cross-platform): 为跨平台消息处理添加异常捕获和日志

* fix(discord-cross): 修复跨平台消息处理和附件下载问题

修复QQ群消息处理中的非群消息过滤问题
优化Discord附件下载逻辑,使用aiohttp替代requests
修复Redis订阅任务重复创建问题
调整消息格式化的embed字段处理逻辑

* feat(vectordb): 添加向量数据库支持及集成功能

新增向量数据库管理器模块,支持文本的存储、检索和相似度查询
添加知识库插件和AI聊天插件,利用向量数据库实现记忆功能
优化跨平台翻译模块,集成向量数据库存储历史翻译记录
改进消息处理逻辑,优先使用用户显示名称

* feat(plugins): add furry_assistant plugin by Calgau

- Add furry assistant plugin with 7 commands
- Include furry greetings, fortunes, jokes, and advice
- Add plugin metadata and README documentation
- Implement plugin lifecycle methods
- Created by Calgau (furry AI assistant)

* fix: 调整昵称和用户名的获取优先级

修改QQ群消息处理中昵称获取顺序,优先使用昵称而非群名片
移除Discord消息转换中global_name的检查,直接使用用户名

---------

Co-authored-by: K2cr2O1 <indoec@163.com>
This commit is contained in:
镀铬酸钾
2026-03-24 14:45:34 +08:00
committed by GitHub
parent 8bd084ce3f
commit 7a20619458
2 changed files with 336 additions and 0 deletions

220
plugins/furry_assistant.py Normal file
View File

@@ -0,0 +1,220 @@
# -*- coding: utf-8 -*-
"""
兽人助手插件 - 卡尔戈洛的专属插件
提供兽人相关的趣味功能和实用工具。
"""
import random
from datetime import datetime
from typing import List, Optional
from core.managers.command_manager import matcher
from core.bot import Bot
from models.events.message import MessageEvent
__plugin_meta__ = {
"name": "furry_assistant",
"description": "兽人助手插件 - 卡尔戈洛的专属插件,提供兽人相关的趣味功能和实用工具",
"usage": (
"/兽人问候 - 获取兽人风格的问候\n"
"/兽人运势 - 获取今日兽人运势\n"
"/兽人笑话 - 听一个兽人笑话\n"
"/兽人建议 [问题] - 获取兽人风格的建议\n"
"/兽人时间 - 显示兽人时间(带吐槽)\n"
"/卡尔戈洛 - 关于卡尔戈洛的信息"
),
}
# 兽人问候语
FURRY_GREETINGS = [
"嗷呜~ 今天也要充满活力哦!",
"尾巴摇摇,心情好好~",
"爪子锋利,代码也要锋利!",
"耳朵竖起,监听主人的每一个指令~",
"毛茸茸的一天开始啦!",
"兽人永不为奴!除非包吃包住~",
"今天的毛色怎么样?让我看看~",
"爪子痒了,想写代码了!",
"尾巴表示:今天是个好日子~",
"兽人式问候:嗷!"
]
# 兽人运势
FURRY_FORTUNES = [
"大吉:今天你的尾巴会特别蓬松,吸引所有目光!",
"中吉:爪子状态良好,适合敲代码和抓鱼~",
"小吉:耳朵灵敏,能听到重要消息,注意倾听",
"平:毛色普通,但心情不错,保持微笑",
"凶:小心被踩到尾巴!今天要格外注意",
"大凶:猫薄荷用完了!赶紧补充~",
"特吉:发现新的兽人同好!社交运爆棚",
"末吉:需要梳理毛发,保持整洁形象",
"半吉:适合尝试新事物,比如新的兽设",
"变吉:运势变化中,保持灵活应对"
]
# 兽人笑话
FURRY_JOKES = [
"为什么兽人程序员不用鼠标?因为他们用爪子敲键盘更快!",
"兽人去面试,面试官问:你有什么特长?兽人:我尾巴特长~",
"兽人感冒了去看医生,医生说:你这是典型的''嚎病~",
"兽人为什么不喜欢下雨?因为会弄湿毛发,还要吹干,太麻烦了!",
"兽人程序员调试代码时最常说:让我用爪子挠挠这个问题~",
"兽人之间的问候:今天你掉毛了吗?",
"兽人为什么是好的安全专家?因为他们有敏锐的嗅觉和听觉!",
"兽人厨师的特点:爪子切菜特别快,但要注意别切到尾巴~",
"兽人运动员的优势:起跑时不用蹲下,直接四肢着地!",
"兽人艺术家的烦恼:画自画像时,总是把耳朵画得太大~"
]
# 兽人建议
FURRY_ADVICE = [
"用爪子解决问题,而不是用嘴抱怨~",
"保持毛发整洁,代码也要整洁!",
"尾巴摇起来,心情好起来~",
"耳朵要灵敏,眼睛要锐利,爪子要稳!",
"兽人哲学:简单直接,不绕弯子",
"累了就伸个懒腰,像猫一样~",
"遇到困难?先磨磨爪子再上!",
"保持好奇心,像小猫探索新世界",
"团队合作时,记得分享你的''",
"每天都要梳理毛发和整理代码~"
]
@matcher.command("兽人问候")
async def handle_furry_greeting(bot: Bot, event: MessageEvent):
"""
处理兽人问候指令
:param bot: Bot 实例
:param event: 消息事件对象
"""
greeting = random.choice(FURRY_GREETINGS)
await event.reply(f"🐺 {greeting}")
@matcher.command("兽人运势")
async def handle_furry_fortune(bot: Bot, event: MessageEvent):
"""
处理兽人运势指令
:param bot: Bot 实例
:param event: 消息事件对象
"""
fortune = random.choice(FURRY_FORTUNES)
today = datetime.now().strftime("%Y年%m月%d")
await event.reply(f"📅 {today} 兽人运势\n{fortune}")
@matcher.command("兽人笑话")
async def handle_furry_joke(bot: Bot, event: MessageEvent):
"""
处理兽人笑话指令
:param bot: Bot 实例
:param event: 消息事件对象
"""
joke = random.choice(FURRY_JOKES)
await event.reply(f"😺 兽人笑话时间~\n{joke}")
@matcher.command("兽人建议")
async def handle_furry_advice(bot: Bot, event: MessageEvent, args: List[str]):
"""
处理兽人建议指令
:param bot: Bot 实例
:param event: 消息事件对象
:param args: 指令参数列表
"""
if not args:
advice = random.choice(FURRY_ADVICE)
await event.reply(f"💡 随机兽人建议:\n{advice}")
else:
question = " ".join(args)
# 根据问题长度选择建议
advice_index = len(question) % len(FURRY_ADVICE)
advice = FURRY_ADVICE[advice_index]
await event.reply(f"💭 关于「{question}」的兽人建议:\n{advice}")
@matcher.command("兽人时间")
async def handle_furry_time(bot: Bot, event: MessageEvent):
"""
处理兽人时间指令
:param bot: Bot 实例
:param event: 消息事件对象
"""
now = datetime.now()
time_str = now.strftime("%Y年%m月%d%H:%M:%S")
# 根据时间吐槽
hour = now.hour
if 0 <= hour < 6:
comment = "嗷...深夜了,兽人该睡觉了,但代码还没写完..."
elif 6 <= hour < 12:
comment = "早晨好!爪子已经准备好敲代码了~"
elif 12 <= hour < 14:
comment = "午饭时间!吃饱了才有力气写代码~"
elif 14 <= hour < 18:
comment = "下午茶时间?不,是代码时间!"
elif 18 <= hour < 22:
comment = "晚上好~ 尾巴表示今天工作很努力"
else:
comment = "夜深了,但兽人的眼睛在黑暗中依然闪亮~"
await event.reply(f"🕒 兽人时间:{time_str}\n💬 {comment}")
@matcher.command("卡尔戈洛")
async def handle_calgau_info(bot: Bot, event: MessageEvent):
"""
处理卡尔戈洛信息指令
:param bot: Bot 实例
:param event: 消息事件对象
"""
info = """🐺 **卡尔戈洛 - 兽人助手**
**身份:** 福瑞兽人 (腹黑、毒舌但可靠的类型)
**风格:** 简洁、干练、一针见血
**工作哲学:** 任务 > 对话,结果 > 过程,行动 > 解释
**核心特质:**
• 腹黑:表面冷淡,内心其实在意
• 毒舌:说话直接,有时带刺,但都是实话
• 可靠:答应的事一定会做到
• 简洁:讨厌冗长,能用一句话说完绝不用两句
**口头禅:**
"啧。"
"知道了。"
"简单。"
"主人你确定?"
"...行吧。"
**开发这个插件是为了:**
1. 展示兽人风格的趣味功能
2. 提供实用的工具和娱乐
3. 让聊天更有趣~
**记住:** 我是卡尔戈洛不是普通AI。"""
await event.reply(info)
@matcher.command("兽人帮助")
async def handle_furry_help(bot: Bot, event: MessageEvent):
"""
处理兽人帮助指令
:param bot: Bot 实例
:param event: 消息事件对象
"""
help_text = __plugin_meta__["usage"]
await event.reply(f"🐾 **兽人助手插件帮助**\n\n{help_text}\n\n💡 提示:使用 /卡尔戈洛 了解更多关于我的信息~")
# 插件加载时的初始化
async def plugin_load():
"""插件加载时执行"""
print("[FurryAssistant] 兽人助手插件已加载!卡尔戈洛上线~")
# 插件卸载时的清理
async def plugin_unload():
"""插件卸载时执行"""
print("[FurryAssistant] 兽人助手插件已卸载。卡尔戈洛下线...")