6 个版本
0.2.4 | 2023 年 8 月 19 日 |
---|---|
0.2.3 | 2023 年 7 月 23 日 |
0.1.0 | 2023 年 7 月 1 日 |
1331 在 命令行工具 中排名
每月下载量 61
49KB
880 行
nofi
由 Rofi 驱动的通知管理器
https://github.com/ellsclytn/nofi/assets/8725013/b3c5e53b-7ba9-44bd-a920-81a408b84cb9
nofi
是一个无干扰的通知中心。虽然大多数通知守护进程将即时弹出作为关键功能,但 nofi
将此功能设计为反功能:通知旨在查看,而不是打扰。用户可以通过启动 nofi
的 Rofi 驱动通知管理器来根据个人意愿查看通知。
nofi
是 freedesktop.org - 桌面通知规范 的服务器实现,并且可以通过 D-Bus 接收应用程序的通知。
名字的由来?
功能
- 模板驱动的通知文本(Jinja2/Django)。
- 根据匹配的通知运行自定义操作系统命令。
安装
从 crates.io
nofi
可从 crates.io 安装
$ cargo install nofi
最低支持的 Rust 版本是 1.64.0
。
Arch Linux
nofi
可通过 AUR 使用 AUR 辅助工具 安装。例如
aura -A nofi-bin
二进制发行版
请参阅 发行版页面 中不同操作系统/架构的可用二进制文件。
从源代码构建
先决条件
说明
- 克隆仓库。
$ git clone https://github.com/ellsclytn/nofi && cd nofi/
- 构建。
$ CARGO_TARGET_DIR=target cargo build --release
二进制文件将位于 target/release/nofi
。
使用方法
在Xorg启动时
您可以使用 xinitrc 或 xprofile 来自动启动 nofi
。
xinitrc
如果您是使用 xinit 手动启动Xorg,您可以在X服务器启动时通过 xinitrc 启动 nofi
$HOME/.xinitrc
:
nofi &
长时间运行程序(如通知守护进程)应在窗口管理器之前启动,因此它们应该自行派生或通过附加 &
符号在后台运行。否则,脚本将停止并等待每个程序退出,然后再执行窗口管理器或桌面环境。
如果由于 nofi
比窗口管理器启动得快而不可用,您可以在以下示例中添加延迟
{ sleep 2; nofi; } &
xprofile
如果您使用的是 显示管理器,您可以使用一个 xprofile 文件,该文件允许您在X用户会话开始时执行命令。
该xprofile文件为 ~/.xprofile
或 /etc/xprofile
,其样式类似于 xinitrc。
作为D-Bus服务
您可以创建一个D-Bus服务,在第一次通知动作时自动启动 nofi
。例如,您可以创建以下服务配置
/usr/share/dbus-1/services/org.ellsclytn.nofi.service
:
[D-BUS Service]
Name=org.freedesktop.Notifications
Exec=/usr/bin/nofi
每当应用程序通过向 org.freedesktop.Notifications
发送信号来发送通知时,D-Bus激活 nofi
。
作为systemd服务
~/.config/systemd/user/nofi.service
:
[Unit]
Description=Nofi notification daemon
Documentation=man:nofi(1)
PartOf=graphical-session.target
[Service]
Type=dbus
BusName=org.freedesktop.Notifications
ExecStart=/usr/bin/nofi
然后您可以重新加载systemd并启动/启用此服务
systemctl --user daemon-reload
systemctl --user start nofi.service
使用方法
nofi
使用 dbus-send(1)
接收控制指令。目前只有一个指令:查看通知历史。
# show the last notification
dbus-send --print-reply \
--dest=org.freedesktop.Notifications \
/org/freedesktop/Notifications/ctl \
org.freedesktop.Notifications.History
此示例用例之一是将此绑定到窗口管理器中的键,例如 i3
bindsym $mod+grave exec dbus-send --print-reply \
--dest=org.freedesktop.Notifications /org/freedesktop/Notifications/ctl org.freedesktop.Notifications.History
状态栏集成
nofi
通过UNIX套接字广播通知计数,其格式与 Rofication 相同。这意味着它可以通过 Rofication块 集成到状态栏,如 i3status-rust。套接字路径遵循 XDG基础目录 规范,通常在 /run/user/<UID>/nofi/socket
暴露套接字。这可能在系统之间有所不同,因此套接字路径在 nofi
启动时输出到 stdout
。
# Example i3status-rust integration
[[block]]
block = "rofication"
interval = 1
socket_path = "/run/user/1000/nofi/socket"
配置
nofi
配置文件支持 TOML 格式,默认配置值可以在 此处 找到。
配置覆盖可以放在 $HOME/.config/nofi/nofi.toml
或通过指定 NOFI_CONFIG
环境变量选择路径。
全局配置
log_verbosity
设置日志输出级别。可能的值包括:error
、warn
、info
、debug
和 trace
。
模板
设置通知消息的模板。语法基于 Jinja2 和 Django 模板。
简单来说,有三种分隔符:
{{
和}}
用于表达式{%
或{%-
和%}
或-%}
用于语句{#
和#}
用于注释
有关控制结构、内置过滤器等更多信息,请参阅 Tera 文档。
上下文
上下文是用于模板渲染的模型,它保存所需数据。以下示例中使用了 JSON 格式来表示上下文。
{
"app_name": "nofi",
"summary": "example",
"body": "this is a notification 🦡",
"urgency": "normal",
"unread_count": 1,
"timestamp": 1672426610
}
紧急程度配置
在 Freedesktop 规范中定义了3个紧急程度级别,它们定义了通知的重要性。
low
:例如,“joe 登录”normal
:例如,“你有邮件”critical
:例如,“你的电脑着火了!”
您可以根据这些紧急程度级别配置 nofi
的行为。为此,需要在配置文件中定义3个不同的部分。每个部分都有以下字段
[urgency_{level}] # urgency_low, urgency_normal or urgency_critical
custom_commands = []
custom_commands
使用此选项,您可以根据紧急程度和通知内容运行自定义操作系统命令。基本用法如下:
custom_commands = [
{ command = 'echo "{{app_name}} {{summary}} {{body}}"' } # echoes the notification to stdout
]
如上例所示,您可以通过 command
指定任意命令,该命令也通过模板引擎进行处理。这意味着您可以使用相同的 模板上下文。
通过使用 filter
和 command 来匹配 JSON 字段进行过滤。例如,如果您想为特定应用程序播放自定义通知声音
custom_commands = [
{ filter = '{ "app_name":"notify-send" }', command = 'aplay notification.wav' },
{ filter = '{ "app_name":"weechat" }', command = 'aplay irc.wav' }
]
JSON 过滤器可以有以下字段
app_name
:发送通知的应用程序的名称。summary
:通知的摘要。body
:通知的主体。
每个字段都使用正则表达式进行匹配,您可以将它们组合如下
custom_commands = [
{ filter = '{ "app_name":"telegram|discord|.*chat$","body":"^hello.*" }', command = 'gotify push -t "{{app_name}}" "someone said hi!"' }
]
在这个假设的例子中,当有人通过匹配正则表达式的任何聊天应用程序向我们打招呼时,我们会发送一个 Gotify 通知。
相关项目
- Rofication
- runst,这是此项目的分支。
许可证
根据您的要求,本软件可使用Apache License Version 2.0或MIT许可证。
版权信息
版权© 2023, Ellis Clayton
依赖项
约20-30MB
约377K SLoC