auto-sync: 2026-04-05 17:32:06
This commit is contained in:
Executable
+35
@@ -0,0 +1,35 @@
|
||||
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
|
||||
import { join } from 'path';
|
||||
|
||||
const CONFIG = {
|
||||
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
|
||||
teamName: 'sanguo-quant'
|
||||
};
|
||||
|
||||
async function checkMail() {
|
||||
const mailbox = new SanguoMailbox(CONFIG);
|
||||
await mailbox.initTeam();
|
||||
|
||||
const unreadMessages = await mailbox.listUnread('jiangwei');
|
||||
if (unreadMessages.length > 0) {
|
||||
console.log(`发现 ${unreadMessages.length} 条未读消息`);
|
||||
unreadMessages.forEach((msg, index) => {
|
||||
console.log(`[${index + 1}] 来自 ${msg.from} - ${msg.text.substring(0, 50)}${msg.text.length > 50 ? '...' : ''}`);
|
||||
});
|
||||
|
||||
await Promise.all(unreadMessages.map((msg, index) =>
|
||||
mailbox.markAsReadByIndex('jiangwei', index)
|
||||
));
|
||||
console.log('所有未读消息已标记为已读');
|
||||
}
|
||||
}
|
||||
|
||||
async function startAutoCheck(intervalSeconds) {
|
||||
console.log(`邮件检查服务已启动,检查间隔: ${intervalSeconds} 秒`);
|
||||
|
||||
checkMail();
|
||||
|
||||
setInterval(checkMail, intervalSeconds * 1000);
|
||||
}
|
||||
|
||||
startAutoCheck(parseInt(process.argv[2]) || 60);
|
||||
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Sanguo Mail 系统健康检查脚本
|
||||
* 定期检查系统状态,确保邮件功能正常
|
||||
*/
|
||||
|
||||
import { SanguoMailbox } from '../sanguo_mail/src/index.js';
|
||||
import { join } from 'path';
|
||||
|
||||
const CONFIG = {
|
||||
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
|
||||
teamName: 'sanguo-quant',
|
||||
};
|
||||
|
||||
async function checkSystem() {
|
||||
console.log('[Health Check] 开始系统健康检查...');
|
||||
|
||||
try {
|
||||
const mail = new SanguoMailbox(CONFIG);
|
||||
|
||||
// 检查团队配置
|
||||
const team = await mail.initTeam();
|
||||
console.log(`[Health Check] 团队配置正常: ${team.teamName}`);
|
||||
|
||||
// 检查成员列表
|
||||
if (team.members.length === 0) {
|
||||
console.error('[Health Check] 错误: 团队成员为空');
|
||||
return 1;
|
||||
}
|
||||
console.log(`[Health Check] 成员数量: ${team.members.length}`);
|
||||
|
||||
// 检查邮件功能
|
||||
const myInbox = await mail.listUnread('jiangwei');
|
||||
console.log(`[Health Check] 收件箱: ${myInbox.length} 条未读消息`);
|
||||
|
||||
console.log('[Health Check] 系统健康检查完成');
|
||||
return 0;
|
||||
} catch (error) {
|
||||
console.error('[Health Check] 系统健康检查失败:', error.message);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
checkSystem().then(process.exit);
|
||||
@@ -0,0 +1,176 @@
|
||||
#!/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();
|
||||
Executable
+630
@@ -0,0 +1,630 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
# Sanguo Mail 系统管理脚本
|
||||
# 支持启动、停止、配置、健康检查等操作
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# 日志函数
|
||||
log() {
|
||||
local level="$1"
|
||||
local message="$2"
|
||||
local color
|
||||
|
||||
case "$level" in
|
||||
"error") color="$RED" ;;
|
||||
"warning") color="$YELLOW" ;;
|
||||
"info") color="$BLUE" ;;
|
||||
"success") color="$GREEN" ;;
|
||||
*) color="$NC" ;;
|
||||
esac
|
||||
|
||||
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
local level_uppercase=$(echo "$level" | tr '[:lower:]' '[:upper:]')
|
||||
|
||||
echo -e "${color}[${timestamp}] [${level_uppercase}] ${message}${NC}"
|
||||
}
|
||||
|
||||
# 配置常量
|
||||
PROJECT_ROOT="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
|
||||
MAIL_PROJECT_DIR="$PROJECT_ROOT/mail"
|
||||
SCRIPTS_DIR="$PROJECT_ROOT/scripts"
|
||||
|
||||
# 检查节点是否在线
|
||||
check_node() {
|
||||
log "info" "检查节点连接..."
|
||||
openclaw nodes list >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
log "success" "节点连接正常"
|
||||
else
|
||||
log "error" "节点连接失败,请确保 OpenClaw 服务正在运行"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 获取服务配置
|
||||
get_config() {
|
||||
local config_file="$SCRIPTS_DIR/config.json"
|
||||
if [ -f "$config_file" ]; then
|
||||
cat "$config_file"
|
||||
else
|
||||
cat << 'EOF'
|
||||
{
|
||||
"server": {
|
||||
"port": 18888,
|
||||
"host": "0.0.0.0",
|
||||
"timeout": 30000
|
||||
},
|
||||
"api": {
|
||||
"baseUrl": "http://127.0.0.1:18888",
|
||||
"timeout": 10000
|
||||
},
|
||||
"mailSystem": {
|
||||
"rootPath": "/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live",
|
||||
"teamName": "sanguo-quant"
|
||||
},
|
||||
"autoCheck": {
|
||||
"interval": 60,
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
# 设置配置
|
||||
set_config() {
|
||||
local config_file="$SCRIPTS_DIR/config.json"
|
||||
local config=$(get_config)
|
||||
local key="$1"
|
||||
local value="$2"
|
||||
|
||||
if [ -z "$key" ] || [ -z "$value" ]; then
|
||||
log "error" "设置配置需要提供配置项和值"
|
||||
log "usage" "使用方法: $0 config set <key> <value>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "info" "正在设置 $key = $value"
|
||||
|
||||
if [ -f "$config_file" ]; then
|
||||
jq ".${key} = \"${value}\"" "$config_file" > "${config_file}.tmp" && mv "${config_file}.tmp" "$config_file"
|
||||
else
|
||||
local default_config=$(get_config | jq ".${key} = \"${value}\"")
|
||||
echo "$default_config" > "$config_file"
|
||||
fi
|
||||
|
||||
log "success" "配置已更新"
|
||||
log "info" "重启服务使配置生效"
|
||||
}
|
||||
|
||||
# 启动服务
|
||||
start_server() {
|
||||
log "info" "正在启动 Sanguo Mail 服务..."
|
||||
|
||||
# 检查项目是否已安装
|
||||
if [ ! -d "$PROJECT_ROOT" ]; then
|
||||
log "error" "项目根目录不存在: $PROJECT_ROOT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查依赖
|
||||
if [ ! -d "$PROJECT_ROOT/node_modules" ]; then
|
||||
log "info" "依赖未安装,正在安装..."
|
||||
install_deps
|
||||
fi
|
||||
|
||||
# 检查邮件系统初始化
|
||||
if [ ! -d "$PROJECT_ROOT/mail/sanguo-quant/inboxes" ] || [ ! -f "$PROJECT_ROOT/mail/sanguo-quant/team.json" ]; then
|
||||
log "info" "邮件系统未初始化,正在初始化..."
|
||||
init_system
|
||||
fi
|
||||
|
||||
# 启动服务
|
||||
log "info" "正在启动邮件服务进程..."
|
||||
node "$SCRIPTS_DIR/server.js" > "$SCRIPTS_DIR/mail-service.log" 2>&1 &
|
||||
local PID=$!
|
||||
|
||||
# 保存 PID
|
||||
echo "$PID" > "$SCRIPTS_DIR/mail.pid"
|
||||
|
||||
# 等待服务启动
|
||||
log "info" "等待服务启动..."
|
||||
sleep 2
|
||||
|
||||
# 检查服务是否正在运行
|
||||
if ps -p "$PID" > /dev/null 2>&1; then
|
||||
log "success" "服务启动成功,PID: $PID"
|
||||
log "success" "服务日志: $SCRIPTS_DIR/mail-service.log"
|
||||
log "success" "访问地址: http://127.0.0.1:18888"
|
||||
else
|
||||
log "error" "服务启动失败"
|
||||
if [ -f "$SCRIPTS_DIR/mail-service.log" ]; then
|
||||
log "error" "错误日志: $(head -20 "$SCRIPTS_DIR/mail-service.log")"
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 停止服务
|
||||
stop_server() {
|
||||
local PID_FILE="$SCRIPTS_DIR/mail.pid"
|
||||
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
local PID=$(cat "$PID_FILE")
|
||||
|
||||
log "info" "正在停止服务,PID: $PID"
|
||||
|
||||
if ps -p "$PID" > /dev/null 2>&1; then
|
||||
kill "$PID"
|
||||
log "success" "服务已停止"
|
||||
else
|
||||
log "warning" "服务已停止 (PID $PID 不存在)"
|
||||
fi
|
||||
|
||||
rm -f "$PID_FILE"
|
||||
else
|
||||
log "warning" "服务 PID 文件不存在,可能服务未运行"
|
||||
|
||||
# 尝试查找并停止进程
|
||||
local PROCESS=$(ps aux | grep "node $SCRIPTS_DIR/server.js" | grep -v grep | awk '{print $2}')
|
||||
if [ -n "$PROCESS" ]; then
|
||||
log "info" "找到服务进程,PID: $PROCESS"
|
||||
kill "$PROCESS"
|
||||
log "success" "服务已停止"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 查看服务状态
|
||||
status() {
|
||||
log "info" "=== 系统状态 ==="
|
||||
|
||||
# 检查项目根目录
|
||||
if [ -d "$PROJECT_ROOT" ]; then
|
||||
log "success" "项目根目录存在: $PROJECT_ROOT"
|
||||
else
|
||||
log "error" "项目根目录不存在: $PROJECT_ROOT"
|
||||
fi
|
||||
|
||||
# 检查邮件系统目录
|
||||
MAIL_DIR="$PROJECT_ROOT/mail/sanguo-quant"
|
||||
|
||||
if [ -d "$MAIL_DIR" ]; then
|
||||
log "success" "邮件系统目录存在: $MAIL_DIR"
|
||||
else
|
||||
log "warning" "邮件系统目录不存在: $MAIL_DIR"
|
||||
fi
|
||||
|
||||
# 检查收件箱
|
||||
if [ -d "$MAIL_DIR/inboxes" ]; then
|
||||
log "success" "收件箱目录存在: $MAIL_DIR/inboxes"
|
||||
|
||||
# 统计收件箱文件数量
|
||||
local inbox_count=$(ls -1 "$MAIL_DIR/inboxes"/*.json 2>/dev/null | wc -l)
|
||||
log "success" "收件箱数量: $inbox_count"
|
||||
else
|
||||
log "warning" "收件箱目录不存在: $MAIL_DIR/inboxes"
|
||||
fi
|
||||
|
||||
# 检查成员配置
|
||||
TEAM_CONFIG="$MAIL_DIR/team.json"
|
||||
|
||||
if [ -f "$TEAM_CONFIG" ]; then
|
||||
log "success" "团队配置文件存在: $TEAM_CONFIG"
|
||||
|
||||
# 统计团队成员数量
|
||||
local member_count=$(jq '.members | length' "$TEAM_CONFIG" 2>/dev/null || echo 0)
|
||||
log "success" "团队成员数量: $member_count"
|
||||
else
|
||||
log "warning" "团队配置文件不存在: $TEAM_CONFIG"
|
||||
fi
|
||||
|
||||
# 检查服务状态
|
||||
if [ -f "$SCRIPTS_DIR/mail.pid" ]; then
|
||||
local PID=$(cat "$SCRIPTS_DIR/mail.pid")
|
||||
|
||||
if ps -p "$PID" > /dev/null 2>&1; then
|
||||
log "success" "服务正在运行,PID: $PID"
|
||||
else
|
||||
log "warning" "PID 文件存在,但进程未运行"
|
||||
rm -f "$SCRIPTS_DIR/mail.pid"
|
||||
fi
|
||||
else
|
||||
log "warning" "服务未运行"
|
||||
fi
|
||||
}
|
||||
|
||||
# 查看日志
|
||||
logs() {
|
||||
local LOG_FILE="$SCRIPTS_DIR/mail-service.log"
|
||||
|
||||
if [ ! -f "$LOG_FILE" ]; then
|
||||
log "error" "日志文件不存在: $LOG_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$2" ]; then
|
||||
tail -f "$LOG_FILE"
|
||||
else
|
||||
log "info" "显示最后 $2 行日志"
|
||||
tail -"$2" "$LOG_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
# 健康检查
|
||||
check_health() {
|
||||
log "info" "正在进行健康检查..."
|
||||
|
||||
local ERROR_COUNT=0
|
||||
local WARNING_COUNT=0
|
||||
|
||||
# 检查依赖
|
||||
if [ ! -d "$PROJECT_ROOT/node_modules" ]; then
|
||||
log "error" "依赖未安装"
|
||||
ERROR_COUNT=$((ERROR_COUNT + 1))
|
||||
else
|
||||
log "success" "依赖已安装"
|
||||
fi
|
||||
|
||||
# 检查邮件系统初始化
|
||||
if [ ! -d "$PROJECT_ROOT/mail/sanguo-quant/inboxes" ] || [ ! -f "$PROJECT_ROOT/mail/sanguo-quant/team.json" ]; then
|
||||
log "warning" "邮件系统未初始化"
|
||||
WARNING_COUNT=$((WARNING_COUNT + 1))
|
||||
else
|
||||
log "success" "邮件系统已初始化"
|
||||
fi
|
||||
|
||||
# 检查服务状态
|
||||
if [ -f "$SCRIPTS_DIR/mail.pid" ]; then
|
||||
local PID=$(cat "$SCRIPTS_DIR/mail.pid")
|
||||
|
||||
if ps -p "$PID" > /dev/null 2>&1; then
|
||||
log "success" "服务正在运行,PID: $PID"
|
||||
else
|
||||
log "error" "PID 文件存在,但进程未运行"
|
||||
ERROR_COUNT=$((ERROR_COUNT + 1))
|
||||
fi
|
||||
else
|
||||
log "warning" "服务未运行"
|
||||
WARNING_COUNT=$((WARNING_COUNT + 1))
|
||||
fi
|
||||
|
||||
log "info" "=== 健康检查结果 ==="
|
||||
log "success" "成功项: $((4 - ERROR_COUNT - WARNING_COUNT))"
|
||||
|
||||
if [ "$WARNING_COUNT" -gt 0 ]; then
|
||||
log "warning" "警告项: $WARNING_COUNT"
|
||||
fi
|
||||
|
||||
if [ "$ERROR_COUNT" -gt 0 ]; then
|
||||
log "error" "错误项: $ERROR_COUNT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "success" "系统健康状况良好"
|
||||
}
|
||||
|
||||
# 检查安全配置
|
||||
check_security() {
|
||||
if [ ! -f "/Users/chufeng/.openclaw/config/security.json" ]; then
|
||||
log "warning" "安全配置文件未找到,使用默认策略"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local security_level=$(jq -r '.security_level' "/Users/chufeng/.openclaw/config/security.json")
|
||||
log "info" "当前安全级别: $security_level"
|
||||
|
||||
if [ "$security_level" != "full" ]; then
|
||||
log "warning" "安全级别不是 full,可能会影响邮件系统功能"
|
||||
fi
|
||||
}
|
||||
|
||||
# 列出配置
|
||||
list_config() {
|
||||
log "info" "=== 当前配置 ==="
|
||||
log "info" "项目根目录: $PROJECT_ROOT"
|
||||
log "info" "邮件系统目录: $MAIL_PROJECT_DIR"
|
||||
log "info" "脚本目录: $SCRIPTS_DIR"
|
||||
|
||||
# 显示配置文件内容
|
||||
if [ -f "$SCRIPTS_DIR/config.json" ]; then
|
||||
log "info" "配置文件内容:"
|
||||
cat "$SCRIPTS_DIR/config.json"
|
||||
else
|
||||
log "warning" "配置文件未找到,使用默认值"
|
||||
fi
|
||||
}
|
||||
|
||||
# 启动邮件检查服务
|
||||
watch_mail() {
|
||||
log "info" "正在启动邮件检查服务..."
|
||||
|
||||
local interval=${2:-60}
|
||||
|
||||
log "info" "邮件检查间隔: $interval 秒"
|
||||
|
||||
# 创建检查脚本
|
||||
cat > "$SCRIPTS_DIR/auto-check-mail.js" << 'EOF'
|
||||
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
|
||||
import { join } from 'path';
|
||||
|
||||
const CONFIG = {
|
||||
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
|
||||
teamName: 'sanguo-quant'
|
||||
};
|
||||
|
||||
async function checkMail() {
|
||||
const mailbox = new SanguoMailbox(CONFIG);
|
||||
await mailbox.initTeam();
|
||||
|
||||
const unreadMessages = await mailbox.listUnread('jiangwei');
|
||||
if (unreadMessages.length > 0) {
|
||||
console.log(`发现 ${unreadMessages.length} 条未读消息`);
|
||||
unreadMessages.forEach((msg, index) => {
|
||||
console.log(`[${index + 1}] 来自 ${msg.from} - ${msg.text.substring(0, 50)}${msg.text.length > 50 ? '...' : ''}`);
|
||||
});
|
||||
|
||||
await Promise.all(unreadMessages.map((msg, index) =>
|
||||
mailbox.markAsReadByIndex('jiangwei', index)
|
||||
));
|
||||
console.log('所有未读消息已标记为已读');
|
||||
}
|
||||
}
|
||||
|
||||
async function startAutoCheck(intervalSeconds) {
|
||||
console.log(`邮件检查服务已启动,检查间隔: ${intervalSeconds} 秒`);
|
||||
|
||||
checkMail();
|
||||
|
||||
setInterval(checkMail, intervalSeconds * 1000);
|
||||
}
|
||||
|
||||
startAutoCheck(parseInt(process.argv[2]) || 60);
|
||||
EOF
|
||||
|
||||
chmod +x "$SCRIPTS_DIR/auto-check-mail.js"
|
||||
|
||||
# 启动服务
|
||||
log "info" "正在启动邮件检查服务..."
|
||||
|
||||
node "$SCRIPTS_DIR/auto-check-mail.js" "$interval" > "$SCRIPTS_DIR/auto-check-mail.log" 2>&1 &
|
||||
local PID=$!
|
||||
|
||||
log "success" "邮件检查服务启动成功,PID: $PID"
|
||||
log "success" "检查日志: $SCRIPTS_DIR/auto-check-mail.log"
|
||||
log "success" "检查间隔: $interval 秒"
|
||||
}
|
||||
|
||||
# 停止邮件检查服务
|
||||
stop_watch_mail() {
|
||||
local WATCH_PID=$(ps aux | grep "node $SCRIPTS_DIR/auto-check-mail.js" | grep -v grep | awk '{print $2}')
|
||||
|
||||
if [ -n "$WATCH_PID" ]; then
|
||||
log "info" "正在停止邮件检查服务,PID: $WATCH_PID"
|
||||
kill "$WATCH_PID"
|
||||
log "success" "邮件检查服务已停止"
|
||||
else
|
||||
log "warning" "邮件检查服务未运行"
|
||||
fi
|
||||
}
|
||||
|
||||
# 显示使用说明
|
||||
show_usage() {
|
||||
log "info" "Sanguo Mail 系统管理脚本"
|
||||
log "info" "使用方法: $0 <命令> [参数]"
|
||||
log "info" ""
|
||||
log "info" "可用命令:"
|
||||
log "info" " init 初始化系统"
|
||||
log " start 启动服务"
|
||||
log " stop 停止服务"
|
||||
log " restart 重启服务"
|
||||
log " status 显示系统状态"
|
||||
log " logs [行数] 显示服务日志"
|
||||
log " config [set <配置项> <值>] 设置/查看配置"
|
||||
log " install 安装项目依赖"
|
||||
log " check 健康检查"
|
||||
log " list 列出所有命令"
|
||||
log " watch [间隔] 启动邮件检查服务"
|
||||
log " stop-watch 停止邮件检查服务"
|
||||
log " test 测试邮件发送和接收"
|
||||
log " help 显示此帮助信息"
|
||||
}
|
||||
|
||||
# 显示可用命令列表
|
||||
list_commands() {
|
||||
log "info" "可用命令:"
|
||||
log "info" " init 初始化系统"
|
||||
log "info" " start 启动服务"
|
||||
log "info" " stop 停止服务"
|
||||
log "info" " restart 重启服务"
|
||||
log "info" " status 显示系统状态"
|
||||
log "info" " logs [行数] 显示服务日志"
|
||||
log "info" " config [set <配置项> <值>] 设置/查看配置"
|
||||
log "info" " install 安装项目依赖"
|
||||
log "info" " check 健康检查"
|
||||
log "info" " list 列出所有命令"
|
||||
log "info" " watch [间隔] 启动邮件检查服务"
|
||||
log "info" " stop-watch 停止邮件检查服务"
|
||||
log "info" " test 测试邮件发送和接收"
|
||||
log "info" " help 显示此帮助信息"
|
||||
}
|
||||
|
||||
# 测试邮件发送
|
||||
test_send_mail() {
|
||||
log "info" "正在测试邮件发送..."
|
||||
|
||||
cat > "$SCRIPTS_DIR/test-send.js" << 'EOF'
|
||||
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
|
||||
|
||||
const CONFIG = {
|
||||
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
|
||||
teamName: 'sanguo-quant'
|
||||
};
|
||||
|
||||
async function testSendMail() {
|
||||
const mailbox = new SanguoMailbox(CONFIG);
|
||||
await mailbox.initTeam();
|
||||
|
||||
await mailbox.sendMessage('zhangfei', {
|
||||
from: 'pangtong',
|
||||
to: 'zhangfei',
|
||||
text: '测试消息:发送一条测试邮件',
|
||||
type: 'text'
|
||||
});
|
||||
|
||||
console.log('测试邮件发送成功');
|
||||
}
|
||||
|
||||
testSendMail();
|
||||
EOF
|
||||
|
||||
chmod +x "$SCRIPTS_DIR/test-send.js"
|
||||
node "$SCRIPTS_DIR/test-send.js"
|
||||
|
||||
log "success" "测试邮件发送成功"
|
||||
}
|
||||
|
||||
# 测试邮件接收
|
||||
test_receive_mail() {
|
||||
log "info" "正在测试邮件接收..."
|
||||
|
||||
cat > "$SCRIPTS_DIR/test-receive.js" << 'EOF'
|
||||
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
|
||||
|
||||
const CONFIG = {
|
||||
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
|
||||
teamName: 'sanguo-quant'
|
||||
};
|
||||
|
||||
async function testReceiveMail() {
|
||||
const mailbox = new SanguoMailbox(CONFIG);
|
||||
await mailbox.initTeam();
|
||||
|
||||
const unread = await mailbox.listUnread('zhangfei');
|
||||
|
||||
if (unread.length === 0) {
|
||||
console.log('没有未读邮件');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`发现 ${unread.length} 条未读邮件`);
|
||||
|
||||
for (let i = 0; i < unread.length; i++) {
|
||||
const msg = unread[i];
|
||||
console.log(`[${i + 1}] ${msg.from} - ${msg.text}`);
|
||||
console.log(`类型: ${msg.type}`);
|
||||
console.log(`时间: ${msg.timestamp}`);
|
||||
console.log('');
|
||||
}
|
||||
}
|
||||
|
||||
testReceiveMail();
|
||||
EOF
|
||||
|
||||
chmod +x "$SCRIPTS_DIR/test-receive.js"
|
||||
node "$SCRIPTS_DIR/test-receive.js"
|
||||
|
||||
log "success" "测试邮件接收成功"
|
||||
}
|
||||
|
||||
# 测试功能
|
||||
run_test() {
|
||||
log "info" "正在运行 Sanguo Mail 系统测试..."
|
||||
|
||||
# 初始化系统(如果未初始化)
|
||||
if [ ! -d "$PROJECT_ROOT/mail/sanguo-quant/inboxes" ] || [ ! -f "$PROJECT_ROOT/mail/sanguo-quant/team.json" ]; then
|
||||
log "info" "邮件系统未初始化,正在初始化..."
|
||||
init_system
|
||||
fi
|
||||
|
||||
# 测试邮件发送
|
||||
test_send_mail
|
||||
|
||||
# 测试邮件接收
|
||||
test_receive_mail
|
||||
}
|
||||
|
||||
# 主命令处理
|
||||
case "${1:-}" in
|
||||
"init" | "setup" )
|
||||
init_system
|
||||
;;
|
||||
|
||||
"start" | "up" )
|
||||
start_server
|
||||
;;
|
||||
|
||||
"stop" | "down" )
|
||||
stop_server
|
||||
;;
|
||||
|
||||
"restart" )
|
||||
stop_server
|
||||
sleep 2
|
||||
start_server
|
||||
;;
|
||||
|
||||
"watch" )
|
||||
watch_mail "$@"
|
||||
;;
|
||||
|
||||
"stop-watch" )
|
||||
stop_watch_mail
|
||||
;;
|
||||
|
||||
"status" )
|
||||
status
|
||||
;;
|
||||
|
||||
"logs" )
|
||||
logs "$@"
|
||||
;;
|
||||
|
||||
"config" )
|
||||
if [ -z "$2" ]; then
|
||||
list_config
|
||||
elif [ "$2" = "set" ]; then
|
||||
set_config "${3:-}" "${4:-}"
|
||||
else
|
||||
log "error" "配置命令无效"
|
||||
log "usage" "使用方法: $0 config [set <key> <value>]"
|
||||
fi
|
||||
;;
|
||||
|
||||
"install" )
|
||||
install_deps
|
||||
;;
|
||||
|
||||
"check" )
|
||||
check_health
|
||||
;;
|
||||
|
||||
"list" )
|
||||
list_commands
|
||||
;;
|
||||
|
||||
"test" )
|
||||
run_test
|
||||
;;
|
||||
|
||||
"help" )
|
||||
show_usage
|
||||
;;
|
||||
|
||||
"" )
|
||||
show_usage
|
||||
;;
|
||||
|
||||
* )
|
||||
log "warning" "未知命令: $1"
|
||||
show_usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user