[WIP] Add custom activity structure type to GDScript #6

Closed
vaporvee wants to merge 4 commits from add-activity-as-structure into main
22 changed files with 202 additions and 195 deletions

4
.gitignore vendored
View File

@@ -19,6 +19,4 @@ build/
*.lib
#Clean files from the Game SDK
src/discord-game-sdk-cpp/*.cpp
src/discord-game-sdk-cpp/*.h
src/discord-game-sdk-cpp/*.md
src/lib/discord_game_sdk/

4
.gitmodules vendored
View File

@@ -1,3 +1,3 @@
[submodule "lib/godot-cpp"]
path = lib/godot-cpp
[submodule "src/lib/godot-cpp"]
path = src/lib/godot-cpp
url = https://github.com/godotengine/godot-cpp

21
.vscode/c_cpp_properties.json vendored Normal file
View File

@@ -0,0 +1,21 @@
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${default}"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.22621.0",
"compilerPath": "cl.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64"
}
],
"version": 4
}

12
.vscode/settings.json vendored
View File

@@ -1,10 +1,14 @@
{
"C_Cpp.default.includePath": [
"lib/godot-cpp/include",
"lib/godot-cpp/gen/include",
"lib/godot-cpp/gdextension"
"src/lib/godot-cpp/include",
"src/lib/godot-cpp/gen/include",
"src/lib/godot-cpp/gdextension"
],
"files.associations": {
"xlocbuf": "cpp"
}
},
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter"
},
"python.formatting.provider": "none"
}

View File

@@ -45,8 +45,8 @@ func _ready():
<br />
### Credit
[@Pukimaa](https://github.com/pukimaa) - Designer
[@Pukimaa](https://github.com/pukimaa) - Designer<br>
[@koyuawsmbrtn](https://github.com/koyuawsmbrtn) - Getting it to work on MacOS (shes giving her best)
<br />
*This project is not endorsed or affiliated with Discord Inc. or the Godot Foundation.*

View File

@@ -2,40 +2,62 @@
import os
# Gets the standard flags CC, CCX, etc.
env = SConscript("lib/godot-cpp/SConstruct")
env = SConscript("src/lib/godot-cpp/SConstruct")
# Check our platform specifics
if env['platform'] == "macos":
discord_library = 'libdiscord_game_sdk.dylib'
if env["platform"] == "macos":
discord_library = "libdiscord_game_sdk.dylib"
discord_library_second = "libdiscord_game_sdk_aarch64.dylib"
libexportfolder = "/macos/"
elif env['platform'] in ('linuxbsd', 'linux'):
discord_library = 'libdiscord_game_sdk.so'
elif env["platform"] in ("linuxbsd", "linux"):
discord_library = "libdiscord_game_sdk.so"
discord_library_second = ""
libexportfolder = "/linux/"
elif env['platform'] == "windows":
discord_library = 'discord_game_sdk.dll'
elif env["platform"] == "windows":
discord_library = "discord_game_sdk.dll"
discord_library_second = "discord_game_sdk_x86.dll"
libexportfolder = "/windows/"
if env['target'] == "template_debug":
if env["target"] == "template_debug":
debugsuffix = "_debug"
else:
debugsuffix = ""
# make sure our binding library is properly includes
env.Append(LIBPATH=["lib/discord-game-sdk/"])
sources = Glob('src/discord-game-sdk-cpp/*.cpp')
env.Append(CPPPATH=['src/discord-game-sdk-cpp'])
env.Append(LIBPATH=["src/lib/discord_game_sdk/bin/"])
sources = Glob("src/lib/discord_game_sdk/cpp/*.cpp")
env.Append(CPPPATH=["src/lib/discord_game_sdk/cpp/"])
env.Append(LIBS=["discord_game_sdk"])
# tweak this if you want to use different folders, or more folders, to store your source code in.
env.Append(CPPPATH=['src/'])
sources += Glob('src/*.cpp')
env.Append(CPPPATH=["src/"])
sources += Glob("src/*.cpp")
# The finished exports
library = env.SharedLibrary(target="project/addons/discord-sdk-gd/bin/" +
libexportfolder + "discord_game_sdk_binding" + debugsuffix, source=sources)
env.Depends(library, Command("project/addons/discord-sdk-gd/bin/" + libexportfolder +
discord_library, "lib/discord-game-sdk/" + discord_library, Copy("$TARGET", "$SOURCE")))
library = env.SharedLibrary(
target="project/addons/discord-sdk-gd/bin/"
+ libexportfolder
+ "discord_game_sdk_binding"
+ debugsuffix,
source=sources,
)
env.Depends(
library,
Command(
"project/addons/discord-sdk-gd/bin/" + libexportfolder + discord_library,
"src/lib/discord_game_sdk/bin/" + discord_library,
Copy("$TARGET", "$SOURCE"),
),
)
env.Depends(
library,
Command(
"project/addons/discord-sdk-gd/bin/" + libexportfolder + discord_library_second,
"src/lib/discord_game_sdk/bin/" + discord_library_second,
Copy("$TARGET", "$SOURCE"),
),
)
Default(library)

Submodule lib/godot-cpp deleted from feaba551b5

View File

@@ -3,8 +3,12 @@ extends EditorExportPlugin
func _export_file(path, type, features):
if features[2] == "windows":
add_shared_object("res://addons/discord-sdk-gd/bin/windows/discord_game_sdk.dll",[],"/")
if features[4] == "x86_64":
add_shared_object("res://addons/discord-sdk-gd/bin/windows/discord_game_sdk.dll",[],"/")
elif features[4] == "x86":
add_shared_object("res://addons/discord-sdk-gd/bin/windows/discord_game_sdk_x86.dll",[],"/")
elif features[2] == "linux":
add_shared_object("res://addons/discord-sdk-gd/bin/linux/libdiscord_game_sdk.so",[],"/")
elif features[2] == "macos":
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",[],"/")

View File

@@ -3,15 +3,42 @@ from distutils.dir_util import copy_tree
import shutil
import os
with zipfile.ZipFile("src/discord-game-sdk-cpp/discord_game_sdk.zip", "r") as zip_ref:
zip_ref.extractall("src/discord-game-sdk-cpp")
with zipfile.ZipFile("src/lib/discord_game_sdk.zip", "r") as zip_ref:
zip_ref.extractall("src/lib/discord_game_sdk/")
copy_tree("src/discord-game-sdk-cpp/cpp", "src/discord-game-sdk-cpp/")
copy_tree("src/lib/discord_game_sdk/lib/", "src/lib/discord_game_sdk/bin/")
os.rename(
"src/lib/discord_game_sdk/bin/aarch64/discord_game_sdk.dylib",
"src/lib/discord_game_sdk/bin/aarch64/libdiscord_game_sdk_aarch64.dylib",
)
os.rename(
"src/lib/discord_game_sdk/bin/x86_64/discord_game_sdk.dylib",
"src/lib/discord_game_sdk/bin/x86_64/libdiscord_game_sdk.dylib",
)
os.rename(
"src/lib/discord_game_sdk/bin/x86_64/discord_game_sdk.so",
"src/lib/discord_game_sdk/bin/x86_64/libdiscord_game_sdk.so",
)
os.rename(
"src/lib/discord_game_sdk/bin/x86/discord_game_sdk.dll",
"src/lib/discord_game_sdk/bin/x86/discord_game_sdk_x86.dll",
)
shutil.rmtree("src/discord-game-sdk-cpp/c/", ignore_errors=True)
shutil.rmtree("src/discord-game-sdk-cpp/cpp/", ignore_errors=True)
shutil.rmtree("src/discord-game-sdk-cpp/csharp/", ignore_errors=True)
shutil.rmtree("src/discord-game-sdk-cpp/examples/", ignore_errors=True)
shutil.rmtree("src/discord-game-sdk-cpp/lib/", ignore_errors=True)
os.rename(
"src/lib/discord_game_sdk/bin/x86_64/discord_game_sdk.dll.lib",
"src/lib/discord_game_sdk/bin/x86_64/discord_game_sdk.lib",
)
copy_tree("src/lib/discord_game_sdk/bin/aarch64/", "src/lib/discord_game_sdk/bin/")
copy_tree("src/lib/discord_game_sdk/bin/x86/", "src/lib/discord_game_sdk/bin/")
copy_tree("src/lib/discord_game_sdk/bin/x86_64/", "src/lib/discord_game_sdk/bin/")
shutil.rmtree("src/lib/discord_game_sdk/c/", ignore_errors=True)
shutil.rmtree("src/lib/discord_game_sdk/csharp/", ignore_errors=True)
shutil.rmtree("src/lib/discord_game_sdk/examples/", ignore_errors=True)
shutil.rmtree("src/lib/discord_game_sdk/lib/", ignore_errors=True)
shutil.rmtree("src/lib/discord_game_sdk/bin/aarch64/", ignore_errors=True)
shutil.rmtree("src/lib/discord_game_sdk/bin/x86/", ignore_errors=True)
shutil.rmtree("src/lib/discord_game_sdk/bin/x86_64/", ignore_errors=True)
os.remove("src/lib/discord_game_sdk/README.md")
os.system("git submodule update --init")

View File

@@ -1,5 +1,4 @@
#include "discordgodot.h"
#include "./discord-game-sdk-cpp/discord.h"
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/classes/editor_plugin.hpp>
#include <godot_cpp/variant/utility_functions.hpp>
@@ -9,11 +8,6 @@ using namespace godot;
Discord_SDK *Discord_SDK::singleton = nullptr;
discord::Core *core{};
discord::Result result;
discord::Activity activity{};
discord::User user{};
void Discord_SDK::_bind_methods()
{
ClassDB::bind_method(D_METHOD("debug"), &Discord_SDK::debug);
@@ -22,38 +16,16 @@ void Discord_SDK::_bind_methods()
ClassDB::bind_method(D_METHOD("get_app_id"), &Discord_SDK::get_app_id);
ClassDB::bind_method(D_METHOD("set_app_id", "app_id"), &Discord_SDK::set_app_id);
ADD_PROPERTY(PropertyInfo(Variant::INT, "app_id"), "set_app_id", "get_app_id");
ClassDB::bind_method(D_METHOD("get_state"), &Discord_SDK::get_state);
ClassDB::bind_method(D_METHOD("set_state", "state"), &Discord_SDK::set_state);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "state"), "set_state", "get_state");
ClassDB::bind_method(D_METHOD("get_details"), &Discord_SDK::get_details);
ClassDB::bind_method(D_METHOD("set_details", "details"), &Discord_SDK::set_details);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "details"), "set_details", "get_details");
ClassDB::bind_method(D_METHOD("get_large_image"), &Discord_SDK::get_large_image);
ClassDB::bind_method(D_METHOD("set_large_image", "large_image"), &Discord_SDK::set_large_image);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "large_image"), "set_large_image", "get_large_image");
ClassDB::bind_method(D_METHOD("get_large_image_text"), &Discord_SDK::get_large_image_text);
ClassDB::bind_method(D_METHOD("set_large_image_text", "large_image_text"), &Discord_SDK::set_large_image_text);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "large_image_text"), "set_large_image_text", "get_large_image_text");
ClassDB::bind_method(D_METHOD("get_small_image"), &Discord_SDK::get_small_image);
ClassDB::bind_method(D_METHOD("set_small_image", "small_image"), &Discord_SDK::set_small_image);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "small_image"), "set_small_image", "get_small_image");
ClassDB::bind_method(D_METHOD("get_small_image_text"), &Discord_SDK::get_small_image_text);
ClassDB::bind_method(D_METHOD("set_small_image_text", "large_small_text"), &Discord_SDK::set_small_image_text);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "small_image_text"), "set_small_image_text", "get_small_image_text");
ClassDB::bind_method(D_METHOD("get_start_timestamp"), &Discord_SDK::get_start_timestamp);
ClassDB::bind_method(D_METHOD("set_start_timestamp", "start_timestamp"), &Discord_SDK::set_start_timestamp);
ADD_PROPERTY(PropertyInfo(Variant::INT, "start_timestamp"), "set_start_timestamp", "get_start_timestamp");
ClassDB::bind_method(D_METHOD("get_end_timestamp"), &Discord_SDK::get_end_timestamp);
ClassDB::bind_method(D_METHOD("set_end_timestamp", "end_timestamp"), &Discord_SDK::set_end_timestamp);
ADD_PROPERTY(PropertyInfo(Variant::INT, "end_timestamp"), "set_end_timestamp", "get_end_timestamp");
ClassDB::bind_method(D_METHOD("refresh"), &Discord_SDK::refresh);
ClassDB::bind_method(D_METHOD("get_activity"), &Discord_SDK::get_activity);
ClassDB::bind_method(D_METHOD("set_activity", "activity"), &Discord_SDK::set_activity);
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "activity"), "set_activity", "get_activity");
ClassDB::bind_method(D_METHOD("get_is_discord_working"), &Discord_SDK::get_is_discord_working);
ClassDB::bind_method(D_METHOD("get_result_int"), &Discord_SDK::get_result_int);
ClassDB::bind_method(D_METHOD("refresh"), &Discord_SDK::refresh);
}
Discord_SDK *Discord_SDK::get_singleton()
@@ -83,16 +55,16 @@ void Discord_SDK::coreupdate()
void Discord_SDK::debug()
{
result = discord::Core::Create(1080224638845591692, DiscordCreateFlags_NoRequireDiscord, &core);
activity.SetState("Test from Godot!");
activity.SetDetails("I worked months on this");
activity.GetAssets().SetLargeImage("test1");
activity.GetAssets().SetLargeText("wow test text for large image");
activity.GetAssets().SetSmallImage("godot");
activity.GetAssets().SetSmallText("wow test text for small image");
activity.GetTimestamps().SetStart(1682242800);
sdkactivity.SetState("Test from Godot!");
sdkactivity.SetDetails("I worked months on this");
sdkactivity.GetAssets().SetLargeImage("test1");
sdkactivity.GetAssets().SetLargeText("wow test text for large image");
sdkactivity.GetAssets().SetSmallImage("godot");
sdkactivity.GetAssets().SetSmallText("wow test text for small image");
sdkactivity.GetTimestamps().SetStart(1682242800);
if (result == discord::Result::Ok)
{
core->ActivityManager().UpdateActivity(activity, [](discord::Result result) {});
core->ActivityManager().UpdateActivity(sdkactivity, [](discord::Result result) {});
core->UserManager().OnCurrentUserUpdate.Connect([]()
{ core->UserManager().GetCurrentUser(&user); });
}
@@ -110,91 +82,29 @@ int64_t Discord_SDK::get_app_id() const
return app_id;
}
void Discord_SDK::set_state(const String &value)
{
state = value;
activity.SetState(value.utf8().get_data());
}
String Discord_SDK::get_state() const
{
return state;
}
void Discord_SDK::set_details(const String &value)
{
details = value;
activity.SetDetails(value.utf8().get_data());
}
String Discord_SDK::get_details() const
{
return details;
}
void Discord_SDK::set_activity(const Object &value)
{ /*
activity.state = value.state;
activity.details = value.details;
activity.large_image = value.large_image;
activity.large_image = value.large_image_text;
activity.large_image = value.small_image;
activity.large_image = value.small_image_text;
activity.start_timestamp = value.start_timestamp;
activity.end_timestamp = value.end_timestamp;*/
void Discord_SDK::refresh()
{
if (result == discord::Result::Ok && app_id > 0)
{
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!");
sdkactivity.SetState(activity.state.utf8().get_data());
sdkactivity.SetDetails(activity.details.utf8().get_data());
sdkactivity.GetAssets().SetLargeImage(activity.large_image.utf8().get_data());
sdkactivity.GetAssets().SetLargeText(activity.large_image_text.utf8().get_data());
sdkactivity.GetAssets().SetSmallImage(activity.small_image.utf8().get_data());
sdkactivity.GetAssets().SetSmallText(activity.small_image_text.utf8().get_data());
sdkactivity.GetTimestamps().SetStart(activity.start_timestamp);
sdkactivity.GetTimestamps().SetEnd(activity.end_timestamp);
}
void Discord_SDK::set_large_image(const String &value)
Object Discord_SDK::get_activity() const
{
large_image = value;
activity.GetAssets().SetLargeImage(value.utf8().get_data());
}
String Discord_SDK::get_large_image() const
{
return large_image;
}
void Discord_SDK::set_large_image_text(const String &value)
{
large_image_text = value;
activity.GetAssets().SetLargeText(value.utf8().get_data());
}
String Discord_SDK::get_large_image_text() const
{
return large_image_text;
}
void Discord_SDK::set_small_image(const String &value)
{
small_image = value;
activity.GetAssets().SetSmallImage(value.utf8().get_data());
}
String Discord_SDK::get_small_image() const
{
return small_image;
}
void Discord_SDK::set_small_image_text(const String &value)
{
small_image_text = value;
activity.GetAssets().SetSmallText(value.utf8().get_data());
}
String Discord_SDK::get_small_image_text() const
{
return small_image_text;
}
void Discord_SDK::set_start_timestamp(const int64_t &value)
{
start_timestamp = value;
activity.GetTimestamps().SetStart(value);
}
int64_t Discord_SDK::get_start_timestamp() const
{
return activity.GetTimestamps().GetStart();
}
void Discord_SDK::set_end_timestamp(const int64_t &value)
{
end_timestamp = value;
activity.GetTimestamps().SetEnd(value);
}
int64_t Discord_SDK::get_end_timestamp() const
{
return activity.GetTimestamps().GetEnd();
return activity;
}
bool Discord_SDK::get_is_discord_working() const
@@ -206,3 +116,15 @@ int Discord_SDK::get_result_int() const
{
return static_cast<int>(result);
}
void Discord_SDK::refresh()
{
if (result == discord::Result::Ok && app_id > 0)
{
core->ActivityManager().UpdateActivity(sdkactivity, [](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!");
}

View File

@@ -2,16 +2,21 @@
#define DISCORDGODOT_H
#include <stdio.h>
#include "discord-game-sdk-cpp/discord.h"
#include "lib/discord_game_sdk/cpp/discord.h"
#include <godot_cpp/classes/ref_counted.hpp>
#include <godot_cpp/classes/object.hpp>
#include <godot_cpp/core/class_db.hpp>
using namespace godot;
class Discord_SDK : public Object
{
GDCLASS(Discord_SDK, Object);
discord::Core *core{};
discord::Result result;
discord::Activity sdkactivity{};
discord::User user{};
class Discord_SDK : public RefCounted
{
GDCLASS(Discord_SDK, RefCounted);
static Discord_SDK *singleton;
protected:
@@ -20,48 +25,49 @@ protected:
private:
int64_t app_id;
String state;
String details;
String large_image;
String large_image_text;
String small_image;
String small_image_text;
int64_t start_timestamp;
int64_t end_timestamp;
public:
static Discord_SDK *get_singleton();
static Discord_SDK *
get_singleton();
Discord_SDK();
~Discord_SDK();
class activitystruct : public Object
{
GDCLASS(activitystruct, Object);
protected:
static void _bind_methods();
public:
static activitystruct *
get_singleton();
activitystruct();
~activitystruct();
String state;
String details;
String large_image;
String large_image_text;
String small_image;
String small_image_text;
int64_t start_timestamp;
int64_t end_timestamp;
};
activitystruct activity;
void debug();
void coreupdate();
void refresh();
int64_t get_app_id() const;
void set_app_id(const int64_t &value);
String get_state() const;
void set_state(const String &value);
String get_details() const;
void set_details(const String &value);
String get_large_image() const;
void set_large_image(const String &value);
String get_large_image_text() const;
void set_large_image_text(const String &value);
String get_small_image() const;
void set_small_image(const String &value);
String get_small_image_text() const;
void set_small_image_text(const String &value);
int64_t get_start_timestamp() const;
void set_start_timestamp(const int64_t &value);
int64_t get_end_timestamp() const;
void set_end_timestamp(const int64_t &value);
void set_activity(const Object &value);
Object get_activity() const;
bool get_is_discord_working() const;
int get_result_int() const;

View File

@@ -10,13 +10,16 @@
using namespace godot;
static Discord_SDK *discordsdk;
static Discord_SDK::activitystruct *discordsdkactivity;
void gdextension_initialize(ModuleInitializationLevel p_level)
{
if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE)
{
ClassDB::register_class<Discord_SDK>();
ClassDB::register_class<Discord_SDK::activitystruct>();
discordsdk = memnew(Discord_SDK);
discordsdkactivity = memnew(Discord_SDK::activitystruct);
Engine::get_singleton()->register_singleton("Discord_SDK", Discord_SDK::get_singleton());
}
}
@@ -27,6 +30,7 @@ void gdextension_terminate(ModuleInitializationLevel p_level)
{
Engine::get_singleton()->unregister_singleton("Discord_SDK");
memdelete(discordsdk);
memdelete(discordsdkactivity);
}
}