3 个不稳定版本
0.2.1 | 2023 年 9 月 23 日 |
---|---|
0.2.0 | 2023 年 8 月 17 日 |
0.1.0 | 2023 年 8 月 6 日 |
每月 26 次下载
27KB
647 行
安装
Disco 可以从 crates.io 安装或从 GitHub 手动安装。
crates.io
假设您已经安装了 Rust 工具链,您可以通过运行以下命令安装 disco:
cargo install disco-rpc
为了允许 Lua 调用外部 C 库,还需要启用 unsafe
特性标志。
cargo install disco-rpc --features unsafe
GitHub
目前为 x86_64-linux-gnu 提供了预构建的二进制文件,带有和不带有 unsafe 标志。您还可以通过 cargo 从源代码构建 Disco。
git clone https://github.com/KaitlynEthylia/Disco
cd Disco
cargo install --path .
与 crates.io 安装类似,您可以在最终命令中附加 --features unsafe
。
用法
运行 disco
命令将自动查找 Lua 文件以读取配置,如 配置部分 中所述。您可以向命令传递一些参数以调整其运行方式。
当然,存在 -h, --help
和 -V, --version
标志。此外,还有一个 -p --print-config-path
标志,它将阻止程序运行并打印它通常会查找配置文件的路径。实际上影响程序的标志还有
-c, --config : 覆盖默认配置路径。
-i, --application-id : 设置要连接的 Discord 应用程序的 ID。
-r, --retry-after : 连接失败后重试。
-q, --quiet ...: 禁用打印多余信息。
-d, --dry-run: 解析配置但不连接到 Discord。
配置
Disco将首先检查是否通过命令行中的-c
标志提供了配置文件。如果没有,它将检查DISCO_CONFIG
环境变量。如果没有设置该变量,它将接着检查$XDG_CONFIG_HOME/disco.lua
,最后检查$HOME/disco.lua
。
如果它仍然找不到配置文件,将会报错。没有默认配置。
丰富的存在感由一系列可以在配置文件中设置的变量组成。
变量 | 类型 | 描述 |
---|---|---|
Active | 布尔值 | 是否显示丰富的存在感。 |
Details | 字符串 | 丰富存在感的第一行。 |
State | 字符串 | 丰富存在感的第二行。 |
Timestaamp | 时间戳 | 时间戳,用于计数或倒计时,出现在State所在的位置。请注意,时间戳可能会有问题。如果丰富的存在感没有显示,您可能设置了此值不正确,请删除它并查看是否解决了问题。 |
LargeImage | 图像 | 存在感左侧的主要图像。 |
SmallImage | 图像 | 大图像左下角的图像。 |
Button1 | 按钮 | 可以跳转至URL的按钮。 |
Button2 | 按钮 | 第二个可以跳转至URL的按钮。Discord最多支持2个。 |
Timestamp、Image和Button类型不是Lua的一部分,它们各自代表
类型 | 说明 | 示例 |
---|---|---|
时间戳 | 一个包含start 键的选项表,以及一个可选的_end 键。或者,一个单独的整数,相当于设置start 但不是_end 。 |
{ start = 12345, _end = 23456 } 或10000 。 |
图像 | 图像的URL或第一个元素是URL的表,以及一个键text ,表示在悬停图像上出现的文本。 |
'https://example.com/image.png' 或{ 'https://example.com/image.png', text = "Some Image" } 。 |
按钮 | 要跳转到的URL或第一个元素是要在图像上显示的文本的表,以及一个键url ,表示要跳转到的URL。 |
'https://example.org' 或{ 'Example Website', url = 'https://example.org' } 。 |
这些变量可以通过三种不同的方式设置
- 可以通过分配变量值来简单地设置。我们将称之为“静态变量”,因为其值在整个程序中不会改变。
State = "Some Text"
- 可以通过表格来设置。第二个元素是一个返回值的函数,第一个元素是这个函数连续调用之间的秒数。我们将称之为“轮询变量”。
State = { 60, function()
return os.date("%H:%M")
end }
在这里,每60秒运行一次 os.date()
函数来获取系统时间。
- 最后,可以通过协程来设置。这个协程将不断恢复,并且应该每次都提供一个要设置的值。
State = coroutine.create(function()
for i = 1, 10, 1 do
coroutine.yield("Number: " .. i)
end
end)
在这个例子中,协程数到十然后停止返回。一旦停止,最终值将保持不变。这个例子是虚构的,但更复杂的例子可以在 示例部分 看到
此外。除了直接赋值外,还可以提供一个函数,该函数将立即返回值。这确保即使在应用程序需要启动多个Lua VM的情况下,值也只计算一次。
Disco还可以调用外部Lua库,但如果该库需要C库,则需要启用unsafe
功能标志。
-- requires the `http` library to be installed, as well as the
-- `unsafe` feature to be enabled.
local request = require 'http.request'
local _, stream = request.new_from_uri('https://api.rot26.org/encrypt/test'):go()
State = stream:get_body_as_string()
示例
以下是我用于我的Arch Linux + Hyprland设置的个性化配置,以展示一些详细信息。这并不是我实际使用的,但我略微修改了它来演示一些我没有使用的功能,例如轮询。
-- ID of the application I created for ArchLinux via
-- https://discord.com/developers/applications
ApplicationID = 1137762526541656105
-- Display the rich presence
Active = true
-- Show what time it is on my machine on the first line, rerun
-- the function every 60 seconds.
Details = { 60, function()
return "My Time: " .. os.date("%H:%M")
end }
-- Plug into the Hyprland socket to show which window is currently
-- active, and update every time I switch window.
State = coroutine.create(function()
local handle = io.popen([[
socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - |
stdbuf -o0 awk -F '>>|,' '/^activewindow>>/{ $2 = toupper(substr($2, 1, 1)) substr($2, 2); print $2}'
]])
if not handle then return end
for line in handle:lines() do
coroutine.yield("Using: " .. line)
end
end)
-- Display the Arch Linux logo
LargeImage = {
'https://seeklogo.com/images/A/arch-linux-logo-3C25E68BA9-seeklogo.com.png',
text = 'Arch Linux',
}
-- Include the Hyprland logo in the corner
SmallImage = {
'https://i.imgur.com/PanwaBQ.png',
text = 'Hyprland',
}
-- A really cool button
Button1 = {
'Press This Button!',
url = 'https://youtu.be/dQw4w9WgXcQ',
}
结果
依赖项
~4–14MB
~169K SLoC