Modularize Discord RPC (#247)

This commit delegates all Discord-related functions to DiscordManager.gd and adds a project setting bool to toggle using Discord RPC at all. Toggling off will reduce cpu and memory overhead when Discord is not needed.
This commit is contained in:
Jeod
2025-09-26 09:56:44 -04:00
committed by GitHub
parent c2eafee352
commit 1c309ce731
9 changed files with 72 additions and 29 deletions

View File

@@ -0,0 +1,63 @@
extends Node
var enabled: bool = ProjectSettings.get_setting("application/use_discord", false) and not (OS.has_feature("linux") and OS.has_feature("arm64"))
var rpc = null
class DiscordRPCStub:
var app_id
var start_timestamp
var details
var state
var large_image
var small_image
func start(): pass
func refresh(): pass
func get_is_discord_working() -> bool: return false
func shutdown(): pass
func _ready() -> void:
if enabled:
rpc = Engine.get_singleton("DiscordRPC")
else:
rpc = DiscordRPCStub.new()
setup_discord_rpc()
func _process(_delta: float) -> void:
if enabled:
rpc.run_callbacks()
func setup_discord_rpc() -> void:
if not enabled:
return
rpc.app_id = 1331261692381757562
rpc.start_timestamp = int(Time.get_unix_time_from_system())
rpc.details = "In Title Screen.."
if rpc.get_is_discord_working():
rpc.refresh()
func set_discord_status(details: String = "") -> void:
if not enabled:
return
rpc.details = details
if rpc.get_is_discord_working():
rpc.refresh()
func update_discord_status(details: String) -> void:
if not enabled:
return
rpc.details = details
rpc.state = details
rpc.large_image = (Global.level_theme + Global.theme_time).to_lower()
rpc.small_image = Global.current_campaign.to_lower()
if rpc.get_is_discord_working():
rpc.refresh()
func refresh_discord_rpc() -> void:
if not enabled:
return
if not rpc.get_is_discord_working():
return
Global.update_game_status()
update_discord_status("")
rpc.refresh()

View File

@@ -0,0 +1 @@
uid://yx2impqs0lo5

View File

@@ -169,7 +169,6 @@ func _ready() -> void:
get_server_version()
if OS.is_debug_build():
debug_mode = false
setup_discord_rpc()
check_for_rom()
func check_for_rom() -> void:
@@ -333,32 +332,11 @@ func close_freeze() -> void:
var recording_dir = "user://marathon_recordings/"
func setup_discord_rpc() -> void:
DiscordRPC.app_id = 1331261692381757562
DiscordRPC.start_timestamp = int(Time.get_unix_time_from_system())
DiscordRPC.details = "In Title Screen.."
if DiscordRPC.get_is_discord_working():
DiscordRPC.refresh()
func set_discord_status(details := "") -> void:
DiscordRPC.details = details
if DiscordRPC.get_is_discord_working():
DiscordRPC.refresh()
func update_game_status() -> void:
var lives_str := str(Global.lives)
if Settings.file.difficulty.inf_lives == 1:
lives_str = ""
var string := "Coins = " + str(Global.coins) + " Lives = " + lives_str
DiscordRPC.large_image = (Global.level_theme + Global.theme_time).to_lower()
DiscordRPC.small_image = Global.current_campaign.to_lower()
DiscordRPC.state = string
func refresh_discord_rpc() -> void:
if DiscordRPC.get_is_discord_working() == false:
return
update_game_status()
DiscordRPC.refresh()
func open_marathon_results() -> void:
get_node("GameHUD/MarathonResults").open()