added signal and cleaned up old code

This commit is contained in:
2025-03-24 14:42:20 +01:00
parent 70969b5a19
commit 8e029178cd
9 changed files with 23 additions and 351 deletions

View File

@@ -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"]

View File

@@ -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])

View File

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

View File

@@ -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"]

View File

@@ -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; }

View File

@@ -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()));
}

View File

@@ -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();

View File

@@ -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<discordpp::ActivityActionType>(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<discordpp::ActivityJoinRequestReply>(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<discordpp::ActivityActionType>(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() &&*/
}

View File

@@ -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