Skip to content

Commit def2523

Browse files
committed
feat(rp-app): add detailsUrl, stateUrl and min 2-char padding
- Add detailsUrl and stateUrl fields to make text lines clickable - Add minimum 2-character padding using Hangul filler (same as ytb-music) - Update UI with URL input fields for details and state - Discord rejects text fields shorter than 2 characters, padding prevents this
1 parent 1bdfac5 commit def2523

File tree

3 files changed

+50
-12
lines changed

3 files changed

+50
-12
lines changed

rp-app/src/main/discord-service.js

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -197,30 +197,38 @@ class DiscordService {
197197
payload.statusDisplayType = activity.statusDisplayType;
198198
}
199199

200-
// Details (first line)
200+
// Details (first line) - min 2 chars required
201201
if (activity.details && activity.details.trim()) {
202-
payload.details = this._truncate(activity.details, 128);
202+
payload.details = this._padToMinLength(this._truncate(activity.details, 128));
203+
}
204+
// Details URL (makes details clickable)
205+
if (activity.detailsUrl && activity.detailsUrl.trim()) {
206+
payload.detailsUrl = activity.detailsUrl;
203207
}
204208

205-
// State (second line)
209+
// State (second line) - min 2 chars required
206210
if (activity.state && activity.state.trim()) {
207-
payload.state = this._truncate(activity.state, 128);
211+
payload.state = this._padToMinLength(this._truncate(activity.state, 128));
212+
}
213+
// State URL (makes state clickable)
214+
if (activity.stateUrl && activity.stateUrl.trim()) {
215+
payload.stateUrl = activity.stateUrl;
208216
}
209217

210218
// Large image
211219
if (activity.largeImageKey && activity.largeImageKey.trim()) {
212220
payload.largeImageKey = activity.largeImageKey;
213221
}
214222
if (activity.largeImageText && activity.largeImageText.trim()) {
215-
payload.largeImageText = this._truncate(activity.largeImageText, 128);
223+
payload.largeImageText = this._padToMinLength(this._truncate(activity.largeImageText, 128));
216224
}
217225

218226
// Small image
219227
if (activity.smallImageKey && activity.smallImageKey.trim()) {
220228
payload.smallImageKey = activity.smallImageKey;
221229
}
222230
if (activity.smallImageText && activity.smallImageText.trim()) {
223-
payload.smallImageText = this._truncate(activity.smallImageText, 128);
231+
payload.smallImageText = this._padToMinLength(this._truncate(activity.smallImageText, 128));
224232
}
225233

226234
// Timestamps
@@ -263,6 +271,19 @@ class DiscordService {
263271
return str.substring(0, maxLength - 3) + '...';
264272
}
265273

274+
/**
275+
* Pad string to minimum length (Discord requires min 2 chars)
276+
* Uses Unicode Hangul filler character (invisible)
277+
*/
278+
_padToMinLength(str, minLength = 2) {
279+
if (!str) return str;
280+
const FILLER = '\u3164'; // Hangul filler (invisible)
281+
if (str.length > 0 && str.length < minLength) {
282+
return str + FILLER.repeat(minLength - str.length);
283+
}
284+
return str;
285+
}
286+
266287
/**
267288
* Clear Discord activity
268289
*/

rp-app/src/renderer/index.html

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,27 @@ <h2>Activity Type</h2>
5858
<!-- Text Fields -->
5959
<section class="section">
6060
<h2>Text</h2>
61-
<div class="form-group">
62-
<label for="details">Details (Line 1)</label>
63-
<input type="text" id="details" placeholder="What are you doing?" maxlength="128">
61+
<div class="form-row">
62+
<div class="form-group">
63+
<label for="details">Details (Line 1)</label>
64+
<input type="text" id="details" placeholder="What are you doing?" maxlength="128" minlength="2">
65+
</div>
66+
<div class="form-group">
67+
<label for="detailsUrl">Details URL</label>
68+
<input type="text" id="detailsUrl" placeholder="https://... (clickable link)">
69+
</div>
6470
</div>
65-
<div class="form-group">
66-
<label for="state">State (Line 2)</label>
67-
<input type="text" id="state" placeholder="Additional info" maxlength="128">
71+
<div class="form-row">
72+
<div class="form-group">
73+
<label for="state">State (Line 2)</label>
74+
<input type="text" id="state" placeholder="Additional info" maxlength="128" minlength="2">
75+
</div>
76+
<div class="form-group">
77+
<label for="stateUrl">State URL</label>
78+
<input type="text" id="stateUrl" placeholder="https://... (clickable link)">
79+
</div>
6880
</div>
81+
<small>Text fields must be at least 2 characters. URLs make the text clickable.</small>
6982
</section>
7083

7184
<!-- Images -->

rp-app/src/renderer/renderer.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ const statusText = document.querySelector('.status-text');
1111
const activityType = document.getElementById('activityType');
1212
const statusDisplayType = document.getElementById('statusDisplayType');
1313
const details = document.getElementById('details');
14+
const detailsUrl = document.getElementById('detailsUrl');
1415
const state = document.getElementById('state');
16+
const stateUrl = document.getElementById('stateUrl');
1517
const largeImageKey = document.getElementById('largeImageKey');
1618
const largeImageText = document.getElementById('largeImageText');
1719
const smallImageKey = document.getElementById('smallImageKey');
@@ -106,7 +108,9 @@ function getActivityData() {
106108
type: parseInt(activityType.value),
107109
statusDisplayType: parseInt(statusDisplayType.value),
108110
details: details.value,
111+
detailsUrl: detailsUrl.value,
109112
state: state.value,
113+
stateUrl: stateUrl.value,
110114
largeImageKey: largeImageKey.value,
111115
largeImageText: largeImageText.value,
112116
smallImageKey: smallImageKey.value,

0 commit comments

Comments
 (0)