Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
2fcb6d2d38 | ||
|
90d6d9dd86 | ||
|
a6a0347dbe | ||
|
92915897db | ||
|
e95d703c7a | ||
|
ebf5d677e8 | ||
|
af1a7de970 | ||
|
fd72715976 | ||
|
84eb884b83 | ||
a62ae85545 | |||
6bc04c045b | |||
bd125cb7d3 | |||
bac857b984 | |||
|
5c43b68aed | ||
|
d68088a7e1 | ||
|
d4df61f263 | ||
|
d5a9dbf91f | ||
|
7b9ae7d24a | ||
|
ae3feb9d8e | ||
|
84db87503e |
19
README.md
19
README.md
@@ -1,21 +1,22 @@
|
|||||||
<img src="https://github.com/vaporvee/discord-sdk-godot/blob/main/project/assets/Banner_v1.png?raw=true">
|
<img src="https://github.com/vaporvee/discord-sdk-godot/blob/main/project/assets/Banner_v1.png?raw=true">
|
||||||
|
|
||||||
### This is version 1.0! In future versions there will be lobbies, invites, linux builds etc. very soon!
|
### This is an early version! In future versions there will be lobbies, invites, linux builds etc. very soon!
|
||||||
Don't forget to run the following command **if you clone this project** or the godot-cpp folder will be empty
|
Don't forget to run the following command **if you clone this project** or the godot-cpp folder will be empty
|
||||||
```sh
|
```sh
|
||||||
git submodule update --init
|
git submodule update --init
|
||||||
```
|
```
|
||||||
# Addon Usage :rocket:
|
# Addon Usage :rocket:
|
||||||
1. Put the `discord-sdk-gd/` folder in a `addons/` folder in your Godot project
|
1. [Download the addon](https://github.com/vaporvee/discord-sdk-godot/releases/latest/download/ADDON-Discord-SDK-Godot.zip/)
|
||||||
2. Enable the addon in your Project Settings under "Plugins" and "DiscordSDK". (if it doesn't show up reopen the project)
|
2. Put the `discord-sdk-gd/` folder in a `addons/` folder in your Godot project
|
||||||
3. Create an Application under https://discord.com/developers/applications and get the Application ID
|
3. Enable the addon in your Project Settings under "Plugins" and "DiscordSDK". (if it doesn't show up reopen the project)
|
||||||
4. (optional) Set images under "Rich Presence" and "Art Assets" and remember the keys
|
4. Create an Application under https://discord.com/developers/applications and get the Application ID
|
||||||
5. Exporting: You need to copy the `discord_game_sdk.dll` or on linux `discord_game_sdk.so` from `res://addons/discord-sdk-gd/bin/PLATFORM/discord_game_sdk.[dll/.so]` to your exported project in the same directory as `discord_game_sdk_binding_debug.[dll/.so]`
|
5. (optional) Set images under "Rich Presence" and "Art Assets" and remember the keys
|
||||||
```gdscript
|
```gdscript
|
||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
Discord_Activity.app_id = 1099618430065324082 # Application ID
|
Discord_Activity.app_id = 1099618430065324082 # Application ID
|
||||||
|
print("Discord working: " + str(Discord_Activity.get_is_discord_working())) # A boolean if everything worked
|
||||||
Discord_Activity.details = "A demo activity by vaporvee#1231"
|
Discord_Activity.details = "A demo activity by vaporvee#1231"
|
||||||
Discord_Activity.state = "Checkpoint 23/23"
|
Discord_Activity.state = "Checkpoint 23/23"
|
||||||
|
|
||||||
@@ -33,8 +34,12 @@ func _ready():
|
|||||||
#### Then it should look like this:
|
#### Then it should look like this:
|
||||||
<img src="https://cdn.discordapp.com/attachments/825019604207927326/1099642861256970311/activity.webp">
|
<img src="https://cdn.discordapp.com/attachments/825019604207927326/1099642861256970311/activity.webp">
|
||||||
|
|
||||||
|
### [Try a built demo](https://github.com/vaporvee/discord-sdk-godot/releases/latest/download/Demo-Export.zip)
|
||||||
|
:incoming_envelope: Still questions? write an [issue](https://github.com/vaporvee/discord-sdk-godot/issues)! I'll answer very fast :)
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
## Extra Info
|
## Extra Info
|
||||||
- "Step 2" (enabling the addon) is needed to add `Discord_Activity.coreupdate()` to a `_process()` function with a singleton. This function is needed by pretty everything but you can it also just add it yourself.
|
|
||||||
- The Discord SDK itself doesn't build under Linux for some reason (I don't have a Mac so i don't even know if it's builds under OSX) its not well documented but I try as hard as i can to get it working crossplatform but at the time its only working under Windows... (But feel free to make pull requests btw)
|
- The Discord SDK itself doesn't build under Linux for some reason (I don't have a Mac so i don't even know if it's builds under OSX) its not well documented but I try as hard as i can to get it working crossplatform but at the time its only working under Windows... (But feel free to make pull requests btw)
|
||||||
- Its an early release some features aren't implemented only because i need a small amount of time not because it's not possible
|
- Its an early release some features aren't implemented only because i need a small amount of time not because it's not possible
|
||||||
|
|
||||||
|
Binary file not shown.
Binary file not shown.
10
project/addons/discord-sdk-gd/export.gd
Normal file
10
project/addons/discord-sdk-gd/export.gd
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
@tool
|
||||||
|
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",[],"/")
|
||||||
|
elif features[2] == "linux":
|
||||||
|
add_shared_object("res://addons/discord-sdk-gd/bin/linux/discord_game_sdk.so",[],"/")
|
||||||
|
elif features[2] == "macos":
|
||||||
|
add_shared_object("res://addons/discord-sdk-gd/bin/macos/discord_game_sdk.dylib",[],"/")
|
@@ -3,5 +3,5 @@
|
|||||||
name="DiscordSDK"
|
name="DiscordSDK"
|
||||||
description="Discord Game SDK support for GDScript in Godot"
|
description="Discord Game SDK support for GDScript in Godot"
|
||||||
author="vaporvee"
|
author="vaporvee"
|
||||||
version="1.0"
|
version="1.1"
|
||||||
script="plugin.gd"
|
script="plugin.gd"
|
||||||
|
@@ -1,9 +1,15 @@
|
|||||||
@tool
|
@tool
|
||||||
extends EditorPlugin
|
extends EditorPlugin
|
||||||
|
|
||||||
|
const ExportPlugin = preload("res://addons/discord-sdk-gd/export.gd")
|
||||||
|
var loaded_exportplugin = ExportPlugin.new()
|
||||||
|
|
||||||
func _enter_tree():
|
func _enter_tree():
|
||||||
add_autoload_singleton("discord_coreupdater", "res://addons/discord-sdk-gd/discord_coreupdater.gd")
|
add_autoload_singleton("discord_coreupdater", "res://addons/discord-sdk-gd/discord_coreupdater.gd")
|
||||||
|
add_export_plugin(loaded_exportplugin)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func disable_plugin():
|
func disable_plugin():
|
||||||
remove_autoload_singleton("discord_coreupdater")
|
remove_autoload_singleton("discord_coreupdater")
|
||||||
|
remove_export_plugin(loaded_exportplugin)
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 158 KiB |
65
project/export_presets.cfg
Normal file
65
project/export_presets.cfg
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
[preset.0]
|
||||||
|
|
||||||
|
name="Windows Desktop"
|
||||||
|
platform="Windows Desktop"
|
||||||
|
runnable=true
|
||||||
|
dedicated_server=false
|
||||||
|
custom_features=""
|
||||||
|
export_filter="all_resources"
|
||||||
|
include_filter=""
|
||||||
|
exclude_filter=""
|
||||||
|
export_path="../../demo/Discord_Activity.exe"
|
||||||
|
encryption_include_filters=""
|
||||||
|
encryption_exclude_filters=""
|
||||||
|
encrypt_pck=false
|
||||||
|
encrypt_directory=false
|
||||||
|
script_encryption_key=""
|
||||||
|
|
||||||
|
[preset.0.options]
|
||||||
|
|
||||||
|
custom_template/debug=""
|
||||||
|
custom_template/release=""
|
||||||
|
debug/export_console_script=1
|
||||||
|
binary_format/embed_pck=true
|
||||||
|
texture_format/bptc=true
|
||||||
|
texture_format/s3tc=true
|
||||||
|
texture_format/etc=false
|
||||||
|
texture_format/etc2=false
|
||||||
|
binary_format/architecture="x86_64"
|
||||||
|
codesign/enable=false
|
||||||
|
codesign/identity_type=0
|
||||||
|
codesign/identity=""
|
||||||
|
codesign/password=""
|
||||||
|
codesign/timestamp=true
|
||||||
|
codesign/timestamp_server_url=""
|
||||||
|
codesign/digest_algorithm=1
|
||||||
|
codesign/description=""
|
||||||
|
codesign/custom_options=PackedStringArray()
|
||||||
|
application/modify_resources=false
|
||||||
|
application/icon=""
|
||||||
|
application/console_wrapper_icon=""
|
||||||
|
application/icon_interpolation=4
|
||||||
|
application/file_version=""
|
||||||
|
application/product_version=""
|
||||||
|
application/company_name=""
|
||||||
|
application/product_name=""
|
||||||
|
application/file_description=""
|
||||||
|
application/copyright=""
|
||||||
|
application/trademarks=""
|
||||||
|
ssh_remote_deploy/enabled=false
|
||||||
|
ssh_remote_deploy/host="user@host_ip"
|
||||||
|
ssh_remote_deploy/port="22"
|
||||||
|
ssh_remote_deploy/extra_args_ssh=""
|
||||||
|
ssh_remote_deploy/extra_args_scp=""
|
||||||
|
ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
|
||||||
|
$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
|
||||||
|
$trigger = New-ScheduledTaskTrigger -Once -At 00:00
|
||||||
|
$settings = New-ScheduledTaskSettingsSet
|
||||||
|
$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
|
||||||
|
Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
|
||||||
|
Start-ScheduledTask -TaskName godot_remote_debug
|
||||||
|
while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
|
||||||
|
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
|
||||||
|
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
|
||||||
|
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
|
||||||
|
Remove-Item -Recurse -Force '{temp_dir}'"
|
@@ -1,7 +1,6 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
#Discord_Activity.debug()
|
|
||||||
Discord_Activity.app_id = 1099618430065324082
|
Discord_Activity.app_id = 1099618430065324082
|
||||||
Discord_Activity.details = "A demo activity by vaporvee#1231"
|
Discord_Activity.details = "A demo activity by vaporvee#1231"
|
||||||
Discord_Activity.state = "Checkpoint 23/23"
|
Discord_Activity.state = "Checkpoint 23/23"
|
||||||
@@ -12,7 +11,8 @@ func _ready():
|
|||||||
Discord_Activity.small_image_text = "Fighting the end boss! D:"
|
Discord_Activity.small_image_text = "Fighting the end boss! D:"
|
||||||
|
|
||||||
Discord_Activity.start_timestamp = int(Time.get_unix_time_from_system())
|
Discord_Activity.start_timestamp = int(Time.get_unix_time_from_system())
|
||||||
#Discord_Activity.end_timestamp = 2492978400 #31. 12. 2048 in unix time
|
# Discord_Activity.end_timestamp = int(Time.get_unix_time_from_system()) + 3600 # +1 hour in unix time
|
||||||
|
|
||||||
Discord_Activity.refresh()
|
Discord_Activity.refresh()
|
||||||
$Info.text = $Info.text.replace("{id}",str(Discord_Activity.app_id)).replace("{details}",Discord_Activity.details).replace("{state}",Discord_Activity.state).replace("{lkey}",Discord_Activity.large_image).replace("{ltext}",Discord_Activity.large_image_text).replace("{skey}",Discord_Activity.small_image).replace("{stext}",Discord_Activity.small_image_text).replace("{stimestamp}",str(Discord_Activity.start_timestamp)).replace("{etimestamp}",str(Discord_Activity.end_timestamp))
|
|
||||||
|
$Info.text = $Info.text.replace("{isdiscordworking}",str(Discord_Activity.get_is_discord_working())).replace("{id}",str(Discord_Activity.app_id)).replace("{details}",Discord_Activity.details).replace("{state}",Discord_Activity.state).replace("{lkey}",Discord_Activity.large_image).replace("{ltext}",Discord_Activity.large_image_text).replace("{skey}",Discord_Activity.small_image).replace("{stext}",Discord_Activity.small_image_text).replace("{stimestamp}",str(Discord_Activity.start_timestamp)).replace("{etimestamp}",str(Discord_Activity.end_timestamp))
|
||||||
|
@@ -45,8 +45,10 @@ text = "[center][font s=60][rainbow]DiscordSDK Test[/rainbow][/font]"
|
|||||||
offset_left = 7.0
|
offset_left = 7.0
|
||||||
offset_top = 6.0
|
offset_top = 6.0
|
||||||
offset_right = 514.0
|
offset_right = 514.0
|
||||||
offset_bottom = 399.0
|
offset_bottom = 722.0
|
||||||
text = "Application ID : {id}
|
text = "Is Discord working: {isdiscordworking}
|
||||||
|
|
||||||
|
Application ID : {id}
|
||||||
Details: {details}
|
Details: {details}
|
||||||
State: {state}
|
State: {state}
|
||||||
|
|
||||||
@@ -57,3 +59,4 @@ Small image text: {stext}
|
|||||||
|
|
||||||
Start timestamp: {stimestamp}
|
Start timestamp: {stimestamp}
|
||||||
End timestamp: {etimestamp}"
|
End timestamp: {etimestamp}"
|
||||||
|
scroll_active = false
|
||||||
|
@@ -49,6 +49,8 @@ void Discord_Activity::_bind_methods()
|
|||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "end_timestamp"), "set_end_timestamp", "get_end_timestamp");
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "end_timestamp"), "set_end_timestamp", "get_end_timestamp");
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("refresh"), &Discord_Activity::refresh);
|
ClassDB::bind_method(D_METHOD("refresh"), &Discord_Activity::refresh);
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("get_is_discord_working"), &Discord_Activity::get_is_discord_working);
|
||||||
}
|
}
|
||||||
|
|
||||||
Discord_Activity *Discord_Activity::get_singleton()
|
Discord_Activity *Discord_Activity::get_singleton()
|
||||||
@@ -70,21 +72,26 @@ Discord_Activity::~Discord_Activity()
|
|||||||
|
|
||||||
void Discord_Activity::debug()
|
void Discord_Activity::debug()
|
||||||
{
|
{
|
||||||
auto debugresult = discord::Core::Create(1080224638845591692, DiscordCreateFlags_NoRequireDiscord, &core);
|
result = discord::Core::Create(1080224638845591692, DiscordCreateFlags_NoRequireDiscord, &core);
|
||||||
discord::Activity debugactivity{};
|
activity.SetState("Test from Godot!");
|
||||||
debugactivity.SetState("Test from Godot!");
|
activity.SetDetails("I worked months on this");
|
||||||
debugactivity.SetDetails("I worked months on this");
|
activity.GetAssets().SetLargeImage("test1");
|
||||||
debugactivity.GetAssets().SetLargeImage("test1");
|
activity.GetAssets().SetLargeText("wow test text for large image");
|
||||||
debugactivity.GetAssets().SetLargeText("wow test text for large image");
|
activity.GetAssets().SetSmallImage("godot");
|
||||||
debugactivity.GetAssets().SetSmallImage("godot");
|
activity.GetAssets().SetSmallText("wow test text for small image");
|
||||||
debugactivity.GetAssets().SetSmallText("wow test text for small image");
|
activity.GetTimestamps().SetStart(1682242800);
|
||||||
debugactivity.GetTimestamps().SetStart(1682242800);
|
if (result == discord::Result::Ok)
|
||||||
core->ActivityManager().UpdateActivity(debugactivity, [](discord::Result debugresult) {});
|
{
|
||||||
|
core->ActivityManager().UpdateActivity(activity, [](discord::Result result) {});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
UtilityFunctions::push_warning("Discord Activity couldn't be updated. It could be that Discord isn't running!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Discord_Activity::coreupdate()
|
void Discord_Activity::coreupdate()
|
||||||
{
|
{
|
||||||
::core->RunCallbacks();
|
if (result == discord::Result::Ok)
|
||||||
|
::core->RunCallbacks();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Discord_Activity::set_app_id(const int64_t &value)
|
void Discord_Activity::set_app_id(const int64_t &value)
|
||||||
@@ -118,7 +125,10 @@ String Discord_Activity::get_details() const
|
|||||||
|
|
||||||
void Discord_Activity::refresh()
|
void Discord_Activity::refresh()
|
||||||
{
|
{
|
||||||
core->ActivityManager().UpdateActivity(activity, [](discord::Result result) {});
|
if (result == discord::Result::Ok)
|
||||||
|
core->ActivityManager().UpdateActivity(activity, [](discord::Result result) {});
|
||||||
|
else
|
||||||
|
UtilityFunctions::push_warning("Discord Activity couldn't be updated. It could be that Discord isn't running!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Discord_Activity::set_large_image(const String &value)
|
void Discord_Activity::set_large_image(const String &value)
|
||||||
@@ -175,4 +185,9 @@ void Discord_Activity::set_end_timestamp(const int64_t &value)
|
|||||||
int64_t Discord_Activity::get_end_timestamp() const
|
int64_t Discord_Activity::get_end_timestamp() const
|
||||||
{
|
{
|
||||||
return activity.GetTimestamps().GetEnd();
|
return activity.GetTimestamps().GetEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Discord_Activity::get_is_discord_working() const
|
||||||
|
{
|
||||||
|
return result == discord::Result::Ok;
|
||||||
}
|
}
|
@@ -61,6 +61,8 @@ public:
|
|||||||
void set_start_timestamp(const int64_t &value);
|
void set_start_timestamp(const int64_t &value);
|
||||||
int64_t get_end_timestamp() const;
|
int64_t get_end_timestamp() const;
|
||||||
void set_end_timestamp(const int64_t &value);
|
void set_end_timestamp(const int64_t &value);
|
||||||
|
|
||||||
|
bool get_is_discord_working() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@@ -16,9 +16,8 @@ void gdextension_initialize(ModuleInitializationLevel p_level)
|
|||||||
if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE)
|
if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE)
|
||||||
{
|
{
|
||||||
ClassDB::register_class<Discord_Activity>();
|
ClassDB::register_class<Discord_Activity>();
|
||||||
|
|
||||||
discordactivity = memnew(Discord_Activity);
|
discordactivity = memnew(Discord_Activity);
|
||||||
Engine::get_singleton()->register_singleton("Discord_Activity", Discord_Activity::get_singleton()); // Cant change the class name in the cpp files for some reason
|
Engine::get_singleton()->register_singleton("Discord_Activity", Discord_Activity::get_singleton());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user