fix: truncate long activity fields to prevent Discord rejection (#18)
This commit is contained in:
36
rpc.go
36
rpc.go
@@ -55,6 +55,30 @@ const (
|
||||
|
||||
const heartbeatInterval = 41 // Heartbeat interval in seconds
|
||||
|
||||
// Discord API field length limits
|
||||
const (
|
||||
maxTextLength = 128 // Max characters for text fields (details, state, name, large_text)
|
||||
maxURLLength = 256 // Max characters for URL fields (details_url, state_url, etc.)
|
||||
)
|
||||
|
||||
// truncateText truncates s to maxTextLength runes, appending "…" if truncated.
|
||||
func truncateText(s string) string {
|
||||
runes := []rune(s)
|
||||
if len(runes) <= maxTextLength {
|
||||
return s
|
||||
}
|
||||
return string(runes[:maxTextLength-1]) + "…"
|
||||
}
|
||||
|
||||
// truncateURL returns s unchanged if within maxURLLength, otherwise returns ""
|
||||
// (a truncated URL would be broken, so we omit it entirely).
|
||||
func truncateURL(s string) string {
|
||||
if len(s) <= maxURLLength {
|
||||
return s
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// activity represents a Discord activity sent via Gateway opcode 3.
|
||||
type activity struct {
|
||||
Name string `json:"name"`
|
||||
@@ -200,6 +224,18 @@ func (r *discordRPC) processImage(imageURL, clientID, token string, ttl int64) (
|
||||
func (r *discordRPC) sendActivity(clientID, username, token string, data activity) error {
|
||||
pdk.Log(pdk.LogInfo, fmt.Sprintf("Sending activity for user %s: %s - %s", username, data.Details, data.State))
|
||||
|
||||
// Truncate text fields to Discord's 128-character limit
|
||||
data.Name = truncateText(data.Name)
|
||||
data.Details = truncateText(data.Details)
|
||||
data.State = truncateText(data.State)
|
||||
data.Assets.LargeText = truncateText(data.Assets.LargeText)
|
||||
|
||||
// Omit URLs that exceed Discord's 256-character limit
|
||||
data.DetailsURL = truncateURL(data.DetailsURL)
|
||||
data.StateURL = truncateURL(data.StateURL)
|
||||
data.Assets.LargeURL = truncateURL(data.Assets.LargeURL)
|
||||
data.Assets.SmallURL = truncateURL(data.Assets.SmallURL)
|
||||
|
||||
// Try track artwork first, fall back to Navidrome logo
|
||||
usingDefaultImage := false
|
||||
processedImage, err := r.processImage(data.Assets.LargeImage, clientID, token, imageCacheTTL)
|
||||
|
||||
Reference in New Issue
Block a user