1 个不稳定版本

0.0.1 2021年10月7日

#93 in #定时任务

GPL-3.0-or-later

100KB
1K SLoC

ELMO - Rust 持久通知

Elmo logo

一个小巧的工具,用于提醒你需要做的事情。

一个最小化的提醒服务实现,不限于单个计算机会话。对于那些生活在终端的用户来说,像这样简单的东西

sleep 40m && notify-send -t 3000 "Apple pie" "Fetch the apple pie from the oven" &

工作得相当不错,但在我看来有两个问题

  1. 如果你想在特定日期设置提醒,你必须计算从现在到目标时间的分钟数。
  2. 如果我要重启或者如果目标日期是几天后,我定期关闭我的电脑,这就不起作用了。

我们通过在本地 SQLite 数据库中维护事件,并以良好的旧 cronjob 定期检查该数据库的条目来解决此问题。

安装

cargo install elmo

数据库位置

默认情况下,新数据库文件将创建在: ~/.elmo/events.db。如果你希望使用其他位置,请使用 ELMO_DATABASE_URL 环境变量指定该位置。无论如何,表将自动创建。

用法

此工具包含 4 个命令

  1. set - 在 4 种风味之一中创建新的通知

    • 立即通知,这是默认选项,当未使用 --date--cron--wait 时使用。你可以像使用其他工具(如 notify-senddunstify)一样使用此选项。
    • 安排通知,当你使用 --date 选项指定日期(格式:2021-09-10T18:00)或使用 --wait 选项指定等待时间(例如 5 分钟7 小时)时,事件将被存储在本地数据库中,以后可以搜索和发出通知。
    • 使用--cron选项安排重复事件,这类似于在crontab中手动设置cronjob,例如:* */5 * * * elmo set "提醒我" "每隔5小时",但有一些优点。您可以列出所有重复事件:elmo list --cron,如果您在事件发生几分钟后再打开计算机,通知会延迟发送,所有重复事件都由一个cronjob处理(您的crontab更简洁)
  2. 检查 - 查找即将发生的所有事件。对于常规事件,这也会处理过去的事件,所有已通知的常规事件都会从数据库中删除。此外,该功能还会检查在时间段内(现在 - 30分钟 -> 现在)与重复事件的匹配日期,当事件被触发时,数据库中最后通知的日期会更新。

  3. 列出 - 显示即将发生的事件及其所有相关属性(名称、描述、通知日期、图标名称、声音文件路径)。有两种模式:未设置--cron常规事件和设置--cron重复事件。使用--exp可以筛选出在时间段内(现在 -> 现在 + 持续时间表达式)通知的事件,例如:表达式示例:5 min30 minutes20 seconds3 hours15 days等。

  4. 删除 - 删除数据库中现有事件,使用列出命令可找到ID。此命令也有两种模式:常规事件重复事件--cron)。默认情况下,用户将需要确认,但可以使用-y参数跳过确认。

示例

立即触发的简单通知

elmo set "Hey" "It's me, your computer"

特定时间触发,具有持续时间表达式和图标的通知
此事件将存储到数据库中,必须使用检查命令来触发

elmo set "Pizza" "Get the pizza out of the oven" --wait "20 min" --icon pizza_icon

特定日期时间的提醒,带有声音、公告和声音测试
此事件将存储到数据库中,必须使用检查命令来触发

elmo set "Meeting" "Work meeting per jitsi"\
    --date "2022-10-01T11:00"\
    --sound ~/Music/gong.mp3\
    --announce\
    --test_sound

每3天下午6点提醒浇水植物
此事件将存储到数据库中,必须使用检查命令来触发

elmo set "Plants" "Water the plants" --cron "0 0 18 */3 * *" --icon plants_icon

Cronjob配置

在创建新事件后,我们需要一种机制来检查何时应发出通知。Unix系统包含一个众所周知的工具,称为cronjob,该工具使用户能够定义某些重复事件。
使用crontab -e打开您的crontab,并在末尾添加一行以定期运行elmo --check。例如(每10分钟一次)

*/10 * * * * elmo --check

接下来,我们需要确保cronjob的过程可以与图形子系统(X11)通信。在您的crontab顶部添加以下行

XDG_RUNTIME_DIR="/run/user/1000"

最后,如果您想使用自定义数据库位置,还必须向crontab提供ELMO_DATABASE_URL环境变量

ELMO_DATABASE_URL=/path/to/my/events.db

Windows系统

Windows生态系统实际上并没有提供cronjob的等效功能,它提供的是Windows任务计划程序,但无法每10分钟运行一次。有一些替代方案,如Task Till Dawn,但由于此软件不是开源的,我无法毫无保留地推荐它。
如果您发现一个好的方法,请随时为此README文件发起一个pull request。

为什么是Elmo?

嗯,我的狗的名字叫Elmo,他时不时地在吸引注意力方面表现得非常好。 ;)

依赖项

~39–75MB
~1.5M SLoC