6 个版本

0.2.4 2023 年 8 月 19 日
0.2.3 2023 年 7 月 23 日
0.1.0 2023 年 7 月 1 日

1331命令行工具 中排名

Download history 40/week @ 2024-04-01

每月下载量 61

MIT 许可证

49KB
880

nofi

由 Rofi 驱动的通知管理器

GitHub Release Crate Release Continuous Integration Continuous Deployment Documentation

https://github.com/ellsclytn/nofi/assets/8725013/b3c5e53b-7ba9-44bd-a920-81a408b84cb9

nofi 是一个无干扰的通知中心。虽然大多数通知守护进程将即时弹出作为关键功能,但 nofi 将此功能设计为反功能:通知旨在查看,而不是打扰。用户可以通过启动 nofi 的 Rofi 驱动通知管理器来根据个人意愿查看通知。

nofi 是 freedesktop.org - 桌面通知规范 的服务器实现,并且可以通过 D-Bus 接收应用程序的通知。

名字的由来?

"通知" 和 "Rofi" 的混成词。

功能

  • 模板驱动的通知文本(Jinja2/Django)。
  • 根据匹配的通知运行自定义操作系统命令。

安装

从 crates.io

nofi 可从 crates.io 安装

$ cargo install nofi

最低支持的 Rust 版本是 1.64.0

Arch Linux

nofi 可通过 AUR 使用 AUR 辅助工具 安装。例如

aura -A nofi-bin

二进制发行版

请参阅 发行版页面 中不同操作系统/架构的可用二进制文件。

从源代码构建

先决条件

说明

  1. 克隆仓库。
$ git clone https://github.com/ellsclytn/nofi && cd nofi/
  1. 构建。
$ CARGO_TARGET_DIR=target cargo build --release

二进制文件将位于 target/release/nofi

使用方法

在Xorg启动时

您可以使用 xinitrcxprofile 来自动启动 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

设置日志输出级别。可能的值包括:errorwarninfodebugtrace

模板

设置通知消息的模板。语法基于 Jinja2Django 模板。

简单来说,有三种分隔符:

  • {{}} 用于表达式
  • {%{%-%}-%} 用于语句
  • {##} 用于注释

有关控制结构内置过滤器等更多信息,请参阅 Tera 文档

上下文

上下文是用于模板渲染的模型,它保存所需数据。以下示例中使用了 JSON 格式来表示上下文。

{
  "app_name": "nofi",
  "summary": "example",
  "body": "this is a notification 🦡",
  "urgency": "normal",
  "unread_count": 1,
  "timestamp": 1672426610
}

紧急程度配置

Freedesktop 规范中定义了3个紧急程度级别,它们定义了通知的重要性。

  1. low:例如,“joe 登录”
  2. normal:例如,“你有邮件”
  3. 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 指定任意命令,该命令也通过模板引擎进行处理。这意味着您可以使用相同的 模板上下文

通过使用 filtercommand 来匹配 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 通知。

许可证

根据您的要求,本软件可使用Apache License Version 2.0MIT许可证

版权© 2023, Ellis Clayton

依赖项

约20-30MB
约377K SLoC