2023-09-04 14:45:56 +08:00
2023-09-04 14:45:56 +08:00
2023-08-16 10:55:19 +08:00
2023-09-03 18:59:33 +08:00
2023-09-03 18:59:33 +08:00
2023-08-16 10:55:19 +08:00
2023-09-03 18:59:33 +08:00
2023-08-16 10:55:19 +08:00
2023-08-16 10:55:19 +08:00
2023-09-04 14:45:56 +08:00
2023-09-04 14:45:56 +08:00
2023-09-03 18:59:33 +08:00
2023-09-01 21:43:16 +08:00
2023-09-03 18:59:33 +08:00

小煎蛋 通知系统服务端

初始的目标是替代小方糖

里程碑

[ ] 建立日志系统

[ ] 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;
  /**
   * 接收者类型
   */
  subscriberType: "open_id" | "user_id" | "union_id" | "email" | "chat_id";
  /**
   * 接收者Id
   */
  subscriberId: 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;
}

用户列表

存储用户信息便于拿取提醒列表浏览器应用接入米盾之后可以用user_id对应username拿到对应信息

后续可能有关键词提醒

interface User {
  /**
   * id
   */
  id: string;
  /**
   * 用户名
   * @example zhaoyingbo
   */
  user_id: string;
  /**
   * open_id
   */
  open_id: string;
}
Description
小煎蛋的服务端
Readme 3.7 MiB
Languages
TypeScript 99.1%
JavaScript 0.8%
Dockerfile 0.1%