#discord-rich-presence #rich-presence #lua #client #configuration #command #applications

app disco-rpc

使用简单 Lua 配置的 Discord 丰富显示功能的自定义客户端

3 个不稳定版本

0.2.1 2023 年 9 月 23 日
0.2.0 2023 年 8 月 17 日
0.1.0 2023 年 8 月 6 日

#4#discord-rich-presence

每月 26 次下载

无版权许可证

27KB
647

安装 | 用法 | 配置 | 示例

Disco

Github Crates.io Unlicense

Disco 是一个使用简单 Lua 配置的 Discord 丰富显示功能的自定义客户端。

安装

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',
}

结果

Discord Rich Presence

依赖项

~4–14MB
~169K SLoC