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")