diff --git a/project/addons/discord-rpc-gd/nodes/Debug.tscn b/project/addons/discord-rpc-gd/nodes/Debug.tscn index 611eeab..b9b06a0 100644 --- a/project/addons/discord-rpc-gd/nodes/Debug.tscn +++ b/project/addons/discord-rpc-gd/nodes/Debug.tscn @@ -14,7 +14,7 @@ func _ready(): DiscordUtil.connect(\"activity_join_request\",_on_activity_join_request) func _process(_delta) -> void: - if(DiscordUtil.get_is_discord_working()): + if(false): $Panel/TextureRect.self_modulate = Color(\"#3eff8d\") if !animation_player.is_playing(): animation_player.play(\"pulsate\") @@ -55,28 +55,6 @@ var user_request: Dictionary = {}; func _on_activity_join_request(user_requesting: Dictionary) -> void: print(user_requesting) user_request = user_requesting - -func _on_accept_join_request_pressed() -> void: - if(!user_request.is_empty()): - DiscordUtil.accept_join_request(user_request.id) - -func _on_invite_with_user_id_text_submitted(new_text: String) -> void: - DiscordUtil.send_invite(int(new_text),true,\"this is a test invite sent from godot\") - -func _on_accept_with_user_id_text_submitted(new_text: String) -> void: - DiscordUtil.accept_invite(int(new_text)) - -func _on_print_current_user_on_console_pressed() -> void: - print(DiscordUtil.get_current_user()) - -func _on_toggle_sdk_toggled(button_pressed: bool) -> void: - if(button_pressed): - DiscordUtil.unclear() - else: - DiscordUtil.clear(false) - -func _on_print_friends_pressed() -> void: - print(DiscordUtil.get_all_relationships()) " [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8abo6"] diff --git a/project/discord_connector.gd b/project/discord_connector.gd new file mode 100644 index 0000000..bd5c0ab --- /dev/null +++ b/project/discord_connector.gd @@ -0,0 +1,4 @@ +extends DiscordConnector + +func _on_user_connected(access_token: String, refresh_token: String, expires_in: int) -> void: + print_debug("Access token: %s \nRefresh Token: %s \nExpires in: %s" % [access_token, refresh_token, expires_in]) diff --git a/project/discord_connector.gd.uid b/project/discord_connector.gd.uid new file mode 100644 index 0000000..1b9a05c --- /dev/null +++ b/project/discord_connector.gd.uid @@ -0,0 +1 @@ +uid://kmubk5a6i385 diff --git a/project/main.tscn b/project/main.tscn index 8dbf547..4bb9000 100644 --- a/project/main.tscn +++ b/project/main.tscn @@ -1,76 +1,10 @@ [gd_scene load_steps=4 format=3 uid="uid://dyc3kseph4el7"] [ext_resource type="Texture2D" uid="uid://b3qm246m7pnsx" path="res://assets/Logo_V2.png" id="2_gd222"] +[ext_resource type="Script" uid="uid://kmubk5a6i385" path="res://discord_connector.gd" id="3_h2yge"] [ext_resource type="Script" uid="uid://46tue7u6crd6" path="res://addons/discord-rpc-gd/nodes/debug.gd" id="6_ujijw"] -[sub_resource type="GDScript" id="GDScript_0xm2m"] -script/source = "extends Node - -func _ready() -> void: - if GDExtensionManager.is_extension_loaded(\"res://addons/discord-rpc-gd/bin/discord-rpc-gd.gdextension\"): - set_activity() - DiscordUtil.connect(\"activity_join_request\",_on_activity_join_request) - #DiscordUtil.connect(\"activity_join\",_on_activity_join) - DiscordUtil.connect(\"activity_spectate\",_on_activity_spectate) - DiscordUtil.connect(\"relationships_init\",_on_relationship_init) - DiscordUtil.connect(\"updated_relationship\", _on_updated_relationship) - -func set_activity() -> void: - #DiscordUtil.clear(false) - DiscordUtil.app_id = 1099618430065324082 - #DiscordUtil.details = \"A demo activity by vaporvee#1231\" - #DiscordUtil.state = \"Checkpoint 23/23\" - # - #DiscordUtil.large_image = \"example_game\" - #DiscordUtil.large_image_text = \"Try it now!\" - #DiscordUtil.small_image = \"boss\" - #DiscordUtil.small_image_text = \"Fighting the end boss! D:\" - #DiscordUtil.end_timestamp = int(Time.get_unix_time_from_system()) + 3600 # +1 hour in unix time - - # It is NOT recommended to manage secrets locally! It's meant to be a payload wich the server understands and - # returns the other variables like current_party_size, party_id etc. Most of the values must differ from the others. - #var my_secret: String = str(randi_range(0,999999)) - - #DiscordUtil.party_id = \"mylobbycanbeeverything_\" + my_secret - #DiscordUtil.current_party_size = 1 - #DiscordUtil.max_party_size = 4 - #DiscordUtil.match_secret = \"m_\" + my_secret #better use seeds with 1 to 1 range instead of just chars - #DiscordUtil.join_secret = \"j_\" + my_secret - #DiscordUtil.spectate_secret = \"s_\" + my_secret - #DiscordUtil.is_public_party = true - #DiscordUtil.instanced = true #required for spectate - #DiscordUtil.start_timestamp = int(Time.get_unix_time_from_system()) - DiscordUtil.register_command(\"C:\\\\Users\\\\yanni\\\\Desktop\\\\demo\\\\DiscordUtil.exe\") - #DiscordUtil.register_steam(1389990) - DiscordUtil.refresh() - -var user_request: Dictionary; - -func _on_activity_join_request(user_requesting: Dictionary) -> void: - print(user_requesting) - user_request = user_requesting - -#func _on_activity_join(secret: String) -> void: - #if(DiscordUtil.join_secret != secret): - #DiscordUtil.current_party_size = clamp(int(secret) + 1, 0, DiscordUtil.max_party_size) - #DiscordUtil.party_id = secret.replace(\"j_\",\"mylobbycanbeeverything_\") - #DiscordUtil.match_secret = secret.replace(\"j_\",\"m_\") - #DiscordUtil.join_secret = secret - #DiscordUtil.spectate_secret = secret.replace(\"j_\",\"s_\") - #DiscordUtil.refresh() - -func _on_activity_spectate(secret: String) -> void: - print(secret) - -func _on_relationship_init() -> void: - print(\"initialized\") - -func _on_updated_relationship(relationship: Dictionary) -> void: - print(relationship) -" - [node name="Node" type="Node"] -script = SubResource("GDScript_0xm2m") [node name="ColorRect" type="ColorRect" parent="."] anchors_preset = 15 @@ -111,3 +45,6 @@ script = ExtResource("6_ujijw") [node name="DiscordConnector" type="DiscordConnector" parent="."] app_id = 1099618430065324082 auto_connect = true +script = ExtResource("3_h2yge") + +[connection signal="user_connected" from="DiscordConnector" to="DiscordConnector" method="_on_user_connected"] diff --git a/src/definitions.h b/src/definitions.h index b646222..b93bf34 100644 --- a/src/definitions.h +++ b/src/definitions.h @@ -3,7 +3,7 @@ godot::ClassDB::bind_method(D_METHOD("get_" #property_name), &class_name::get_##property_name); \ godot::ClassDB::bind_method(D_METHOD("set_" #property_name, #variant_type), &class_name::set_##property_name); \ godot::ClassDB::add_property(class_name::get_class_static(), PropertyInfo(variant_type, #property_name, ##__VA_ARGS__), "set_" #property_name, "get_" #property_name) -#define BIND_SIGNAL(class_name, signal_name, ...) godot::ClassDB::add_signal(class_name::get_class_static(), MethodInfo(#signal_name, ##__VA_ARGS__)) +#define BIND_SIGNAL(signal_name, ...) ADD_SIGNAL(MethodInfo(#signal_name, ##__VA_ARGS__)) // getter isn't mandatory for this project #define SET_GET(class_name, variable, setter, ...) decltype(class_name::variable) class_name::get_##variable() { return variable; } void class_name::set_##variable(decltype(class_name::variable) value) { variable = value; setter; } diff --git a/src/nodes/discord_connector.cpp b/src/nodes/discord_connector.cpp index e3b2c42..78dd6ec 100644 --- a/src/nodes/discord_connector.cpp +++ b/src/nodes/discord_connector.cpp @@ -8,6 +8,7 @@ void DiscordConnector::_bind_methods() BIND_SET_GET(DiscordConnector, auto_connect, Variant::BOOL); BIND_SET_GET(DiscordConnector, token_auto_manage, Variant::BOOL); BIND_METHOD(DiscordConnector, connect); + BIND_SIGNAL(user_connected, PropertyInfo(Variant::STRING, "access_token"), PropertyInfo(Variant::STRING, "refresh_token"), PropertyInfo(Variant::INT, "expires_in")); } DiscordConnector::DiscordConnector() { @@ -28,7 +29,7 @@ void DiscordConnector::_ready() if (!Engine::get_singleton()->is_editor_hint() && !editor_process) { if (auto_connect) - connect(); + connect_user(); } } @@ -70,7 +71,7 @@ bool DiscordConnector::get_auto_connect() return auto_connect; } -void DiscordConnector::connect() +void DiscordConnector::connect_user() { auto codeVerifier = client->CreateAuthorizationCodeVerifier(); @@ -88,15 +89,20 @@ void DiscordConnector::connect() } else { client->GetToken(app_id, code, codeVerifier.Verifier(), redirectUri, [this](discordpp::ClientResult result, - std::string accessToken, // needs to be stored securely - std::string refreshToken, // needs to be stored securely + std::string accessToken, + std::string refreshToken, discordpp::AuthorizationTokenType tokenType, int32_t expiresIn, std::string scope) { + if (result.Successful()) { + DiscordConnector::get_singleton()->emit_signal("user_connected", accessToken.c_str(), refreshToken.c_str(), expiresIn); + } else { + UtilityFunctions::push_error("Access token error: " + String(result.Error().c_str())); + return; + } client->UpdateToken(discordpp::AuthorizationTokenType::Bearer, accessToken, [this](discordpp::ClientResult result) { if(result.Successful()) { client->Connect(); - UtilityFunctions::print("TODO: connection success signal"); } else { UtilityFunctions::push_error("Token update error: " + String(result.Error().c_str())); } diff --git a/src/nodes/discord_connector.h b/src/nodes/discord_connector.h index f1676e7..d29875c 100644 --- a/src/nodes/discord_connector.h +++ b/src/nodes/discord_connector.h @@ -26,7 +26,7 @@ public: H_SET_GET(token_auto_manage, true) H_SET_GET(auto_connect, false) - void connect(); + void connect_user(); DiscordConnector(); ~DiscordConnector(); diff --git a/src/util.cpp b/src/util.cpp index d45f088..7d75283 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -4,31 +4,8 @@ DiscordUtil *DiscordUtil::singleton = nullptr; void DiscordUtil::_bind_methods() { - BIND_SET_GET(DiscordUtil, app_id, Variant::INT); - BIND_SIGNAL(DiscordUtil, activity_join, PropertyInfo(Variant::STRING, "join_secret")); - BIND_SIGNAL(DiscordUtil, activity_spectate, PropertyInfo(Variant::STRING, "spectate_secret")); - BIND_SIGNAL(DiscordUtil, activity_join_request, PropertyInfo(Variant::DICTIONARY, "user_requesting")); - BIND_SIGNAL(DiscordUtil, updated_relationship, PropertyInfo(Variant::DICTIONARY, "relationship")); - BIND_SIGNAL(DiscordUtil, overlay_toggle, PropertyInfo(Variant::BOOL, "is_locked")); - BIND_SIGNAL(DiscordUtil, relationships_init); BIND_METHOD(DiscordUtil, debug); BIND_METHOD(DiscordUtil, run_callbacks); - BIND_METHOD(DiscordUtil, refresh); - ClassDB::bind_method(D_METHOD("clear", "reset_values"), &DiscordUtil::clear, DEFVAL(false)); - BIND_METHOD(DiscordUtil, unclear); - BIND_METHOD(DiscordUtil, register_command, "command"); - BIND_METHOD(DiscordUtil, register_steam, "steam_id"); - BIND_METHOD(DiscordUtil, accept_join_request, "user_id"); - BIND_METHOD(DiscordUtil, send_invite, "user_id", "is_spectate", "message_content"); - BIND_METHOD(DiscordUtil, accept_invite, "user_id"); - BIND_METHOD(DiscordUtil, get_current_user); - BIND_METHOD(DiscordUtil, get_all_relationships); - BIND_METHOD(DiscordUtil, get_is_overlay_enabled); - BIND_METHOD(DiscordUtil, get_is_overlay_locked); - BIND_METHOD(DiscordUtil, open_invite_overlay, "is_spectate"); - BIND_METHOD(DiscordUtil, open_server_invite_overlay, "invite_code"); - BIND_METHOD(DiscordUtil, open_voice_settings); - BIND_METHOD(DiscordUtil, get_is_discord_working); } DiscordUtil::DiscordUtil() @@ -39,7 +16,6 @@ DiscordUtil::DiscordUtil() DiscordUtil::~DiscordUtil() { - app_id = 0; ERR_FAIL_COND(singleton != this); singleton = nullptr; } @@ -131,208 +107,6 @@ void DiscordUtil::debug() } }); } -void DiscordUtil::set_app_id(int64_t value) -{ - app_id = value; - if (app_id > 0) - { - /* - result = discordpp::Core::Create(value, DiscordCreateFlags_NoRequireDiscord, &core); // after setting app_ID it initializes everything - if (result == discordpp::Result::Ok) - { - // initialize currentuser - core->UserManager().OnCurrentUserUpdate.Connect([]() - {discordpp::User user{}; - core->UserManager().GetCurrentUser(&user); }); - // signals - core->ActivityManager().OnActivityJoin.Connect([](const char *secret) - { DiscordUtil::get_singleton() - ->emit_signal("activity_join", secret); }); - core->ActivityManager().OnActivitySpectate.Connect([](const char *secret) - { DiscordUtil::get_singleton() - ->emit_signal("activity_spectate", secret); }); - core->ActivityManager().OnActivityJoinRequest.Connect([this](discordpp::User const &user) - { DiscordUtil::get_singleton() - ->emit_signal("activity_join_request", user2dict(user)); }); - core->OverlayManager().OnToggle.Connect([](bool is_locked) - { DiscordUtil::get_singleton() - ->emit_signal("overlay_toggle", is_locked); }); - core->RelationshipManager().OnRefresh.Connect([&]() - { DiscordUtil::get_singleton() - ->emit_signal("relationships_init"); }); - core->RelationshipManager().OnRelationshipUpdate.Connect([&](discordpp::Relationship const &relationship) - { DiscordUtil::get_singleton() - ->emit_signal("updated_relationship", relationship2dict(relationship)); }); - } - */ - } -} -int64_t DiscordUtil::get_app_id() -{ - if (app_id != 0) - return app_id; - return old_app_id; -} - -void DiscordUtil::refresh() -{ - if (get_is_discord_working()) - { - /*activity.GetParty().SetPrivacy(discordpp::ActivityPartyPrivacy::Public); - activity.SetType(discordpp::ActivityType::Playing); - core->ActivityManager().UpdateActivity(activity, [](discordpp::Result result) {});*/ - return; - } - else - UtilityFunctions::push_warning("Discord Activity couldn't be updated. It could be that Discord isn't running!"); -} - -void DiscordUtil::clear(bool reset_values = false) -{ - if (get_is_discord_working()) - { - if (reset_values) - { - old_app_id = 0; - set_is_overlay_locked(false); - // core->ActivityManager().ClearActivity([](discordpp::Result result) {}); - } - else - old_app_id = app_id; - app_id = 0; - } -} - -void DiscordUtil::unclear() -{ - if (old_app_id > 0) - { - set_app_id(old_app_id); - refresh(); - old_app_id = 0; - } - else - UtilityFunctions::push_warning("Discord Activity couldn't be uncleared. Maybe it didn't get cleared before?"); -} - -bool DiscordUtil::get_is_overlay_enabled() -{ - bool ie; - if (get_is_discord_working()) - { - // core->OverlayManager().IsEnabled(&ie); - return ie; - } - return ie; -} -bool DiscordUtil::get_is_overlay_locked() -{ - bool il; - if (get_is_discord_working()) - { - // core->OverlayManager().IsLocked(&il); - return il; - } - return il; -} -void DiscordUtil::set_is_overlay_locked(bool value) -{ - is_overlay_locked = value; - if (get_is_discord_working()) - // core->OverlayManager().SetLocked(value, {}); - return; -} -void DiscordUtil::open_invite_overlay(bool is_spectate) -{ - if (get_is_discord_working()) - // core->OverlayManager().OpenActivityInvite(static_cast(is_spectate + 1), {}); - return; -} -void DiscordUtil::open_server_invite_overlay(String invite_code) -{ - if (get_is_discord_working()) - // core->OverlayManager().OpenGuildInvite(invite_code.utf8().get_data(), {}); - return; -} -void DiscordUtil::open_voice_settings() -{ - if (get_is_discord_working()) - // core->OverlayManager().OpenVoiceSettings({}); - return; -} - -void DiscordUtil::accept_join_request(int64_t user_id) -{ - if (get_is_discord_working()) - // core->ActivityManager().SendRequestReply(user_id, static_cast(1), {}); - return; -} -void DiscordUtil::send_invite(int64_t user_id, bool is_spectate = false, String message_content = "") -{ - if (get_is_discord_working()) - // core->ActivityManager().SendInvite(user_id, static_cast(is_spectate + 1), message_content.utf8().get_data(), {}); - return; -} -void DiscordUtil::accept_invite(int64_t user_id) -{ - if (get_is_discord_working()) - // core->ActivityManager().AcceptInvite(user_id, {}); - return; -} - -void DiscordUtil::register_command(String value) -{ - if (get_is_discord_working()) - // core->ActivityManager().RegisterCommand(value.utf8().get_data()); - return; -} -void DiscordUtil::register_steam(int32_t value) -{ - if (get_is_discord_working()) - // core->ActivityManager().RegisterSteam(value); - return; -} -Dictionary DiscordUtil::get_current_user() -{ - Dictionary userdict; - if (get_is_discord_working()) - { - // discordpp::User user{}; - // core->UserManager().GetCurrentUser(&user); - return userdict; // user2dict(user) - } - return userdict; -} - -Dictionary DiscordUtil::get_relationship(int64_t user_id) -{ - Dictionary dict; - if (get_is_discord_working()) - { - // discordpp::Relationship relationship{}; - // core->RelationshipManager().Get(user_id, &relationship); - return dict /*relationship2dict(relationship)*/; - } - return dict; -} - -Array DiscordUtil::get_all_relationships() -{ - Array all_relationships; - /*core->RelationshipManager().Filter( - [](discordpp::Relationship const &relationship) -> bool - { return true; });*/ - uint32_t friendcount{0}; - // core->RelationshipManager().Count(&friendcount); - /*for (int i = 0; i < friendcount; i++) - { - discordpp::Relationship relationship{}; - core->RelationshipManager().GetAt(i, &relationship); - all_relationships.append(relationship2dict(relationship)); - }*/ - return all_relationships; -} - Dictionary DiscordUtil::user2dict(discordpp::UserHandle user) { Dictionary userdict; @@ -419,9 +193,4 @@ Dictionary DiscordUtil::relationship2dict(discordpp::RelationshipHandle relation dict_relationship["presence"] = presence; dict_relationship.make_read_only();*/ return dict_relationship; -} - -bool DiscordUtil::get_is_discord_working() -{ - return app_id > 0; /*result.Successful() &&*/ } \ No newline at end of file diff --git a/src/util.h b/src/util.h index 65ed1c6..74c6ac8 100644 --- a/src/util.h +++ b/src/util.h @@ -27,34 +27,11 @@ public: DiscordUtil(); ~DiscordUtil(); - // INTERBNAL - int64_t old_app_id; Dictionary relationship2dict(discordpp::RelationshipHandle relationship); Dictionary user2dict(discordpp::UserHandle user); - /// - void set_app_id(int64_t value); - int64_t get_app_id(); - int64_t app_id = 0; // needs to be directly set to 0 or it will crash randomly - H_SET_GET(is_overlay_locked, false) void debug(); void run_callbacks(); - void refresh(); - void clear(bool reset_values); - void unclear(); - bool get_is_overlay_enabled(); - void open_invite_overlay(bool is_spectate); - void open_server_invite_overlay(String invite_code); - void open_voice_settings(); - void accept_join_request(int64_t user_id); - void send_invite(int64_t user_id, bool is_spectate, String message_content); - void accept_invite(int64_t user_id); - void register_command(String value); - void register_steam(int32_t value); - Dictionary get_current_user(); - Dictionary get_relationship(int64_t user_id); - Array get_all_relationships(); - bool get_is_discord_working(); }; #endif \ No newline at end of file