added signal and cleaned up old code
This commit is contained in:
@@ -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"]
|
||||
|
4
project/discord_connector.gd
Normal file
4
project/discord_connector.gd
Normal 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])
|
1
project/discord_connector.gd.uid
Normal file
1
project/discord_connector.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://kmubk5a6i385
|
@@ -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"]
|
||||
|
@@ -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; }
|
||||
|
||||
|
@@ -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()));
|
||||
}
|
||||
|
@@ -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();
|
||||
|
231
src/util.cpp
231
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<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;
|
||||
@@ -420,8 +194,3 @@ Dictionary DiscordUtil::relationship2dict(discordpp::RelationshipHandle relation
|
||||
dict_relationship.make_read_only();*/
|
||||
return dict_relationship;
|
||||
}
|
||||
|
||||
bool DiscordUtil::get_is_discord_working()
|
||||
{
|
||||
return app_id > 0; /*result.Successful() &&*/
|
||||
}
|
23
src/util.h
23
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
|
Reference in New Issue
Block a user