diff --git a/.vscode/settings.json b/.vscode/settings.json index f83e860..920d270 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,7 +4,64 @@ "${workspaceFolder}/src/lib/godot-cpp/include" ], "files.associations": { - "xlocbuf": "cpp" + "xlocbuf": "cpp", + "algorithm": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "csignal": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "exception": "cpp", + "functional": "cpp", + "initializer_list": "cpp", + "ios": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "iterator": "cpp", + "limits": "cpp", + "list": "cpp", + "memory": "cpp", + "new": "cpp", + "optional": "cpp", + "ostream": "cpp", + "ratio": "cpp", + "set": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "string": "cpp", + "system_error": "cpp", + "thread": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "unordered_map": "cpp", + "utility": "cpp", + "vector": "cpp", + "xfacet": "cpp", + "xhash": "cpp", + "xiosbase": "cpp", + "xlocale": "cpp", + "xlocinfo": "cpp", + "xlocnum": "cpp", + "xmemory": "cpp", + "xstddef": "cpp", + "xstring": "cpp", + "xtr1common": "cpp", + "xtree": "cpp", + "xutility": "cpp" }, "[python]": { "editor.defaultFormatter": "ms-python.black-formatter" diff --git a/discord_addon_export_beta.zip b/discord_addon_export_beta.zip new file mode 100644 index 0000000..7eeb0c9 Binary files /dev/null and b/discord_addon_export_beta.zip differ diff --git a/project/addons/discord-sdk-gd/bin/windows/discord_game_sdk_binding.dll b/project/addons/discord-sdk-gd/bin/windows/discord_game_sdk_binding.dll index c6add20..bf806b9 100644 Binary files a/project/addons/discord-sdk-gd/bin/windows/discord_game_sdk_binding.dll and b/project/addons/discord-sdk-gd/bin/windows/discord_game_sdk_binding.dll differ diff --git a/project/addons/discord-sdk-gd/bin/windows/discord_game_sdk_binding_debug.dll b/project/addons/discord-sdk-gd/bin/windows/discord_game_sdk_binding_debug.dll index ee803de..a841bbd 100644 Binary files a/project/addons/discord-sdk-gd/bin/windows/discord_game_sdk_binding_debug.dll and b/project/addons/discord-sdk-gd/bin/windows/discord_game_sdk_binding_debug.dll differ diff --git a/project/addons/discord-sdk-gd/export.gd b/project/addons/discord-sdk-gd/export.gd index 6790839..2c6e265 100644 --- a/project/addons/discord-sdk-gd/export.gd +++ b/project/addons/discord-sdk-gd/export.gd @@ -4,11 +4,11 @@ extends EditorExportPlugin func _export_file(path, type, features): if features[2] == "windows": if features[4] == "x86_64": - add_shared_object("bin/windows/discord_game_sdk.dll",[],"/") + add_shared_object("res://addons/discord-sdk-gd/bin/windows/discord_game_sdk.dll",[],"/") elif features[4] == "x86": - add_shared_object("bin/windows/discord_game_sdk_x86.dll",[],"/") + add_shared_object("res://addons/discord-sdk-gd/bin/windows/discord_game_sdk_x86.dll",[],"/") elif features[2] == "linux": - add_shared_object("bin/linux/libdiscord_game_sdk.so",[],"/") + add_shared_object("res://addons/discord-sdk-gd/bin/linux/libdiscord_game_sdk.so",[],"/") elif features[2] == "macos": - add_shared_object("bin/macos/libdiscord_game_sdk.dylib",[],"/") - add_shared_object("bin/macos/libdiscord_game_sdk_aarch64.dylib",[],"/") + add_shared_object("res://addons/discord-sdk-gd/bin/macos/libdiscord_game_sdk.dylib",[],"/") + add_shared_object("res://addons/discord-sdk-gd/bin/macos/libdiscord_game_sdk_aarch64.dylib",[],"/") diff --git a/project/addons/discord-sdk-gd/sdk_utility.gd b/project/addons/discord-sdk-gd/sdk_utility.gd index ccb4a0a..be8b542 100644 --- a/project/addons/discord-sdk-gd/sdk_utility.gd +++ b/project/addons/discord-sdk-gd/sdk_utility.gd @@ -1,4 +1,4 @@ extends Node -func _process(delta): +func _process(delta) -> void: discord_sdk.coreupdate() diff --git a/project/main.gd b/project/main.gd index 83bf4b0..53847e7 100644 --- a/project/main.gd +++ b/project/main.gd @@ -9,18 +9,39 @@ func _ready(): discord_sdk.large_image_text = "Try it now!" discord_sdk.small_image = "boss" discord_sdk.small_image_text = "Fighting the end boss! D:" - - discord_sdk.party_id = "my-random-id-can-be-everything" - discord_sdk.current_party_size = 1 - discord_sdk.max_party_size = 4 - discord_sdk.match_secret = "my-random-match-secret" - discord_sdk.join_secret = "my-random-join-secret" - discord_sdk.spectate_secret = "my-random-spectate-secret" - #discord_sdk.start_timestamp = int(Time.get_unix_time_from_system()) discord_sdk.end_timestamp = int(Time.get_unix_time_from_system()) + 3600 # +1 hour in unix time - discord_sdk.register_steam(1389990) - + var my_secret = str(randi_range(0,999999)) + + discord_sdk.party_id = "mylobbycanbeeverything_" + my_secret + discord_sdk.current_party_size = 1 + discord_sdk.max_party_size = 4 + discord_sdk.match_secret = "m_" + my_secret + ",discord_sdk.current_party_size" #better use seeds with 1 to 1 range instead of just chars + discord_sdk.join_secret = "j_" + my_secret + ",discord_sdk.current_party_size" + discord_sdk.spectate_secret = "s_" + my_secret + #discord_sdk.start_timestamp = int(Time.get_unix_time_from_system()) + #discord_sdk.register_command("steam://rungameid/1389990") + #discord_sdk.register_steam(1389990) discord_sdk.refresh() - $Info.text = $Info.text.replace("{discordinfo}",str(discord_sdk.get_is_discord_working())).replace("{id}",str(discord_sdk.app_id)).replace("{details}",discord_sdk.details).replace("{state}",discord_sdk.state).replace("{lkey}",discord_sdk.large_image).replace("{ltext}",discord_sdk.large_image_text).replace("{skey}",discord_sdk.small_image).replace("{stext}",discord_sdk.small_image_text).replace("{stimestamp}",str(discord_sdk.start_timestamp)).replace("{etimestamp}",str(discord_sdk.end_timestamp)) +func debug_text_update(): + $Info.text = $Info.text.replace("{ssecret}",discord_sdk.spectate_secret).replace("{jsecret}",discord_sdk.join_secret).replace("{msecret}",discord_sdk.match_secret).replace("{mpartysize}",str(discord_sdk.max_party_size)).replace("{cpartysize}",str(discord_sdk.current_party_size)).replace("{partyid}",discord_sdk.party_id).replace("{discordinfo}",str(discord_sdk.get_is_discord_working())).replace("{id}",str(discord_sdk.app_id)).replace("{details}",discord_sdk.details).replace("{state}",discord_sdk.state).replace("{lkey}",discord_sdk.large_image).replace("{ltext}",discord_sdk.large_image_text).replace("{skey}",discord_sdk.small_image).replace("{stext}",discord_sdk.small_image_text).replace("{stimestamp}",str(discord_sdk.start_timestamp)).replace("{etimestamp}",str(discord_sdk.end_timestamp)) + +func _on_activity_join_request(user_requesting): + print(user_requesting) + +func _on_activity_join(secret): + if(discord_sdk.join_secret != secret): + discord_sdk.current_party_size = clamp(int(secret.split(",")[1]) + 1, 0, discord_sdk.max_party_size) + discord_sdk.party_id = secret.split(",")[0].replace("j_","mylobbycanbeeverything_") + discord_sdk.match_secret = secret.split(",")[0].replace("j_","m_") + discord_sdk.join_secret = secret.split(",")[0] + discord_sdk.spectate_secret = secret.split(",")[0].replace("j_","s_") + discord_sdk.refresh() + $Info.text = $Info.text.replace("{ssecret}",discord_sdk.spectate_secret).replace("{jsecret}",discord_sdk.join_secret).replace("{msecret}",discord_sdk.match_secret).replace("{mpartysize}",str(discord_sdk.max_party_size)).replace("{cpartysize}",str(discord_sdk.current_party_size)).replace("{partyid}",discord_sdk.party_id).replace("{discordinfo}",str(discord_sdk.get_is_discord_working())).replace("{id}",str(discord_sdk.app_id)).replace("{details}",discord_sdk.details).replace("{state}",discord_sdk.state).replace("{lkey}",discord_sdk.large_image).replace("{ltext}",discord_sdk.large_image_text).replace("{skey}",discord_sdk.small_image).replace("{stext}",discord_sdk.small_image_text).replace("{stimestamp}",str(discord_sdk.start_timestamp)).replace("{etimestamp}",str(discord_sdk.end_timestamp)) + print(secret) + print(discord_sdk.get_current_party_size()) + print(discord_sdk.get_join_secret()) + +func _on_activity_spectate(secret): + print(secret) diff --git a/project/main.tscn b/project/main.tscn index d803974..4f92dc3 100644 --- a/project/main.tscn +++ b/project/main.tscn @@ -58,5 +58,12 @@ Small image key: {skey} Small image text: {stext} Start timestamp: {stimestamp} -End timestamp: {etimestamp}" +End timestamp: {etimestamp} + +Party ID: {partyid} +Current party size: {cpartysize} +Max party size: {mpartysize} +Match secret: {msecret} +Join secret: {jsecret} +Spectate secret: {ssecret}" scroll_active = false diff --git a/src/discordgodot.cpp b/src/discordgodot.cpp index c2f0d8e..3150e17 100644 --- a/src/discordgodot.cpp +++ b/src/discordgodot.cpp @@ -71,7 +71,16 @@ void discord_sdk::_bind_methods() ClassDB::bind_method(D_METHOD("set_spectate_secret", "spectate_secret"), &discord_sdk::set_spectate_secret); ADD_PROPERTY(PropertyInfo(Variant::STRING, "spectate_secret"), "set_spectate_secret", "get_spectate_secret"); + ClassDB::bind_method(D_METHOD("get_instanced"), &discord_sdk::get_instanced); + ClassDB::bind_method(D_METHOD("set_instanced", "instanced"), &discord_sdk::set_instanced); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "instanced"), "set_instanced", "get_instanced"); + + ADD_SIGNAL(MethodInfo("activity_join", PropertyInfo(Variant::STRING, "join_secret"))); + ADD_SIGNAL(MethodInfo("activity_spectate", PropertyInfo(Variant::STRING, "spectate_secret"))); + ADD_SIGNAL(MethodInfo("activity_join_request", PropertyInfo(Variant::DICTIONARY, "user_requesting"))); + ClassDB::bind_method(D_METHOD("refresh"), &discord_sdk::refresh); + ClassDB::bind_method(D_METHOD("clear"), &discord_sdk::clear); ClassDB::bind_method(D_METHOD("register_command"), &discord_sdk::register_command); ClassDB::bind_method(D_METHOD("register_steam"), &discord_sdk::register_steam); @@ -118,8 +127,6 @@ void discord_sdk::debug() if (result == discord::Result::Ok) { core->ActivityManager().UpdateActivity(activity, [](discord::Result result) {}); - core->UserManager().OnCurrentUserUpdate.Connect([]() - { core->UserManager().GetCurrentUser(&user); }); } else UtilityFunctions::push_warning("Discord Activity couldn't be updated. It could be that Discord isn't running!"); @@ -128,7 +135,25 @@ void discord_sdk::debug() void discord_sdk::set_app_id(int64_t value) { app_id = value; - result = discord::Core::Create(value, DiscordCreateFlags_NoRequireDiscord, &core); + result = discord::Core::Create(value, DiscordCreateFlags_NoRequireDiscord, &core); // after setting app_ID it initializes everything + // signals + core->ActivityManager().OnActivityJoin.Connect([](const char *secret) + { discord_sdk::get_singleton() + ->emit_signal("activity_join", secret); }); + core->ActivityManager().OnActivitySpectate.Connect([](const char *secret) + { discord_sdk::get_singleton() + ->emit_signal("activity_spectate", secret); }); + core->ActivityManager().OnActivityJoinRequest.Connect([this](discord::User const &user) + { Dictionary user_requesting; + user_requesting["avatar"] = user.GetAvatar(); //can be empty when user has no avatar + user_requesting["is_bot"] = user.GetBot(); + user_requesting["discriminator"] = user.GetDiscriminator(); + user_requesting["id"] = user.GetId(); + user_requesting["username"] = user.GetUsername(); + user_requesting.make_read_only(); + discord_sdk::get_singleton() + ->emit_signal("activity_join_request",user_requesting); }); + activity.GetParty().SetPrivacy(discord::ActivityPartyPrivacy(DiscordActivityPartyPrivacy_Public)); } int64_t discord_sdk::get_app_id() { @@ -158,14 +183,21 @@ void discord_sdk::refresh() { if (result == discord::Result::Ok && app_id > 0) { + activity.GetParty().SetPrivacy(discord::ActivityPartyPrivacy::Public); + activity.SetType(discord::ActivityType::Playing); core->ActivityManager().UpdateActivity(activity, [](discord::Result result) {}); - core->UserManager().OnCurrentUserUpdate.Connect([]() - { core->UserManager().GetCurrentUser(&user); }); } else UtilityFunctions::push_warning("Discord Activity couldn't be updated. It could be that Discord isn't running!"); } +void discord_sdk::clear() +{ + if (result == discord::Result::Ok /*should it be only at ok?*/ && app_id > 0) + // + ; +} + void discord_sdk::set_large_image(String value) { large_image = value; @@ -279,6 +311,16 @@ String discord_sdk::get_spectate_secret() return spectate_secret; } +void discord_sdk::set_instanced(bool value) +{ + instanced = value; + activity.SetInstance(value); +} +bool discord_sdk::get_instanced() +{ + return instanced; +} + void discord_sdk::register_command(String value) { if (result == discord::Result::Ok && app_id > 0) diff --git a/src/discordgodot.h b/src/discordgodot.h index 37b6483..3e4e471 100644 --- a/src/discordgodot.h +++ b/src/discordgodot.h @@ -3,12 +3,12 @@ #include #include "lib/discord_game_sdk/cpp/discord.h" -#include +#include #include using namespace godot; -class discord_sdk : public Object +class discord_sdk : public RefCounted { GDCLASS(discord_sdk, Object); @@ -38,6 +38,8 @@ private: String join_secret; String spectate_secret; + bool instanced; + public: static discord_sdk * get_singleton(); @@ -48,6 +50,7 @@ public: void debug(); void coreupdate(); void refresh(); + void clear(); int64_t get_app_id(); void set_app_id(int64_t value); @@ -84,6 +87,9 @@ public: String get_spectate_secret(); void set_spectate_secret(String value); + bool get_instanced(); + void set_instanced(bool value); + void register_command(String value); void register_steam(int32_t value);