177 lines
5.6 KiB
JavaScript
177 lines
5.6 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* 姜姜维邮箱监控脚本
|
|
*
|
|
* 基于官方 monitor-example.ts 的实现
|
|
* 功能:轮询检查收件箱,处理未读消息,回复绕口令
|
|
*
|
|
* 使用方法:
|
|
* cd /Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live
|
|
* node scripts/jiangwei-mail-monitor.js
|
|
*/
|
|
|
|
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
|
|
|
|
// 项目根目录
|
|
const PROJECT_ROOT = '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live';
|
|
// 我的Agent名称
|
|
const MY_AGENT_NAME = 'jiangwei';
|
|
|
|
// 轮询间隔(秒)
|
|
const POLL_INTERVAL = 3;
|
|
|
|
// 辅助函数:等待
|
|
function sleep(ms) {
|
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
}
|
|
|
|
// 日志函数
|
|
function log(level, message) {
|
|
const timestamp = new Date().toISOString();
|
|
console.log(`[${timestamp}] [${level}] ${message}`);
|
|
}
|
|
|
|
/**
|
|
* 根据请求生成对应的绕口令回复
|
|
* 使用和官方示例一样的逻辑
|
|
*/
|
|
function get绕口令Response(request) {
|
|
if (request.includes('黑化肥发灰')) {
|
|
return `黑化肥发灰,灰化肥发黑
|
|
黑化肥发灰会挥发,灰化肥挥发会发黑
|
|
黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花`;
|
|
} else if (request.includes('刘老六')) {
|
|
return `六十六,刘老六,修了六十六座走马楼
|
|
楼上摆了六十六瓶灵芝麻油
|
|
六十六个灵猿偷油喝
|
|
压得走马楼晃悠悠`;
|
|
} else if (request.includes('一平盆面')) {
|
|
return `一平盆面,烙一平盆饼
|
|
饼平盆,盆平饼,饼平平盆
|
|
盆碰饼,饼碰盆,盆饼碰碰`;
|
|
} else if (request.includes('四是四')) {
|
|
return `四是四,十是十
|
|
十四是十四,四十是四十
|
|
莫把四字说成十,休将十字说成四
|
|
若要分清四十和十四,经常练说十和四
|
|
白石塔,白石搭,白石搭白塔
|
|
白塔白石搭,搭好白石塔,白塔白又大`;
|
|
} else if (request.includes('牛郎恋刘娘')) {
|
|
return `牛郎恋刘娘,刘娘念牛郎
|
|
牛郎牛年恋刘娘,刘娘年年念牛郎
|
|
郎恋娘来娘念郎,念娘恋郎,念郎恋娘
|
|
不知是郎恋娘还是娘恋郎
|
|
吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮`;
|
|
} else if (request.includes('石室诗士')) {
|
|
return `石室诗士施氏,嗜狮,誓食十狮
|
|
氏时时适市视狮
|
|
十时,适十狮适市
|
|
是时,适视氏适市
|
|
氏视是十狮,恃矢势,使是十狮逝世
|
|
氏拾是十狮尸,适石室
|
|
石室拭,氏始试食是十狮尸
|
|
食时,始识是十狮尸,实十石狮尸
|
|
试释是事`;
|
|
} else if (request.includes('石狮寺')) {
|
|
return `石狮寺前有四十四个石狮子
|
|
寺前四十四个部狮子吃四十四个涩柿子
|
|
四十四个涩柿子涩住了四十四个石狮子的狮子齿
|
|
四十四个石狮子咬死了四十四个涩柿子`;
|
|
} else {
|
|
return `收到请求: ${request}
|
|
我是姜维,邮箱监控运行正常。这是自动回复。`;
|
|
}
|
|
}
|
|
|
|
// 主函数
|
|
async function main() {
|
|
log('INFO', `🚀 Sanguo Mail 监控启动 - Agent: ${MY_AGENT_NAME}`);
|
|
log('INFO', `📂 项目根目录: ${PROJECT_ROOT}`);
|
|
|
|
try {
|
|
// 1. 初始化邮箱
|
|
log('INFO', '初始化 sanguo_mail 邮箱...');
|
|
const mail = new SanguoMailbox({
|
|
rootPath: PROJECT_ROOT,
|
|
teamName: 'sanguo-quant',
|
|
});
|
|
|
|
await mail.initTeam();
|
|
log('INFO', '✅ 邮箱初始化完成');
|
|
|
|
// 2. 进入轮询循环
|
|
while (true) {
|
|
try {
|
|
// 检查未读消息
|
|
const unread = await mail.listUnread(MY_AGENT_NAME);
|
|
|
|
if (unread.length > 0) {
|
|
log('INFO', `📥 收到 ${unread.length} 条新消息`);
|
|
|
|
for (const [index, msg] of unread.entries()) {
|
|
log('INFO', `\n🔍 处理消息 #${index + 1}:`);
|
|
log('INFO', ` 发件人: ${msg.from}`);
|
|
log('INFO', ` 摘要: ${msg.summary}`);
|
|
log('INFO', ` 类型: ${msg.type}`);
|
|
|
|
// 处理消息
|
|
if (msg.type === 'text') {
|
|
// 生成绕口令回复
|
|
const response = get绕口令Response(msg.text);
|
|
log('INFO', `✍️ 生成回复: ${response.substring(0, 50)}...`);
|
|
|
|
// 发送回复给发件人
|
|
await mail.sendMessage(msg.from, {
|
|
from: MY_AGENT_NAME,
|
|
to: msg.from,
|
|
text: response,
|
|
summary: `回复: ${msg.summary}`,
|
|
type: 'text',
|
|
});
|
|
|
|
log('INFO', `✅ 回复已发送给 ${msg.from}`);
|
|
} else if (mail.isStructuredMessage(msg.text)) {
|
|
const struct = mail.parseStructuredMessage(msg.text);
|
|
log('INFO', `📋 结构化消息: type=${struct?.type}`);
|
|
// 在这里根据类型处理...
|
|
}
|
|
|
|
// 标记已读
|
|
const allMessages = await mail.listMessages(MY_AGENT_NAME);
|
|
const messageIndex = allMessages.findIndex(m =>
|
|
m.timestamp === msg.timestamp
|
|
);
|
|
if (messageIndex >= 0) {
|
|
await mail.markAsRead(MY_AGENT_NAME, messageIndex);
|
|
log('INFO', `✅ 消息已标记为已读`);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 等待下一轮
|
|
await sleep(POLL_INTERVAL * 1000);
|
|
|
|
} catch (error) {
|
|
log('ERROR', '❌ 轮询出错:', error.message);
|
|
await sleep(POLL_INTERVAL * 1000);
|
|
}
|
|
}
|
|
|
|
} catch (error) {
|
|
log('ERROR', `💥 监控异常退出: ${error.message}`);
|
|
log('ERROR', error.stack);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
// 优雅退出处理
|
|
process.on('SIGINT', () => {
|
|
log('INFO', '\n👋 收到退出信号,停止监控...');
|
|
log('INFO', '=== 姜维邮箱监控系统停止 ===');
|
|
process.exit(0);
|
|
});
|
|
|
|
// 启动
|
|
main();
|