2 Commits
1.2.0 ... 2.0

Author SHA1 Message Date
Yannik
7c66fbc474 fixed some 2.0 bugs 2023-05-17 00:58:38 +02:00
Yannik
a8c4f33fdd Merge pull request #27 from vaporvee/make-2.0-releasable
Fix bugs and round up main for 2.0
2023-05-17 00:35:58 +02:00
64 changed files with 1386 additions and 1765 deletions

1
.github/FUNDING.yml vendored
View File

@@ -1,2 +1 @@
patreon: vaporvee
ko_fi: vaporvee ko_fi: vaporvee

View File

@@ -1,6 +1,6 @@
name: Error name: Bug Report
description: Get help with an error or report a bug description: File a bug report
title: "[Issue/Bug]: " title: "[Bug/Crash]: "
labels: ["bug"] labels: ["bug"]
assignees: assignees:
- vaporvee - vaporvee
@@ -21,26 +21,14 @@ body:
id: version id: version
attributes: attributes:
label: Version label: Version
description: What version of the Discord Game SDK Godot plugin are you running? description: What version of our software are you running?
options: options:
- 1.2.0 - 1.5
- 1.1.0 - 1.4
- 1.0.1 - 1.3
- 1.0.0 - 1.2
- 0.3.2 - 1.1
- 0.3.1 - 1.0
- 0.3.0
- 0.2.4
- 0.2.3
- 0.2.2
- 0.2.1
- 0.2.0
- 0.1.5
- 0.1.4
- 0.1.3
- 0.1.2
- 0.1.1
- 0.1.0
- Custom build - Custom build
validations: validations:
required: true required: true
@@ -48,15 +36,8 @@ body:
id: gd-version id: gd-version
attributes: attributes:
label: Godot Version label: Godot Version
description: This addon is ONLY for 4.1 and above! description: This addon is ONLY for 4.0 and above!
placeholder: e.g. 4.1.0-stable placeholder: e.g. 4.0.2-stable
validations:
required: true
- type: textarea
id: steps_reproduce
attributes:
label: Exact steps to reproduce this error
description: Tell what completely exactly you did from downloading and copying the plugin to the error. You can also drag and drop a zip file of how you would setup a fresh project with it.
validations: validations:
required: true required: true
- type: textarea - type: textarea
@@ -89,10 +70,8 @@ body:
attributes: attributes:
label: Checks label: Checks
description: Common mistakes (Adding more in the future sorry btw) description: Common mistakes (Adding more in the future sorry btw)
options: options:
- label: I tried reinstalling the addon or tried to fix it myself with other methods. - label: I tried reinstalling the addon or tried to fix it myself with other methods.
required: true required: true
- label: I tried restarting Discord and Godot completely. - label: I tried restarting Discord and Godot completely.
required: true required: true
- label: I did read the documentation https://vaporvee.com/docs/discord-sdk-godot/
required: true

View File

@@ -1,27 +0,0 @@
name: Feature request
description: File a feature request
title: "[Feature request]: "
labels: ["enhancement"]
assignees:
- vaporvee
body:
- type: markdown
attributes:
value: Thanks for taking the time to fill out this feature request!
- type: textarea
id: idea
attributes:
label: What is your idea?
description: Tell me what you want to see in the addon.
placeholder: Tell me what you want to see!
value: "I have a cool new feature!"
validations:
required: true
- type: textarea
id: additional
attributes:
label: Additional information
description: If you have anything else tell me here
placeholder: Anything else.
validations:
required: false

View File

@@ -1,65 +0,0 @@
name: Auto Wontfix Issues
on:
issues:
types: [opened, edited]
jobs:
auto_wontfix:
runs-on: ubuntu-latest
steps:
- name: Check for specific word in the issue
uses: actions/github-script@v4
with:
github-token: ${{ secrets.WONTFIX_TOKEN }}
script: |
const wordToCheck = 'mac';
const issue = context.payload.issue;
if (issue.body && issue.body.toLowerCase().includes(wordToCheck)) {
const repo = context.repo.repo;
const owner = context.repo.owner;
const number = issue.number;
const issueComment = "macOS is not supported, because loading libraries in Godot from third-party sources requires a paid developer certificate from Apple. You are welcome to compile and sign the library yourself.";
// Mark the issue as "wontfix"
await octokit.issues.update({
owner,
repo,
issue_number: number,
state: 'closed',
labels: ['wontfix']
});
// Post a comment on the issue
await octokit.issues.createComment({
owner,
repo,
issue_number: number,
body: issueComment
});
}
if (issue.title && issue.title.toLowerCase().includes(wordToCheck)) {
const repo = context.repo.repo;
const owner = context.repo.owner;
const number = issue.number;
const issueComment = "macOS is not supported, because loading libraries in Godot from third-party sources requires a paid developer certificate from Apple. You are welcome to compile and sign the library yourself.";
// Mark the issue as "wontfix"
await octokit.issues.update({
owner,
repo,
issue_number: number,
state: 'closed',
labels: ['wontfix']
});
// Post a comment on the issue
await octokit.issues.createComment({
owner,
repo,
issue_number: number,
body: issueComment
});
}

15
.gitignore vendored
View File

@@ -1,14 +1,12 @@
# Objects. # Objects.
.scons-cache/ .scons-cache/
*.os *.os
*.o
# SConstruct # SConstruct
.sconf_temp .sconf_temp
.sconsign.dblite .sconsign.dblite
*.pyc *.pyc
# MacOS # MacOS
.DS_Store .DS_Store
@@ -19,15 +17,6 @@ build/
*.obj *.obj
*.exp *.exp
*.lib *.lib
*.a
#Clean files from setup.py
src/lib/discord_game_sdk/
# release
release/
project/export/
# venv
venv/
#Clean files from the Game SDK
src/lib/discord_game_sdk/

1
.gitmodules vendored
View File

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

View File

@@ -6,8 +6,7 @@
"${default}", "${default}",
"${workspaceFolder}/src/lib/godot-cpp/gen/include", "${workspaceFolder}/src/lib/godot-cpp/gen/include",
"${workspaceFolder}/src/lib/godot-cpp/include", "${workspaceFolder}/src/lib/godot-cpp/include",
"${workspaceFolder}/src/lib/godot-cpp/gdextension", "${workspaceFolder}/src/lib/godot-cpp/gdextension"
"${workspaceFolder}/src/lib/godot-cpp/gen/include"
], ],
"defines": [ "defines": [
"_DEBUG", "_DEBUG",

View File

@@ -1,8 +1,5 @@
{ {
"recommendations": [ "recommendations": [
"ms-vscode.cpptools", "ms-vscode.cpptools"
"ms-vscode.cpptools-extension-pack",
"geequlim.godot-tools",
"ms-python.python"
] ]
} }

59
.vscode/settings.json vendored
View File

@@ -4,7 +4,64 @@
"${workspaceFolder}/src/lib/godot-cpp/include" "${workspaceFolder}/src/lib/godot-cpp/include"
], ],
"files.associations": { "files.associations": {
"*.gdextension": "ini" "xlocbuf": "cpp",
"algorithm": "cpp",
"array": "cpp",
"atomic": "cpp",
"bit": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"compare": "cpp",
"concepts": "cpp",
"csignal": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"exception": "cpp",
"functional": "cpp",
"initializer_list": "cpp",
"ios": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"iterator": "cpp",
"limits": "cpp",
"list": "cpp",
"memory": "cpp",
"new": "cpp",
"optional": "cpp",
"ostream": "cpp",
"ratio": "cpp",
"set": "cpp",
"stdexcept": "cpp",
"stop_token": "cpp",
"streambuf": "cpp",
"string": "cpp",
"system_error": "cpp",
"thread": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"typeinfo": "cpp",
"unordered_map": "cpp",
"utility": "cpp",
"vector": "cpp",
"xfacet": "cpp",
"xhash": "cpp",
"xiosbase": "cpp",
"xlocale": "cpp",
"xlocinfo": "cpp",
"xlocnum": "cpp",
"xmemory": "cpp",
"xstddef": "cpp",
"xstring": "cpp",
"xtr1common": "cpp",
"xtree": "cpp",
"xutility": "cpp"
}, },
"[python]": { "[python]": {
"editor.defaultFormatter": "ms-python.black-formatter" "editor.defaultFormatter": "ms-python.black-formatter"

View File

@@ -1,25 +1,14 @@
<img src="/project/assets/Banner.svg" alt="Project Banner" /> <img src="/project/assets/Banner.svg" alt="Project Banner" />
**Discord Game SDK support for GDScript in Godot Engine 4.0. with the easiest code pattern!**<br><br>
**Discord Game SDK support for GDScript in Godot Engine 4.2. with the easiest code pattern!**<br><br> **Please leave a star that would really help! And thanks to all the people that already starred this project! ❤️**
<br /> <br />
### [My Discord Server](https://discord.gg/EBdaTefpWy) <br />
# [Quick start :rocket: (click here)](https://vaporvee.com/docs/discord-sdk-godot#quick-start) # [Quick start :rocket: (click here)](https://github.com/vaporvee/discord-sdk-godot/wiki/Quick-start)
<br /> <br />
**A small donation with the sponsor button would be nice if you sell your project with this addon but is of course not mandatory!** **A small donation with the sponsor button would be nice if you sell your project with this addon but is of course not mandatory!**
# Features
- Activities (Make people see what you are playing)
- Invites
- Steam and launch command registering
- User information
- Relationship Manager (Get friendlist and its updates)
- Overlay management
- Editor Presence (optional)
<img width="600px" src="https://raw.githubusercontent.com/vaporvee/discord-sdk-godot/main/project/assets/GodotEditorPresenceBanner.png">
<br />
<br /> <br />
### Credit ### Credit

View File

@@ -1,11 +1,13 @@
#!python #!python
import os import os
# Gets the standard flags CC, CCX, etc.
env = SConscript("src/lib/godot-cpp/SConstruct") env = SConscript("src/lib/godot-cpp/SConstruct")
# Check our platform specifics
if env["platform"] == "macos": if env["platform"] == "macos":
discord_library = "libdiscord_game_sdk.dylib" discord_library = "libdiscord_game_sdk.dylib"
discord_library_second = "" discord_library_second = "libdiscord_game_sdk_aarch64.dylib"
libexportfolder = "/macos/" libexportfolder = "/macos/"
elif env["platform"] in ("linuxbsd", "linux"): elif env["platform"] in ("linuxbsd", "linux"):
@@ -23,26 +25,21 @@ if env["target"] == "template_debug":
else: else:
debugsuffix = "" debugsuffix = ""
if env.get("arch") == "arm64": # make sure our binding library is properly includes
armsuffix = "_arm64"
else:
armsuffix = ""
env.Append(LIBPATH=["src/lib/discord_game_sdk/bin/"]) env.Append(LIBPATH=["src/lib/discord_game_sdk/bin/"])
sources = Glob("src/lib/discord_game_sdk/cpp/*.cpp") sources = Glob("src/lib/discord_game_sdk/cpp/*.cpp")
env.Append(CPPPATH=["src/lib/discord_game_sdk/cpp/"]) env.Append(CPPPATH=["src/lib/discord_game_sdk/cpp/"]) # this line for some reason doesn't get understanded by most linux distros
env.Append(LIBS=["discord_game_sdk"]) 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/"]) env.Append(CPPPATH=["src/"])
sources += Glob("src/*.cpp") sources += Glob("src/*.cpp")
env.Append(CPPDEFINES=["HOT_RELOAD_ENABLED"]) # The finished exports
library = env.SharedLibrary( library = env.SharedLibrary(
target="project/addons/discord-sdk-gd/bin/" target="project/addons/discord-sdk-gd/bin/"
+ libexportfolder + libexportfolder
+ "discord_game_sdk_binding" + "discord_game_sdk_binding"
+ armsuffix
+ debugsuffix, + debugsuffix,
source=sources, source=sources,
) )
@@ -54,13 +51,11 @@ env.Depends(
Copy("$TARGET", "$SOURCE"), Copy("$TARGET", "$SOURCE"),
), ),
) )
if discord_library_second != "": if(discord_library_second != ""):
env.Depends( env.Depends(
library, library,
Command( Command(
"project/addons/discord-sdk-gd/bin/" "project/addons/discord-sdk-gd/bin/" + libexportfolder + discord_library_second,
+ libexportfolder
+ discord_library_second,
"src/lib/discord_game_sdk/bin/" + discord_library_second, "src/lib/discord_game_sdk/bin/" + discord_library_second,
Copy("$TARGET", "$SOURCE"), Copy("$TARGET", "$SOURCE"),
), ),

View File

@@ -1,35 +1,23 @@
import os import os
import platform
import sys import sys
yes = {"yes", "y", "ye", ""} yes = {'yes', 'y', 'ye', ''}
no = {"no", "n"} no = {'no', 'n'}
if len(sys.argv) > 1: if len(sys.argv) > 1:
choice = sys.argv[1].removeprefix("-") choice = sys.argv[1].removeprefix("-")
else: else:
sys.stdout.write( sys.stdout.write(
"Do you want to open only the built project instead of the Godot Editor after building? ([y]es/[n]o): " "Do you want to open only the built project instead of the Godot Editor after building? ([y]es/[n]o): ")
)
choice = input().lower() choice = input().lower()
if choice in yes: if choice in yes:
os.system( os.system("python -m SCons && python -m SCons target=template_release && cd project && godot")
"python -m SCons && python -m SCons target=template_release && cd project && godot"
)
elif choice in no: elif choice in no:
system = platform.system() if os.name == 'nt':
print("Building for: '%s'" % (system))
if system == "Windows": # Windows
os.system( os.system(
"python -m SCons && python -m SCons target=template_release && godot project/project.godot" "python -m SCons && python -m SCons target=template_release && godot project\project.godot")
) else:
elif system == "Darwin": # macOS
os.system( os.system(
"python -m SCons target=template_release arch=x86_64 && python -m SCons target=template_debug arch=x86_64 && python -m SCons target=template_release arch=arm64 && python -m SCons target=template_debug arch=arm64 && godot project/project.godot" "python -m SCons && python -m SCons target=template_release && godot project/project.godot")
)
else: # Linux
os.system(
"python -m SCons && python -m SCons target=template_release && godot project/project.godot"
)
else: else:
sys.stdout.write("Please respond with 'yes' or 'no'") sys.stdout.write("Please respond with 'yes' or 'no'")

BIN
project/Node Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -1,7 +0,0 @@
MINIMUM GODOT VERSION: 4.2
PLEASE ACTIVATE THE PLUGIN UNDER Project -> Project Settings... -> Plugins -> DiscordSDK -> Status
IGNORE THE RED ERRORS ON THE FIRST 2 RESTARTS
READ THE TUTORIAL LINKED IN THE WINDOW THAT WILL OPEN ON PLUGIN ENABLE
If nothing works, enable the plugin and delete /addons/discord-sdk-gd/bin/.gdignore

View File

@@ -1,29 +0,0 @@
[configuration]
entry_symbol = "discordsdkgd_library_init"
compatibility_minimum = 4.1
[libraries]
macos.debug = "macos/libdiscord_game_sdk_binding_debug.dylib"
macos.release = "macos/libdiscord_game_sdk_binding.dylib"
windows.debug.x86_64 = "windows/discord_game_sdk_binding_debug.dll"
windows.release.x86_64 = "windows/discord_game_sdk_binding.dll"
linux.debug.x86_64 = "linux/libdiscord_game_sdk_binding_debug.so"
linux.release.x86_64 = "linux/libdiscord_game_sdk_binding.so"
linux.debug.arm64 = "linux/libdiscord_game_sdk_binding_debug.so"
linux.release.arm64 = "linux/libdiscord_game_sdk_binding.so"
linux.debug.rv64 = "linux/libdiscord_game_sdk_binding_debug.so"
linux.release.rv64 = "linux/libdiscord_game_sdk_binding.so"
[dependencies]
macos = { "macos/libdiscord_game_sdk.dylib": "" }
windows.debug.x86_64 = { "windows/discord_game_sdk.dll": "" }
windows.release.x86_64 = { "windows/discord_game_sdk.dll": "" }
linux.debug.x86_64 = { "linux/libdiscord_game_sdk.so": "" }
linux.release.x86_64 = { "linux/libdiscord_game_sdk.so": "" }
linux.debug.arm64 = { "linux/libdiscord_game_sdk.so": "" }
linux.release.arm64 = { "linux/libdiscord_game_sdk.so": "" }
linux.debug.rv64 = { "linux/libdiscord_game_sdk.so": "" }
linux.release.rv64 = { "linux/libdiscord_game_sdk.so": "" }

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,4 @@
Version: 1.2
Windows: build-1
Linux: build-1
MacOS: build-1

View File

@@ -0,0 +1,29 @@
[configuration]
entry_symbol = "discordsdkgd_library_init"
[libraries]
macos.debug = "bin/macos/libdiscord_game_sdk_binding_debug.dylib"
macos.release = "bin/macos/libdiscord_game_sdk_binding.dylib"
windows.debug.x86_64 = "bin/windows/discord_game_sdk_binding_debug.dll"
windows.release.x86_64 = "bin/windows/discord_game_sdk_binding.dll"
linux.debug.x86_64 = "bin/linux/libdiscord_game_sdk_binding_debug.so"
linux.release.x86_64 = "bin/linux/libdiscord_game_sdk_binding.so"
linux.debug.arm64 = "bin/linux/libdiscord_game_sdk_binding_debug.so"
linux.release.arm64 = "bin/linux/libdiscord_game_sdk_binding.so"
linux.debug.rv64 = "bin/linux/libdiscord_game_sdk_binding_debug.so"
linux.release.rv64 = "bin/linux/libdiscord_game_sdk_binding.so"
[dependencies]
macos.debug = "bin/macos/libdiscord_game_sdk.dylib"
macos.release = "bin/macos/libdiscord_game_sdk.dylib"
windows.debug.x86_64 = "bin/windows/discord_game_sdk.dll"
windows.release.x86_64 = "bin/windows/discord_game_sdk.dll"
linux.debug.x86_64 = "bin/linux/libdiscord_game_sdk.so"
linux.release.x86_64 = "bin/linux/libdiscord_game_sdk.so"
linux.debug.arm64 = "bin/linux/libdiscord_game_sdk.so"
linux.release.arm64 = "bin/linux/libdiscord_game_sdk.so"
linux.debug.rv64 = "bin/linux/libdiscord_game_sdk.so"
linux.release.rv64 = "bin/linux/libdiscord_game_sdk.so"

View File

@@ -1,38 +1,25 @@
class_name DiscordSDKTutorial
extends Node extends Node
## 1. Put the addons/ folder in your Godot project[br] # 1. Put the addons/ folder in your Godot project
## 2. Enable the addon in your Project Settings under "Plugins" and "DiscordSDK". [br](if it doesn't show up restart your project and try again)[br] # 2. Enable the addon in your Project Settings under "Plugins" and "DiscordSDK". (if it doesn't show up restart your project and try again)
## 3. Restart your project[br] # 3. Restart your project
## 4. Create an Application under https://discord.com/developers/applications and get the Application ID br] # 4. Create an Application under https://discord.com/developers/applications and get the Application ID
## 5. (optional) Set images under "Rich Presence" and "Art Assets" and remember the keys[br] # 5. (optional) Set images under "Rich Presence" and "Art Assets" and remember the keys
##
## This is your [code]_ready()[/code] function wich could be anywhere #SELECT THE TEXT WITH YOUR MOUSE AND CTR + K TO UNCOMMENT THE FOLLOWING
## [codeblock]
## func _ready(): #func _ready():
## # Application ID # discord_sdk.app_id = 1099618430065324082 # Application ID
## DiscordSDK.app_id = 1099618430065324082 # print("Discord working: " + str(discord_sdk.get_is_discord_working())) # A boolean if everything worked
## # this is boolean if everything worked # discord_sdk.details = "A demo activity by vaporvee#1231"
## print("Discord working: " + str(DiscordSDK.get_is_discord_working())) # discord_sdk.state = "Checkpoint 23/23"
## # Set the first custom text row of the activity here #
## DiscordSDK.details = "A demo activity by vaporvee#1231" # discord_sdk.large_image = "game" # Image key from "Art Assets"
## # Set the second custom text row of the activity here # discord_sdk.large_image_text = "Try it now!"
## DiscordSDK.state = "Checkpoint 23/23" # discord_sdk.small_image = "boss" # Image key from "Art Assets"
## # Image key for small image from "Art Assets" from the Discord Developer website # discord_sdk.small_image_text = "Fighting the end boss! D:"
## DiscordSDK.large_image = "game" #
## # Tooltip text for the large image # discord_sdk.start_timestamp = int(Time.get_unix_time_from_system()) # "02:41 elapsed"
## DiscordSDK.large_image_text = "Try it now!" # discord_sdk.end_timestamp = int(Time.get_unix_time_from_system()) + 3600 # +1 hour in unix time
## # Image key for large image from "Art Assets" from the Discord Developer website #
## DiscordSDK.small_image = "boss" # discord_sdk.refresh() # Always refresh after changing the values!
## # Tooltip text for the small image
## DiscordSDK.small_image_text = "Fighting the end boss! D:"
## # "02:41 elapsed" timestamp for the activity
## DiscordSDK.start_timestamp = int(Time.get_unix_time_from_system())
## # "59:59 remaining" timestamp for the activity
## DiscordSDK.end_timestamp = int(Time.get_unix_time_from_system()) + 3600
## # Always refresh after changing the values!
## DiscordSDK.refresh()
## [/codeblock]
##
## @tutorial(More information here): https://github.com/vaporvee/discord-sdk-godot/wiki/Quick-start
## @tutorial(Make your Application ID and else here): https://discord.com/developers/applications

View File

@@ -0,0 +1,17 @@
@tool
extends EditorExportPlugin
func _export_file(_path, _type, features) -> void:
if features[2] == "windows":
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",[],"/")
func _get_name():
pass

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://csl0e2px0cwc1"
path="res://.godot/imported/logo.png-b59b4861dc0c64616d78af30082b08b5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/discord-sdk-gd/logo.png"
dest_files=["res://.godot/imported/logo.png-b59b4861dc0c64616d78af30082b08b5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -1,29 +1,25 @@
[gd_scene load_steps=9 format=3 uid="uid://c1slhdnlsv2qt"] [gd_scene load_steps=68 format=3 uid="uid://c1slhdnlsv2qt"]
[ext_resource type="Texture2D" uid="uid://dnfq6kug4x6o2" path="res://addons/discord-sdk-gd/nodes/assets/Checked.svg" id="2_q6tao"] [ext_resource type="Texture2D" uid="uid://cq8lwj2matk6x" path="res://addons/discord-sdk-gd/nodes/assets/flow_spritesheet.png" id="4_gvc3o"]
[ext_resource type="Texture2D" uid="uid://compmm3kviqqe" path="res://addons/discord-sdk-gd/nodes/assets/Unchecked.svg" id="3_5cyem"]
[ext_resource type="Texture2D" uid="uid://dtc6ckladq0td" path="res://addons/discord-sdk-gd/nodes/assets/circle.svg" id="3_goflf"]
[sub_resource type="GDScript" id="GDScript_ak1tp"] [sub_resource type="GDScript" id="GDScript_ak1tp"]
resource_name = "Debug" resource_name = "Debug"
script/source = "extends Node script/source = "extends Node
func _ready(): func _ready():
DiscordSDK.connect(\"activity_join_request\",_on_activity_join_request) discord_sdk.connect(\"activity_join_request\",_on_activity_join_request)
func _process(_delta): func _process(_delta):
if(DiscordSDK.get_is_discord_working()): if(discord_sdk.get_is_discord_working()):
$Panel/TextureRect.self_modulate = Color(\"#3eff8d\") $AnimatedSprite2D.play(\"default\")
$Panel/TextureRect/AnimationPlayer.play(\"pulsate\")
debug_text_update() debug_text_update()
else: else:
$Panel/TextureRect.self_modulate = Color(\"#797979\") $AnimatedSprite2D.stop()
$Panel/TextureRect/AnimationPlayer.stop() $AnimatedSprite2D.animation = \"gray\"
debug_text_update() debug_text_update()
func debug_text_update(): func debug_text_update():
$Panel/Info.text = \"Application ID : {id} $Info.text = \"Application ID : {id}
Details: {details} Details: {details}
State: {state} State: {state}
@@ -45,7 +41,7 @@ Is party public: {ppublic} (needs to be activated in Discord client settings)
Is instanced: {instanced} Is instanced: {instanced}
\" \"
$Panel/Info.text = $Panel/Info.text.replace(\"{ppublic}\",str(DiscordSDK.is_public_party)).replace(\"{instanced}\",str(DiscordSDK.instanced)).replace(\"{ssecret}\",DiscordSDK.spectate_secret).replace(\"{jsecret}\",DiscordSDK.join_secret).replace(\"{msecret}\",DiscordSDK.match_secret).replace(\"{mpartysize}\",str(DiscordSDK.max_party_size)).replace(\"{cpartysize}\",str(DiscordSDK.current_party_size)).replace(\"{partyid}\",DiscordSDK.party_id).replace(\"{id}\",str(DiscordSDK.app_id)).replace(\"{details}\",DiscordSDK.details).replace(\"{state}\",DiscordSDK.state).replace(\"{lkey}\",DiscordSDK.large_image).replace(\"{ltext}\",DiscordSDK.large_image_text).replace(\"{skey}\",DiscordSDK.small_image).replace(\"{stext}\",DiscordSDK.small_image_text).replace(\"{stimestamp}\",str(DiscordSDK.start_timestamp)).replace(\"{etimestamp}\",str(DiscordSDK.end_timestamp)) $Info.text = $Info.text.replace(\"{ppublic}\",str(discord_sdk.is_public_party)).replace(\"{instanced}\",str(discord_sdk.instanced)).replace(\"{ssecret}\",discord_sdk.spectate_secret).replace(\"{jsecret}\",discord_sdk.join_secret).replace(\"{msecret}\",discord_sdk.match_secret).replace(\"{mpartysize}\",str(discord_sdk.max_party_size)).replace(\"{cpartysize}\",str(discord_sdk.current_party_size)).replace(\"{partyid}\",discord_sdk.party_id).replace(\"{id}\",str(discord_sdk.app_id)).replace(\"{details}\",discord_sdk.details).replace(\"{state}\",discord_sdk.state).replace(\"{lkey}\",discord_sdk.large_image).replace(\"{ltext}\",discord_sdk.large_image_text).replace(\"{skey}\",discord_sdk.small_image).replace(\"{stext}\",discord_sdk.small_image_text).replace(\"{stimestamp}\",str(discord_sdk.start_timestamp)).replace(\"{etimestamp}\",str(discord_sdk.end_timestamp))
var user_request = {}; var user_request = {};
@@ -53,87 +49,504 @@ func _on_activity_join_request(user_requesting):
print(user_requesting) print(user_requesting)
user_request = user_requesting user_request = user_requesting
func _on_accept_join_request_pressed(): func _on_button_pressed():
if(!user_request.is_empty()): if(!user_request.is_empty()):
DiscordSDK.accept_join_request(user_request.id) discord_sdk.accept_join_request(user_request.id)
func _on_invite_with_user_id_text_submitted(new_text): func _on_line_edit_text_submitted(new_text):
DiscordSDK.send_invite(int(new_text),true,\"this is a test invite sent from godot\") discord_sdk.send_invite(int(new_text),true,\"this is a test invite sent from godot\")
func _on_accept_with_user_id_text_submitted(new_text): func _on_line_edit_2_text_submitted(new_text):
DiscordSDK.accept_invite(int(new_text)) discord_sdk.accept_invite(int(new_text))
func _on_print_current_user_on_console_pressed(): func _on_button_2_pressed():
print(DiscordSDK.get_current_user()) print(discord_sdk.get_current_user())
func _on_toggle_sdk_toggled(button_pressed): func _on_check_button_toggled(button_pressed):
if(button_pressed): if(button_pressed):
DiscordSDK.unclear() debug_text_update()
else: else:
DiscordSDK.clear(false) discord_sdk.clear()
debug_text_update()
func _on_print_friends_pressed():
print(DiscordSDK.get_all_relationships())
" "
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8abo6"] [sub_resource type="AtlasTexture" id="AtlasTexture_85oj4"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 0, 512, 512)
[sub_resource type="Animation" id="Animation_mmtmn"] [sub_resource type="AtlasTexture" id="AtlasTexture_vv4mb"]
length = 0.001 atlas = ExtResource("4_gvc3o")
tracks/0/type = "value" region = Rect2(1024, 0, 512, 512)
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:scale")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0.4),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector2(0.5, 0.5)]
}
[sub_resource type="Animation" id="Animation_5u02v"] [sub_resource type="AtlasTexture" id="AtlasTexture_kwv3j"]
resource_name = "pulsate" atlas = ExtResource("4_gvc3o")
loop_mode = 1 region = Rect2(1536, 0, 512, 512)
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:scale")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.5, 1),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector2(0.5, 0.5), Vector2(0.8, 0.8), Vector2(0.5, 0.5)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_a7ofc"] [sub_resource type="AtlasTexture" id="AtlasTexture_ij57t"]
_data = { atlas = ExtResource("4_gvc3o")
"RESET": SubResource("Animation_mmtmn"), region = Rect2(2048, 0, 512, 512)
"pulsate": SubResource("Animation_5u02v")
} [sub_resource type="AtlasTexture" id="AtlasTexture_w2du1"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 512, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_4pma1"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 512, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_fcoqp"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 512, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_tjcb7"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 512, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_oudh8"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 512, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_csja0"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 1024, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_0xbpk"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 1024, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_p84pv"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 1024, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_1gjwh"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 1024, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_mrm73"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 1024, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_8rkne"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 1536, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_c15qo"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 1536, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_74tpk"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 1536, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_v5nxq"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 1536, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_0mf44"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 1536, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_kb0hn"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 2048, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_o22ug"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 2048, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_21q7w"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 2048, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_gitfl"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 2048, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_8hg1o"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 2048, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_niuoc"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 2560, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_mt5ft"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 2560, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_ub7uo"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 2560, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_2uxnl"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 2560, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_bh4ts"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 2560, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_lcu0i"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 3072, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_mmqt1"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 3072, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_orode"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 3072, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_ricn8"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 3072, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_6ftll"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 3072, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_fm4jy"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 3584, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_7qcot"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 3584, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_2y47g"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 3584, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_gpr0t"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 3584, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_nn332"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 3584, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_jg384"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 4096, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_g0wvw"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 4096, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_e6fmf"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 4096, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_n1rtv"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 4096, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_365g3"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 4096, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_frkrx"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 4608, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_j8adw"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 4608, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_76fh7"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 4608, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_gmmrx"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 4608, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_rlh42"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 4608, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_wijf7"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 5120, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_2n5hs"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 5120, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_yrp6k"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 5120, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_w411h"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 5120, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_pe7po"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 5120, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_sr5kq"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 5632, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_kgesr"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 5632, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_vfk6x"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 5632, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_4d1t3"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 5632, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_6bexm"]
atlas = ExtResource("4_gvc3o")
region = Rect2(2048, 5632, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_tadlo"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 6144, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_g2h20"]
atlas = ExtResource("4_gvc3o")
region = Rect2(512, 6144, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_x351d"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1024, 6144, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_0jq3r"]
atlas = ExtResource("4_gvc3o")
region = Rect2(1536, 6144, 512, 512)
[sub_resource type="AtlasTexture" id="AtlasTexture_1eeyl"]
atlas = ExtResource("4_gvc3o")
region = Rect2(0, 0, 512, 512)
[sub_resource type="SpriteFrames" id="SpriteFrames_kudgl"]
animations = [{
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_85oj4")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_vv4mb")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_kwv3j")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ij57t")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_w2du1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_4pma1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_fcoqp")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_tjcb7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_oudh8")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_csja0")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_0xbpk")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_p84pv")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_1gjwh")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_mrm73")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8rkne")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_c15qo")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_74tpk")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_v5nxq")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_0mf44")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_kb0hn")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_o22ug")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_21q7w")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_gitfl")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_8hg1o")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_niuoc")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_mt5ft")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ub7uo")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2uxnl")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_bh4ts")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_lcu0i")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_mmqt1")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_orode")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_ricn8")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_6ftll")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_fm4jy")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_7qcot")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2y47g")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_gpr0t")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_nn332")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_jg384")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_g0wvw")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_e6fmf")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_n1rtv")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_365g3")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_frkrx")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_j8adw")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_76fh7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_gmmrx")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_rlh42")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_wijf7")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_2n5hs")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_yrp6k")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_w411h")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_pe7po")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_sr5kq")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_kgesr")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_vfk6x")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_4d1t3")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_6bexm")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_tadlo")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_g2h20")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_x351d")
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_0jq3r")
}],
"loop": true,
"name": &"default",
"speed": 30.0
}, {
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_1eeyl")
}],
"loop": true,
"name": &"gray",
"speed": 5.0
}]
[node name="DebugNodeGroup" type="Node"] [node name="DebugNodeGroup" type="Node"]
editor_description = "This is a Debug Node wich will show (only if the project runs) some usefull info and buttons/input" editor_description = "This is a Debug Node wich will show (only if the project runs) some usefull info and buttons/input"
script = SubResource("GDScript_ak1tp") script = SubResource("GDScript_ak1tp")
[node name="Panel" type="Panel" parent="."] [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
anchors_preset = -1 position = Vector2(389, 477.375)
anchor_right = 0.373 scale = Vector2(0.14209, 0.14209)
anchor_bottom = 1.0 sprite_frames = SubResource("SpriteFrames_kudgl")
offset_left = -5.0 frame_progress = 0.417812
offset_right = 0.303955
grow_horizontal = 2
grow_vertical = 2
[node name="Info" type="RichTextLabel" parent="Panel"] [node name="Info" type="RichTextLabel" parent="."]
layout_mode = 0 offset_left = 7.0
offset_left = 12.0 offset_top = 6.0
offset_top = 21.0 offset_right = 424.0
offset_right = 429.0 offset_bottom = 312.0
offset_bottom = 461.0
theme_override_font_sizes/normal_font_size = 14 theme_override_font_sizes/normal_font_size = 14
text = "Application ID : {id} text = "Application ID : {id}
Details: {details} Details: {details}
@@ -159,109 +572,52 @@ Is instanced: {instanced}
" "
fit_content = true fit_content = true
[node name="PrintCurrentUserOnConsole" type="Button" parent="Panel"] [node name="PrintCurrentUserOnConsole" type="Button" parent="."]
layout_mode = 1
anchors_preset = 4 anchors_preset = 4
anchor_top = 0.5 anchor_top = 0.5
anchor_bottom = 0.5 anchor_bottom = 0.5
offset_left = 12.0 offset_left = 7.0
offset_top = 138.375 offset_top = 141.375
offset_right = 245.0 offset_right = 240.0
offset_bottom = 171.375 offset_bottom = 174.375
grow_vertical = 2 grow_vertical = 2
text = "Print current user on console" text = "Print current user on console"
[node name="PrintFriends" type="Button" parent="Panel"] [node name="AcceptInviteRequest" type="Button" parent="."]
layout_mode = 1
anchors_preset = 4 anchors_preset = 4
anchor_top = 0.5 anchor_top = 0.5
anchor_bottom = 0.5 anchor_bottom = 0.5
offset_left = 12.0 offset_left = 7.0
offset_top = 176.5 offset_top = 178.875
offset_right = 204.0 offset_right = 149.0
offset_bottom = 207.5 offset_bottom = 209.875
grow_vertical = 2
text = "Print friends on console"
[node name="AcceptJoinRequest" type="Button" parent="Panel"]
layout_mode = 1
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_left = 12.0
offset_top = 212.875
offset_right = 154.0
offset_bottom = 243.875
grow_vertical = 2 grow_vertical = 2
text = "ACCEPT REQUEST" text = "ACCEPT REQUEST"
[node name="InviteWithUserID" type="LineEdit" parent="Panel"] [node name="InviteWithUserID" type="LineEdit" parent="."]
layout_mode = 1
anchors_preset = 4 anchors_preset = 4
anchor_top = 0.5 anchor_top = 0.5
anchor_bottom = 0.5 anchor_bottom = 0.5
offset_left = 11.0 offset_left = 6.0
offset_top = 250.375 offset_top = 215.375
offset_right = 210.0 offset_right = 205.0
offset_bottom = 281.375 offset_bottom = 246.375
grow_vertical = 2 grow_vertical = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
placeholder_text = "Invite with user_id here" placeholder_text = "Invite with user_id here"
[node name="AcceptWithUserID" type="LineEdit" parent="Panel"] [node name="AcceptWithUserID" type="LineEdit" parent="."]
layout_mode = 1
anchors_preset = 4 anchors_preset = 4
anchor_top = 0.5 anchor_top = 0.5
anchor_bottom = 0.5 anchor_bottom = 0.5
offset_left = 11.0 offset_left = 6.0
offset_top = 286.875 offset_top = 250.875
offset_right = 260.0 offset_right = 255.0
offset_bottom = 317.875 offset_bottom = 281.875
grow_vertical = 2 grow_vertical = 2
placeholder_text = "Accept Invite with user_id here" placeholder_text = "Accept Invite with user_id here"
[node name="ToggleSDK" type="CheckButton" parent="Panel"] [connection signal="pressed" from="PrintCurrentUserOnConsole" to="." method="_on_button_2_pressed"]
layout_mode = 1 [connection signal="pressed" from="AcceptInviteRequest" to="." method="_on_button_pressed"]
anchors_preset = 4 [connection signal="text_submitted" from="InviteWithUserID" to="." method="_on_line_edit_text_submitted"]
anchor_top = 0.5 [connection signal="text_submitted" from="AcceptWithUserID" to="." method="_on_line_edit_2_text_submitted"]
anchor_bottom = 0.5
offset_left = 298.0
offset_top = 157.375
offset_right = 1144.0
offset_bottom = 665.375
grow_vertical = 2
scale = Vector2(0.05, 0.05)
theme_override_icons/checked = ExtResource("2_q6tao")
theme_override_icons/unchecked = ExtResource("3_5cyem")
theme_override_styles/focus = SubResource("StyleBoxEmpty_8abo6")
button_pressed = true
[node name="TextureRect" type="TextureRect" parent="Panel"]
self_modulate = Color(0.47451, 0.47451, 0.47451, 1)
layout_mode = 1
anchors_preset = -1
anchor_left = 0.88
anchor_top = 0.762
anchor_right = 0.88
anchor_bottom = 0.762
offset_left = -28.8
offset_top = -28.776
offset_right = 28.0841
offset_bottom = 28.1082
grow_horizontal = 2
grow_vertical = 2
scale = Vector2(0.5, 0.5)
pivot_offset = Vector2(29.0693, 29.0693)
texture = ExtResource("3_goflf")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Panel/TextureRect"]
libraries = {
"": SubResource("AnimationLibrary_a7ofc")
}
[connection signal="pressed" from="Panel/PrintCurrentUserOnConsole" to="." method="_on_print_current_user_on_console_pressed"]
[connection signal="pressed" from="Panel/PrintFriends" to="." method="_on_print_friends_pressed"]
[connection signal="pressed" from="Panel/AcceptJoinRequest" to="." method="_on_accept_join_request_pressed"]
[connection signal="text_submitted" from="Panel/InviteWithUserID" to="." method="_on_invite_with_user_id_text_submitted"]
[connection signal="text_submitted" from="Panel/AcceptWithUserID" to="." method="_on_accept_with_user_id_text_submitted"]
[connection signal="toggled" from="Panel/ToggleSDK" to="." method="_on_toggle_sdk_toggled"]

View File

@@ -0,0 +1,7 @@
[gd_scene load_steps=2 format=3 uid="uid://dkbtuqbtdlqnk"]
[ext_resource type="Script" path="res://addons/discord-sdk-gd/nodes/core_updater.gd" id="1_8fjwg"]
[node name="DiscordSDKLoader" type="Node"]
editor_description = "This always needs to run in the background if you want to comunicate with the discord client."
script = ExtResource("1_8fjwg")

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -3,15 +3,15 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://ufh1hha1ehui" uid="uid://ufh1hha1ehui"
path="res://.godot/imported/Debug.svg-97b25f5d09dbf04212867cd1a46cf368.ctex" path="res://.godot/imported/Debug.svg-c87ff9d4b4b0e718ec457560f6c420dc.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
[deps] [deps]
source_file="res://addons/discord-sdk-gd/Debug.svg" source_file="res://addons/discord-sdk-gd/nodes/assets/Debug.svg"
dest_files=["res://.godot/imported/Debug.svg-97b25f5d09dbf04212867cd1a46cf368.ctex"] dest_files=["res://.godot/imported/Debug.svg-c87ff9d4b4b0e718ec457560f6c420dc.ctex"]
[params] [params]

View File

@@ -0,0 +1,4 @@
<svg width="16" height="14" viewBox="0 0 16 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.35776 4.35954C0.15745 6.80425 -0.158183 9.20437 0.0679444 11.5772C1.29133 12.4811 2.66066 13.1685 4.11639 13.6096C4.44417 13.1687 4.73422 12.701 4.98346 12.2115C4.51007 12.0346 4.05317 11.8165 3.61804 11.5596C3.73256 11.4765 3.84456 11.3909 3.95279 11.3079C5.21891 11.9033 6.60083 12.212 7.99997 12.212C9.39912 12.212 10.781 11.9033 12.0472 11.3079C12.1566 11.3972 12.2686 11.4828 12.3819 11.5596C11.9459 11.8169 11.4882 12.0355 11.014 12.2127C11.2629 12.7021 11.553 13.1694 11.881 13.6096C13.338 13.1703 14.7084 12.4832 15.932 11.5785C16.1887 8.91658 15.71 6.52885 14.6441 4.35954H1.35776ZM3.90119 8.15294C3.90119 9.03386 4.55307 9.74992 5.34212 9.74992C6.14627 9.74992 6.76795 9.03386 6.78179 8.15294C6.79563 7.27203 6.14879 6.54967 5.3396 6.54967C4.53042 6.54967 3.90119 7.27203 3.90119 8.15294ZM9.21815 8.15294C9.21815 9.03386 9.86752 9.74992 10.6578 9.74992C11.462 9.74992 12.0824 9.03386 12.0962 8.15294C12.1101 7.27203 11.4683 6.54967 10.6578 6.54967C9.84738 6.54967 9.21815 7.27203 9.21815 8.15294Z" fill="#5865F2"/>
<path d="M4.31337 0.711094C4.97409 0.378693 5.67883 0.1583 6.39124 0C6.67624 0.478046 6.93634 0.995727 7.16285 1.50181C7.43169 1.45692 7.70147 1.4403 7.97234 1.43708V1.43666C7.97402 1.43666 7.97578 1.43708 7.97746 1.43708C7.97907 1.43708 7.98082 1.43666 7.98271 1.43666V1.43708C8.25308 1.4403 8.5231 1.45692 8.79187 1.50181C9.01852 0.995727 9.27877 0.478046 9.56334 0C10.2761 0.1583 10.9807 0.378693 11.6415 0.711094C11.6264 1.29423 11.5887 1.85296 11.5124 2.42051C11.7685 2.58482 12.0385 2.72584 12.2781 2.91819C12.522 3.10544 12.7702 3.28458 12.9907 3.50357C13.4312 3.21235 13.8976 2.93868 14.3777 2.6971C14.8955 3.25402 15.3798 3.85511 15.7752 4.52774C15.5165 4.9441 15.1789 5.43899 14.8223 5.88763H1.13254C0.823832 5.50544 0.490472 5.01534 0.179688 4.52774C0.575141 3.85511 1.05924 3.25402 1.57697 2.6971C2.05728 2.93868 2.52351 3.21235 2.96401 3.50357C3.18451 3.28458 3.43322 3.10544 3.67673 2.91819C3.9164 2.72584 4.18607 2.58482 4.44266 2.42051C4.3662 1.85296 4.32848 1.29423 4.31337 0.711094Z" fill="#5865F2"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -2,16 +2,16 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://dtc6ckladq0td" uid="uid://c70jidlptani4"
path="res://.godot/imported/circle.svg-ca71b895eb1c5e7e6f2f2afe081d28dd.ctex" path="res://.godot/imported/Group_1.svg-8cf36058739c5884a9a47a4dfa7d001a.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
[deps] [deps]
source_file="res://addons/discord-sdk-gd/nodes/assets/circle.svg" source_file="res://addons/discord-sdk-gd/nodes/assets/Group_1.svg"
dest_files=["res://.godot/imported/circle.svg-ca71b895eb1c5e7e6f2f2afe081d28dd.ctex"] dest_files=["res://.godot/imported/Group_1.svg-8cf36058739c5884a9a47a4dfa7d001a.ctex"]
[params] [params]

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_1" data-name="Ebene 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44.72 44.72">
<defs>
<style>
.cls-1 {
fill: #fff;
}
</style>
</defs>
<circle class="cls-1" cx="22.36" cy="22.36" r="22.36"/>
</svg>

Before

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

View File

@@ -2,16 +2,16 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://csl0e2px0cwc1" uid="uid://cq8lwj2matk6x"
path="res://.godot/imported/Logo_V2_No_Bg.png-9c8178062d6891c8370df63a912bd8e2.ctex" path="res://.godot/imported/flow_spritesheet.png-4637bb4103771b4d4bbc78a0bb858512.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
[deps] [deps]
source_file="res://addons/discord-sdk-gd/Logo_V2_No_Bg.png" source_file="res://addons/discord-sdk-gd/nodes/assets/flow_spritesheet.png"
dest_files=["res://.godot/imported/Logo_V2_No_Bg.png-9c8178062d6891c8370df63a912bd8e2.ctex"] dest_files=["res://.godot/imported/flow_spritesheet.png-4637bb4103771b4d4bbc78a0bb858512.ctex"]
[params] [params]

View File

@@ -0,0 +1,8 @@
## This always needs to run in the background if you want to comunicate with the discord client.
extends Node
@export var is_running: bool =false
func _process(delta) -> void:
discord_sdk.coreupdate()
is_running = true

View File

@@ -1,9 +1,4 @@
## This is a Debug Node wich will show some usefull info and buttons/input ## This is a Debug Node wich will show (only if the project runs) some usefull info and buttons/input
##
## The DiscordSDK Debug Node will show info about the current values of its variables and some buttons to change them.
##
## @tutorial: https://github.com/vaporvee/discord-sdk-godot/wiki
@tool
extends Node extends Node
func _ready() -> void: func _ready() -> void:

View File

@@ -1,13 +0,0 @@
## This is a GDscript Node wich gets automatically added as Autoload while installing the addon.
##
## It can run in the background to comunicate with Discord.
## You don't need to use it. If you remove it make sure to run [code]DiscordSDK.run_callbacks()[/code] in a [code]_process[/code] function.
##
## @tutorial: https://github.com/vaporvee/discord-sdk-godot/wiki
extends Node
func _ready() -> void:
pass
func _process(_delta) -> void:
DiscordSDK.run_callbacks()

View File

@@ -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.2.0" version="2.0"
script="plugin.gd" script="plugin.gd"

View File

@@ -1,56 +1,47 @@
@tool @tool
extends EditorPlugin extends EditorPlugin
const DiscordSDKLoader = preload("res://addons/discord-sdk-gd/nodes/core_updater.gd")
const DiscordSDKLoader_icon = preload("res://addons/discord-sdk-gd/nodes/assets/Group_1.svg")
var loaded_DiscordSDKLoader = DiscordSDKLoader.new()
const DiscordSDKDebug = preload("res://addons/discord-sdk-gd/nodes/debug.gd") const DiscordSDKDebug = preload("res://addons/discord-sdk-gd/nodes/debug.gd")
const DiscordSDKDebug_icon = preload("res://addons/discord-sdk-gd/Debug.svg") const DiscordSDKDebug_icon = preload("res://addons/discord-sdk-gd/nodes/assets/Debug.svg")
var loaded_DiscordSDKDebug = DiscordSDKDebug.new() var loaded_DiscordSDKDebug = DiscordSDKDebug.new()
var restart_window: ConfirmationDialog = preload("res://addons/discord-sdk-gd/restart_window.tscn").instantiate()
var plugin_cfg: ConfigFile = ConfigFile.new()
const plugin_data_filename = "/plugin_data.cfg" const ExportPlugin = preload("res://addons/discord-sdk-gd/export.gd")
var loaded_exportplugin = ExportPlugin.new()
func _enter_tree() -> void: func _enter_tree() -> void:
add_custom_type("DiscordSDKLoader","Node",DiscordSDKLoader,DiscordSDKLoader_icon)
add_custom_type("DiscordSDKDebug","Node",DiscordSDKDebug,DiscordSDKDebug_icon) add_custom_type("DiscordSDKDebug","Node",DiscordSDKDebug,DiscordSDKDebug_icon)
get_editor_interface().get_editor_settings().settings_changed.connect(_on_editor_settings_changed) add_autoload_singleton("DiscordSDKLoader", "res://addons/discord-sdk-gd/nodes/core_updater.gd")
add_export_plugin(loaded_exportplugin)
func _ready() -> void: func _enable_plugin():
await get_tree().create_timer(0.5).timeout print("DiscordSDK Addon got enabled")
plugin_cfg.load(get_editor_interface().get_editor_paths().get_data_dir() + plugin_data_filename) ProjectSettings.set_setting("DiscordSDK/EditorPresence/enabled",false)
if !get_editor_interface().get_editor_settings().has_setting("DiscordSDK/EditorPresence/enabled"): ProjectSettings.set_initial_value("DiscordSDK/EditorPresence/enabled",false)
get_editor_interface().get_editor_settings().set_setting("DiscordSDK/EditorPresence/enabled",plugin_cfg.get_value("Discord","editor_presence",false)) ProjectSettings.set_restart_if_changed("DiscordSDK/EditorPresence/enabled",true)
func _exit_tree():
if get_editor_interface().get_editor_settings().has_setting("DiscordSDK/EditorPresence/enabled"):
get_editor_interface().get_editor_settings().erase("DiscordSDK/EditorPresence/enabled")
func _enable_plugin() -> void:
if FileAccess.file_exists(ProjectSettings.globalize_path("res://") + "addons/discord-sdk-gd/bin/.gdignore"):
DirAccess.remove_absolute(ProjectSettings.globalize_path("res://") + "addons/discord-sdk-gd/bin/.gdignore")
add_autoload_singleton("DiscordSDKLoader","res://addons/discord-sdk-gd/nodes/discord_autoload.gd")
restart_window.connect("confirmed", save_no_restart)
restart_window.connect("canceled", save_and_restart)
get_editor_interface().popup_dialog_centered(restart_window)
print("IGNORE RED ERROR MESSAGES BEFORE THE SECOND RESTART!")
func _disable_plugin() -> void: func _disable_plugin() -> void:
print("DiscordSDK Addon got disabled")
remove_autoload_singleton("DiscordSDKLoader") remove_autoload_singleton("DiscordSDKLoader")
FileAccess.open("res://addons/discord-sdk-gd/bin/.gdignore",FileAccess.WRITE) remove_custom_type("DiscordSDKLoader")
remove_custom_type("DiscordSDKDebug") remove_custom_type("DiscordSDKDebug")
get_editor_interface().get_editor_settings().erase("DiscordSDK/EditorPresence/enabled") ProjectSettings.clear("DiscordSDK/EditorPresence/enabled")
push_warning("Please restart the editor to fully disable the DiscordSDK plugin")
func save_and_restart() -> void: func _process(_delta):
get_editor_interface().restart_editor(true) if(ProjectSettings.get_setting("DiscordSDK/EditorPresence/enabled")&&!get_editor_interface().is_playing_scene()):
if(discord_sdk.app_id != 1108142249990176808):
func save_no_restart() -> void: discord_sdk.app_id = 1108142249990176808
get_editor_interface().restart_editor(false) discord_sdk.details = ProjectSettings.get_setting("application/config/name")
discord_sdk.state = "Editing: \""+ str(get_tree().edited_scene_root.scene_file_path).replace("res://","") +"\""
var editor_presence: Node discord_sdk.large_image = "godot"
func _on_editor_settings_changed() -> void: discord_sdk.large_image_text = str(Engine.get_version_info())
plugin_cfg.set_value("Discord","editor_presence",get_editor_interface().get_editor_settings().get_setting("DiscordSDK/EditorPresence/enabled")) discord_sdk.start_timestamp = int(Time.get_unix_time_from_system())
plugin_cfg.save(get_editor_interface().get_editor_paths().get_data_dir() + plugin_data_filename) discord_sdk.refresh()
if ClassDB.class_exists("EditorPresence") && editor_presence == null: if(discord_sdk.app_id == 1108142249990176808):
editor_presence = ClassDB.instantiate("EditorPresence") discord_sdk.coreupdate()
if get_editor_interface().get_editor_settings().has_setting("DiscordSDK/EditorPresence/enabled") && get_editor_interface().get_editor_settings().get_setting("DiscordSDK/EditorPresence/enabled"):
add_child(editor_presence)
else:
editor_presence.queue_free()

View File

@@ -1,112 +0,0 @@
[gd_scene load_steps=8 format=3 uid="uid://byc4c6d5tpomq"]
[ext_resource type="Texture2D" uid="uid://csl0e2px0cwc1" path="res://addons/discord-sdk-gd/Logo_V2_No_Bg.png" id="1_0svbg"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_1t7mm"]
[sub_resource type="Theme" id="Theme_swwco"]
Button/styles/focus = SubResource("StyleBoxEmpty_1t7mm")
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5vqdt"]
[sub_resource type="Image" id="Image_v4whe"]
data = {
"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 168, 224, 224, 224, 233, 224, 224, 224, 236, 224, 224, 224, 170, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 234, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 239, 230, 230, 230, 30, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 168, 224, 224, 224, 255, 224, 224, 224, 186, 224, 224, 224, 32, 224, 224, 224, 33, 224, 224, 224, 187, 224, 224, 224, 255, 225, 225, 225, 167, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 237, 224, 224, 224, 255, 224, 224, 224, 33, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 255, 224, 224, 224, 234, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 237, 224, 224, 224, 255, 224, 224, 224, 33, 255, 255, 255, 0, 255, 255, 255, 0, 229, 229, 229, 38, 224, 224, 224, 255, 224, 224, 224, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 164, 224, 224, 224, 255, 224, 224, 224, 187, 225, 225, 225, 34, 227, 227, 227, 36, 224, 224, 224, 192, 224, 224, 224, 255, 224, 224, 224, 162, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 225, 225, 225, 215, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 229, 224, 224, 224, 32, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 161, 224, 224, 224, 232, 224, 224, 224, 231, 225, 225, 225, 159, 230, 230, 230, 30, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 107, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 105, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 221, 224, 224, 224, 130, 255, 255, 255, 1, 255, 255, 255, 1, 225, 225, 225, 134, 224, 224, 224, 224, 225, 225, 225, 223, 224, 224, 224, 132, 255, 255, 255, 1, 255, 255, 255, 6, 224, 224, 224, 137, 224, 224, 224, 231, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 130, 225, 225, 225, 133, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 129, 224, 224, 224, 137, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 65, 224, 224, 224, 255, 224, 224, 224, 220, 225, 225, 225, 223, 224, 224, 224, 255, 226, 226, 226, 61, 224, 224, 224, 65, 224, 224, 224, 255, 224, 224, 224, 222, 224, 224, 224, 231, 224, 224, 224, 255, 227, 227, 227, 62, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 67, 224, 224, 224, 255, 224, 224, 224, 219, 224, 224, 224, 222, 224, 224, 224, 255, 227, 227, 227, 63, 225, 225, 225, 67, 224, 224, 224, 255, 224, 224, 224, 219, 224, 224, 224, 230, 224, 224, 224, 255, 227, 227, 227, 63, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 126, 225, 225, 225, 135, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 221, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 1, 224, 224, 224, 128, 224, 224, 224, 220, 224, 224, 224, 219, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 5, 225, 225, 225, 134, 224, 224, 224, 229, 224, 224, 224, 255, 255, 255, 255, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_gdtpn"]
image = SubResource("Image_v4whe")
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_7v0rg"]
[node name="RestartWindow" type="ConfirmationDialog"]
title = "Restart required"
initial_position = 2
size = Vector2i(430, 500)
visible = true
transient = false
unresizable = true
theme = SubResource("Theme_swwco")
ok_button_text = "Restart"
cancel_button_text = "Save and restart"
[node name="Panel" type="Panel" parent="."]
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -207.0
offset_top = 8.0
offset_right = 207.0
offset_bottom = 451.0
grow_horizontal = 2
mouse_filter = 1
[node name="VBoxContainer" type="VBoxContainer" parent="Panel"]
custom_minimum_size = Vector2(400, 0)
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -200.0
offset_right = 200.0
offset_bottom = 389.0
grow_horizontal = 2
[node name="HSeparator" type="HSeparator" parent="Panel/VBoxContainer"]
layout_mode = 2
mouse_filter = 1
theme_override_constants/separation = 15
theme_override_styles/separator = SubResource("StyleBoxEmpty_5vqdt")
[node name="HBoxContainer" type="HBoxContainer" parent="Panel/VBoxContainer"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_constants/separation = 10
[node name="DocsIcon" type="TextureRect" parent="Panel/VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 4
texture = SubResource("ImageTexture_gdtpn")
stretch_mode = 2
[node name="LinkButton" type="LinkButton" parent="Panel/VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 8
mouse_default_cursor_shape = 16
theme_override_font_sizes/font_size = 20
text = "HOW TO USE"
uri = "https://vaporvee.com/docs/discord-sdk-godot#quick-start"
[node name="TextureRect" type="TextureRect" parent="Panel/VBoxContainer"]
custom_minimum_size = Vector2(128, 128)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 0
texture = ExtResource("1_0svbg")
expand_mode = 1
[node name="RichTextLabel" type="RichTextLabel" parent="Panel/VBoxContainer"]
custom_minimum_size = Vector2(400, 250)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 0
mouse_filter = 1
theme_override_font_sizes/normal_font_size = 16
theme_override_styles/normal = SubResource("StyleBoxEmpty_7v0rg")
bbcode_enabled = true
text = "[center]Thanks for enabling the
[rainbow]Discord Game SDK Plugin[/rainbow]
made by vaporvee. ❤️
You need to [wave]restart[/wave] the editor to fully enable this plugin!
Do you want to [wave]save[/wave] your project before restarting?
Error messages after the first two restarts are normal. Please ignore them!"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 36 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 444 KiB

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 KiB

View File

@@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dp4u0g6gvyt0a"
path="res://.godot/imported/GodotEditorPresenceBanner.png-5d1b012e64655706e9686e0163b65d30.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/GodotEditorPresenceBanner.png"
dest_files=["res://.godot/imported/GodotEditorPresenceBanner.png-5d1b012e64655706e9686e0163b65d30.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 350 KiB

View File

@@ -1,37 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://08bj2tfacvhm"
path="res://.godot/imported/GodotEditorPresenceBanner.svg-e0420faa20460520008caa2101993296.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/GodotEditorPresenceBanner.svg"
dest_files=["res://.godot/imported/GodotEditorPresenceBanner.svg-e0420faa20460520008caa2101993296.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bjns3n0prshdy"
path="res://.godot/imported/Logo_V2_No_Bg_Small.png-6c9c0ba88b8e0a9cb7aa1acb948a1191.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/Logo_V2_No_Bg_Small.png"
dest_files=["res://.godot/imported/Logo_V2_No_Bg_Small.png-6c9c0ba88b8e0a9cb7aa1acb948a1191.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -8,17 +8,18 @@ custom_features=""
export_filter="all_resources" export_filter="all_resources"
include_filter="" include_filter=""
exclude_filter="" exclude_filter=""
export_path="export/windows/discord-sdk-godot-demo.exe" export_path="../../demo/discord_sdk.exe"
encryption_include_filters="" encryption_include_filters=""
encryption_exclude_filters="" encryption_exclude_filters=""
encrypt_pck=false encrypt_pck=false
encrypt_directory=false encrypt_directory=false
script_encryption_key=""
[preset.0.options] [preset.0.options]
custom_template/debug="" custom_template/debug=""
custom_template/release="" custom_template/release=""
debug/export_console_wrapper=1 debug/export_console_script=1
binary_format/embed_pck=true binary_format/embed_pck=true
texture_format/bptc=true texture_format/bptc=true
texture_format/s3tc=true texture_format/s3tc=true
@@ -26,23 +27,25 @@ texture_format/etc=false
texture_format/etc2=false texture_format/etc2=false
binary_format/architecture="x86_64" binary_format/architecture="x86_64"
codesign/enable=false codesign/enable=false
codesign/identity_type=0
codesign/identity=""
codesign/password=""
codesign/timestamp=true codesign/timestamp=true
codesign/timestamp_server_url="" codesign/timestamp_server_url=""
codesign/digest_algorithm=1 codesign/digest_algorithm=1
codesign/description="" codesign/description=""
codesign/custom_options=PackedStringArray() codesign/custom_options=PackedStringArray()
application/modify_resources=true application/modify_resources=false
application/icon="res://assets/Logo_V2.png" application/icon=""
application/console_wrapper_icon="" application/console_wrapper_icon=""
application/icon_interpolation=4 application/icon_interpolation=4
application/file_version="" application/file_version=""
application/product_version="" application/product_version=""
application/company_name="" application/company_name=""
application/product_name="" application/product_name=""
application/file_description="Discord SDK Godot Test" application/file_description=""
application/copyright="" application/copyright=""
application/trademarks="" application/trademarks=""
application/export_angle=0
ssh_remote_deploy/enabled=false ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip" ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22" ssh_remote_deploy/port="22"
@@ -60,148 +63,3 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -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 Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'" Remove-Item -Recurse -Force '{temp_dir}'"
[preset.1]
name="Linux/X11"
platform="Linux/X11"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="export/linux/discord-sdk-godot-demo.x86_64"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
[preset.1.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=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"
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="#!/usr/bin/env bash
export DISPLAY=:0
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
\"{temp_dir}/{exe_name}\" {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
[preset.2]
name="macOS"
platform="macOS"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="export/macos/discord-sdk-godot-demo.zip"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
[preset.2.options]
export/distribution_type=0
binary_format/architecture="universal"
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
application/icon=""
application/icon_interpolation=4
application/bundle_identifier="com.vaporvee.discord-sdk-godot-demo"
application/signature=""
application/app_category="Games"
application/short_version=""
application/version=""
application/copyright=""
application/copyright_localized={}
application/min_macos_version="10.12"
application/export_angle=0
display/high_res=true
xcode/platform_build="14C18"
xcode/sdk_version="13.1"
xcode/sdk_build="22C55"
xcode/sdk_name="macosx13.1"
xcode/xcode_version="1420"
xcode/xcode_build="14C18"
codesign/codesign=1
codesign/installer_identity=""
codesign/apple_team_id=""
codesign/identity=""
codesign/entitlements/custom_file=""
codesign/entitlements/allow_jit_code_execution=false
codesign/entitlements/allow_unsigned_executable_memory=false
codesign/entitlements/allow_dyld_environment_variables=false
codesign/entitlements/disable_library_validation=false
codesign/entitlements/audio_input=false
codesign/entitlements/camera=false
codesign/entitlements/location=false
codesign/entitlements/address_book=false
codesign/entitlements/calendars=false
codesign/entitlements/photos_library=false
codesign/entitlements/apple_events=false
codesign/entitlements/debugging=false
codesign/entitlements/app_sandbox/enabled=false
codesign/entitlements/app_sandbox/network_server=false
codesign/entitlements/app_sandbox/network_client=false
codesign/entitlements/app_sandbox/device_usb=false
codesign/entitlements/app_sandbox/device_bluetooth=false
codesign/entitlements/app_sandbox/files_downloads=0
codesign/entitlements/app_sandbox/files_pictures=0
codesign/entitlements/app_sandbox/files_music=0
codesign/entitlements/app_sandbox/files_movies=0
codesign/entitlements/app_sandbox/files_user_selected=0
codesign/entitlements/app_sandbox/helper_executables=[]
codesign/custom_options=PackedStringArray()
notarization/notarization=0
privacy/microphone_usage_description=""
privacy/microphone_usage_description_localized={}
privacy/camera_usage_description=""
privacy/camera_usage_description_localized={}
privacy/location_usage_description=""
privacy/location_usage_description_localized={}
privacy/address_book_usage_description=""
privacy/address_book_usage_description_localized={}
privacy/calendar_usage_description=""
privacy/calendar_usage_description_localized={}
privacy/photos_library_usage_description=""
privacy/photos_library_usage_description_localized={}
privacy/desktop_folder_usage_description=""
privacy/desktop_folder_usage_description_localized={}
privacy/documents_folder_usage_description=""
privacy/documents_folder_usage_description_localized={}
privacy/downloads_folder_usage_description=""
privacy/downloads_folder_usage_description_localized={}
privacy/network_volumes_usage_description=""
privacy/network_volumes_usage_description_localized={}
privacy/removable_volumes_usage_description=""
privacy/removable_volumes_usage_description_localized={}
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="#!/usr/bin/env bash
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""

View File

@@ -2,40 +2,38 @@ extends Node
func _ready() -> void: func _ready() -> void:
set_activity() set_activity()
DiscordSDK.connect("activity_join_request",_on_activity_join_request) discord_sdk.connect("activity_join_request",_on_activity_join_request)
DiscordSDK.connect("activity_join",_on_activity_join) discord_sdk.connect("activity_join",_on_activity_join)
DiscordSDK.connect("activity_spectate",_on_activity_spectate) discord_sdk.connect("activity_spectate",_on_activity_spectate)
DiscordSDK.connect("relationships_init",_on_relationship_init)
DiscordSDK.connect("updated_relationship", _on_updated_relationship)
func set_activity() -> void: func set_activity() -> void:
DiscordSDK.clear(false) discord_sdk.clear()
DiscordSDK.app_id = 1099618430065324082 discord_sdk.app_id = 1099618430065324082
DiscordSDK.details = "A demo activity by vaporvee#1231" discord_sdk.details = "A demo activity by vaporvee#1231"
DiscordSDK.state = "Checkpoint 23/23" discord_sdk.state = "Checkpoint 23/23"
DiscordSDK.large_image = "example_game" discord_sdk.large_image = "example_game"
DiscordSDK.large_image_text = "Try it now!" discord_sdk.large_image_text = "Try it now!"
DiscordSDK.small_image = "boss" discord_sdk.small_image = "boss"
DiscordSDK.small_image_text = "Fighting the end boss! D:" discord_sdk.small_image_text = "Fighting the end boss! D:"
DiscordSDK.end_timestamp = int(Time.get_unix_time_from_system()) + 3600 # +1 hour in unix time discord_sdk.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 # It is NOT recommended to manage secrets locally! It's meant to be a payload wich the server
# returns the other variables like current_party_size, party_id etc. Most of the values must differ from the others. # 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)) var my_secret: String = str(randi_range(0,999999))
DiscordSDK.party_id = "mylobbycanbeeverything_" + my_secret discord_sdk.party_id = "mylobbycanbeeverything_" + my_secret
DiscordSDK.current_party_size = 1 discord_sdk.current_party_size = 1
DiscordSDK.max_party_size = 4 discord_sdk.max_party_size = 4
DiscordSDK.match_secret = "m_" + my_secret #better use seeds with 1 to 1 range instead of just chars discord_sdk.match_secret = "m_" + my_secret #better use seeds with 1 to 1 range instead of just chars
DiscordSDK.join_secret = "j_" + my_secret discord_sdk.join_secret = "j_" + my_secret
DiscordSDK.spectate_secret = "s_" + my_secret discord_sdk.spectate_secret = "s_" + my_secret
DiscordSDK.is_public_party = true discord_sdk.is_public_party = true
DiscordSDK.instanced = true #required for spectate discord_sdk.instanced = true #required for spectate
#DiscordSDK.start_timestamp = int(Time.get_unix_time_from_system()) #discord_sdk.start_timestamp = int(Time.get_unix_time_from_system())
DiscordSDK.register_command("C:\\Users\\yanni\\Desktop\\demo\\DiscordSDK.exe") discord_sdk.register_command("C:\\Users\\yanni\\Desktop\\demo\\discord_sdk.exe")
#DiscordSDK.register_steam(1389990) #discord_sdk.register_steam(1389990)
DiscordSDK.refresh() discord_sdk.refresh()
var user_request: Dictionary; var user_request: Dictionary;
@@ -44,20 +42,19 @@ func _on_activity_join_request(user_requesting) -> void:
user_request = user_requesting user_request = user_requesting
func _on_activity_join(secret) -> void: func _on_activity_join(secret) -> void:
if(DiscordSDK.join_secret != secret): if(discord_sdk.join_secret != secret):
DiscordSDK.current_party_size = clamp(int(secret) + 1, 0, DiscordSDK.max_party_size) discord_sdk.current_party_size = clamp(int(secret) + 1, 0, discord_sdk.max_party_size)
DiscordSDK.party_id = secret.replace("j_","mylobbycanbeeverything_") discord_sdk.party_id = secret.replace("j_","mylobbycanbeeverything_")
DiscordSDK.match_secret = secret.replace("j_","m_") discord_sdk.match_secret = secret.replace("j_","m_")
DiscordSDK.join_secret = secret discord_sdk.join_secret = secret
DiscordSDK.spectate_secret = secret.replace("j_","s_") discord_sdk.spectate_secret = secret.replace("j_","s_")
DiscordSDK.refresh() discord_sdk.refresh()
func _on_activity_spectate(secret) -> void: func _on_activity_spectate(secret) -> void:
print(secret) print(secret)
func _on_relationship_init(): func _on_toggle_sdk_toggled(button_pressed):
print("initialized") if(button_pressed):
set_activity()
func _on_updated_relationship(relationship): else:
print(relationship) discord_sdk.clear()

View File

@@ -1,9 +1,13 @@
[gd_scene load_steps=4 format=3 uid="uid://dyc3kseph4el7"] [gd_scene load_steps=7 format=3 uid="uid://dyc3kseph4el7"]
[ext_resource type="Script" path="res://main.gd" id="1_kl8ri"] [ext_resource type="Script" path="res://main.gd" id="1_kl8ri"]
[ext_resource type="Texture2D" uid="uid://b3qm246m7pnsx" path="res://assets/Logo_V2.png" id="2_gd222"] [ext_resource type="Texture2D" uid="uid://b3qm246m7pnsx" path="res://assets/Logo_V2.png" id="2_gd222"]
[ext_resource type="Texture2D" uid="uid://dnfq6kug4x6o2" path="res://addons/discord-sdk-gd/nodes/assets/Checked.svg" id="3_wajuo"]
[ext_resource type="Texture2D" uid="uid://compmm3kviqqe" path="res://addons/discord-sdk-gd/nodes/assets/Unchecked.svg" id="4_8hvtu"]
[ext_resource type="Script" path="res://addons/discord-sdk-gd/nodes/debug.gd" id="6_ujijw"] [ext_resource type="Script" path="res://addons/discord-sdk-gd/nodes/debug.gd" id="6_ujijw"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_phc3u"]
[node name="Node" type="Node"] [node name="Node" type="Node"]
script = ExtResource("1_kl8ri") script = ExtResource("1_kl8ri")
@@ -19,7 +23,7 @@ color = Color(0.345098, 0.396078, 0.94902, 1)
[node name="Sprite2D" type="Sprite2D" parent="."] [node name="Sprite2D" type="Sprite2D" parent="."]
texture_filter = 4 texture_filter = 4
position = Vector2(789, 330.5) position = Vector2(580, 308)
scale = Vector2(0.408203, 0.408203) scale = Vector2(0.408203, 0.408203)
texture = ExtResource("2_gd222") texture = ExtResource("2_gd222")
@@ -29,10 +33,10 @@ anchor_left = 0.293
anchor_top = 0.59 anchor_top = 0.59
anchor_right = 0.736 anchor_right = 0.736
anchor_bottom = 0.727 anchor_bottom = 0.727
offset_left = 208.464 offset_left = -0.536011
offset_top = 22.18 offset_top = -0.319977
offset_right = 209.128 offset_right = 0.12793
offset_bottom = 22.4039 offset_bottom = -0.0960388
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
size_flags_horizontal = 4 size_flags_horizontal = 4
@@ -42,3 +46,20 @@ text = "[center][font s=60]DiscordSDK Test"
[node name="DiscordSDKDebug" type="Node" parent="."] [node name="DiscordSDKDebug" type="Node" parent="."]
script = ExtResource("6_ujijw") script = ExtResource("6_ujijw")
[node name="ToggleSDK" type="CheckButton" parent="."]
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_left = 293.0
offset_top = 142.375
offset_right = 1139.0
offset_bottom = 650.375
grow_vertical = 2
scale = Vector2(0.05, 0.05)
theme_override_icons/checked = ExtResource("3_wajuo")
theme_override_icons/unchecked = ExtResource("4_8hvtu")
theme_override_styles/focus = SubResource("StyleBoxEmpty_phc3u")
button_pressed = true
[connection signal="toggled" from="ToggleSDK" to="." method="_on_toggle_sdk_toggled"]

View File

@@ -8,12 +8,15 @@
config_version=5 config_version=5
[DiscordSDK]
EditorPresence/enabled=true
[application] [application]
config/name="GDExtension DiscordSDK Test Project" config/name="GDExtension DiscordSDK Test Project"
config/tags=PackedStringArray("vaporvee")
run/main_scene="res://main.tscn" run/main_scene="res://main.tscn"
config/features=PackedStringArray("4.2") config/features=PackedStringArray("4.0")
boot_splash/bg_color=Color(0.25098, 0.305882, 0.929412, 1) boot_splash/bg_color=Color(0.25098, 0.305882, 0.929412, 1)
boot_splash/image="res://assets/Banner_v1.png" boot_splash/image="res://assets/Banner_v1.png"
boot_splash/fullsize=false boot_splash/fullsize=false
@@ -21,7 +24,7 @@ config/icon="res://assets/Logo_V2.png"
[autoload] [autoload]
DiscordSDKLoader="*res://addons/discord-sdk-gd/nodes/discord_autoload.gd" DiscordSDKLoader="*res://addons/discord-sdk-gd/nodes/core_updater.gd"
[display] [display]

View File

@@ -1,37 +0,0 @@
import os
import shutil
from distutils.dir_util import copy_tree
win_folder_path = "project/addons/discord-sdk-gd/bin/windows"
matching_files = [file for file in os.listdir(win_folder_path) if file.endswith(("TMP", "exp", "lib"))]
for file in matching_files:
file_path = os.path.join(win_folder_path, file)
os.remove(file_path)
if os.path.exists("release/ADDON-Discord-SDK-Godot/addons"):
shutil.rmtree("release/ADDON-Discord-SDK-Godot/addons", ignore_errors=True)
copy_tree("project/addons/", "release/temp/ADDON-Discord-SDK-Godot/addons")
open("release/temp/ADDON-Discord-SDK-Godot/addons/discord-sdk-gd/bin/.gdignore", "a").close()
shutil.make_archive('release/ADDON-Discord-SDK-Godot', 'zip', 'release/temp/')
shutil.rmtree("release/temp/")
# Export Demos
os.system("cd project && godot --headless --export-release \"Linux/X11\"")
os.system("cd project && godot --headless --export-release \"Windows Desktop\"")
os.system("cd project && godot --headless --export-release \"macOS\"")
temp_dir = "release/temp_export_dir"
os.makedirs(temp_dir, exist_ok=True)
for platform in ["windows", "linux", "macos"]:
shutil.copytree(f"project/export/{platform}", os.path.join(temp_dir, platform))
shutil.make_archive('release/Demo-Export', 'zip', temp_dir)
shutil.rmtree(temp_dir)
print("ADDON-Discord-SDK-Godot.zip and Demo-Export.zip have been created successfully.")

View File

@@ -1,2 +0,0 @@
setuptools
scons

View File

@@ -2,21 +2,18 @@ import zipfile
from distutils.dir_util import copy_tree from distutils.dir_util import copy_tree
import shutil import shutil
import os import os
import sys
with zipfile.ZipFile("src/lib/discord_game_sdk.zip", "r") as zip_ref: with zipfile.ZipFile("src/lib/discord_game_sdk.zip", "r") as zip_ref:
zip_ref.extractall("src/lib/discord_game_sdk/") zip_ref.extractall("src/lib/discord_game_sdk/")
# Patch the SDK to actually build, since it's missing an include
with open("src/lib/discord_game_sdk/cpp/types.h", "r+") as f:
s = f.read()
f.seek(0)
f.write("#include <cstdint>\n" + s)
copy_tree("src/lib/discord_game_sdk/lib/", "src/lib/discord_game_sdk/bin/") copy_tree("src/lib/discord_game_sdk/lib/", "src/lib/discord_game_sdk/bin/")
os.rename( os.rename(
"src/lib/discord_game_sdk/bin/aarch64/discord_game_sdk.dylib", "src/lib/discord_game_sdk/bin/aarch64/discord_game_sdk.dylib",
"src/lib/discord_game_sdk/bin/aarch64/discord_game_sdk_aarch64.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( os.rename(
"src/lib/discord_game_sdk/bin/x86_64/discord_game_sdk.so", "src/lib/discord_game_sdk/bin/x86_64/discord_game_sdk.so",
@@ -44,18 +41,4 @@ 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) shutil.rmtree("src/lib/discord_game_sdk/bin/x86_64/", ignore_errors=True)
os.remove("src/lib/discord_game_sdk/README.md") os.remove("src/lib/discord_game_sdk/README.md")
if sys.platform == "darwin": os.system("git submodule update --init")
# Combine the two libraries into one
os.system(
"lipo src/lib/discord_game_sdk/bin/{discord_game_sdk.dylib,discord_game_sdk_aarch64.dylib} -output src/lib/discord_game_sdk/bin/libdiscord_game_sdk.dylib -create"
)
# Change the install name to (library's location)/(its new name)
os.system(
"install_name_tool -id '@loader_path/libdiscord_game_sdk.dylib'\
src/lib/discord_game_sdk/bin/libdiscord_game_sdk.dylib"
)
# Remove the ones it's made of
os.remove("src/lib/discord_game_sdk/bin/discord_game_sdk.dylib")
os.remove("src/lib/discord_game_sdk/bin/discord_game_sdk_aarch64.dylib")
os.system("git submodule update --init --remote")

View File

@@ -1,116 +1,139 @@
#include "discordgodot.h" #include "discordgodot.h"
#include "lib/discord_game_sdk/cpp/discord.h" #include "lib/discord_game_sdk/cpp/discord.h"
#include <godot_cpp/core/class_db.hpp> #include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/classes/editor_plugin.hpp>
#include <godot_cpp/variant/utility_functions.hpp> #include <godot_cpp/variant/utility_functions.hpp>
#include <godot_cpp/classes/time.hpp>
#define BIND_METHOD(method, ...) godot::ClassDB::bind_method(D_METHOD(#method, ##__VA_ARGS__), &DiscordSDK::method) using namespace godot;
#define BIND_SET_GET(property_name, variant_type) \
godot::ClassDB::bind_method(D_METHOD("get_" #property_name), &DiscordSDK::get_##property_name); \ discord_sdk *discord_sdk::singleton = nullptr;
godot::ClassDB::bind_method(D_METHOD("set_" #property_name, #variant_type), &DiscordSDK::set_##property_name); \
godot::ClassDB::add_property(get_class_static(), PropertyInfo(variant_type, #property_name), "set_" #property_name, "get_" #property_name)
#define BIND_SIGNAL(signal_name, ...) godot::ClassDB::add_signal(get_class_static(), MethodInfo(#signal_name, ##__VA_ARGS__))
#define SET_GET(variable, setter, ...) /*getter isn't mandatory for this project*/ \
decltype(DiscordSDK::variable) DiscordSDK::get_##variable() { return variable; } \
void DiscordSDK::set_##variable(decltype(DiscordSDK::variable) value) \
{ \
variable = value; \
setter; \
}
DiscordSDK *DiscordSDK::singleton = nullptr;
discord::Core *core{}; discord::Core *core{};
discord::Result result; discord::Result result;
discord::Activity activity{}; discord::Activity activity{};
discord::User user{}; discord::User user{};
void DiscordSDK::_bind_methods() void discord_sdk::_bind_methods()
{ {
BIND_SET_GET(app_id, Variant::INT); ClassDB::bind_method(D_METHOD("debug"), &discord_sdk::debug);
BIND_SET_GET(state, Variant::STRING); ClassDB::bind_method(D_METHOD("coreupdate"), &discord_sdk::coreupdate);
BIND_SET_GET(details, Variant::STRING);
BIND_SET_GET(large_image, Variant::STRING);
BIND_SET_GET(large_image_text, Variant::STRING);
BIND_SET_GET(small_image, Variant::STRING);
BIND_SET_GET(small_image_text, Variant::STRING);
BIND_SET_GET(start_timestamp, Variant::INT);
BIND_SET_GET(end_timestamp, Variant::INT);
BIND_SET_GET(party_id, Variant::STRING);
BIND_SET_GET(current_party_size, Variant::INT);
BIND_SET_GET(max_party_size, Variant::INT);
BIND_SET_GET(match_secret, Variant::STRING);
BIND_SET_GET(join_secret, Variant::STRING);
BIND_SET_GET(spectate_secret, Variant::STRING);
BIND_SET_GET(instanced, Variant::BOOL);
BIND_SET_GET(is_public_party, Variant::BOOL);
BIND_SIGNAL(activity_join, PropertyInfo(Variant::STRING, "join_secret"));
BIND_SIGNAL(activity_spectate, PropertyInfo(Variant::STRING, "spectate_secret"));
BIND_SIGNAL(activity_join_request, PropertyInfo(Variant::DICTIONARY, "user_requesting"));
BIND_SIGNAL(updated_relationship, PropertyInfo(Variant::DICTIONARY, "relationship"));
BIND_SIGNAL(overlay_toggle, PropertyInfo(Variant::BOOL, "is_locked"));
BIND_SIGNAL(relationships_init);
BIND_METHOD(debug);
BIND_METHOD(run_callbacks);
BIND_METHOD(refresh);
ClassDB::bind_method(D_METHOD("clear", "reset_values"), &DiscordSDK::clear, DEFVAL(false));
BIND_METHOD(unclear);
BIND_METHOD(register_command, "command");
BIND_METHOD(register_steam, "steam_id");
BIND_METHOD(accept_join_request, "user_id");
BIND_METHOD(send_invite, "user_id", "is_spectate", "message_content");
BIND_METHOD(accept_invite, "user_id");
BIND_METHOD(get_current_user);
BIND_METHOD(get_all_relationships);
BIND_METHOD(get_is_overlay_enabled);
BIND_METHOD(get_is_overlay_locked);
BIND_METHOD(open_invite_overlay, "is_spectate");
BIND_METHOD(open_server_invite_overlay, "invite_code");
BIND_METHOD(open_voice_settings);
BIND_METHOD(get_is_discord_working);
BIND_METHOD(get_result_int);
}
SET_GET(state, activity.SetState(value.utf8().get_data()))
SET_GET(details, activity.SetDetails(value.utf8().get_data()))
SET_GET(large_image, activity.GetAssets().SetLargeImage(value.utf8().get_data()))
SET_GET(large_image_text, activity.GetAssets().SetLargeText(value.utf8().get_data()))
SET_GET(small_image, activity.GetAssets().SetSmallImage(value.utf8().get_data()))
SET_GET(small_image_text, activity.GetAssets().SetSmallText(value.utf8().get_data()))
SET_GET(start_timestamp, activity.GetTimestamps().SetStart(value))
SET_GET(end_timestamp, activity.GetTimestamps().SetEnd(value))
SET_GET(party_id, activity.GetParty().SetId(value.utf8().get_data()))
SET_GET(current_party_size, activity.GetParty().GetSize().SetCurrentSize(value))
SET_GET(max_party_size, activity.GetParty().GetSize().SetMaxSize(value))
SET_GET(match_secret, activity.GetSecrets().SetMatch(value.utf8().get_data()))
SET_GET(join_secret, activity.GetSecrets().SetJoin(value.utf8().get_data()))
SET_GET(spectate_secret, activity.GetSecrets().SetSpectate(value.utf8().get_data()))
SET_GET(instanced, activity.SetInstance(value))
SET_GET(is_public_party, activity.GetParty().SetPrivacy(static_cast<discord::ActivityPartyPrivacy>(value)))
DiscordSDK::DiscordSDK() 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("get_party_id"), &discord_sdk::get_party_id);
ClassDB::bind_method(D_METHOD("set_party_id", "party_id"), &discord_sdk::set_party_id);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "party_id"), "set_party_id", "get_party_id");
ClassDB::bind_method(D_METHOD("get_current_party_size"), &discord_sdk::get_current_party_size);
ClassDB::bind_method(D_METHOD("set_current_party_size", "current_party_size"), &discord_sdk::set_current_party_size);
ADD_PROPERTY(PropertyInfo(Variant::INT, "current_party_size"), "set_current_party_size", "get_current_party_size");
ClassDB::bind_method(D_METHOD("get_max_party_size"), &discord_sdk::get_max_party_size);
ClassDB::bind_method(D_METHOD("set_max_party_size", "max_party_size"), &discord_sdk::set_max_party_size);
ADD_PROPERTY(PropertyInfo(Variant::INT, "max_party_size"), "set_max_party_size", "get_max_party_size");
ClassDB::bind_method(D_METHOD("get_match_secret"), &discord_sdk::get_match_secret);
ClassDB::bind_method(D_METHOD("set_match_secret", "match_secret"), &discord_sdk::set_match_secret);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "match_secret"), "set_match_secret", "get_match_secret");
ClassDB::bind_method(D_METHOD("get_join_secret"), &discord_sdk::get_join_secret);
ClassDB::bind_method(D_METHOD("set_join_secret", "join_secret"), &discord_sdk::set_join_secret);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "join_secret"), "set_join_secret", "get_join_secret");
ClassDB::bind_method(D_METHOD("get_spectate_secret"), &discord_sdk::get_spectate_secret);
ClassDB::bind_method(D_METHOD("set_spectate_secret", "spectate_secret"), &discord_sdk::set_spectate_secret);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "spectate_secret"), "set_spectate_secret", "get_spectate_secret");
ClassDB::bind_method(D_METHOD("get_instanced"), &discord_sdk::get_instanced);
ClassDB::bind_method(D_METHOD("set_instanced", "instanced"), &discord_sdk::set_instanced);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "instanced"), "set_instanced", "get_instanced");
ClassDB::bind_method(D_METHOD("get_is_public_party"), &discord_sdk::get_is_public_party);
ClassDB::bind_method(D_METHOD("set_is_public_party", "is_public_party"), &discord_sdk::set_is_public_party);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "is_public_party"), "set_is_public_party", "get_is_public_party");
ADD_SIGNAL(MethodInfo("activity_join", PropertyInfo(Variant::STRING, "join_secret")));
ADD_SIGNAL(MethodInfo("activity_spectate", PropertyInfo(Variant::STRING, "spectate_secret")));
ADD_SIGNAL(MethodInfo("activity_join_request", PropertyInfo(Variant::DICTIONARY, "user_requesting")));
ClassDB::bind_method(D_METHOD("refresh"), &discord_sdk::refresh);
ClassDB::bind_method(D_METHOD("clear"), &discord_sdk::clear);
ClassDB::bind_method(D_METHOD("register_command", "command"), &discord_sdk::register_command);
ClassDB::bind_method(D_METHOD("register_steam", "steam_id"), &discord_sdk::register_steam);
ClassDB::bind_method(D_METHOD("accept_join_request", "user_id"), &discord_sdk::accept_join_request);
ClassDB::bind_method(D_METHOD("send_invite", "user_id", "is_spectate", "message_content"), &discord_sdk::send_invite);
ClassDB::bind_method(D_METHOD("accept_invite", "user_id"), &discord_sdk::accept_invite);
ClassDB::bind_method(D_METHOD("get_current_user"), &discord_sdk::get_current_user);
ClassDB::bind_method(D_METHOD("get_is_overlay_enabled"), &discord_sdk::get_is_overlay_enabled);
ClassDB::bind_method(D_METHOD("get_is_overlay_locked"), &discord_sdk::get_is_overlay_locked);
ClassDB::bind_method(D_METHOD("set_is_overlay_locked", "is_overlay_locked"), &discord_sdk::set_is_overlay_locked);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "is_overlay_locked"), "set_is_overlay_locked", "get_is_overlay_locked");
ClassDB::bind_method(D_METHOD("open_invite_overlay", "is_spectate"), &discord_sdk::open_invite_overlay);
ClassDB::bind_method(D_METHOD("open_server_invite_overlay", "invite_code"), &discord_sdk::open_server_invite_overlay);
ClassDB::bind_method(D_METHOD("open_voice_settings"), &discord_sdk::open_voice_settings);
ADD_SIGNAL(MethodInfo("overlay_toggle", PropertyInfo(Variant::BOOL, "is_locked")));
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);
}
discord_sdk *discord_sdk::get_singleton()
{
return singleton;
}
discord_sdk::discord_sdk()
{ {
ERR_FAIL_COND(singleton != nullptr); ERR_FAIL_COND(singleton != nullptr);
singleton = this; singleton = this;
} }
DiscordSDK::~DiscordSDK() discord_sdk::~discord_sdk()
{ {
app_id = 0;
delete core; // couldn't use destructor because it would not compile on linux
core = nullptr;
ERR_FAIL_COND(singleton != this); ERR_FAIL_COND(singleton != this);
singleton = nullptr; singleton = nullptr;
delete core;
core = nullptr;
} }
DiscordSDK *DiscordSDK::get_singleton() void discord_sdk::coreupdate()
{
return singleton;
}
void DiscordSDK::run_callbacks()
{ {
if (result == discord::Result::Ok && app_id > 0) if (result == discord::Result::Ok && app_id > 0)
::core->RunCallbacks(); ::core->RunCallbacks();
} }
void DiscordSDK::debug() void discord_sdk::debug()
{ {
result = discord::Core::Create(1080224638845591692, DiscordCreateFlags_NoRequireDiscord, &core); result = discord::Core::Create(1080224638845591692, DiscordCreateFlags_NoRequireDiscord, &core);
activity.SetState("Test from Godot!"); activity.SetState("Test from Godot!");
@@ -128,51 +151,71 @@ void DiscordSDK::debug()
UtilityFunctions::push_warning("Discord Activity couldn't be updated. It could be that Discord isn't running!"); UtilityFunctions::push_warning("Discord Activity couldn't be updated. It could be that Discord isn't running!");
} }
void DiscordSDK::set_app_id(int64_t value) void discord_sdk::set_app_id(int64_t value)
{ {
app_id = value; app_id = value;
if (app_id > 0) result = discord::Core::Create(value, DiscordCreateFlags_NoRequireDiscord, &core); // after setting app_ID it initializes everything
{
result = discord::Core::Create(value, DiscordCreateFlags_NoRequireDiscord, &core); // after setting app_ID it initializes everything
if (result == discord::Result::Ok) if (result == discord::Result::Ok && app_id > 0)
{ {
// initialize currentuser // initialize currentuser stuff
core->UserManager().OnCurrentUserUpdate.Connect([]() core->UserManager().OnCurrentUserUpdate.Connect([]()
{discord::User user{}; {discord::User user{};
core->UserManager().GetCurrentUser(&user); }); core->UserManager().GetCurrentUser(&user); });
// signals // signals
core->ActivityManager().OnActivityJoin.Connect([](const char *secret) core->ActivityManager().OnActivityJoin.Connect([](const char *secret)
{ DiscordSDK::get_singleton() { discord_sdk::get_singleton()
->emit_signal("activity_join", secret); }); ->emit_signal("activity_join", secret); });
core->ActivityManager().OnActivitySpectate.Connect([](const char *secret) core->ActivityManager().OnActivitySpectate.Connect([](const char *secret)
{ DiscordSDK::get_singleton() { discord_sdk::get_singleton()
->emit_signal("activity_spectate", secret); }); ->emit_signal("activity_spectate", secret); });
core->ActivityManager().OnActivityJoinRequest.Connect([this](discord::User const &user) core->ActivityManager().OnActivityJoinRequest.Connect([this](discord::User const &user)
{ DiscordSDK::get_singleton() { Dictionary user_requesting;
->emit_signal("activity_join_request", user2dict(user)); }); user_requesting["avatar"] = user.GetAvatar(); //can be empty when user has no avatar
core->OverlayManager().OnToggle.Connect([](bool is_locked) user_requesting["is_bot"] = user.GetBot();
{ DiscordSDK::get_singleton() user_requesting["discriminator"] = user.GetDiscriminator();
->emit_signal("overlay_toggle", is_locked); }); user_requesting["id"] = user.GetId();
core->RelationshipManager().OnRefresh.Connect([&]() user_requesting["username"] = user.GetUsername();
{ DiscordSDK::get_singleton() if(String(user_requesting["avatar"]).is_empty())
->emit_signal("relationships_init"); }); user_requesting["avatar_url"] = String(std::string("https://cdn.discordapp.com/embed/avatars/" + std::to_string((user_requesting["discriminator"].INT % 5) - 1)+ ".png").c_str());
core->RelationshipManager().OnRelationshipUpdate.Connect([&](discord::Relationship const &relationship) else
{ DiscordSDK::get_singleton() user_requesting["avatar_url"] = String(std::string("https://cdn.discordapp.com/avatars/" + std::to_string(user.GetId()) + "/" + user.GetAvatar() + ".png?size=512").c_str());//I don't know what the hell i did there but removing ?size=512 will crash the whole editor
->emit_signal("updated_relationship", relationship2dict(relationship)); }); user_requesting.make_read_only();
} discord_sdk::get_singleton()
->emit_signal("activity_join_request",user_requesting); });
core->OverlayManager().OnToggle.Connect([](bool is_locked)
{ discord_sdk::get_singleton()
->emit_signal("overlay_toggle", is_locked); });
} }
} }
int64_t DiscordSDK::get_app_id() int64_t discord_sdk::get_app_id()
{ {
if (app_id != 0) return app_id;
return app_id;
return old_app_id;
} }
void DiscordSDK::refresh() void discord_sdk::set_state(String value)
{ {
if (get_is_discord_working()) state = value;
activity.SetState(value.utf8().get_data());
}
String discord_sdk::get_state()
{
return state;
}
void discord_sdk::set_details(String value)
{
details = value;
activity.SetDetails(value.utf8().get_data());
}
String discord_sdk::get_details()
{
return details;
}
void discord_sdk::refresh()
{
if (result == discord::Result::Ok && app_id > 0)
{ {
activity.GetParty().SetPrivacy(discord::ActivityPartyPrivacy::Public); activity.GetParty().SetPrivacy(discord::ActivityPartyPrivacy::Public);
activity.SetType(discord::ActivityType::Playing); activity.SetType(discord::ActivityType::Playing);
@@ -182,249 +225,256 @@ void DiscordSDK::refresh()
UtilityFunctions::push_warning("Discord Activity couldn't be updated. It could be that Discord isn't running!"); UtilityFunctions::push_warning("Discord Activity couldn't be updated. It could be that Discord isn't running!");
} }
void DiscordSDK::clear(bool reset_values = false) void discord_sdk::clear()
{ {
if (get_is_discord_working()) if (result == discord::Result::Ok)
{ {
if (reset_values)
{
old_app_id = 0;
set_state("");
set_details("");
set_large_image("");
set_large_image_text("");
set_small_image("");
set_small_image_text("");
set_start_timestamp(0);
set_end_timestamp(0);
set_party_id("");
set_current_party_size(0);
set_max_party_size(0);
set_match_secret("");
set_join_secret("");
set_spectate_secret("");
set_instanced(false);
set_is_public_party(false);
set_is_overlay_locked(false);
core->ActivityManager().ClearActivity([](discord::Result result) {});
}
else
old_app_id = app_id;
app_id = 0; app_id = 0;
state = "";
details = "";
large_image = "";
large_image_text = "";
small_image = "";
small_image_text = "";
start_timestamp = 0;
end_timestamp = 0;
party_id = "";
current_party_size = 0;
max_party_size = 0;
match_secret = "";
join_secret = "";
spectate_secret = "";
instanced = false;
is_public_party = false;
is_overlay_locked = false;
delete core; delete core;
core = nullptr; core = nullptr;
} }
} }
void DiscordSDK::unclear() void discord_sdk::set_large_image(String value)
{ {
if (old_app_id > 0) large_image = value;
{ activity.GetAssets().SetLargeImage(value.utf8().get_data());
set_app_id(old_app_id); }
refresh(); String discord_sdk::get_large_image()
old_app_id = 0; {
} return large_image;
else }
UtilityFunctions::push_warning("Discord Activity couldn't be uncleared. Maybe it didn't get cleared before?"); void discord_sdk::set_large_image_text(String value)
{
large_image_text = value;
activity.GetAssets().SetLargeText(value.utf8().get_data());
}
String discord_sdk::get_large_image_text()
{
return large_image_text;
}
void discord_sdk::set_small_image(String value)
{
small_image = value;
activity.GetAssets().SetSmallImage(value.utf8().get_data());
}
String discord_sdk::get_small_image()
{
return small_image;
}
void discord_sdk::set_small_image_text(String value)
{
small_image_text = value;
activity.GetAssets().SetSmallText(value.utf8().get_data());
}
String discord_sdk::get_small_image_text()
{
return small_image_text;
} }
bool DiscordSDK::get_is_overlay_enabled() void discord_sdk::set_start_timestamp(int64_t value)
{
start_timestamp = value;
activity.GetTimestamps().SetStart(value);
}
int64_t discord_sdk::get_start_timestamp()
{
return activity.GetTimestamps().GetStart();
}
void discord_sdk::set_end_timestamp(int64_t value)
{
end_timestamp = value;
activity.GetTimestamps().SetEnd(value);
}
int64_t discord_sdk::get_end_timestamp()
{
return activity.GetTimestamps().GetEnd();
}
void discord_sdk::set_party_id(String value)
{
party_id = value;
activity.GetParty().SetId(value.utf8().get_data());
}
String discord_sdk::get_party_id()
{
return party_id;
}
void discord_sdk::set_current_party_size(int32_t value)
{
current_party_size = value;
activity.GetParty().GetSize().SetCurrentSize(value);
}
int32_t discord_sdk::get_current_party_size()
{
return current_party_size;
}
void discord_sdk::set_max_party_size(int32_t value)
{
max_party_size = value;
activity.GetParty().GetSize().SetMaxSize(value);
}
int32_t discord_sdk::get_max_party_size()
{
return max_party_size;
}
void discord_sdk::set_match_secret(String value)
{
match_secret = value;
activity.GetSecrets().SetMatch(value.utf8().get_data());
}
String discord_sdk::get_match_secret()
{
return match_secret;
}
void discord_sdk::set_join_secret(String value)
{
join_secret = value;
activity.GetSecrets().SetJoin(value.utf8().get_data());
}
String discord_sdk::get_join_secret()
{
return join_secret;
}
void discord_sdk::set_spectate_secret(String value)
{
spectate_secret = value;
activity.GetSecrets().SetSpectate(value.utf8().get_data());
}
String discord_sdk::get_spectate_secret()
{
return spectate_secret;
}
void discord_sdk::set_instanced(bool value)
{
instanced = value;
activity.SetInstance(value);
}
bool discord_sdk::get_instanced()
{
return instanced;
}
bool discord_sdk::get_is_overlay_enabled()
{ {
bool ie; bool ie;
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
core->OverlayManager().IsEnabled(&ie); core->OverlayManager().IsEnabled(&ie);
return ie; return ie;
} }
bool DiscordSDK::get_is_overlay_locked() bool discord_sdk::get_is_overlay_locked()
{ {
bool il; bool il;
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
core->OverlayManager().IsLocked(&il); core->OverlayManager().IsLocked(&il);
return il; return il;
} }
void DiscordSDK::set_is_overlay_locked(bool value) void discord_sdk::set_is_overlay_locked(bool value)
{ {
is_overlay_locked = value; is_overlay_locked = value;
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
core->OverlayManager().SetLocked(value, {}); core->OverlayManager().SetLocked(value, {});
} }
void DiscordSDK::open_invite_overlay(bool is_spectate) void discord_sdk::open_invite_overlay(bool is_spectate)
{ {
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
core->OverlayManager().OpenActivityInvite(static_cast<discord::ActivityActionType>(is_spectate + 1), {}); core->OverlayManager().OpenActivityInvite(static_cast<discord::ActivityActionType>(is_spectate + 1), {});
} }
void DiscordSDK::open_server_invite_overlay(String invite_code) void discord_sdk::open_server_invite_overlay(String invite_code)
{ {
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
core->OverlayManager().OpenGuildInvite(invite_code.utf8().get_data(), {}); core->OverlayManager().OpenGuildInvite(invite_code.utf8().get_data(), {});
} }
void DiscordSDK::open_voice_settings() void discord_sdk::open_voice_settings()
{ {
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
core->OverlayManager().OpenVoiceSettings({}); core->OverlayManager().OpenVoiceSettings({});
} }
void DiscordSDK::accept_join_request(int64_t user_id) void discord_sdk::set_is_public_party(bool value)
{ {
if (get_is_discord_working()) is_public_party = value;
activity.GetParty().SetPrivacy(static_cast<discord::ActivityPartyPrivacy>(value)); // normaly true
}
bool discord_sdk::get_is_public_party()
{
return is_public_party;
}
void discord_sdk::accept_join_request(int64_t user_id)
{
if (result == discord::Result::Ok && app_id > 0)
core->ActivityManager().SendRequestReply(user_id, static_cast<discord::ActivityJoinRequestReply>(1), {}); core->ActivityManager().SendRequestReply(user_id, static_cast<discord::ActivityJoinRequestReply>(1), {});
} }
void DiscordSDK::send_invite(int64_t user_id, bool is_spectate = false, String message_content = "") void discord_sdk::send_invite(int64_t user_id, bool is_spectate = false, String message_content = "")
{ {
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
core->ActivityManager().SendInvite(user_id, static_cast<discord::ActivityActionType>(is_spectate + 1), message_content.utf8().get_data(), {}); core->ActivityManager().SendInvite(user_id, static_cast<discord::ActivityActionType>(is_spectate + 1), message_content.utf8().get_data(), {});
} }
void DiscordSDK::accept_invite(int64_t user_id) void discord_sdk::accept_invite(int64_t user_id)
{ {
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
core->ActivityManager().AcceptInvite(user_id, {}); core->ActivityManager().AcceptInvite(user_id, {});
} }
void DiscordSDK::register_command(String value) void discord_sdk::register_command(String value)
{ {
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
core->ActivityManager().RegisterCommand(value.utf8().get_data()); core->ActivityManager().RegisterCommand(value.utf8().get_data());
} }
void DiscordSDK::register_steam(int32_t value) void discord_sdk::register_steam(int32_t value)
{ {
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
core->ActivityManager().RegisterSteam(value); core->ActivityManager().RegisterSteam(value);
} }
Dictionary DiscordSDK::get_current_user() Dictionary discord_sdk::get_current_user()
{ {
Dictionary userdict; Dictionary userdict;
if (get_is_discord_working()) if (result == discord::Result::Ok && app_id > 0)
{ {
discord::User user{}; discord::User user{};
core->UserManager().GetCurrentUser(&user); core->UserManager().GetCurrentUser(&user);
return user2dict(user); userdict["avatar"] = user.GetAvatar(); // can be empty when user has no avatar
userdict["is_bot"] = user.GetBot();
userdict["discriminator"] = user.GetDiscriminator();
userdict["id"] = user.GetId();
userdict["username"] = user.GetUsername();
if (String(userdict["avatar"]).is_empty())
userdict["avatar_url"] = String(std::string("https://cdn.discordapp.com/embed/avatars/" + std::to_string((userdict["discriminator"].INT % 5) - 1) + ".png").c_str());
else
userdict["avatar_url"] = String(std::string("https://cdn.discordapp.com/avatars/" + std::to_string(user.GetId()) + "/" + user.GetAvatar() + ".png?size=512").c_str());
userdict.make_read_only();
} }
return userdict; return userdict;
} }
Dictionary DiscordSDK::get_relationship(int64_t user_id) bool discord_sdk::get_is_discord_working()
{ {
if (get_is_discord_working()) return result == discord::Result::Ok && app_id > 0;
{
discord::Relationship relationship{};
core->RelationshipManager().Get(user_id, &relationship);
return relationship2dict(relationship);
}
Dictionary dict;
return dict;
} }
Array DiscordSDK::get_all_relationships() int discord_sdk::get_result_int()
{
Array all_relationships;
core->RelationshipManager().Filter(
[](discord::Relationship const &relationship) -> bool
{ return true; });
int32_t friendcount{0};
core->RelationshipManager().Count(&friendcount);
for (int i = 0; i < friendcount; i++)
{
discord::Relationship relationship{};
core->RelationshipManager().GetAt(i, &relationship);
all_relationships.append(relationship2dict(relationship));
}
return all_relationships;
}
int DiscordSDK::get_result_int()
{ {
return static_cast<int>(result); return static_cast<int>(result);
} }
Dictionary DiscordSDK::user2dict(discord::User user)
{
Dictionary userdict;
userdict["avatar"] = user.GetAvatar(); // can be empty when user has no avatar
userdict["is_bot"] = user.GetBot();
userdict["discriminator"] = user.GetDiscriminator();
userdict["id"] = user.GetId();
userdict["username"] = user.GetUsername();
if (String(userdict["avatar"]).is_empty())
userdict["avatar_url"] = String(std::string("https://cdn.discordapp.com/embed/avatars/" + std::to_string((userdict["discriminator"].INT % 5) - 1) + ".png").c_str());
else
userdict["avatar_url"] = String(std::string("https://cdn.discordapp.com/avatars/" + std::to_string(user.GetId()) + "/" + user.GetAvatar() + ".png").c_str());
userdict.make_read_only();
return userdict;
}
Dictionary DiscordSDK::relationship2dict(discord::Relationship relationship)
{
Dictionary dict_relationship;
Dictionary presence;
Dictionary presence_activity;
switch (static_cast<int>(relationship.GetPresence().GetStatus()))
{
case 0:
presence["status"] = "Offline";
break;
case 1:
presence["status"] = "Online";
break;
case 2:
presence["status"] = "Idle";
break;
case 3:
presence["status"] = "DoNotDisturb";
break;
default:
presence["status"] = "NotAvailable";
break;
}
presence_activity["application_id"] = relationship.GetPresence().GetActivity().GetApplicationId();
presence_activity["name"] = relationship.GetPresence().GetActivity().GetName();
presence_activity["state"] = relationship.GetPresence().GetActivity().GetState();
presence_activity["details"] = relationship.GetPresence().GetActivity().GetDetails();
presence_activity["large_image"] = relationship.GetPresence().GetActivity().GetAssets().GetLargeImage();
presence_activity["large_text"] = relationship.GetPresence().GetActivity().GetAssets().GetLargeText();
presence_activity["small_image"] = relationship.GetPresence().GetActivity().GetAssets().GetSmallImage();
presence_activity["small_text"] = relationship.GetPresence().GetActivity().GetAssets().GetSmallText();
presence_activity["timestamps_start"] = relationship.GetPresence().GetActivity().GetTimestamps().GetStart();
presence_activity["timestamps_end"] = relationship.GetPresence().GetActivity().GetTimestamps().GetEnd();
presence_activity["instance"] = relationship.GetPresence().GetActivity().GetInstance();
presence_activity["party_id"] = relationship.GetPresence().GetActivity().GetParty().GetId();
presence_activity["current_party_size"] = relationship.GetPresence().GetActivity().GetParty().GetSize().GetCurrentSize();
presence_activity["max_party_size"] = relationship.GetPresence().GetActivity().GetParty().GetSize().GetMaxSize();
presence_activity["join_secret"] = relationship.GetPresence().GetActivity().GetSecrets().GetJoin();
presence_activity["spectate_secret"] = relationship.GetPresence().GetActivity().GetSecrets().GetSpectate();
presence_activity["match_secret"] = relationship.GetPresence().GetActivity().GetSecrets().GetMatch();
presence["activity"] = presence_activity;
presence.make_read_only();
switch (relationship.GetType())
{
case discord::RelationshipType::None:
dict_relationship["type"] = "None";
break;
case discord::RelationshipType::Friend:
dict_relationship["type"] = "Friend";
break;
case discord::RelationshipType::Blocked:
dict_relationship["type"] = "Blocked";
break;
case discord::RelationshipType::PendingIncoming:
dict_relationship["type"] = "PendingIncoming";
break;
case discord::RelationshipType::PendingOutgoing:
dict_relationship["type"] = "PendingOutgoing";
break;
case discord::RelationshipType::Implicit:
dict_relationship["type"] = "Implicit";
break;
default:
dict_relationship["type"] = "NotAvailable";
break;
}
dict_relationship["user"] = user2dict(relationship.GetUser());
dict_relationship["presence"] = presence;
dict_relationship.make_read_only();
return dict_relationship;
}
bool DiscordSDK::get_is_discord_working()
{
return result == discord::Result::Ok && app_id > 0;
}

View File

@@ -3,75 +3,117 @@
#include <stdio.h> #include <stdio.h>
#include "lib/discord_game_sdk/cpp/discord.h" #include "lib/discord_game_sdk/cpp/discord.h"
#include <godot_cpp/classes/object.hpp> #include <godot_cpp/classes/ref_counted.hpp>
#include <godot_cpp/core/class_db.hpp> #include <godot_cpp/core/class_db.hpp>
#define H_SET_GET(variable_type, property_name) \
variable_type property_name; \
variable_type get_##property_name(); \
void set_##property_name(variable_type value);
using namespace godot; using namespace godot;
class DiscordSDK : public Object class discord_sdk : public RefCounted
{ {
GDCLASS(DiscordSDK, Object); GDCLASS(discord_sdk, Object);
static DiscordSDK *singleton; static discord_sdk *singleton;
protected: protected:
static void _bind_methods(); static void _bind_methods();
private:
int64_t app_id;
String state;
String details;
// just want to make pr
String large_image;
String large_image_text;
String small_image;
String small_image_text;
int64_t start_timestamp;
int64_t end_timestamp;
String party_id;
int32_t current_party_size;
int32_t max_party_size;
String match_secret;
String join_secret;
String spectate_secret;
bool is_public_party;
bool instanced;
bool is_overlay_locked;
public: public:
static DiscordSDK * static discord_sdk *
get_singleton(); get_singleton();
DiscordSDK(); discord_sdk();
~DiscordSDK(); ~discord_sdk();
// INTERBNAL
int64_t old_app_id;
Dictionary relationship2dict(discord::Relationship relationship);
Dictionary user2dict(discord::User user);
///
void set_app_id(int64_t value);
int64_t get_app_id();
int64_t app_id = 0; // needs to be directly setted to 0 or it will crash randomly
H_SET_GET(String, state)
H_SET_GET(String, details)
H_SET_GET(String, large_image)
H_SET_GET(String, large_image_text)
H_SET_GET(String, small_image)
H_SET_GET(String, small_image_text)
H_SET_GET(int64_t, start_timestamp)
H_SET_GET(int64_t, end_timestamp)
H_SET_GET(String, party_id)
H_SET_GET(int32_t, current_party_size)
H_SET_GET(int32_t, max_party_size)
H_SET_GET(String, match_secret)
H_SET_GET(String, join_secret)
H_SET_GET(String, spectate_secret)
H_SET_GET(bool, is_public_party)
H_SET_GET(bool, instanced)
H_SET_GET(bool, is_overlay_locked)
void debug(); void debug();
void run_callbacks(); void coreupdate();
void refresh(); void refresh();
void clear(bool reset_values); void clear();
void unclear();
int64_t get_app_id();
void set_app_id(int64_t value);
String get_state();
void set_state(String value);
String get_details();
void set_details(String value);
String get_large_image();
void set_large_image(String value);
String get_large_image_text();
void set_large_image_text(String value);
String get_small_image();
void set_small_image(String value);
String get_small_image_text();
void set_small_image_text(String value);
int64_t get_start_timestamp();
void set_start_timestamp(int64_t value);
int64_t get_end_timestamp();
void set_end_timestamp(int64_t value);
String get_party_id();
void set_party_id(String value);
int32_t get_current_party_size();
void set_current_party_size(int32_t value);
int32_t get_max_party_size();
void set_max_party_size(int32_t value);
String get_match_secret();
void set_match_secret(String value);
String get_join_secret();
void set_join_secret(String value);
String get_spectate_secret();
void set_spectate_secret(String value);
bool get_is_public_party();
void set_is_public_party(bool value);
bool get_instanced();
void set_instanced(bool value);
bool get_is_overlay_enabled(); bool get_is_overlay_enabled();
bool get_is_overlay_locked();
void set_is_overlay_locked(bool value);
void open_invite_overlay(bool is_spectate); void open_invite_overlay(bool is_spectate);
void open_server_invite_overlay(String invite_code); void open_server_invite_overlay(String invite_code);
void open_voice_settings(); void open_voice_settings();
void accept_join_request(int64_t user_id); void accept_join_request(int64_t user_id);
void send_invite(int64_t user_id, bool is_spectate, String message_content); void send_invite(int64_t user_id, bool is_spectate, String message_content);
void accept_invite(int64_t user_id); void accept_invite(int64_t user_id);
void register_command(String value); void register_command(String value);
void register_steam(int32_t value); void register_steam(int32_t value);
Dictionary get_current_user(); Dictionary get_current_user();
Dictionary get_relationship(int64_t user_id); void set_current_user(Dictionary value);
Array get_all_relationships();
bool get_is_discord_working(); bool get_is_discord_working();
int get_result_int(); int get_result_int();
}; };

View File

@@ -1,55 +0,0 @@
#include "editor_presence.h"
#include "lib/discord_game_sdk/cpp/discord.h"
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/variant/utility_functions.hpp>
#include <godot_cpp/classes/scene_tree.hpp>
EditorPresence *EditorPresence::singleton = nullptr;
void EditorPresence::_bind_methods()
{
}
EditorPresence::EditorPresence()
{
singleton = this;
}
EditorPresence::~EditorPresence()
{
singleton = nullptr;
delete core; // couldn't use destructor because it would not compile on linux
core = nullptr;
}
EditorPresence *EditorPresence::get_singleton()
{
return singleton;
}
void EditorPresence::_ready()
{
result = discord::Core::Create(1108142249990176808, DiscordCreateFlags_NoRequireDiscord, &core);
activity.SetState("Editing a project...");
activity.SetDetails(String(project_settings->get_setting("application/config/name")).utf8());
if (project_settings->has_setting("application/config/name"))
{
activity.GetAssets().SetLargeImage("godot");
}
activity.GetAssets().SetLargeText(String(engine->get_version_info()["string"]).utf8());
activity.GetTimestamps().SetStart(time->get_unix_time_from_system());
if (result == discord::Result::Ok)
core->ActivityManager().UpdateActivity(activity, [](discord::Result result) {});
else
UtilityFunctions::push_warning("EditorPresence couldn't be loaded! Maybe your Discord isn't running?");
}
void EditorPresence::_process(double delta)
{
if (state_string.utf8() != activity.GetState())
{
godot::Node *edited_scene_root = get_tree()->get_edited_scene_root();
activity.SetState(String("Editing: \"" + edited_scene_root->get_scene_file_path() + "\"").replace("res://", "").utf8());
if (result == discord::Result::Ok)
core->ActivityManager().UpdateActivity(activity, [](discord::Result result) {});
}
if (result == discord::Result::Ok)
core->RunCallbacks();
}

View File

@@ -1,44 +0,0 @@
#ifndef EDITOR_PRESENCE_H
#define EDITOR_PRESENCE_H
#include <stdio.h>
#include "lib/discord_game_sdk/cpp/discord.h"
#include <godot_cpp/classes/node.hpp>
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/classes/project_settings.hpp>
#include <godot_cpp/classes/engine.hpp>
#include <godot_cpp/classes/time.hpp>
#include <godot_cpp/classes/tree.hpp>
using namespace godot;
class EditorPresence : public Node
{
GDCLASS(EditorPresence, Node);
static EditorPresence *singleton;
protected:
static void _bind_methods();
public:
static EditorPresence *
get_singleton();
godot::Engine *engine = godot::Engine::get_singleton();
godot::ProjectSettings *project_settings = godot::ProjectSettings::get_singleton();
godot::Time *time = godot::Time::get_singleton();
discord::Core *core{};
discord::Result result;
discord::Activity activity{};
String state_string;
EditorPresence();
~EditorPresence();
void _ready() override;
void _process(double delta) override;
};
#endif

View File

@@ -7,39 +7,37 @@
#include <godot_cpp/godot.hpp> #include <godot_cpp/godot.hpp>
#include "discordgodot.h" #include "discordgodot.h"
#include "editor_presence.h"
using namespace godot; using namespace godot;
static DiscordSDK *discordsdk; static discord_sdk *discordsdk;
void initialize_discordsdk_module(ModuleInitializationLevel p_level) void gdextension_initialize(ModuleInitializationLevel p_level)
{ {
if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE)
{ {
ClassDB::register_class<DiscordSDK>(); ClassDB::register_class<discord_sdk>();
discordsdk = memnew(DiscordSDK); discordsdk = memnew(discord_sdk);
Engine::get_singleton()->register_singleton("DiscordSDK", DiscordSDK::get_singleton()); Engine::get_singleton()->register_singleton("discord_sdk", discord_sdk::get_singleton());
ClassDB::register_class<EditorPresence>();
} }
} }
void uninitialize_discordsdk_module(ModuleInitializationLevel p_level) void gdextension_terminate(ModuleInitializationLevel p_level)
{ {
if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE)
{ {
Engine::get_singleton()->unregister_singleton("DiscordSDK"); Engine::get_singleton()->unregister_singleton("discord_sdk");
memdelete(discordsdk); memdelete(discordsdk);
} }
} }
extern "C" extern "C"
{ {
GDExtensionBool GDE_EXPORT discordsdkgd_library_init(GDExtensionInterfaceGetProcAddress p_get_proc_address, GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) GDExtensionBool GDE_EXPORT discordsdkgd_library_init(const GDExtensionInterface *p_interface, GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization)
{ {
godot::GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization); godot::GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
init_obj.register_initializer(initialize_discordsdk_module); init_obj.register_initializer(gdextension_initialize);
init_obj.register_terminator(uninitialize_discordsdk_module); init_obj.register_terminator(gdextension_terminate);
init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE); init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);
return init_obj.init(); return init_obj.init();