小煎蛋 通知系统服务端
初始的目标是替代小方糖
里程碑
[ ] Dockerfile & Gitea Action
[ ] webhook消息通知
[ ] 通过GPT接口判断用户意图创建提醒
[ ] 日常提醒 & 重复提醒
[ ] 提醒记录
[ ] 提醒统计
零碎TODO
[ ] 用药提醒的卡片模板,确认、取消、延迟
[ ] 看看提醒统计的卡片需要什么数据,应该是需要单建统计数据表,看看能不能融合进Remind表,加个needReply字段
[ ] 通过getInfo指令,在对话里返回请求的数据
待定TODO
[ ] 支持消息加急
项目框架 Fastify
Fastify 是一个高效、低开销、功能丰富的 Web 框架,专为提高开发人员的生产力和性能而设计。
CLI工具 Fastify-CLI
Docs Fastify documentation.
项目备忘
运行端口: 3000
JSON结构设计
提醒主体信息
不论是用药提醒,还是什么提醒,本质上是一个可重复提醒的闹钟,单独建一个表存
每次提醒之后计算下次提醒时间,每次遍历列表确定是否需要提醒
interface Remind {
/**
* id
*/
id: string;
/**
* 所有者信息,绑定用户表的id
*/
owner: string;
/**
* 接收消息相关信息
*/
subscriber: {
/**
* 接收者类型
*/
type: "open_id" | "user_id" | "union_id" | "email" | "chat_id";
/**
* 接收者Id
*/
id: string;
};
/**
* 是否需要回复,不需要回复的也不会重复提醒
*/
needReply: boolean;
/**
* 延迟时间
*/
delayTime: number;
/**
* 卡片信息,用于绘制初始卡片、确认卡片、取消卡片、延迟卡片
*/
cardInfo: {
/**
* 提醒标题,必须要有
*/
title: string;
/**
* 插图key
*/
imageKey?: string;
/**
* 提醒内容,为空不显示
*/
content?: string;
/**
* 确认文本,为空不显示,为需要回复卡片时,如果为空则默认为“完成”
*/
confirmText?: string;
/**
* 取消文本,为空不显示
*/
cancelText?: string;
/**
* 延迟文本,为空不显示
*/
delayText?: string;
} | null;
/**
* 卡片模板信息
*/
templateInfo: {
/**
* 卡片模板ID,会注入变量
* ${owner} 所有者
* ${remindTime} 提醒时间
*/
pendingTemplateId: string;
/**
* 交互之后的卡片模板ID,如果有这个就不会用下边三个但是都会注入变量
* ${owner} 所有者
* ${remindTime} 提醒时间
* ${result} 交互结果,会读卡片按钮绑定的变量text,如果没有则是绑定的result对应的 已确认、已取消、已延迟
* ${interactTime} 交互时间
*/
interactedTemplateId: string;
/**
* 确认之后的卡片模板ID
*/
confirmedTemplateId: string;
/**
* 取消之后的卡片模板ID
*/
cancelededTemplateId: string;
/**
* 延迟之后的卡片模板ID
*/
delayedTemplateId: string;
} | null;
/**
* 重复类型
* single: 一次性
* daily: 每天
* weekly: 每周
* monthly: 每月
* yearly: 每年
* workday: 工作日
* holiday: 节假日
*/
frequency:
| "single"
| "daily"
| "weekly"
| "monthly"
| "yearly"
| "workday"
| "holiday";
/**
* 提醒时间,格式为HH:mm
*/
time: string;
/**
* 星期几,当frequency为weekly时有效
*/
dayOfWeek: number;
/**
* 每月的几号,当frequency为monthly时有效
*/
dayOfMonth: number;
/**
* 每年的哪天提醒,当frequency为yearly时有效,格式为MM-dd
*/
dayOfYear: string;
/**
* 是否启用
*/
enabled: boolean;
/**
* 下次提醒的时间,格式为yyyy-MM-dd HH:mm
*/
nextRemindTime: string;
}
提醒记录
每次提醒之后记录下messageId,用于确认、取消、延迟
将用户的反馈结果融合进提醒状态里,用于统计
多余的数据如选择的结果则存储进result,没有留空
interface RemindRecord {
/**
* 记录Id
*/
id: string;
/**
* 关联的提醒Id
*/
remindId: string;
/**
* 发送的卡片Id
*/
messageId: string;
/**
* 提醒状态
* pending: 待确认
* delay: 已延迟
* confirmed: 已确认
* canceled: 已取消
*/
status: "pending" | "delayed" | "confirmed" | "canceled";
/**
* 本次提醒时间,格式为yyyy-MM-dd HH:mm
*/
remindTime: string;
/**
* 用户交互的时间,格式为yyyy-MM-dd HH:mm
*/
interactTime: string;
/**
* 用户回答的结果
*/
result: string;
}
Description
Languages
TypeScript
99.1%
JavaScript
0.8%
Dockerfile
0.1%