feat(zulip): 添加全面的 Zulip 集成系统

* **新增 Zulip 模块**:包含完整的集成服务,涵盖客户端池(client pool)、会话管理及事件处理。
* **新增 WebSocket 网关**:用于处理 Zulip 的实时事件监听与双向通信。
* **新增安全服务**:支持 API 密钥加密存储及凭据的安全管理。
* **新增配置管理服务**:支持配置热加载(hot-reload),实现动态配置更新。
* **新增错误处理与监控服务**:提升系统的可靠性与可观测性。
* **新增消息过滤服务**:用于内容校验及速率限制(流控)。
* **新增流初始化与会话清理服务**:优化资源管理与回收。
* **完善测试覆盖**:包含单元测试及端到端(e2e)集成测试。
* **完善详细文档**:包括 API 参考手册、配置指南及集成概述。
* **新增地图配置系统**:实现游戏地点与 Zulip Stream(频道)及 Topic(话题)的逻辑映射。
* **新增环境变量配置**:涵盖 Zulip 服务器地址、身份验证及监控相关设置。
* **更新 App 模块**:注册并启用新的 Zulip 集成模块。
* **更新 Redis 接口**:以支持增强型的会话管理功能。
* **实现 WebSocket 协议支持**:确保与 Zulip 之间的实时双向通信。
This commit is contained in:
angjustinl
2025-12-25 22:22:30 +08:00
parent f6fa1ca1e3
commit 55cfda0532
46 changed files with 21488 additions and 2 deletions

View File

@@ -0,0 +1,85 @@
const zulip = require('zulip-js');
async function listSubscriptions() {
console.log('🔧 检查用户订阅的 Streams...');
const config = {
username: 'angjustinl@mail.angforever.top',
apiKey: 'lCPWC...pqNfGF8',
realm: 'https://zulip.xinghangee.icu/'
};
try {
const client = await zulip(config);
// 获取用户信息
console.log('\n👤 获取用户信息...');
const profile = await client.users.me.getProfile();
console.log('用户:', profile.full_name, `(${profile.email})`);
console.log('是否管理员:', profile.is_admin);
// 获取用户订阅的 Streams
console.log('\n📋 获取用户订阅的 Streams...');
const subscriptions = await client.streams.subscriptions.retrieve();
if (subscriptions.result === 'success') {
console.log(`\n✅ 找到 ${subscriptions.subscriptions.length} 个订阅的 Streams:`);
subscriptions.subscriptions.forEach(sub => {
console.log(` - ${sub.name} (ID: ${sub.stream_id})`);
});
// 检查是否有 "Novice Village"
const noviceVillage = subscriptions.subscriptions.find(s => s.name === 'Novice Village');
if (noviceVillage) {
console.log('\n✅ "Novice Village" Stream 已存在!');
// 测试发送消息
console.log('\n📤 测试发送消息...');
const result = await client.messages.send({
type: 'stream',
to: 'Novice Village',
subject: 'General',
content: '测试消息:系统集成测试成功 🎮'
});
if (result.result === 'success') {
console.log('✅ 消息发送成功! Message ID:', result.id);
} else {
console.log('❌ 消息发送失败:', result.msg);
}
} else {
console.log('\n⚠ "Novice Village" Stream 不存在');
console.log('💡 请在 Zulip 网页界面手动创建该 Stream或使用管理员账号创建');
// 尝试发送到第一个可用的 Stream
if (subscriptions.subscriptions.length > 0) {
const firstStream = subscriptions.subscriptions[0];
console.log(`\n📤 尝试发送消息到 "${firstStream.name}"...`);
const result = await client.messages.send({
type: 'stream',
to: firstStream.name,
subject: 'Test',
content: '测试消息:验证系统可以发送消息 🎮'
});
if (result.result === 'success') {
console.log('✅ 消息发送成功! Message ID:', result.id);
console.log(`💡 系统工作正常,只需创建 "Novice Village" Stream 即可`);
} else {
console.log('❌ 消息发送失败:', result.msg);
}
}
}
} else {
console.log('❌ 获取订阅失败:', subscriptions.msg);
}
} catch (error) {
console.error('\n❌ 操作失败:', error.message);
if (error.response) {
console.error('响应数据:', error.response.data);
}
}
}
listSubscriptions();