diff --git a/bin/assets/i18n/en.xml b/bin/assets/i18n/en.xml index f611d2171..dc8e3555f 100644 --- a/bin/assets/i18n/en.xml +++ b/bin/assets/i18n/en.xml @@ -160,6 +160,8 @@ File path is: Cut Dark Date + Editing %s, a %s file + Working on %s Draw Boxes Debug Draw Boxes Toggle Debug Draw Debug Data diff --git a/bin/assets/plugins/discordRPC.json b/bin/assets/plugins/discordRPC.json index f39aeef55..06addd62a 100644 --- a/bin/assets/plugins/discordRPC.json +++ b/bin/assets/plugins/discordRPC.json @@ -1,112 +1,110 @@ { - "config" : { - "appID": "1335730393948749898", - "doLanguageIcons": true, - "iconBindings": { - ".htaccess": "https://github.com/vyfor/icons/raw/master/icons/onyx/gear.png", - ".ignore file": "https://github.com/vyfor/icons/raw/master/icons/onyx/git.png", - "[x]it!": "https://github.com/vyfor/icons/raw/master/icons/onyx/notes.png", - "ada": "https://github.com/vyfor/icons/raw/master/icons/pastel/ada.png", - "adept": "https://raw.github.com/AdeptLanguage/Adept/master/.github/README_logo.png", - "angelscript": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", - "awk script": "https://github.com/vyfor/icons/raw/master/icons/pastel/awk.png", - "bat": "https://github.com/vyfor/icons/raw/master/icons/onyx/shell.png", - "bazel": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Bazel_logo.svg/1024px-Bazel_logo.svg.png", - "bend": "https://avatars.githubusercontent.com/u/92327702", - "blueprint": "https://github.com/vyfor/icons/raw/master/icons/onyx/controller.png", - "brainfuck": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", - "buzz": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", - "c": "https://github.com/vyfor/icons/raw/master/icons/onyx/c.png", - "carbon": "https://upload.wikimedia.org/wikipedia/commons/e/e1/Carbon_logo.png", - "clojure": "https://github.com/vyfor/icons/raw/master/icons/onyx/clojure.png", - "cmake": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/CMake_logo.svg/1024px-CMake_logo.svg.png", - "cpp": "https://github.com/vyfor/icons/raw/master/icons/onyx/cpp.png", - "crystal": "https://github.com/vyfor/icons/raw/master/icons/onyx/crystal.png", - "csharp": "https://github.com/vyfor/icons/raw/master/icons/onyx/csharp.png", - "css": "https://github.com/vyfor/icons/raw/master/icons/onyx/css.png", - "d": "https://github.com/vyfor/icons/raw/master/icons/onyx/d.png", - "dart": "https://github.com/vyfor/icons/raw/master/icons/onyx/dart.png", - "diff": "https://github.com/vyfor/icons/raw/master/icons/onyx/diagnostics.png", - "dockerfile": "https://github.com/vyfor/icons/raw/master/icons/onyx/docker.png", - "elixir": "https://github.com/vyfor/icons/raw/master/icons/onyx/elixir.png", - "elm": "https://github.com/vyfor/icons/raw/master/icons/onyx/elm.png", - "environment file": "https://github.com/vyfor/icons/raw/master/icons/onyx/gear.png", - "fantom": "https://avatars.githubusercontent.com/u/54911692", - "fortran": "https://github.com/vyfor/icons/raw/master/icons/onyx/fortran.png", - "fstab": "https://github.com/vyfor/icons/raw/master/icons/onyx/gear.png", - "gdscript": "https://github.com/vyfor/icons/raw/master/icons/onyx/godot.png", - "glsl": "https://github.com/vyfor/icons/raw/master/icons/onyx/opengl.png", - "go": "https://github.com/vyfor/icons/raw/master/icons/onyx/go.png", - "graphql": "https://github.com/vyfor/icons/raw/master/icons/onyx/graphql.png", - "groovy": "https://github.com/vyfor/icons/raw/master/icons/onyx/groovy.png", - "hare": "https://harelang.org/mascot.png", - "haskell": "https://github.com/vyfor/icons/raw/master/icons/onyx/haskell.png", - "haxe": "https://github.com/vyfor/icons/raw/master/icons/pastel/haxe.png", - "haxe compiler arguments": "https://github.com/vyfor/icons/raw/master/icons/onyx/haxe.png", - "hlsl": "https://github.com/vyfor/icons/raw/master/icons/onyx/diagnostics.png", - "html": "https://github.com/vyfor/icons/raw/master/icons/onyx/html.png", - "ini": "https://github.com/vyfor/icons/raw/master/icons/onyx/gear.png", - "jai": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", - "java": "https://github.com/vyfor/icons/raw/master/icons/onyx/java.png", - "javascript": "https://github.com/vyfor/icons/raw/master/icons/onyx/javascript.png", - "javascriptreact": "https://github.com/vyfor/icons/raw/master/icons/onyx/react.png", - "json": "https://github.com/vyfor/icons/raw/master/icons/onyx/json.png", - "julia": "https://github.com/vyfor/icons/raw/master/icons/onyx/julia.png", - "kotlin": "https://github.com/vyfor/icons/raw/master/icons/onyx/kotlin.png", - "latex": "https://github.com/vyfor/icons/raw/master/icons/onyx/latex.png", - "lobster": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", - "lua": "https://github.com/vyfor/icons/raw/master/icons/onyx/latex.png", - "makefile": "https://github.com/vyfor/icons/raw/master/icons/onyx/diagnostics.png", - "markdown": "https://github.com/vyfor/icons/raw/master/icons/onyx/markdown.png", - "meson": "https://github.com/vyfor/icons/raw/master/icons/onyx/diagnostics.png", - "moonscript": "https://github.com/vyfor/icons/raw/master/icons/onyx/lua.png", - "nelua": "https://nelua.io/assets/img/nelua-logo-64px.png", - "nim": "https://github.com/vyfor/icons/raw/master/icons/onyx/nim.png", - "objeck": "https://github.com/vyfor/icons/raw/master/icons/onyx/gear.png", - "objective-c": "https://github.com/vyfor/icons/raw/master/icons/onyx/c.png", - "ocaml": "https://github.com/vyfor/icons/raw/master/icons/onyx/ocaml.png", - "odin": "https://github.com/vyfor/icons/raw/master/icons/onyx/odin.png", - "openscad": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Openscad.svg/1024px-Openscad.svg.png", - "pascal": "https://github.com/vyfor/icons/raw/master/icons/onyx/pascal.png", - "perl": "https://github.com/vyfor/icons/raw/master/icons/onyx/perl.png", - "php": "https://github.com/vyfor/icons/raw/master/icons/onyx/php.png", - "pico-8": "https://www.lexaloffle.com/gfx/p8b_pico8.png", - "plaintext": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", - "po": "https://github.com/vyfor/icons/raw/master/icons/onyx/gnu.png", - "pony": "https://avatars.githubusercontent.com/u/12997238", - "postgresql": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Postgresql_elephant.svg/1024px-Postgresql_elephant.svg.png", - "powershell": "https://github.com/vyfor/icons/raw/master/icons/onyx/powershell.png", - "python": "https://github.com/vyfor/icons/raw/master/icons/onyx/python.png", - "r": "https://github.com/vyfor/icons/raw/master/icons/onyx/r.png", - "ring": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", - "ruby": "https://github.com/vyfor/icons/raw/master/icons/onyx/ruby.png", - "rust": "https://github.com/vyfor/icons/raw/master/icons/onyx/rust.png", - "sass": "https://github.com/vyfor/icons/raw/master/icons/onyx/scss.png", - "scala": "https://github.com/vyfor/icons/raw/master/icons/onyx/scala.png", - "shellscript": "https://github.com/vyfor/icons/raw/master/icons/onyx/shell.png", - "smallbasic": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", - "solidity": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", - "sql": "https://github.com/vyfor/icons/raw/master/icons/onyx/sql.png", - "swift": "https://github.com/vyfor/icons/raw/master/icons/onyx/swift.png", - "tcl": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", - "teal": "https://avatars.githubusercontent.com/u/62526430", - "toml": "https://github.com/vyfor/icons/raw/master/icons/onyx/toml.png", - "typescript": "https://github.com/vyfor/icons/raw/master/icons/onyx/typescript.png", - "typescriptreact": "https://github.com/vyfor/icons/raw/master/icons/onyx/react.png", - "v": "https://github.com/vyfor/icons/raw/master/icons/onyx/v.png", - "vala": "https://github.com/vyfor/icons/raw/master/icons/onyx/vala.png", - "verilog": "https://github.com/vyfor/icons/raw/master/icons/onyx/assembly.png", - "visual basic": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/VB.NET_Logo.svg/1024px-VB.NET_Logo.svg.png", - "vue": "https://github.com/vyfor/icons/raw/master/icons/onyx/vue.png", - "wren": "https://avatars.githubusercontent.com/u/45213573", - "x86 assembly": "https://github.com/vyfor/icons/raw/master/icons/onyx/assembly.png", - "xml": "https://github.com/vyfor/icons/raw/master/icons/onyx/xml.png", - "xtend": "https://github.com/vyfor/icons/raw/master/icons/onyx/java.png", - "yaml": "https://github.com/vyfor/icons/raw/master/icons/onyx/yaml.png", - "zig": "https://github.com/vyfor/icons/raw/master/icons/onyx/zig.png" - } - }, - "keybindings" : { - - } + "config": { + "appID": "1335730393948749898", + "doLanguageIcons": true, + "iconBindings": { + ".htaccess": "https://github.com/vyfor/icons/raw/master/icons/onyx/gear.png", + ".ignore file": "https://github.com/vyfor/icons/raw/master/icons/onyx/git.png", + "[x]it!": "https://github.com/vyfor/icons/raw/master/icons/onyx/notes.png", + "ada": "https://github.com/vyfor/icons/raw/master/icons/pastel/ada.png", + "adept": "https://raw.github.com/AdeptLanguage/Adept/master/.github/README_logo.png", + "angelscript": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", + "awk script": "https://github.com/vyfor/icons/raw/master/icons/pastel/awk.png", + "bat": "https://github.com/vyfor/icons/raw/master/icons/onyx/shell.png", + "bazel": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Bazel_logo.svg/1024px-Bazel_logo.svg.png", + "bend": "https://avatars.githubusercontent.com/u/92327702", + "blueprint": "https://github.com/vyfor/icons/raw/master/icons/onyx/controller.png", + "brainfuck": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", + "buzz": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", + "c": "https://github.com/vyfor/icons/raw/master/icons/onyx/c.png", + "carbon": "https://upload.wikimedia.org/wikipedia/commons/e/e1/Carbon_logo.png", + "clojure": "https://github.com/vyfor/icons/raw/master/icons/onyx/clojure.png", + "cmake": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/CMake_logo.svg/1024px-CMake_logo.svg.png", + "cpp": "https://github.com/vyfor/icons/raw/master/icons/onyx/cpp.png", + "crystal": "https://github.com/vyfor/icons/raw/master/icons/onyx/crystal.png", + "csharp": "https://github.com/vyfor/icons/raw/master/icons/onyx/csharp.png", + "css": "https://github.com/vyfor/icons/raw/master/icons/onyx/css.png", + "d": "https://github.com/vyfor/icons/raw/master/icons/onyx/d.png", + "dart": "https://github.com/vyfor/icons/raw/master/icons/onyx/dart.png", + "diff": "https://github.com/vyfor/icons/raw/master/icons/onyx/diagnostics.png", + "dockerfile": "https://github.com/vyfor/icons/raw/master/icons/onyx/docker.png", + "elixir": "https://github.com/vyfor/icons/raw/master/icons/onyx/elixir.png", + "elm": "https://github.com/vyfor/icons/raw/master/icons/onyx/elm.png", + "environment file": "https://github.com/vyfor/icons/raw/master/icons/onyx/gear.png", + "fantom": "https://avatars.githubusercontent.com/u/54911692", + "fortran": "https://github.com/vyfor/icons/raw/master/icons/onyx/fortran.png", + "fstab": "https://github.com/vyfor/icons/raw/master/icons/onyx/gear.png", + "gdscript": "https://github.com/vyfor/icons/raw/master/icons/onyx/godot.png", + "glsl": "https://github.com/vyfor/icons/raw/master/icons/onyx/opengl.png", + "go": "https://github.com/vyfor/icons/raw/master/icons/onyx/go.png", + "graphql": "https://github.com/vyfor/icons/raw/master/icons/onyx/graphql.png", + "groovy": "https://github.com/vyfor/icons/raw/master/icons/onyx/groovy.png", + "hare": "https://harelang.org/mascot.png", + "haskell": "https://github.com/vyfor/icons/raw/master/icons/onyx/haskell.png", + "haxe": "https://github.com/vyfor/icons/raw/master/icons/pastel/haxe.png", + "haxe compiler arguments": "https://github.com/vyfor/icons/raw/master/icons/onyx/haxe.png", + "hlsl": "https://github.com/vyfor/icons/raw/master/icons/onyx/diagnostics.png", + "html": "https://github.com/vyfor/icons/raw/master/icons/onyx/html.png", + "ini": "https://github.com/vyfor/icons/raw/master/icons/onyx/gear.png", + "jai": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", + "java": "https://github.com/vyfor/icons/raw/master/icons/onyx/java.png", + "javascript": "https://github.com/vyfor/icons/raw/master/icons/onyx/javascript.png", + "javascriptreact": "https://github.com/vyfor/icons/raw/master/icons/onyx/react.png", + "json": "https://github.com/vyfor/icons/raw/master/icons/onyx/json.png", + "julia": "https://github.com/vyfor/icons/raw/master/icons/onyx/julia.png", + "kotlin": "https://github.com/vyfor/icons/raw/master/icons/onyx/kotlin.png", + "latex": "https://github.com/vyfor/icons/raw/master/icons/onyx/latex.png", + "lobster": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", + "lua": "https://github.com/vyfor/icons/raw/master/icons/onyx/latex.png", + "makefile": "https://github.com/vyfor/icons/raw/master/icons/onyx/diagnostics.png", + "markdown": "https://github.com/vyfor/icons/raw/master/icons/onyx/markdown.png", + "meson": "https://github.com/vyfor/icons/raw/master/icons/onyx/diagnostics.png", + "moonscript": "https://github.com/vyfor/icons/raw/master/icons/onyx/lua.png", + "nelua": "https://nelua.io/assets/img/nelua-logo-64px.png", + "nim": "https://github.com/vyfor/icons/raw/master/icons/onyx/nim.png", + "objeck": "https://github.com/vyfor/icons/raw/master/icons/onyx/gear.png", + "objective-c": "https://github.com/vyfor/icons/raw/master/icons/onyx/c.png", + "ocaml": "https://github.com/vyfor/icons/raw/master/icons/onyx/ocaml.png", + "odin": "https://github.com/vyfor/icons/raw/master/icons/onyx/odin.png", + "openscad": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Openscad.svg/1024px-Openscad.svg.png", + "pascal": "https://github.com/vyfor/icons/raw/master/icons/onyx/pascal.png", + "perl": "https://github.com/vyfor/icons/raw/master/icons/onyx/perl.png", + "php": "https://github.com/vyfor/icons/raw/master/icons/onyx/php.png", + "pico-8": "https://www.lexaloffle.com/gfx/p8b_pico8.png", + "plaintext": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", + "po": "https://github.com/vyfor/icons/raw/master/icons/onyx/gnu.png", + "pony": "https://avatars.githubusercontent.com/u/12997238", + "postgresql": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Postgresql_elephant.svg/1024px-Postgresql_elephant.svg.png", + "powershell": "https://github.com/vyfor/icons/raw/master/icons/onyx/powershell.png", + "python": "https://github.com/vyfor/icons/raw/master/icons/onyx/python.png", + "r": "https://github.com/vyfor/icons/raw/master/icons/onyx/r.png", + "ring": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", + "ruby": "https://github.com/vyfor/icons/raw/master/icons/onyx/ruby.png", + "rust": "https://github.com/vyfor/icons/raw/master/icons/onyx/rust.png", + "sass": "https://github.com/vyfor/icons/raw/master/icons/onyx/scss.png", + "scala": "https://github.com/vyfor/icons/raw/master/icons/onyx/scala.png", + "shellscript": "https://github.com/vyfor/icons/raw/master/icons/onyx/shell.png", + "smallbasic": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", + "solidity": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", + "sql": "https://github.com/vyfor/icons/raw/master/icons/onyx/sql.png", + "swift": "https://github.com/vyfor/icons/raw/master/icons/onyx/swift.png", + "tcl": "https://github.com/vyfor/icons/raw/master/icons/onyx/text.png", + "teal": "https://avatars.githubusercontent.com/u/62526430", + "toml": "https://github.com/vyfor/icons/raw/master/icons/onyx/toml.png", + "typescript": "https://github.com/vyfor/icons/raw/master/icons/onyx/typescript.png", + "typescriptreact": "https://github.com/vyfor/icons/raw/master/icons/onyx/react.png", + "v": "https://github.com/vyfor/icons/raw/master/icons/onyx/v.png", + "vala": "https://github.com/vyfor/icons/raw/master/icons/onyx/vala.png", + "verilog": "https://github.com/vyfor/icons/raw/master/icons/onyx/assembly.png", + "visual basic": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/VB.NET_Logo.svg/1024px-VB.NET_Logo.svg.png", + "vue": "https://github.com/vyfor/icons/raw/master/icons/onyx/vue.png", + "wren": "https://avatars.githubusercontent.com/u/45213573", + "x86 assembly": "https://github.com/vyfor/icons/raw/master/icons/onyx/assembly.png", + "xml": "https://github.com/vyfor/icons/raw/master/icons/onyx/xml.png", + "xtend": "https://github.com/vyfor/icons/raw/master/icons/onyx/java.png", + "yaml": "https://github.com/vyfor/icons/raw/master/icons/onyx/yaml.png", + "zig": "https://github.com/vyfor/icons/raw/master/icons/onyx/zig.png" + } + }, + "keybindings": {} } \ No newline at end of file diff --git a/src/tools/ecode/plugins/discordRPC/discordRPCplugin.cpp b/src/tools/ecode/plugins/discordRPC/discordRPCplugin.cpp index 09108bebf..5e5f2ec3f 100644 --- a/src/tools/ecode/plugins/discordRPC/discordRPCplugin.cpp +++ b/src/tools/ecode/plugins/discordRPC/discordRPCplugin.cpp @@ -1,7 +1,7 @@ #include "discordRPCplugin.hpp" using json = nlohmann::json; -#if EE_PLATFORM != EE_PLATFORM_EMSCRIPTEN || defined ( __EMSCRIPTEN_PTHREADS__ ) +#if EE_PLATFORM != EE_PLATFORM_EMSCRIPTEN || defined( __EMSCRIPTEN_PTHREADS__ ) #define dcRPC_THREADED 1 #else #define dcRPC_THREADED 0 @@ -9,11 +9,11 @@ using json = nlohmann::json; namespace ecode { -Plugin* DiscordRPCplugin::New( PluginManager* pluginManager) { +Plugin* DiscordRPCplugin::New( PluginManager* pluginManager ) { return eeNew( DiscordRPCplugin, ( pluginManager, false ) ); } -Plugin* DiscordRPCplugin::NewSync( PluginManager* pluginManager) { +Plugin* DiscordRPCplugin::NewSync( PluginManager* pluginManager ) { return eeNew( DiscordRPCplugin, ( pluginManager, true ) ); } @@ -33,28 +33,27 @@ DiscordRPCplugin::DiscordRPCplugin( PluginManager* pluginManager, bool sync ) : DiscordRPCplugin::~DiscordRPCplugin() { waitUntilLoaded(); mShuttingDown = true; - } void DiscordRPCplugin::load( PluginManager* pluginManager ) { Clock clock; AtomicBoolScopedOp loading( mLoading, true ); - + pluginManager->subscribeMessages( this, [this]( const auto& notification ) -> PluginRequestHandle { return processMessage( notification ); } ); - + std::vector paths; std::string path( pluginManager->getResourcesPath() + "plugins/discordRPC.json" ); if ( FileSystem::fileExists( path ) ) paths.emplace_back( path ); path = pluginManager->getPluginsPath() + "discordRPC.json"; if ( FileSystem::fileExists( path ) || - FileSystem::fileWrite(path, "{\n \"config\":{},\n \"keybindings\":{}\n}\n") ) { - mConfigPath = path; - paths.emplace_back( path ); - } - std::string data; + FileSystem::fileWrite( path, "{\n \"config\":{},\n \"keybindings\":{}\n}\n" ) ) { + mConfigPath = path; + paths.emplace_back( path ); + } + std::string data; if ( !FileSystem::fileGet( path, data ) ) return; mConfigHash = String::hash( data ); @@ -81,7 +80,12 @@ void DiscordRPCplugin::load( PluginManager* pluginManager ) { mIPC.mcClientID = "1335730393948749898"; updateConfigFile = true; } - + if ( config.contains( "doLanguageIcons" ) ) { + mcDoLangIcon = config.value( "doLanguageIcons", true ); + } else { + mIPC.mcClientID = true; + updateConfigFile = true; + } } if ( updateConfigFile ) { @@ -91,13 +95,13 @@ void DiscordRPCplugin::load( PluginManager* pluginManager ) { mConfigHash = String::hash( newData ); } } - + mIPC.tryConnect(); DiscordIPCActivity* a = mIPC.getActivity(); a->largeImage = DISCORDRPC_DEFAULT_ICON; - - mIPC.setActivity(*a); - + + mIPC.setActivity( *a ); + mReady = true; fireReadyCbs(); setReady( clock.getElapsedTime() ); @@ -109,38 +113,45 @@ PluginRequestHandle DiscordRPCplugin::processMessage( const PluginMessage& msg ) std::string rpath = FileSystem::getRealPath( msg.asJSON()["folder"] ); FileSystem::dirAddSlashAtEnd( rpath ); mProjectName = FileSystem::fileNameFromPath( rpath ); - Log::debug("Loaded new workspace: %s ; %s", rpath, mProjectName); + Log::debug( "Loaded new workspace: %s ; %s", rpath, mProjectName ); } case PluginMessageType::UIReady: { mIPC.mUIReady = true; -// Log::debug("dcPlugin: UI is ready!"); - if (mIPC.mIsReconnectScheduled) { - Log::debug("Running scheduled reconnect"); + // Log::debug("dcPlugin: UI is ready!"); + if ( mIPC.mIsReconnectScheduled ) { + Log::debug( "Running scheduled reconnect" ); mIPC.tryConnect(); } } default: break; } - + return PluginRequestHandle::empty(); } -void DiscordRPCplugin::onRegisterDocument( TextDocument* doc ){ - doc->setCommand( "discordrpc-reconnect", [this] { - mIPC.reconnect(); - } ); +void DiscordRPCplugin::onRegisterEditor( UICodeEditor* editor ) { + editor->addUnlockedCommands( { "discordrpc-reconnect" } ); + editor->getDocument().setCommand( "discordrpc-reconnect", [this] { mIPC.reconnect(); } ); + + PluginBase::onRegisterEditor( editor ); +} + +void DiscordRPCplugin::onUnregisterEditor( UICodeEditor* editor ) { + editor->removeUnlockedCommands( { "discordrpc-reconnect" } ); } void DiscordRPCplugin::onRegisterListeners( UICodeEditor* editor, std::vector& listeners ) { listeners.push_back( editor->on( Event::OnFocus, [this, editor]( const Event* ) { // `this` in the scope of the lambda is the parent `DiscordRPCplugin` - + auto& doc = editor->getDocument(); - if (!doc.hasFilepath()) { return; } - + if ( !doc.hasFilepath() ) { + return; + } + auto filename = doc.getFilename(); - + if ( filename != mLastFile ) { this->mLastFile = filename; @@ -149,27 +160,25 @@ void DiscordRPCplugin::onRegisterListeners( UICodeEditor* editor, std::vectormIPC.getActivity(); - if (!mProjectName.empty()) - a->details = String::format(i18n( "dc_workspace", "Working on %s" ).toUtf8(), - mProjectName); - a->state = String::format(i18n( "dc_editing", "Editing %s, a %s file" ).toUtf8(), - filename, doc.getSyntaxDefinition().getLanguageName() ); + if ( !mProjectName.empty() ) + a->details = String::format( i18n( "dc_workspace", "Working on %s" ).toUtf8(), + mProjectName ); + a->state = String::format( i18n( "dc_editing", "Editing %s, a %s file" ).toUtf8(), + filename, doc.getSyntaxDefinition().getLanguageName() ); a->start = time( nullptr ); // Time spent in this specific file - + + // TODO: Implement github/gitlab remote button (integrate with git plugin) + // a->buttons[0].label = "Repository"; + // a->buttons[0].url = "https://github.com/name/repo"; + std::string name = doc.getSyntaxDefinition().getLSPName(); - if (!name.empty()) { - a->largeImage = mcLangBindings.value(name, DISCORDRPC_DEFAULT_ICON); + if ( !name.empty() && mcDoLangIcon ) { + a->largeImage = mcLangBindings.value( name, DISCORDRPC_DEFAULT_ICON ); } this->mIPC.setActivity( *a ); } - } ) ); } - - - - - } // namespace ecode \ No newline at end of file diff --git a/src/tools/ecode/plugins/discordRPC/discordRPCplugin.hpp b/src/tools/ecode/plugins/discordRPC/discordRPCplugin.hpp index 338c21b4d..545499c7b 100644 --- a/src/tools/ecode/plugins/discordRPC/discordRPCplugin.hpp +++ b/src/tools/ecode/plugins/discordRPC/discordRPCplugin.hpp @@ -4,10 +4,10 @@ #include "../plugin.hpp" #include "../pluginmanager.hpp" -#include -#include #include +#include #include +#include #include "sdk/ipc.hpp" @@ -18,52 +18,53 @@ using namespace EE::System; using namespace EE::UI; using namespace EE::UI::Doc; -#define DISCORDRPC_DEFAULT_ICON "https://github.com/SpartanJ/eepp/blob/develop/bin/assets/icon/ecode.png?raw=true" +#define DISCORDRPC_DEFAULT_ICON \ + "https://github.com/SpartanJ/eepp/blob/develop/bin/assets/icon/ecode.png?raw=true" namespace ecode { class DiscordRPCplugin : public PluginBase { - public: - static PluginDefinition Definition() { - return { - "discrdrpc", - "Discord Rich Presence", - "Show your friends what you are up to through the discord Rich Presence system", - DiscordRPCplugin::New, - { 0, 0, 0 }, - DiscordRPCplugin::NewSync }; - } - - static Plugin* New( PluginManager* pluginManager ); - - static Plugin* NewSync( PluginManager* pluginManager ); - - virtual ~DiscordRPCplugin() override; - - std::string getId() override { return Definition().id; } + public: + static PluginDefinition Definition() { + return { "discrdrpc", + "Discord Rich Presence", + "Show your friends what you are up to through the discord Rich Presence system", + DiscordRPCplugin::New, + { 0, 0, 0 }, + DiscordRPCplugin::NewSync }; + } - std::string getTitle() override { return Definition().name; } - - std::string getDescription() override { return Definition().description; } - - protected: - DiscordIPC mIPC; - std::string mLastFile; - std::string mProjectName; - nlohmann::json mcLangBindings; - - void load ( PluginManager* pluginManager ); - - PluginRequestHandle processMessage( const PluginMessage& msg ); - - virtual void onRegisterListeners(UICodeEditor* editor, std::vector& listeners ) override; - virtual void onRegisterDocument( TextDocument* doc ) override; - - - DiscordRPCplugin( PluginManager* pluginManager, bool sync ); + static Plugin* New( PluginManager* pluginManager ); + + static Plugin* NewSync( PluginManager* pluginManager ); + + virtual ~DiscordRPCplugin() override; + + std::string getId() override { return Definition().id; } + + std::string getTitle() override { return Definition().name; } + + std::string getDescription() override { return Definition().description; } + + protected: + DiscordIPC mIPC; + std::string mLastFile; + std::string mProjectName; + nlohmann::json mcLangBindings; + bool mcDoLangIcon; + + void load( PluginManager* pluginManager ); + + PluginRequestHandle processMessage( const PluginMessage& msg ); + + virtual void onRegisterListeners( UICodeEditor* editor, + std::vector& listeners ) override; + virtual void onRegisterEditor( UICodeEditor* editor ) override; + virtual void onUnregisterEditor( UICodeEditor* editor ) override; + + DiscordRPCplugin( PluginManager* pluginManager, bool sync ); }; - } // namespace ecode #endif // ECODE_DISCORDRPCPLUGIN_HPP \ No newline at end of file diff --git a/src/tools/ecode/plugins/discordRPC/sdk/ipc.cpp b/src/tools/ecode/plugins/discordRPC/sdk/ipc.cpp index aa3136494..91ce06b67 100644 --- a/src/tools/ecode/plugins/discordRPC/sdk/ipc.cpp +++ b/src/tools/ecode/plugins/discordRPC/sdk/ipc.cpp @@ -3,19 +3,19 @@ #include #include -#include #include +#include #include -#if defined( EE_PLATFORM_POSIX ) - #include - #include - #include +#if defined( EE_PLATFORM_POSIX ) +#include +#include +#include #elif EE_PLATFORM == EE_PLATFORM_WIN - #ifndef WIN32LEAN_AND_MEAN - #define WIN32_LEAN_AND_MEAN - #endif - #include +#ifndef WIN32LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include #endif using namespace EE::System; @@ -27,303 +27,320 @@ DiscordIPC::DiscordIPC() { } bool DiscordIPC::tryConnect() { - #if EE_PLATFORM == EE_PLATFORM_WIN - std::string basePath = "\\\\.\\pipe\\"; - - for (int i = 0; i < 10; ++i) { - std::string ipcPath = basePath + "discord-ipc-" + std::to_string(i); - - // Check if exists - DWORD attributes = GetFileAttributes(ipcPath.c_str()); - if (attributes != INVALID_FILE_ATTRIBUTES) { - Log::debug("dcIPC: IPC path found! - %s", ipcPath); - mIpcPath = ipcPath; - - mSocket = CreateFile(mIpcPath.c_str(), GENERIC_READ | GENERIC_WRITE, - 0, nullptr, OPEN_EXISTING, 0, nullptr); - - doHandshake(); - return true; - } +#if EE_PLATFORM == EE_PLATFORM_WIN + std::string basePath = "\\\\.\\pipe\\"; + + for ( int i = 0; i < 10; ++i ) { + std::string ipcPath = basePath + "discord-ipc-" + std::to_string( i ); + + // Check if exists + DWORD attributes = GetFileAttributes( ipcPath.c_str() ); + if ( attributes != INVALID_FILE_ATTRIBUTES ) { + Log::debug( "dcIPC: IPC path found! - %s", ipcPath ); + mIpcPath = ipcPath; + + mSocket = CreateFile( mIpcPath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, + OPEN_EXISTING, 0, nullptr ); + + doHandshake(); + return true; + } + } + + reconnect(); + return false; + +#elif defined( EE_PLATFORM_POSIX ) + // Socket path can be in any of the following directories: + // * `XDG_RUNTIME_DIR` + // * `TMPDIR` + // * `TMP` + // * `TEMP` + // * `/tmp` + // + // Possibly Followed by: + // * `/app/com.discordapp.Discord` - for flatpak + // * `/.flatpak/dev.vencord.Vesktop/xdg-run` - Vesktop flatpak + // * `/snap.discord` - for snap + // + // Followed by: + // * `/discord-ipc-{i}` - where `i` is a number from 0 to 9 + const std::string env[] = { "XDG_RUNTIME_DIR", "TMPDIR", "TMP", "TEMP" }; + const std::vector additionalPaths = { + "/app/com.discordapp.Discord", + "/.flatpak/dev.vencord.Vesktop/xdg-run", + "/snap.discord", + }; + std::vector validPaths; + for ( const auto& eVar : env ) { + const char* value = std::getenv( eVar.c_str() ); + if ( !value ) { + continue; + } + if ( !std::filesystem::exists( value ) ) { + continue; + } + validPaths.push_back( value ); + } + + validPaths.push_back( "/tmp" ); // Hard coded fallback + + std::vector checkPaths; + + for ( const auto& basePath : validPaths ) { + for ( const auto& additionalPath : additionalPaths ) { + std::string fullPath = basePath + additionalPath; + if ( std::filesystem::exists( fullPath ) ) { + checkPaths.push_back( fullPath ); + } + } + } + checkPaths.insert( checkPaths.end(), validPaths.begin(), validPaths.end() ); + + for ( const auto& basePath : checkPaths ) { + if ( !std::filesystem::exists( basePath ) ) { + continue; + } + for ( int i = 0; i < 10; ++i ) { + std::string ipcPath = basePath + "/discord-ipc-" + std::to_string( i ); + + if ( std::filesystem::exists( ipcPath ) ) { + Log::debug( "dcIPC: IPC path found! - %s", ipcPath ); + mIpcPath = ipcPath; + + mSocket = socket( AF_UNIX, SOCK_STREAM, 0 ); + if ( mSocket == -1 ) { + Log::error( "dcIPC: Discord IPC socket cold not be opened: %s", mIpcPath ); + mIpcPath = ""; + continue; + } + + sockaddr_un serverAddr; + memset( &serverAddr, 0, sizeof( serverAddr ) ); + serverAddr.sun_family = AF_UNIX; + mIpcPath.copy( serverAddr.sun_path, sizeof( serverAddr.sun_path ) - 1 ); + serverAddr.sun_path[sizeof( serverAddr.sun_path ) - 1] = + '\0'; // Ensure null termination + + if ( connect( mSocket, reinterpret_cast( &serverAddr ), + sizeof( serverAddr ) ) == -1 ) { + close( mSocket ); + return false; + } + + doHandshake(); + return true; + } } - reconnect(); return false; - - #elif defined(EE_PLATFORM_POSIX) - // Socket path can be in any of the following directories: - // * `XDG_RUNTIME_DIR` - // * `TMPDIR` - // * `TMP` - // * `TEMP` - // * `/tmp` - // - // Possibly Followed by: - // * `/app/com.discordapp.Discord` - for flatpak - // * `/.flatpak/dev.vencord.Vesktop/xdg-run` - Vesktop flatpak - // * `/snap.discord` - for snap - // - // Followed by: - // * `/discord-ipc-{i}` - where `i` is a number from 0 to 9 - const std::string env[] = {"XDG_RUNTIME_DIR", "TMPDIR", "TMP", "TEMP"}; - const std::vector additionalPaths = { - "/app/com.discordapp.Discord", - "/.flatpak/dev.vencord.Vesktop/xdg-run", - "/snap.discord", - }; - std::vector validPaths; - for ( const auto& eVar : env ){ - const char* value = std::getenv(eVar.c_str()); - if (!value) { continue; } - if (!std::filesystem::exists(value)) { continue; } - validPaths.push_back(value); - } - - validPaths.push_back("/tmp"); // Hard coded fallback - - std::vector checkPaths; - - for ( const auto& basePath : validPaths ) { - for (const auto& additionalPath : additionalPaths) { - std::string fullPath = basePath + additionalPath; - if (std::filesystem::exists(fullPath)) { - checkPaths.push_back(fullPath); - } - } - } - checkPaths.insert(checkPaths.end(), validPaths.begin(), validPaths.end()); - - for (const auto& basePath : checkPaths) { - if (!std::filesystem::exists(basePath)) { continue; } - for (int i = 0; i < 10; ++i) { - std::string ipcPath = basePath + "/discord-ipc-" + std::to_string(i); - - if (std::filesystem::exists(ipcPath)) { - Log::debug("dcIPC: IPC path found! - %s", ipcPath); - mIpcPath = ipcPath; - - mSocket = socket(AF_UNIX, SOCK_STREAM, 0); - if (mSocket == -1) { - Log::error("dcIPC: Discord IPC socket cold not be opened: %s", mIpcPath); - mIpcPath = ""; - continue; - } - - sockaddr_un serverAddr; - memset(&serverAddr, 0, sizeof(serverAddr)); - serverAddr.sun_family = AF_UNIX; - mIpcPath.copy(serverAddr.sun_path, sizeof(serverAddr.sun_path) - 1); - serverAddr.sun_path[sizeof(serverAddr.sun_path) - 1] = '\0'; // Ensure null termination - - if (connect(mSocket, reinterpret_cast(&serverAddr), sizeof(serverAddr)) == -1) { - close(mSocket); - return false; - } - - doHandshake(); - return true; - } - } - reconnect(); - return false; - } - #endif + } +#endif return false; // Discord not supported by other OS (if it is, TBA) } void DiscordIPC::doHandshake() { - json j = { - {"v", 1}, - {"client_id", mcClientID} - }; - - sendPacket(DiscordIPCOpcodes::Handshake, j); + json j = { { "v", 1 }, { "client_id", mcClientID } }; + + sendPacket( DiscordIPCOpcodes::Handshake, j ); } void DiscordIPC::clearActivity() { json j = { - {"cmd", "SET_ACTIVITY"}, - {"args", { - {"pid", 0}, - {"activity", nullptr} - }}, - {"nonce", "-"} // TODO: Null nonce for dev purposes, change to UUIDV4 in finished product - }; - sendPacket(DiscordIPCOpcodes::Frame, j); + { "cmd", "SET_ACTIVITY" }, + { "args", { { "pid", 0 }, { "activity", nullptr } } }, + { "nonce", "-" } // TODO: Null nonce for dev purposes, change to UUIDV4 in finished product + }; + sendPacket( DiscordIPCOpcodes::Frame, j ); } void DiscordIPC::setActivity( DiscordIPCActivity a ) { json aj = { - {"type", static_cast(a.type)}, - {"instance", true}, - }; - - if (!a.state.empty()) - aj["state"] = a.state; - if (!a.details.empty()) - aj["details"] = a.details; + { "type", static_cast( a.type ) }, + { "instance", true }, + }; - json as; - if (!a.largeImage.empty()) { - as["large_image"] = a.largeImage; - } - if (!a.largeText.empty()) { - as["large_text"] = a.largeText; - } - if (!a.smallImage.empty()) { - as["small_image"] = a.smallImage; - } - if (!a.smallText.empty()) { - as["small_text"] = a.smallText; - } - if (!as.empty()) { - aj["assets"] = as; - } + if ( !a.state.empty() ) + aj["state"] = a.state; + if ( !a.details.empty() ) + aj["details"] = a.details; + + json as; + if ( !a.largeImage.empty() ) { + as["large_image"] = a.largeImage; + } + if ( !a.largeText.empty() ) { + as["large_text"] = a.largeText; + } + if ( !a.smallImage.empty() ) { + as["small_image"] = a.smallImage; + } + if ( !a.smallText.empty() ) { + as["small_text"] = a.smallText; + } + if ( !as.empty() ) { + aj["assets"] = as; + } + + json t; + if ( a.start != 0 ) { + t["start"] = a.start; + } + if ( a.end != 0 ) { + t["end"] = a.end; + } + if ( !t.empty() ) { + aj["timestamps"] = t; + } - json t; - if (a.start != 0) { - t["start"] = a.start; - } - if (a.end != 0) { - t["end"] = a.end; - } - if (!t.empty()) { - aj["timestamps"] = t; - } - json b; - if (!a.buttons[0].url.empty()){ + if ( !a.buttons[0].url.empty() ) { b[0]["label"] = a.buttons[0].label; b[0]["url"] = a.buttons[0].url; - } - if (!a.buttons[1].url.empty()){ + } + if ( !a.buttons[1].url.empty() ) { b[1]["label"] = a.buttons[1].label; b[1]["url"] = a.buttons[1].url; - } - if (!b.empty()) { - aj["buttons"] = b; - } - - json j{ - {"cmd", "SET_ACTIVITY"}, - {"args", { - {"pid", mPID}, - {"activity", aj}, - }}, - {"nonce", "-"} - }; - + } + if ( !b.empty() ) { + aj["buttons"] = b; + } + + json j{ { "cmd", "SET_ACTIVITY" }, + { "args", + { + { "pid", mPID }, + { "activity", aj }, + } }, + { "nonce", "-" } }; + mActivity = a; - sendPacket(DiscordIPCOpcodes::Frame, j); + sendPacket( DiscordIPCOpcodes::Frame, j ); } -void DiscordIPC::sendPacket(DiscordIPCOpcodes opcode, json j) { - if (!std::filesystem::exists(mIpcPath)) { reconnect(); return; } - - const std::string packet = j.dump(); - std::vector data; - +void DiscordIPC::sendPacket( DiscordIPCOpcodes opcode, json j ) { + if ( !std::filesystem::exists( mIpcPath ) ) { + reconnect(); + return; + } + + const std::string packet = j.dump(); + std::vector data; + // Add correct ammount of padding for the protocol - union { - uint32_t value; - uint8_t bytes[4]; - } bytes; + union { + uint32_t value; + uint8_t bytes[4]; + } bytes; - bytes.value = opcode; - for (int i = 0; i <= 3; ++i) { - data.push_back(bytes.bytes[i]); - } + bytes.value = opcode; + for ( int i = 0; i <= 3; ++i ) { + data.push_back( bytes.bytes[i] ); + } - bytes.value = packet.length(); - for (int i = 0; i <= 3; ++i) { - data.push_back(bytes.bytes[i]); - } + bytes.value = packet.length(); + for ( int i = 0; i <= 3; ++i ) { + data.push_back( bytes.bytes[i] ); + } - for (char c : packet) { - data.push_back(static_cast(c)); - } - -// Log::debug("Packet is: %s (%u)", j.dump(4), data.size()); - -// std::stringstream ss; -// for (uint8_t byte : data) { -// ss << std::hex << std::setw(2) << std::setfill('0') << static_cast(byte) << " "; -// } + for ( char c : packet ) { + data.push_back( static_cast( c ) ); + } -// Log::debug(ss.str()); - - #if defined( EE_PLATFORM_POSIX ) - - ssize_t bytesSent = send(mSocket, data.data(), data.size(), 0); - if (bytesSent != data.size()) { - Log::error("dcIPC: Failed to send all data to Unix socket: %zu bytes sent, %zu bytes expected", bytesSent, data.size()); - reconnect(); - return; - } + // Log::debug("Packet is: %s (%u)", j.dump(4), data.size()); - - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 500000; // 0.5 seconds in microseconds - setsockopt(mSocket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); - - char buffer[1024]; - ssize_t bytesRead = recv(mSocket, buffer, sizeof(buffer), 0); - -// Log::debug("dcIPC: RECV: %s", buffer); - - // TODO: Implement nonce checking? (does it even really matter?) - - //return bytesRead; - #elif EE_PLATFORM == EE_PLATFORM_WIN - DWORD bytesSent; - if ( !WriteFile(mSocket, data.data(), data.size(), &bytesSent, nullptr) ) { - Log::error("dcIPC: Error writing to pipe!!"); - reconnect(); - return; - } else if (bytesSent != data.size()) { - Log::error("dcIPC: Incorrect ammount of data written: %zu bytes sent, %zu bytes expected", - bytesSent, data.size()); - reconnect(); - return; - } - - DWORD bytesRead; - char buffer[1024]; - if ( !ReadFile(mSocket, buffer, 1024, &bytesRead, nullptr ) ) { - Log::error("dcIPC: Error reading pipe!!"); - reconnect(); - return; - } - -// Log::debug("dcIPC: RECV: %s", buffer); + // std::stringstream ss; + // for (uint8_t byte : data) { + // ss << std::hex << std::setw(2) << std::setfill('0') << static_cast(byte) << " "; + // } - #endif + // Log::debug(ss.str()); + +#if defined( EE_PLATFORM_POSIX ) + + ssize_t bytesSent = send( mSocket, data.data(), data.size(), 0 ); + if ( bytesSent != data.size() ) { + Log::error( + "dcIPC: Failed to send all data to Unix socket: %zu bytes sent, %zu bytes expected", + bytesSent, data.size() ); + reconnect(); + return; + } + + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 500000; // 0.5 seconds in microseconds + setsockopt( mSocket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof( tv ) ); + + char buffer[1024]; + ssize_t bytesRead = recv( mSocket, buffer, sizeof( buffer ), 0 ); + + // Log::debug("dcIPC: RECV: %s", buffer); + + // TODO: Implement nonce checking? (does it even really matter?) + + // return bytesRead; +#elif EE_PLATFORM == EE_PLATFORM_WIN + DWORD bytesSent; + if ( !WriteFile( mSocket, data.data(), data.size(), &bytesSent, nullptr ) ) { + Log::error( "dcIPC: Error writing to pipe!!" ); + reconnect(); + return; + } else if ( bytesSent != data.size() ) { + Log::error( "dcIPC: Incorrect ammount of data written: %zu bytes sent, %zu bytes expected", + bytesSent, data.size() ); + reconnect(); + return; + } + + DWORD bytesRead; + char buffer[1024]; + if ( !ReadFile( mSocket, buffer, 1024, &bytesRead, nullptr ) ) { + Log::error( "dcIPC: Error reading pipe!!" ); + reconnect(); + return; + } + + // Log::debug("dcIPC: RECV: %s", buffer); + +#endif } void DiscordIPC::reconnect() { - if (mReconnectLock) {Log::warning("dcIPC: Tried to call reconnect while locked"); return;} - if (!mUIReady) { Log::debug("dcIPC: Scheduled a reconnect"); mIsReconnectScheduled = true; return; } - if (mBackoffIndex < DISCORDIPC_BACKOFF_MAX) { mBackoffIndex++; } - int delay = 5 + pow(2, mBackoffIndex); + if ( mReconnectLock ) { + Log::warning( "dcIPC: Tried to call reconnect while locked" ); + return; + } + if ( !mUIReady ) { + Log::debug( "dcIPC: Scheduled a reconnect" ); + mIsReconnectScheduled = true; + return; + } + if ( mBackoffIndex < DISCORDIPC_BACKOFF_MAX ) { + mBackoffIndex++; + } + int delay = 5 + pow( 2, mBackoffIndex ); mReconnectLock = true; - - Log::warning("dcIPC: Waiting for reconnect delay of %us (%u/%u)", delay, mBackoffIndex, DISCORDIPC_BACKOFF_MAX); - EE::Scene::SceneManager::instance()->getUISceneNode() - ->setTimeout( [this] { - EE::Scene::SceneManager::instance()->getUISceneNode() - ->getThreadPool()->run( [this]{ - Log::info("dcIPC: Reconnecting..."); - mReconnectLock = false; - if(tryConnect()){ mBackoffIndex = 0; } - }); - }, Seconds(delay)); + + Log::warning( "dcIPC: Waiting for reconnect delay of %us (%u/%u)", delay, mBackoffIndex, + DISCORDIPC_BACKOFF_MAX ); + EE::Scene::SceneManager::instance()->getUISceneNode()->setTimeout( + [this] { + EE::Scene::SceneManager::instance()->getUISceneNode()->getThreadPool()->run( [this] { + Log::info( "dcIPC: Reconnecting..." ); + mReconnectLock = false; + if ( tryConnect() ) { + mBackoffIndex = 0; + } + } ); + }, + Seconds( delay ) ); } DiscordIPC::~DiscordIPC() { - #if defined( EE_PLATFORM_POSIX ) - close(mSocket); - #elif EE_PLATFORM == EE_PLATFORM_WIN - CloseHandle(mSocket); - #endif +#if defined( EE_PLATFORM_POSIX ) + close( mSocket ); +#elif EE_PLATFORM == EE_PLATFORM_WIN + CloseHandle( mSocket ); +#endif } \ No newline at end of file diff --git a/src/tools/ecode/plugins/discordRPC/sdk/ipc.hpp b/src/tools/ecode/plugins/discordRPC/sdk/ipc.hpp index 7b395a7ef..f2a6fc650 100644 --- a/src/tools/ecode/plugins/discordRPC/sdk/ipc.hpp +++ b/src/tools/ecode/plugins/discordRPC/sdk/ipc.hpp @@ -3,81 +3,78 @@ #include // 2^8 = 256s ~4.3min -#define DISCORDIPC_BACKOFF_MAX 8 +#define DISCORDIPC_BACKOFF_MAX 8 enum DiscordIPCActivityTypes { - Playing = 0, - Listening = 2, - Watching = 3, - Competing = 5, + Playing = 0, + Listening = 2, + Watching = 3, + Competing = 5, }; struct DiscordIPCActivityButton { - std::string label; - std::string url; + std::string label; + std::string url; }; struct DiscordIPCActivity { - DiscordIPCActivityTypes type = DiscordIPCActivityTypes::Playing; - std::string state; - std::string details; - - time_t start = 0; - time_t end = 0; - - std::string largeImage; - std::string largeText; - std::string smallImage; - std::string smallText; - - DiscordIPCActivityButton buttons[2]; + DiscordIPCActivityTypes type = DiscordIPCActivityTypes::Playing; + std::string state; + std::string details; + + time_t start = 0; + time_t end = 0; + + std::string largeImage; + std::string largeText; + std::string smallImage; + std::string smallText; + + // IMPORTANT: For some reason, you do not see the buttons of your own account on the discord + // client (intended discord behavior) + DiscordIPCActivityButton buttons[2]; }; -enum DiscordIPCOpcodes { - Handshake = 0, - Frame, - Close, - Ping, - Pong -}; +enum DiscordIPCOpcodes { Handshake = 0, Frame, Close, Ping, Pong }; class DiscordIPC { - public: - - virtual ~DiscordIPC(); - DiscordIPC(); + public: + virtual ~DiscordIPC(); + DiscordIPC(); - // false - FileNotFound/OSNotSupported - // true - Success - bool tryConnect(); - void reconnect(); - - void setActivity( DiscordIPCActivity a ); - DiscordIPCActivity *getActivity() { return &mActivity; } - void clearActivity(); - - bool mUIReady; - bool mIsReconnectScheduled = false; // If we fail to load bofore UI initialises we call reconnect after init - - //Configurables - std::string mcClientID; - protected: - std::string mIpcPath; - int mPID; - - int mBackoffIndex; - int mReconnectLock = false; // Not quite a mutex because I want to lock any attempts if one is already waiting - - DiscordIPCActivity mActivity; - - - #if defined( EE_PLATFORM_POSIX ) - int mSocket; - #elif EE_PLATFORM == EE_PLATFORM_WIN - void* mSocket; - #endif - - void doHandshake(); - - void sendPacket( DiscordIPCOpcodes opcode, nlohmann::json j ); + // false - FileNotFound/OSNotSupported + // true - Success + bool tryConnect(); + void reconnect(); + + void setActivity( DiscordIPCActivity a ); + DiscordIPCActivity* getActivity() { return &mActivity; } + void clearActivity(); + + bool mUIReady; + bool mIsReconnectScheduled = + false; // If we fail to load bofore UI initialises we call reconnect after init + + // Configurables + std::string mcClientID; + + protected: + std::string mIpcPath; + int mPID; + + int mBackoffIndex; + int mReconnectLock = + false; // Not quite a mutex because I want to lock any attempts if one is already waiting + + DiscordIPCActivity mActivity; + +#if defined( EE_PLATFORM_POSIX ) + int mSocket; +#elif EE_PLATFORM == EE_PLATFORM_WIN + void* mSocket; +#endif + + void doHandshake(); + + void sendPacket( DiscordIPCOpcodes opcode, nlohmann::json j ); }; \ No newline at end of file