Skip to content

Commit e021b25

Browse files
committed
🐞 fix: 修复 RPC 显示模式
1 parent afcdf3b commit e021b25

7 files changed

Lines changed: 64 additions & 44 deletions

File tree

Cargo.lock

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

native/discord-rpc-for-splayer/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ crate-type = ["cdylib"]
1010
napi = { version = "3.7", features = ["tokio_rt", "napi9"] }
1111
napi-derive = "3.4"
1212

13-
discord-rich-presence = "0.2"
13+
discord-rich-presence = "1.0"
1414
url = "2.5"
1515

1616
tracing = "0.1"

native/discord-rpc-for-splayer/index.d.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@ export interface DiscordConfigPayload {
1515
displayMode?: DiscordDisplayMode
1616
}
1717

18-
/** Discord 显示模式枚举 */
18+
/**
19+
* Discord 显示模式枚举
20+
* 控制 Discord 左下角 "正在听 - XXX" 的显示内容
21+
*/
1922
export declare enum DiscordDisplayMode {
20-
/** 显示为 "Listening to Spotify" */
23+
/** 仅歌曲名:显示为 "正在听 {歌曲名}" */
2124
Name = 0,
22-
/** 显示为 "Listening to Rick Astley" */
25+
/** 仅播放状态:显示为 "正在听 SPlayer" */
2326
State = 1,
24-
/** 显示为 "Listening to Never Gonna Give You Up" */
27+
/** 完整信息:显示为 "正在听 {歌曲名} - {歌手}" */
2528
Details = 2
2629
}
2730

native/discord-rpc-for-splayer/src/discord_core.rs

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ use std::sync::{LazyLock, Mutex};
33
use std::thread;
44
use std::time::{Duration, SystemTime, UNIX_EPOCH};
55

6-
use discord_rich_presence::activity::{Activity, ActivityType, Assets, Button, Timestamps};
6+
use discord_rich_presence::activity::{
7+
Activity, ActivityType, Assets, Button, StatusDisplayType, Timestamps,
8+
};
79
use discord_rich_presence::{DiscordIpc, DiscordIpcClient};
810
use tracing::{debug, info, warn};
911

@@ -36,24 +38,29 @@ struct ActivityData {
3638
current_time: f64,
3739
cached_cover_url: String,
3840
cached_song_url: String,
41+
/// 缓存 "歌曲名 - 歌手" 格式的完整信息
42+
cached_full_info: String,
3943
}
4044

4145
impl ActivityData {
4246
fn from_metadata(metadata: MetadataPayload) -> Self {
4347
let cached_cover_url = Self::process_cover_url(metadata.original_cover_url.as_deref());
4448
let cached_song_url = Self::process_song_url(metadata.ncm_id);
49+
let cached_full_info = format!("{} - {}", metadata.song_name, metadata.author_name);
4550
Self {
4651
metadata,
4752
status: PlaybackStatus::Paused,
4853
current_time: 0.0,
4954
cached_cover_url,
5055
cached_song_url,
56+
cached_full_info,
5157
}
5258
}
5359

5460
fn update_metadata(&mut self, metadata: MetadataPayload) {
5561
self.cached_cover_url = Self::process_cover_url(metadata.original_cover_url.as_deref());
5662
self.cached_song_url = Self::process_song_url(metadata.ncm_id);
63+
self.cached_full_info = format!("{} - {}", metadata.song_name, metadata.author_name);
5764
self.metadata = metadata;
5865
self.current_time = 0.0;
5966
}
@@ -110,7 +117,7 @@ impl Default for RpcWorker {
110117
connect_retry_count: 0,
111118
last_sent_end_timestamp: None,
112119
show_when_paused: false,
113-
display_mode: DiscordDisplayMode::Details,
120+
display_mode: DiscordDisplayMode::Name,
114121
}
115122
}
116123
}
@@ -182,20 +189,15 @@ impl RpcWorker {
182189
return;
183190
}
184191

185-
match DiscordIpcClient::new(APP_ID) {
186-
Ok(mut client) => match client.connect() {
187-
Ok(()) => {
188-
info!("Discord IPC 已连接");
189-
self.client = Some(client);
190-
self.last_sent_end_timestamp = None;
191-
}
192-
Err(e) => {
193-
info!("连接 Discord IPC 失败: {e:?}. Discord 可能未运行");
194-
self.connect_retry_count = RECONNECT_COOLDOWN_SECONDS;
195-
}
196-
},
192+
let mut client = DiscordIpcClient::new(APP_ID);
193+
match client.connect() {
194+
Ok(()) => {
195+
info!("Discord IPC 已连接");
196+
self.client = Some(client);
197+
self.last_sent_end_timestamp = None;
198+
}
197199
Err(e) => {
198-
info!("创建 Discord IPC 客户端失败: {e:?}");
200+
info!("连接 Discord IPC 失败: {e:?}. Discord 可能未运行");
199201
self.connect_retry_count = RECONNECT_COOLDOWN_SECONDS;
200202
}
201203
}
@@ -244,30 +246,42 @@ impl RpcWorker {
244246

245247
let buttons = vec![Button::new("🎧 Listen", &data.cached_song_url)];
246248

247-
let mut activity = Activity::new()
248-
.activity_type(ActivityType::Listening)
249-
.assets(assets)
250-
.buttons(buttons);
251-
252-
// 根据显示模式设置 details 和 state
253-
activity = match display_mode {
249+
// 根据显示模式设置左下角 "正在听 - XXX" 的显示内容
250+
// StatusDisplayType::Name -> 显示应用名称 (SPlayer)
251+
// StatusDisplayType::Details -> 显示 details 字段
252+
// StatusDisplayType::State -> 显示 state 字段
253+
match display_mode {
254254
DiscordDisplayMode::Name => {
255-
// 显示为 "Listening to SPlayer"
256-
activity.details("SPlayer")
255+
// 仅歌曲名:左下角显示歌曲名
256+
Activity::new()
257+
.details(&data.metadata.song_name)
258+
.state(&data.metadata.author_name)
259+
.activity_type(ActivityType::Listening)
260+
.assets(assets)
261+
.buttons(buttons)
262+
.status_display_type(StatusDisplayType::Details)
257263
}
258264
DiscordDisplayMode::State => {
259-
// 显示为 "Listening to {artist}"
260-
activity.details(&data.metadata.author_name)
265+
// 仅播放状态:左下角显示 SPlayer
266+
Activity::new()
267+
.details(&data.metadata.song_name)
268+
.state(&data.metadata.author_name)
269+
.activity_type(ActivityType::Listening)
270+
.assets(assets)
271+
.buttons(buttons)
272+
.status_display_type(StatusDisplayType::Name)
261273
}
262274
DiscordDisplayMode::Details => {
263-
// 显示为 "Listening to {song}" - by {artist}
264-
activity
265-
.details(&data.metadata.song_name)
275+
// 完整信息:左下角显示 "歌曲名 - 歌手"
276+
Activity::new()
277+
.details(&data.cached_full_info)
266278
.state(&data.metadata.author_name)
279+
.activity_type(ActivityType::Listening)
280+
.assets(assets)
281+
.buttons(buttons)
282+
.status_display_type(StatusDisplayType::Details)
267283
}
268-
};
269-
270-
activity
284+
}
271285
}
272286

273287
fn calc_paused_timestamps(current_time: f64, duration: f64) -> (i64, i64) {

native/discord-rpc-for-splayer/src/model.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
use napi_derive::napi;
22

33
/// Discord 显示模式枚举
4+
/// 控制 Discord 左下角 "正在听 - XXX" 的显示内容
45
#[napi]
56
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
67
pub enum DiscordDisplayMode {
7-
/// 显示为 "Listening to Spotify"
8+
/// 仅歌曲名:显示为 "正在听 {歌曲名}"
89
Name = 0,
9-
/// 显示为 "Listening to Rick Astley"
10+
/// 仅播放状态:显示为 "正在听 SPlayer"
1011
State = 1,
11-
/// 显示为 "Listening to Never Gonna Give You Up"
12+
/// 完整信息:显示为 "正在听 {歌曲名} - {歌手}"
1213
Details = 2,
1314
}
1415

src/components/Setting/ThirdSetting.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@
151151
class="set"
152152
v-model:value="settingStore.discordRpc.displayMode"
153153
:options="[
154-
{ label: '完整信息 (歌曲名/歌手)', value: 'details' },
155154
{ label: '仅歌曲名', value: 'name' },
155+
{ label: '完整信息 (歌曲名/歌手)', value: 'details' },
156156
{ label: '仅播放状态', value: 'state' },
157157
]"
158158
@update:value="handleDiscordConfigUpdate"

src/stores/setting.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ export const useSettingStore = defineStore("setting", {
439439
discordRpc: {
440440
enabled: false,
441441
showWhenPaused: true,
442-
displayMode: "details",
442+
displayMode: "name",
443443
},
444444
}),
445445
getters: {

0 commit comments

Comments
 (0)