diff --git a/.gitignore b/.gitignore
index e8a0a31..355b9ff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@ temp
build
android
assets/*
+env.*
.godot/*
!/.godot/uid_cache.bin
diff --git a/addons/discord-rpc-gd/Debug.svg b/addons/discord-rpc-gd/Debug.svg
new file mode 100644
index 0000000..7987166
--- /dev/null
+++ b/addons/discord-rpc-gd/Debug.svg
@@ -0,0 +1,10 @@
+
diff --git a/addons/discord-rpc-gd/Logo_V2_No_Bg.png b/addons/discord-rpc-gd/Logo_V2_No_Bg.png
new file mode 100644
index 0000000..fb6c700
Binary files /dev/null and b/addons/discord-rpc-gd/Logo_V2_No_Bg.png differ
diff --git a/addons/discord-rpc-gd/READ_ME_PLEASE.txt b/addons/discord-rpc-gd/READ_ME_PLEASE.txt
new file mode 100644
index 0000000..a98427b
--- /dev/null
+++ b/addons/discord-rpc-gd/READ_ME_PLEASE.txt
@@ -0,0 +1,7 @@
+MINIMUM GODOT VERSION: 4.2
+
+PLEASE ACTIVATE THE PLUGIN UNDER Project -> Project Settings... -> Plugins -> DiscordRPC -> Status
+IGNORE THE RED ERRORS ON THE FIRST 2 RESTARTS
+READ THE TUTORIAL LINKED IN THE WINDOW THAT WILL OPEN ON PLUGIN ENABLE
+
+If nothing works, enable the plugin and delete /addons/discord-rpc-gd/bin/.gdignore
diff --git a/addons/discord-rpc-gd/bin/discord-rpc-gd.gdextension b/addons/discord-rpc-gd/bin/discord-rpc-gd.gdextension
new file mode 100644
index 0000000..27e2845
--- /dev/null
+++ b/addons/discord-rpc-gd/bin/discord-rpc-gd.gdextension
@@ -0,0 +1,29 @@
+[configuration]
+
+entry_symbol = "discordrpcgd_library_init"
+compatibility_minimum = 4.1
+
+[libraries]
+
+macos.debug = "macos/libdiscord_game_sdk_binding_debug.dylib"
+macos.release = "macos/libdiscord_game_sdk_binding.dylib"
+windows.debug.x86_64 = "windows/discord_game_sdk_binding_debug.dll"
+windows.release.x86_64 = "windows/discord_game_sdk_binding.dll"
+linux.debug.x86_64 = "linux/libdiscord_game_sdk_binding_debug.so"
+linux.release.x86_64 = "linux/libdiscord_game_sdk_binding.so"
+linux.debug.arm64 = "linux/libdiscord_game_sdk_binding_debug.so"
+linux.release.arm64 = "linux/libdiscord_game_sdk_binding.so"
+linux.debug.rv64 = "linux/libdiscord_game_sdk_binding_debug.so"
+linux.release.rv64 = "linux/libdiscord_game_sdk_binding.so"
+
+[dependencies]
+
+macos = { "macos/libdiscord_game_sdk.dylib": "" }
+windows.debug.x86_64 = { "windows/discord_game_sdk.dll": "" }
+windows.release.x86_64 = { "windows/discord_game_sdk.dll": "" }
+linux.debug.x86_64 = { "linux/libdiscord_game_sdk.so": "" }
+linux.release.x86_64 = { "linux/libdiscord_game_sdk.so": "" }
+linux.debug.arm64 = { "linux/libdiscord_game_sdk.so": "" }
+linux.release.arm64 = { "linux/libdiscord_game_sdk.so": "" }
+linux.debug.rv64 = { "linux/libdiscord_game_sdk.so": "" }
+linux.release.rv64 = { "linux/libdiscord_game_sdk.so": "" }
diff --git a/addons/discord-rpc-gd/bin/linux/libdiscord_game_sdk.so b/addons/discord-rpc-gd/bin/linux/libdiscord_game_sdk.so
new file mode 100644
index 0000000..9dacf94
Binary files /dev/null and b/addons/discord-rpc-gd/bin/linux/libdiscord_game_sdk.so differ
diff --git a/addons/discord-rpc-gd/bin/linux/libdiscord_game_sdk_binding.so b/addons/discord-rpc-gd/bin/linux/libdiscord_game_sdk_binding.so
new file mode 100644
index 0000000..f9863c4
Binary files /dev/null and b/addons/discord-rpc-gd/bin/linux/libdiscord_game_sdk_binding.so differ
diff --git a/addons/discord-rpc-gd/bin/linux/libdiscord_game_sdk_binding_debug.so b/addons/discord-rpc-gd/bin/linux/libdiscord_game_sdk_binding_debug.so
new file mode 100644
index 0000000..89bf7da
Binary files /dev/null and b/addons/discord-rpc-gd/bin/linux/libdiscord_game_sdk_binding_debug.so differ
diff --git a/addons/discord-rpc-gd/bin/macos/libdiscord_game_sdk.dylib b/addons/discord-rpc-gd/bin/macos/libdiscord_game_sdk.dylib
new file mode 100644
index 0000000..2cc726d
Binary files /dev/null and b/addons/discord-rpc-gd/bin/macos/libdiscord_game_sdk.dylib differ
diff --git a/addons/discord-rpc-gd/bin/macos/libdiscord_game_sdk_binding.dylib b/addons/discord-rpc-gd/bin/macos/libdiscord_game_sdk_binding.dylib
new file mode 100644
index 0000000..cfcd1a7
Binary files /dev/null and b/addons/discord-rpc-gd/bin/macos/libdiscord_game_sdk_binding.dylib differ
diff --git a/addons/discord-rpc-gd/bin/macos/libdiscord_game_sdk_binding_debug.dylib b/addons/discord-rpc-gd/bin/macos/libdiscord_game_sdk_binding_debug.dylib
new file mode 100644
index 0000000..082e396
Binary files /dev/null and b/addons/discord-rpc-gd/bin/macos/libdiscord_game_sdk_binding_debug.dylib differ
diff --git a/addons/discord-rpc-gd/bin/windows/discord_game_sdk.dll b/addons/discord-rpc-gd/bin/windows/discord_game_sdk.dll
new file mode 100644
index 0000000..be946ea
Binary files /dev/null and b/addons/discord-rpc-gd/bin/windows/discord_game_sdk.dll differ
diff --git a/addons/discord-rpc-gd/bin/windows/discord_game_sdk_binding.dll b/addons/discord-rpc-gd/bin/windows/discord_game_sdk_binding.dll
new file mode 100644
index 0000000..77ffef2
Binary files /dev/null and b/addons/discord-rpc-gd/bin/windows/discord_game_sdk_binding.dll differ
diff --git a/addons/discord-rpc-gd/bin/windows/discord_game_sdk_binding_debug.dll b/addons/discord-rpc-gd/bin/windows/discord_game_sdk_binding_debug.dll
new file mode 100644
index 0000000..2b52a76
Binary files /dev/null and b/addons/discord-rpc-gd/bin/windows/discord_game_sdk_binding_debug.dll differ
diff --git a/addons/discord-rpc-gd/bin/windows/discord_game_sdk_x86.dll b/addons/discord-rpc-gd/bin/windows/discord_game_sdk_x86.dll
new file mode 100644
index 0000000..45b9bb1
Binary files /dev/null and b/addons/discord-rpc-gd/bin/windows/discord_game_sdk_x86.dll differ
diff --git a/addons/discord-rpc-gd/bin/windows/~discord_game_sdk_binding_debug.dll b/addons/discord-rpc-gd/bin/windows/~discord_game_sdk_binding_debug.dll
new file mode 100644
index 0000000..2b52a76
Binary files /dev/null and b/addons/discord-rpc-gd/bin/windows/~discord_game_sdk_binding_debug.dll differ
diff --git a/addons/discord-rpc-gd/example.gd b/addons/discord-rpc-gd/example.gd
new file mode 100644
index 0000000..b4a9fc8
--- /dev/null
+++ b/addons/discord-rpc-gd/example.gd
@@ -0,0 +1,38 @@
+class_name DiscordRPCTutorial
+extends Node
+
+## 1. Put the addons/ folder in your Godot project[br]
+## 2. Enable the addon in your Project Settings under "Plugins" and "DiscordRPC". [br](if it doesn't show up restart your project and try again)[br]
+## 3. Restart your project[br]
+## 4. Create an Application under https://discord.com/developers/applications and get the Application ID br]
+## 5. (optional) Set images under "Rich Presence" and "Art Assets" and remember the keys[br]
+##
+## This is your [code]_ready()[/code] function wich could be anywhere
+## [codeblock]
+## func _ready():
+## # Application ID
+## DiscordRPC.app_id = 1099618430065324082
+## # this is boolean if everything worked
+## print("Discord working: " + str(DiscordRPC.get_is_discord_working()))
+## # Set the first custom text row of the activity here
+## DiscordRPC.details = "A demo activity by vaporvee#1231"
+## # Set the second custom text row of the activity here
+## DiscordRPC.state = "Checkpoint 23/23"
+## # Image key for small image from "Art Assets" from the Discord Developer website
+## DiscordRPC.large_image = "game"
+## # Tooltip text for the large image
+## DiscordRPC.large_image_text = "Try it now!"
+## # Image key for large image from "Art Assets" from the Discord Developer website
+## DiscordRPC.small_image = "boss"
+## # Tooltip text for the small image
+## DiscordRPC.small_image_text = "Fighting the end boss! D:"
+## # "02:41 elapsed" timestamp for the activity
+## DiscordRPC.start_timestamp = int(Time.get_unix_time_from_system())
+## # "59:59 remaining" timestamp for the activity
+## DiscordRPC.end_timestamp = int(Time.get_unix_time_from_system()) + 3600
+## # Always refresh after changing the values!
+## DiscordRPC.refresh()
+## [/codeblock]
+##
+## @tutorial(More information here): https://github.com/vaporvee/discord-rpc-godot/wiki/Quick-start
+## @tutorial(Make your Application ID and else here): https://discord.com/developers/applications
diff --git a/addons/discord-rpc-gd/logo.png b/addons/discord-rpc-gd/logo.png
new file mode 100644
index 0000000..fb6c700
Binary files /dev/null and b/addons/discord-rpc-gd/logo.png differ
diff --git a/addons/discord-rpc-gd/nodes/Debug.tscn b/addons/discord-rpc-gd/nodes/Debug.tscn
new file mode 100644
index 0000000..4006631
--- /dev/null
+++ b/addons/discord-rpc-gd/nodes/Debug.tscn
@@ -0,0 +1,267 @@
+[gd_scene load_steps=9 format=3 uid="uid://c1slhdnlsv2qt"]
+
+[ext_resource type="Texture2D" uid="uid://dnfq6kug4x6o2" path="res://addons/discord-rpc-gd/nodes/assets/Checked.svg" id="2_q6tao"]
+[ext_resource type="Texture2D" uid="uid://compmm3kviqqe" path="res://addons/discord-rpc-gd/nodes/assets/Unchecked.svg" id="3_5cyem"]
+[ext_resource type="Texture2D" uid="uid://dtc6ckladq0td" path="res://addons/discord-rpc-gd/nodes/assets/circle.svg" id="3_goflf"]
+
+[sub_resource type="GDScript" id="GDScript_ak1tp"]
+resource_name = "Debug"
+script/source = "extends Node
+
+func _ready():
+ DiscordRPC.connect(\"activity_join_request\",_on_activity_join_request)
+
+func _process(_delta):
+ if(DiscordRPC.get_is_discord_working()):
+ $Panel/TextureRect.self_modulate = Color(\"#3eff8d\")
+ $Panel/TextureRect/AnimationPlayer.play(\"pulsate\")
+ debug_text_update()
+ else:
+ $Panel/TextureRect.self_modulate = Color(\"#797979\")
+ $Panel/TextureRect/AnimationPlayer.stop()
+ debug_text_update()
+
+
+func debug_text_update():
+ $Panel/Info.text = \"Application ID : {id}
+Details: {details}
+State: {state}
+
+Large image key: {lkey}
+Large image text: {ltext}
+Small image key: {skey}
+Small image text: {stext}
+
+Start timestamp: {stimestamp}
+End timestamp: {etimestamp}
+
+Party ID: {partyid}
+Current party size: {cpartysize}
+Max party size: {mpartysize}
+Match secret: {msecret}
+Join secret: {jsecret}
+Spectate secret: {ssecret}
+Is party public: {ppublic} (needs to be activated in Discord client settings)
+
+Is instanced: {instanced}
+\"
+ $Panel/Info.text = $Panel/Info.text.replace(\"{ppublic}\",str(DiscordRPC.is_public_party)).replace(\"{instanced}\",str(DiscordRPC.instanced)).replace(\"{ssecret}\",DiscordRPC.spectate_secret).replace(\"{jsecret}\",DiscordRPC.join_secret).replace(\"{msecret}\",DiscordRPC.match_secret).replace(\"{mpartysize}\",str(DiscordRPC.max_party_size)).replace(\"{cpartysize}\",str(DiscordRPC.current_party_size)).replace(\"{partyid}\",DiscordRPC.party_id).replace(\"{id}\",str(DiscordRPC.app_id)).replace(\"{details}\",DiscordRPC.details).replace(\"{state}\",DiscordRPC.state).replace(\"{lkey}\",DiscordRPC.large_image).replace(\"{ltext}\",DiscordRPC.large_image_text).replace(\"{skey}\",DiscordRPC.small_image).replace(\"{stext}\",DiscordRPC.small_image_text).replace(\"{stimestamp}\",str(DiscordRPC.start_timestamp)).replace(\"{etimestamp}\",str(DiscordRPC.end_timestamp))
+
+var user_request = {};
+
+func _on_activity_join_request(user_requesting):
+ print(user_requesting)
+ user_request = user_requesting
+
+func _on_accept_join_request_pressed():
+ if(!user_request.is_empty()):
+ DiscordRPC.accept_join_request(user_request.id)
+
+func _on_invite_with_user_id_text_submitted(new_text):
+ DiscordRPC.send_invite(int(new_text),true,\"this is a test invite sent from godot\")
+
+func _on_accept_with_user_id_text_submitted(new_text):
+ DiscordRPC.accept_invite(int(new_text))
+
+func _on_print_current_user_on_console_pressed():
+ print(DiscordRPC.get_current_user())
+
+func _on_toggle_sdk_toggled(button_pressed):
+ if(button_pressed):
+ DiscordRPC.unclear()
+ else:
+ DiscordRPC.clear(false)
+
+func _on_print_friends_pressed():
+ print(DiscordRPC.get_all_relationships())
+"
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8abo6"]
+
+[sub_resource type="Animation" id="Animation_mmtmn"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath(".:scale")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0.4),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector2(0.5, 0.5)]
+}
+
+[sub_resource type="Animation" id="Animation_5u02v"]
+resource_name = "pulsate"
+loop_mode = 1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath(".:scale")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 0.5, 1),
+"transitions": PackedFloat32Array(1, 1, 1),
+"update": 0,
+"values": [Vector2(0.5, 0.5), Vector2(0.8, 0.8), Vector2(0.5, 0.5)]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_a7ofc"]
+_data = {
+"RESET": SubResource("Animation_mmtmn"),
+"pulsate": SubResource("Animation_5u02v")
+}
+
+[node name="DebugNodeGroup" type="Node"]
+editor_description = "This is a Debug Node wich will show (only if the project runs) some usefull info and buttons/input"
+script = SubResource("GDScript_ak1tp")
+
+[node name="Panel" type="Panel" parent="."]
+anchors_preset = -1
+anchor_right = 0.373
+anchor_bottom = 1.0
+offset_left = -5.0
+offset_right = 0.303955
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Info" type="RichTextLabel" parent="Panel"]
+layout_mode = 0
+offset_left = 12.0
+offset_top = 21.0
+offset_right = 429.0
+offset_bottom = 461.0
+theme_override_font_sizes/normal_font_size = 14
+text = "Application ID : {id}
+Details: {details}
+State: {state}
+
+Large image key: {lkey}
+Large image text: {ltext}
+Small image key: {skey}
+Small image text: {stext}
+
+Start timestamp: {stimestamp}
+End timestamp: {etimestamp}
+
+Party ID: {partyid}
+Current party size: {cpartysize}
+Max party size: {mpartysize}
+Match secret: {msecret}
+Join secret: {jsecret}
+Spectate secret: {ssecret}
+Is party public: {ppublic} (needs to be activated in Discord client settings)
+
+Is instanced: {instanced}
+"
+fit_content = true
+
+[node name="PrintCurrentUserOnConsole" type="Button" parent="Panel"]
+layout_mode = 1
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_left = 12.0
+offset_top = 138.375
+offset_right = 245.0
+offset_bottom = 171.375
+grow_vertical = 2
+text = "Print current user on console"
+
+[node name="PrintFriends" type="Button" parent="Panel"]
+layout_mode = 1
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_left = 12.0
+offset_top = 176.5
+offset_right = 204.0
+offset_bottom = 207.5
+grow_vertical = 2
+text = "Print friends on console"
+
+[node name="AcceptJoinRequest" type="Button" parent="Panel"]
+layout_mode = 1
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_left = 12.0
+offset_top = 212.875
+offset_right = 154.0
+offset_bottom = 243.875
+grow_vertical = 2
+text = "ACCEPT REQUEST"
+
+[node name="InviteWithUserID" type="LineEdit" parent="Panel"]
+layout_mode = 1
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_left = 11.0
+offset_top = 250.375
+offset_right = 210.0
+offset_bottom = 281.375
+grow_vertical = 2
+size_flags_horizontal = 0
+placeholder_text = "Invite with user_id here"
+
+[node name="AcceptWithUserID" type="LineEdit" parent="Panel"]
+layout_mode = 1
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_left = 11.0
+offset_top = 286.875
+offset_right = 260.0
+offset_bottom = 317.875
+grow_vertical = 2
+placeholder_text = "Accept Invite with user_id here"
+
+[node name="ToggleSDK" type="CheckButton" parent="Panel"]
+layout_mode = 1
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_left = 298.0
+offset_top = 157.375
+offset_right = 1144.0
+offset_bottom = 665.375
+grow_vertical = 2
+scale = Vector2(0.05, 0.05)
+theme_override_icons/checked = ExtResource("2_q6tao")
+theme_override_icons/unchecked = ExtResource("3_5cyem")
+theme_override_styles/focus = SubResource("StyleBoxEmpty_8abo6")
+button_pressed = true
+
+[node name="TextureRect" type="TextureRect" parent="Panel"]
+self_modulate = Color(0.47451, 0.47451, 0.47451, 1)
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.88
+anchor_top = 0.762
+anchor_right = 0.88
+anchor_bottom = 0.762
+offset_left = -28.8
+offset_top = -28.776
+offset_right = 28.0841
+offset_bottom = 28.1082
+grow_horizontal = 2
+grow_vertical = 2
+scale = Vector2(0.5, 0.5)
+pivot_offset = Vector2(29.0693, 29.0693)
+texture = ExtResource("3_goflf")
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="Panel/TextureRect"]
+libraries = {
+"": SubResource("AnimationLibrary_a7ofc")
+}
+
+[connection signal="pressed" from="Panel/PrintCurrentUserOnConsole" to="." method="_on_print_current_user_on_console_pressed"]
+[connection signal="pressed" from="Panel/PrintFriends" to="." method="_on_print_friends_pressed"]
+[connection signal="pressed" from="Panel/AcceptJoinRequest" to="." method="_on_accept_join_request_pressed"]
+[connection signal="text_submitted" from="Panel/InviteWithUserID" to="." method="_on_invite_with_user_id_text_submitted"]
+[connection signal="text_submitted" from="Panel/AcceptWithUserID" to="." method="_on_accept_with_user_id_text_submitted"]
+[connection signal="toggled" from="Panel/ToggleSDK" to="." method="_on_toggle_sdk_toggled"]
diff --git a/addons/discord-rpc-gd/nodes/assets/Checked.svg b/addons/discord-rpc-gd/nodes/assets/Checked.svg
new file mode 100644
index 0000000..d37a1c2
--- /dev/null
+++ b/addons/discord-rpc-gd/nodes/assets/Checked.svg
@@ -0,0 +1,18 @@
+
diff --git a/addons/discord-rpc-gd/nodes/assets/Unchecked.svg b/addons/discord-rpc-gd/nodes/assets/Unchecked.svg
new file mode 100644
index 0000000..58cb234
--- /dev/null
+++ b/addons/discord-rpc-gd/nodes/assets/Unchecked.svg
@@ -0,0 +1,18 @@
+
diff --git a/addons/discord-rpc-gd/nodes/assets/circle.svg b/addons/discord-rpc-gd/nodes/assets/circle.svg
new file mode 100644
index 0000000..6cf788f
--- /dev/null
+++ b/addons/discord-rpc-gd/nodes/assets/circle.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/addons/discord-rpc-gd/nodes/debug.gd b/addons/discord-rpc-gd/nodes/debug.gd
new file mode 100644
index 0000000..534fa7d
--- /dev/null
+++ b/addons/discord-rpc-gd/nodes/debug.gd
@@ -0,0 +1,11 @@
+## This is a Debug Node wich will show some usefull info and buttons/input
+##
+## The DiscordRPC Debug Node will show info about the current values of its variables and some buttons to change them.
+##
+## @tutorial: https://github.com/vaporvee/discord-rpc-godot/wiki
+@tool
+extends Node
+
+func _ready() -> void:
+ const DebugNodeGroup: PackedScene = preload("res://addons/discord-rpc-gd/nodes/Debug.tscn")
+ add_child(DebugNodeGroup.instantiate())
diff --git a/addons/discord-rpc-gd/nodes/discord_autoload.gd b/addons/discord-rpc-gd/nodes/discord_autoload.gd
new file mode 100644
index 0000000..3e89310
--- /dev/null
+++ b/addons/discord-rpc-gd/nodes/discord_autoload.gd
@@ -0,0 +1,13 @@
+## This is a GDscript Node wich gets automatically added as Autoload while installing the addon.
+##
+## It can run in the background to comunicate with Discord.
+## You don't need to use it. If you remove it make sure to run [code]DiscordRPC.run_callbacks()[/code] in a [code]_process[/code] function.
+##
+## @tutorial: https://github.com/vaporvee/discord-rpc-godot/wiki
+extends Node
+
+func _ready() -> void:
+ pass
+
+func _process(_delta) -> void:
+ DiscordRPC.run_callbacks()
diff --git a/addons/discord-rpc-gd/plugin.cfg b/addons/discord-rpc-gd/plugin.cfg
new file mode 100644
index 0000000..8eeeb16
--- /dev/null
+++ b/addons/discord-rpc-gd/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="DiscordRPC"
+description="Discord RPC Plugin for GDScript in Godot"
+author="vaporvee"
+version="1.3.1"
+script="plugin.gd"
diff --git a/addons/discord-rpc-gd/plugin.gd b/addons/discord-rpc-gd/plugin.gd
new file mode 100644
index 0000000..445cd9c
--- /dev/null
+++ b/addons/discord-rpc-gd/plugin.gd
@@ -0,0 +1,56 @@
+@tool
+extends EditorPlugin
+
+const DiscordRPCDebug = preload("res://addons/discord-rpc-gd/nodes/debug.gd")
+const DiscordRPCDebug_icon = preload("res://addons/discord-rpc-gd/Debug.svg")
+var loaded_DiscordRPCDebug = DiscordRPCDebug.new()
+var restart_window: ConfirmationDialog = preload("res://addons/discord-rpc-gd/restart_window.tscn").instantiate()
+var plugin_cfg: ConfigFile = ConfigFile.new()
+const plugin_data_filename = "/plugin_data.cfg"
+
+func _enter_tree() -> void:
+ add_custom_type("DiscordRPCDebug","Node",DiscordRPCDebug,DiscordRPCDebug_icon)
+ get_editor_interface().get_editor_settings().settings_changed.connect(_on_editor_settings_changed)
+
+func _ready() -> void:
+ await get_tree().create_timer(0.5).timeout
+ plugin_cfg.load(get_editor_interface().get_editor_paths().get_data_dir() + plugin_data_filename)
+ if !get_editor_interface().get_editor_settings().has_setting("DiscordRPC/EditorPresence/enabled"):
+ get_editor_interface().get_editor_settings().set_setting("DiscordRPC/EditorPresence/enabled",plugin_cfg.get_value("Discord","editor_presence",false))
+
+func _exit_tree():
+ if get_editor_interface().get_editor_settings().has_setting("DiscordRPC/EditorPresence/enabled"):
+ get_editor_interface().get_editor_settings().erase("DiscordRPC/EditorPresence/enabled")
+
+func _enable_plugin() -> void:
+ if FileAccess.file_exists(ProjectSettings.globalize_path("res://") + "addons/discord-rpc-gd/bin/.gdignore"):
+ DirAccess.remove_absolute(ProjectSettings.globalize_path("res://") + "addons/discord-rpc-gd/bin/.gdignore")
+ add_autoload_singleton("DiscordRPCLoader","res://addons/discord-rpc-gd/nodes/discord_autoload.gd")
+ restart_window.connect("confirmed", save_no_restart)
+ restart_window.connect("canceled", save_and_restart)
+ get_editor_interface().popup_dialog_centered(restart_window)
+ print("IGNORE RED ERROR MESSAGES BEFORE THE SECOND RESTART!")
+
+func _disable_plugin() -> void:
+ remove_autoload_singleton("DiscordRPCLoader")
+ FileAccess.open("res://addons/discord-rpc-gd/bin/.gdignore",FileAccess.WRITE)
+ remove_custom_type("DiscordRPCDebug")
+ get_editor_interface().get_editor_settings().erase("DiscordRPC/EditorPresence/enabled")
+ push_warning("Please restart the editor to fully disable the DiscordRPC plugin")
+
+func save_and_restart() -> void:
+ get_editor_interface().restart_editor(true)
+
+func save_no_restart() -> void:
+ get_editor_interface().restart_editor(false)
+
+var editor_presence: Node
+func _on_editor_settings_changed() -> void:
+ plugin_cfg.set_value("Discord","editor_presence",get_editor_interface().get_editor_settings().get_setting("DiscordRPC/EditorPresence/enabled"))
+ plugin_cfg.save(get_editor_interface().get_editor_paths().get_data_dir() + plugin_data_filename)
+ if ClassDB.class_exists("EditorPresence") && editor_presence == null:
+ editor_presence = ClassDB.instantiate("EditorPresence")
+ if get_editor_interface().get_editor_settings().has_setting("DiscordRPC/EditorPresence/enabled") && get_editor_interface().get_editor_settings().get_setting("DiscordRPC/EditorPresence/enabled"):
+ add_child(editor_presence)
+ else:
+ editor_presence.queue_free()
diff --git a/addons/discord-rpc-gd/restart_window.tscn b/addons/discord-rpc-gd/restart_window.tscn
new file mode 100644
index 0000000..052c250
--- /dev/null
+++ b/addons/discord-rpc-gd/restart_window.tscn
@@ -0,0 +1,112 @@
+[gd_scene load_steps=8 format=3 uid="uid://byc4c6d5tpomq"]
+
+[ext_resource type="Texture2D" uid="uid://csl0e2px0cwc1" path="res://addons/discord-rpc-gd/Logo_V2_No_Bg.png" id="1_0svbg"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_1t7mm"]
+
+[sub_resource type="Theme" id="Theme_swwco"]
+Button/styles/focus = SubResource("StyleBoxEmpty_1t7mm")
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5vqdt"]
+
+[sub_resource type="Image" id="Image_v4whe"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 168, 224, 224, 224, 233, 224, 224, 224, 236, 224, 224, 224, 170, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 234, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 239, 230, 230, 230, 30, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 168, 224, 224, 224, 255, 224, 224, 224, 186, 224, 224, 224, 32, 224, 224, 224, 33, 224, 224, 224, 187, 224, 224, 224, 255, 225, 225, 225, 167, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 237, 224, 224, 224, 255, 224, 224, 224, 33, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 255, 224, 224, 224, 234, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 237, 224, 224, 224, 255, 224, 224, 224, 33, 255, 255, 255, 0, 255, 255, 255, 0, 229, 229, 229, 38, 224, 224, 224, 255, 224, 224, 224, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 164, 224, 224, 224, 255, 224, 224, 224, 187, 225, 225, 225, 34, 227, 227, 227, 36, 224, 224, 224, 192, 224, 224, 224, 255, 224, 224, 224, 162, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 225, 225, 225, 215, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 229, 224, 224, 224, 32, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 161, 224, 224, 224, 232, 224, 224, 224, 231, 225, 225, 225, 159, 230, 230, 230, 30, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 107, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 105, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 221, 224, 224, 224, 130, 255, 255, 255, 1, 255, 255, 255, 1, 225, 225, 225, 134, 224, 224, 224, 224, 225, 225, 225, 223, 224, 224, 224, 132, 255, 255, 255, 1, 255, 255, 255, 6, 224, 224, 224, 137, 224, 224, 224, 231, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 130, 225, 225, 225, 133, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 129, 224, 224, 224, 137, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 65, 224, 224, 224, 255, 224, 224, 224, 220, 225, 225, 225, 223, 224, 224, 224, 255, 226, 226, 226, 61, 224, 224, 224, 65, 224, 224, 224, 255, 224, 224, 224, 222, 224, 224, 224, 231, 224, 224, 224, 255, 227, 227, 227, 62, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 67, 224, 224, 224, 255, 224, 224, 224, 219, 224, 224, 224, 222, 224, 224, 224, 255, 227, 227, 227, 63, 225, 225, 225, 67, 224, 224, 224, 255, 224, 224, 224, 219, 224, 224, 224, 230, 224, 224, 224, 255, 227, 227, 227, 63, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 126, 225, 225, 225, 135, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 221, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 1, 224, 224, 224, 128, 224, 224, 224, 220, 224, 224, 224, 219, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 5, 225, 225, 225, 134, 224, 224, 224, 229, 224, 224, 224, 255, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_gdtpn"]
+image = SubResource("Image_v4whe")
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_7v0rg"]
+
+[node name="RestartWindow" type="ConfirmationDialog"]
+title = "Restart required"
+initial_position = 2
+size = Vector2i(430, 500)
+visible = true
+transient = false
+unresizable = true
+theme = SubResource("Theme_swwco")
+ok_button_text = "Restart"
+cancel_button_text = "Save and restart"
+
+[node name="Panel" type="Panel" parent="."]
+anchors_preset = 5
+anchor_left = 0.5
+anchor_right = 0.5
+offset_left = -207.0
+offset_top = 8.0
+offset_right = 207.0
+offset_bottom = 451.0
+grow_horizontal = 2
+mouse_filter = 1
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Panel"]
+custom_minimum_size = Vector2(400, 0)
+layout_mode = 1
+anchors_preset = 5
+anchor_left = 0.5
+anchor_right = 0.5
+offset_left = -200.0
+offset_right = 200.0
+offset_bottom = 389.0
+grow_horizontal = 2
+
+[node name="HSeparator" type="HSeparator" parent="Panel/VBoxContainer"]
+layout_mode = 2
+mouse_filter = 1
+theme_override_constants/separation = 15
+theme_override_styles/separator = SubResource("StyleBoxEmpty_5vqdt")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Panel/VBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+theme_override_constants/separation = 10
+
+[node name="DocsIcon" type="TextureRect" parent="Panel/VBoxContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 8
+size_flags_vertical = 4
+texture = SubResource("ImageTexture_gdtpn")
+stretch_mode = 2
+
+[node name="LinkButton" type="LinkButton" parent="Panel/VBoxContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 8
+mouse_default_cursor_shape = 16
+theme_override_font_sizes/font_size = 20
+text = "HOW TO USE"
+uri = "https://vaporvee.com/docs/discord-rpc-godot#quick-start"
+
+[node name="TextureRect" type="TextureRect" parent="Panel/VBoxContainer"]
+custom_minimum_size = Vector2(128, 128)
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 0
+texture = ExtResource("1_0svbg")
+expand_mode = 1
+
+[node name="RichTextLabel" type="RichTextLabel" parent="Panel/VBoxContainer"]
+custom_minimum_size = Vector2(400, 250)
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 0
+mouse_filter = 1
+theme_override_font_sizes/normal_font_size = 16
+theme_override_styles/normal = SubResource("StyleBoxEmpty_7v0rg")
+bbcode_enabled = true
+text = "[center]Thanks for enabling the
+[rainbow]Discord Game SDK Plugin[/rainbow]
+made by vaporvee. ❤️
+
+
+You need to [wave]restart[/wave] the editor to fully enable this plugin!
+Do you want to [wave]save[/wave] your project before restarting?
+
+Error messages after the first two restarts are normal. Please ignore them!"
diff --git a/project.godot b/project.godot
index b0cb26c..dbcccdb 100644
--- a/project.godot
+++ b/project.godot
@@ -21,6 +21,7 @@ config/windows_native_icon="res://icons/icon.ico"
[autoload]
G="*res://src/globals.gd"
+DiscordRPCLoader="*res://addons/discord-rpc-gd/nodes/discord_autoload.gd"
[debug]
@@ -37,6 +38,10 @@ window/size/mode=2
window/stretch/mode="canvas_items"
window/stretch/aspect="expand"
+[editor_plugins]
+
+enabled=PackedStringArray("res://addons/discord-rpc-gd/plugin.cfg")
+
[filesystem]
import/blender/enabled=false
diff --git a/src/components/DiscordStatus.gd b/src/components/DiscordStatus.gd
index 67269e9..7f9c6d2 100644
--- a/src/components/DiscordStatus.gd
+++ b/src/components/DiscordStatus.gd
@@ -1,12 +1,13 @@
extends Node
class_name DiscordStatus
+
func _ready():
- DiscordRPC.app_id = 1273351971310534719 # Application ID
- DiscordRPC.details = "A demo activity by vaporvee"
+ DiscordRPC.app_id = ENV.DISCORD_APP_ID # Application ID
+ DiscordRPC.details = "Main menu"
DiscordRPC.state = "Checkpoint 23/23"
- DiscordRPC.large_image = "example_game" # Image key from "Art Assets"
+ DiscordRPC.large_image = 'icon' # Image key from "Art Assets"
DiscordRPC.large_image_text = "Try it now!"
- DiscordRPC.small_image = "boss" # Image key from "Art Assets"
+ DiscordRPC.small_image = 'icon' # Image key from "Art Assets"
DiscordRPC.small_image_text = "Fighting the end boss! D:"
DiscordRPC.start_timestamp = int(Time.get_unix_time_from_system()) # "02:46 elapsed"
diff --git a/src/scenes/MainScene.tscn b/src/scenes/MainScene.tscn
index 347ffb9..094979f 100644
--- a/src/scenes/MainScene.tscn
+++ b/src/scenes/MainScene.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=10 format=3 uid="uid://bl2xm774sjmm6"]
+[gd_scene load_steps=11 format=3 uid="uid://bl2xm774sjmm6"]
[ext_resource type="Script" path="res://src/scenes/init/MainScene.gd" id="1_7yre0"]
[ext_resource type="Script" path="res://src/components/GameSettings.gd" id="2_mjoy8"]
@@ -9,6 +9,7 @@
[ext_resource type="AudioStream" uid="uid://d238csgqeoqiu" path="res://assets/build/ost/section_select.wav" id="7_66dvc"]
[ext_resource type="AudioStream" uid="uid://dkhl2sdncv4gg" path="res://assets/build/ost/action_select.wav" id="8_kispc"]
[ext_resource type="AudioStream" uid="uid://dfrpg15jmgpg4" path="res://assets/build/ost/main_menu_theme.wav" id="9_3482d"]
+[ext_resource type="Script" path="res://src/components/DiscordStatus.gd" id="10_ndvlm"]
[node name="MainScene" type="Node"]
script = ExtResource("1_7yre0")
@@ -48,3 +49,6 @@ bus = &"sfx"
stream = ExtResource("9_3482d")
autoplay = true
bus = &"Music"
+
+[node name="DiscordStatus" type="Node" parent="."]
+script = ExtResource("10_ndvlm")