├── .gitattributes ├── .github └── workflows │ └── main.yml ├── .gitignore ├── README.md ├── binding.gyp ├── include ├── activity.h ├── application.h ├── core.h ├── discord_game.h ├── macro.h └── promise.h ├── lib └── discord_game.js ├── package.json ├── sdk ├── discord_game_sdk.h ├── x86 │ ├── discord_game_sdk.dll │ └── discord_game_sdk.dll.lib └── x86_64 │ ├── discord_game_sdk.bundle │ ├── discord_game_sdk.dll │ ├── discord_game_sdk.dll.lib │ ├── discord_game_sdk.dylib │ └── discord_game_sdk.so ├── src ├── activity.c ├── application.c └── discord_game.c ├── test ├── application.js └── discord.js ├── types └── discord_game.d.ts └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | *.dll filter=lfs diff=lfs merge=lfs -text 2 | *.so filter=lfs diff=lfs merge=lfs -text 3 | *.dylib filter=lfs diff=lfs merge=lfs -text 4 | *.bundle filter=lfs diff=lfs merge=lfs -text 5 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Node CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | test: 7 | name: Test 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | os: [macos-latest, windows-latest] 12 | node-version: [10.x, 12.x, 14.x] 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | with: 17 | lfs: true 18 | - name: Use Node.js ${{ matrix.node-version }} 19 | uses: actions/setup-node@v1 20 | with: 21 | node-version: ${{ matrix.node-version }} 22 | - name: yarn install, build, and test 23 | run: | 24 | yarn install 25 | yarn build --if-present 26 | yarn test 27 | env: 28 | CI: true 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # next.js build output 79 | .next 80 | 81 | # nuxt.js build output 82 | .nuxt 83 | 84 | # gatsby files 85 | .cache/ 86 | public 87 | 88 | # vuepress build output 89 | .vuepress/dist 90 | 91 | # Serverless directories 92 | .serverless/ 93 | 94 | # FuseBox cache 95 | .fusebox/ 96 | 97 | # DynamoDB Local files 98 | .dynamodb/ 99 | 100 | # Node GYP 101 | build/ 102 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Discord Game SDK 2 | === 3 | [![Node CI Status](https://github.com/open-unlight/node-discord-game/workflows/Node%20CI/badge.svg)](https://github.com/open-unlight/node-discord-game/actions?workflow=Node+CI) 4 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fopen-unlight%2Fnode-discord-game.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fopen-unlight%2Fnode-discord-game?ref=badge_shield) 5 | 6 | This is node.js module for Electron to integrate with Discord. 7 | 8 | ## Requirements 9 | 10 | * Node.js 11+ 11 | * Electron 6.0+ 12 | 13 | ## Windows Setup 14 | 15 | The Windows is required to add `dll` to project root, please copy `sdk\{ARCH}\discord_game_sdk.dll` to your project folder to ensure your Electron can access SDK correctly. 16 | 17 | ## Usage 18 | 19 | Before using this module, you have to go to [Discord Developer](https://discord.com/developers/applications/) to create an application. 20 | 21 | ### Discord 22 | 23 | #### create() 24 | 25 | Initialize Discord. 26 | 27 | ```js 28 | const Discord = require('discord-game'); 29 | 30 | const isRequireDiscord = true; 31 | Discord.create('Client ID', isRequireDiscord); 32 | // => true 33 | ``` 34 | 35 | #### version 36 | 37 | Get Discord Game SDK Version 38 | 39 | #### runCallback() 40 | 41 | Resolve Discord's async behavior and call the callback; 42 | 43 | ```js 44 | const Discord = require('discord-game'); 45 | 46 | const isRequireDiscord = true; 47 | Discord.create('Client ID', isRequireDiscord); 48 | 49 | setInterval(function() { 50 | Discord.runCallback(); // => true 51 | }, 1000/60) 52 | ``` 53 | 54 | ### Application 55 | 56 | #### locale 57 | 58 | Get the current locale 59 | 60 | #### branch 61 | 62 | Get the current branch 63 | 64 | #### getOAuth2Token() 65 | 66 | Get the user OAuth2 Token. 67 | 68 | ```js 69 | const Discord = require('discord-game'); 70 | 71 | const isRequireDiscord = true; 72 | Discord.create('Client ID', isRequireDiscord); 73 | 74 | Discord.Application 75 | .getOAuth2Token() 76 | .then(function(token) { console.log('Token is', token) }); 77 | 78 | setInterval(function() { 79 | Discord.runCallback(); // => true 80 | }, 1000/60) 81 | ``` 82 | 83 | ### Activity (aka Rich Presence) 84 | 85 | #### update 86 | 87 | Update user's rich presence. 88 | 89 | ```js 90 | const Discord = require('discord-game'); 91 | 92 | const isRequireDiscord = true; 93 | Discord.create('Client ID', isRequireDiscord); 94 | 95 | // All property are optional 96 | const activity = { 97 | details: 'Details', 98 | state: 'State', 99 | assets: { 100 | largeImage: 'large', 101 | largeText: 'Large', 102 | samllImage: 'small', 103 | smallText: 'Small' 104 | }, 105 | timestamps: { 106 | startAt: new Date(), 107 | endAt: new Date() 108 | }, 109 | secrets: { 110 | match: 'match', 111 | join: 'join', 112 | spectate: 'spectate' 113 | }, 114 | party: { 115 | id: 'id', 116 | currentSize: 1, 117 | maxSize: 5 118 | } 119 | } 120 | const start_at = new Date(); 121 | Discord.Activity 122 | .update(activity) 123 | .then(function() { console.log('Rich Presence updated') }); 124 | 125 | setInterval(function() { 126 | Discord.runCallback(); // => true 127 | }, 1000/60) 128 | ``` 129 | 130 | #### clear 131 | 132 | Clear user's rich presence. 133 | 134 | ```js 135 | Discord.Activity.clear() 136 | ``` 137 | 138 | 139 | ## License 140 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fopen-unlight%2Fnode-discord-game.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fopen-unlight%2Fnode-discord-game?ref=badge_large) 141 | -------------------------------------------------------------------------------- /binding.gyp: -------------------------------------------------------------------------------- 1 | { 2 | "targets": [ 3 | { 4 | "target_name": "discord_game", 5 | "sources": [ 6 | "src/discord_game.c", 7 | "src/application.c", 8 | "src/activity.c" 9 | ], 10 | 11 | "include_dirs": [ 12 | "include/", 13 | "sdk/" 14 | ], 15 | "conditions": [ 16 | ["OS == 'win'", { 17 | "conditions": [ 18 | ["target_arch == 'ia32'", { 19 | "link_settings": { 20 | "libraries": [ 21 | "<(module_root_dir)/sdk/x86/discord_game_sdk.dll.lib" 22 | ], 23 | "copies":[{ 24 | "destination":"<(module_root_dir)/build/Release", 25 | "files":["<(module_root_dir)/sdk/x86/discord_game_sdk.dll"] 26 | }] 27 | } 28 | }], 29 | ["target_arch == 'x64'", { 30 | "link_settings": { 31 | "libraries": [ 32 | "<(module_root_dir)/sdk/x86_64/discord_game_sdk.dll.lib" 33 | ], 34 | "copies":[{ 35 | "destination":"<(module_root_dir)/build/Release", 36 | "files":["<(module_root_dir)/sdk/x86_64/discord_game_sdk.dll"] 37 | }] 38 | } 39 | }] 40 | ] 41 | }], 42 | ["OS == 'mac'", { 43 | "link_settings": { 44 | "libraries": [ 45 | "-Wl,-rpath,<(module_root_dir)/sdk/x86_64", 46 | "-Wl,-rpath,@executable_path/../Resources", 47 | "-Wl,-rpath,@executable_path/../Frameworks", 48 | "<(module_root_dir)/sdk/x86_64/discord_game_sdk.dylib" 49 | ] 50 | } 51 | }] 52 | ] 53 | } 54 | ] 55 | } 56 | -------------------------------------------------------------------------------- /include/activity.h: -------------------------------------------------------------------------------- 1 | #ifndef __DISCORD_GAME_ACTIVITY_H 2 | #define __DISCORD_GAME_ACTIVITY_H 3 | 4 | #include "discord_game.h" 5 | 6 | napi_value Activity_Init(napi_env env, AddonState* state); 7 | 8 | #endif 9 | -------------------------------------------------------------------------------- /include/application.h: -------------------------------------------------------------------------------- 1 | #ifndef __DISCORD_GAME_APPLICATION_H 2 | #define __DISCORD_GAME_APPLICATION_H 3 | 4 | #include "discord_game.h" 5 | 6 | napi_value Application_Init(napi_env env, AddonState* state); 7 | 8 | #endif 9 | -------------------------------------------------------------------------------- /include/core.h: -------------------------------------------------------------------------------- 1 | #ifndef __DISCORD_GAME_CORE_H 2 | #define __DISCORD_GAME_CORE_H 3 | 4 | typedef struct { 5 | struct IDiscordCore* core; 6 | struct IDiscordUserManager* users; 7 | struct IDiscordAchievementManager* achievements; 8 | struct IDiscordActivityManager* activities; 9 | struct IDiscordRelationshipManager* relationships; 10 | struct IDiscordApplicationManager* application; 11 | struct IDiscordLobbyManager* lobbies; 12 | DiscordUserId user_id; 13 | } Application; 14 | 15 | typedef struct { 16 | Application app; 17 | struct IDiscordUserEvents users_events; 18 | struct IDiscordActivityEvents activities_events; 19 | struct IDiscordRelationshipEvents relationships_events; 20 | bool initialized; 21 | } AddonState; 22 | 23 | #endif 24 | -------------------------------------------------------------------------------- /include/discord_game.h: -------------------------------------------------------------------------------- 1 | #ifndef __DISCORD_GAME_H 2 | #define __DISCORD_GAME_H 3 | 4 | // Standard Library 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include "discord_game_sdk.h" 11 | #ifdef _WIN32 12 | #include 13 | #else 14 | #include 15 | #include 16 | #endif 17 | 18 | // Node NAPI 19 | #include 20 | 21 | // Discord Game 22 | #include "discord_game_sdk.h" 23 | 24 | // Discord Game 25 | #include "core.h" 26 | #include "promise.h" 27 | #include "application.h" 28 | #include "activity.h" 29 | #include "macro.h" 30 | 31 | #endif 32 | -------------------------------------------------------------------------------- /include/macro.h: -------------------------------------------------------------------------------- 1 | #ifndef __DISCORD_GAME_MACRO_H 2 | #define __DISCORD_GAME_MACRO_H 3 | 4 | // NAPI 5 | #define NAPI_REQUIRE(x) assert(x == napi_ok) 6 | #define NAPI_HAS_PROPERTY_DO(object, property) \ 7 | bool has_##property; \ 8 | NAPI_REQUIRE(napi_has_named_property(env, object, ""#property"", &has_##property)); \ 9 | if(has_##property) 10 | 11 | // DISCORD 12 | #define DISCORD_REQUIRE(x) assert(x == DiscordResult_Ok) 13 | 14 | #endif 15 | -------------------------------------------------------------------------------- /include/promise.h: -------------------------------------------------------------------------------- 1 | #ifndef __DISCORD_GAME_PROMISE_H 2 | #define __DISCORD_GAME_PROMISE_H 3 | 4 | typedef struct { 5 | napi_env env; 6 | napi_deferred deferred; 7 | AddonState* state; 8 | } Promise; 9 | 10 | #endif 11 | -------------------------------------------------------------------------------- /lib/discord_game.js: -------------------------------------------------------------------------------- 1 | const DiscordGame = require('bindings')('discord_game'); 2 | module.exports = DiscordGame 3 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "discord-game", 3 | "version": "0.1.2", 4 | "description": "The Discord Game SDK for Electron.js", 5 | "main": "lib/discord_game.js", 6 | "types": "types/discord_game.d.ts", 7 | "scripts": { 8 | "build": "node-gyp configure && node-gyp build", 9 | "test": "mocha -gc-global --reporter spec" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/open-unlight/node-discord-game.git" 14 | }, 15 | "keywords": [ 16 | "Discord", 17 | "Electron.js" 18 | ], 19 | "author": "Open Unlight ", 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/open-unlight/node-discord-game/issues" 23 | }, 24 | "homepage": "https://github.com/open-unlight/node-discord-game#readme", 25 | "dependencies": { 26 | "bindings": "^1.5.0" 27 | }, 28 | "devDependencies": { 29 | "mocha": "^8.1.3" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /sdk/discord_game_sdk.h: -------------------------------------------------------------------------------- 1 | #ifndef _DISCORD_GAME_SDK_H_ 2 | #define _DISCORD_GAME_SDK_H_ 3 | 4 | #ifdef __cplusplus 5 | extern "C" { 6 | #endif 7 | 8 | #include 9 | #include 10 | #ifndef __cplusplus 11 | #include 12 | #endif 13 | 14 | #define DISCORD_VERSION 2 15 | #define DISCORD_APPLICATION_MANAGER_VERSION 1 16 | #define DISCORD_USER_MANAGER_VERSION 1 17 | #define DISCORD_IMAGE_MANAGER_VERSION 1 18 | #define DISCORD_ACTIVITY_MANAGER_VERSION 1 19 | #define DISCORD_RELATIONSHIP_MANAGER_VERSION 1 20 | #define DISCORD_LOBBY_MANAGER_VERSION 1 21 | #define DISCORD_NETWORK_MANAGER_VERSION 1 22 | #define DISCORD_OVERLAY_MANAGER_VERSION 1 23 | #define DISCORD_STORAGE_MANAGER_VERSION 1 24 | #define DISCORD_STORE_MANAGER_VERSION 1 25 | #define DISCORD_VOICE_MANAGER_VERSION 1 26 | #define DISCORD_ACHIEVEMENT_MANAGER_VERSION 1 27 | 28 | enum EDiscordResult { 29 | DiscordResult_Ok = 0, 30 | DiscordResult_ServiceUnavailable = 1, 31 | DiscordResult_InvalidVersion = 2, 32 | DiscordResult_LockFailed = 3, 33 | DiscordResult_InternalError = 4, 34 | DiscordResult_InvalidPayload = 5, 35 | DiscordResult_InvalidCommand = 6, 36 | DiscordResult_InvalidPermissions = 7, 37 | DiscordResult_NotFetched = 8, 38 | DiscordResult_NotFound = 9, 39 | DiscordResult_Conflict = 10, 40 | DiscordResult_InvalidSecret = 11, 41 | DiscordResult_InvalidJoinSecret = 12, 42 | DiscordResult_NoEligibleActivity = 13, 43 | DiscordResult_InvalidInvite = 14, 44 | DiscordResult_NotAuthenticated = 15, 45 | DiscordResult_InvalidAccessToken = 16, 46 | DiscordResult_ApplicationMismatch = 17, 47 | DiscordResult_InvalidDataUrl = 18, 48 | DiscordResult_InvalidBase64 = 19, 49 | DiscordResult_NotFiltered = 20, 50 | DiscordResult_LobbyFull = 21, 51 | DiscordResult_InvalidLobbySecret = 22, 52 | DiscordResult_InvalidFilename = 23, 53 | DiscordResult_InvalidFileSize = 24, 54 | DiscordResult_InvalidEntitlement = 25, 55 | DiscordResult_NotInstalled = 26, 56 | DiscordResult_NotRunning = 27, 57 | DiscordResult_InsufficientBuffer = 28, 58 | DiscordResult_PurchaseCanceled = 29, 59 | DiscordResult_InvalidGuild = 30, 60 | DiscordResult_InvalidEvent = 31, 61 | DiscordResult_InvalidChannel = 32, 62 | DiscordResult_InvalidOrigin = 33, 63 | DiscordResult_RateLimited = 34, 64 | DiscordResult_OAuth2Error = 35, 65 | DiscordResult_SelectChannelTimeout = 36, 66 | DiscordResult_GetGuildTimeout = 37, 67 | DiscordResult_SelectVoiceForceRequired = 38, 68 | DiscordResult_CaptureShortcutAlreadyListening = 39, 69 | DiscordResult_UnauthorizedForAchievement = 40, 70 | DiscordResult_InvalidGiftCode = 41, 71 | DiscordResult_PurchaseError = 42, 72 | DiscordResult_TransactionAborted = 43, 73 | }; 74 | 75 | enum EDiscordCreateFlags { 76 | DiscordCreateFlags_Default = 0, 77 | DiscordCreateFlags_NoRequireDiscord = 1, 78 | }; 79 | 80 | enum EDiscordLogLevel { 81 | DiscordLogLevel_Error = 1, 82 | DiscordLogLevel_Warn, 83 | DiscordLogLevel_Info, 84 | DiscordLogLevel_Debug, 85 | }; 86 | 87 | enum EDiscordUserFlag { 88 | DiscordUserFlag_Partner = 2, 89 | DiscordUserFlag_HypeSquadEvents = 4, 90 | DiscordUserFlag_HypeSquadHouse1 = 64, 91 | DiscordUserFlag_HypeSquadHouse2 = 128, 92 | DiscordUserFlag_HypeSquadHouse3 = 256, 93 | }; 94 | 95 | enum EDiscordPremiumType { 96 | DiscordPremiumType_None = 0, 97 | DiscordPremiumType_Tier1 = 1, 98 | DiscordPremiumType_Tier2 = 2, 99 | }; 100 | 101 | enum EDiscordImageType { 102 | DiscordImageType_User, 103 | }; 104 | 105 | enum EDiscordActivityType { 106 | DiscordActivityType_Playing, 107 | DiscordActivityType_Streaming, 108 | DiscordActivityType_Listening, 109 | DiscordActivityType_Watching, 110 | }; 111 | 112 | enum EDiscordActivityActionType { 113 | DiscordActivityActionType_Join = 1, 114 | DiscordActivityActionType_Spectate, 115 | }; 116 | 117 | enum EDiscordActivityJoinRequestReply { 118 | DiscordActivityJoinRequestReply_No, 119 | DiscordActivityJoinRequestReply_Yes, 120 | DiscordActivityJoinRequestReply_Ignore, 121 | }; 122 | 123 | enum EDiscordStatus { 124 | DiscordStatus_Offline = 0, 125 | DiscordStatus_Online = 1, 126 | DiscordStatus_Idle = 2, 127 | DiscordStatus_DoNotDisturb = 3, 128 | }; 129 | 130 | enum EDiscordRelationshipType { 131 | DiscordRelationshipType_None, 132 | DiscordRelationshipType_Friend, 133 | DiscordRelationshipType_Blocked, 134 | DiscordRelationshipType_PendingIncoming, 135 | DiscordRelationshipType_PendingOutgoing, 136 | DiscordRelationshipType_Implicit, 137 | }; 138 | 139 | enum EDiscordLobbyType { 140 | DiscordLobbyType_Private = 1, 141 | DiscordLobbyType_Public, 142 | }; 143 | 144 | enum EDiscordLobbySearchComparison { 145 | DiscordLobbySearchComparison_LessThanOrEqual = -2, 146 | DiscordLobbySearchComparison_LessThan, 147 | DiscordLobbySearchComparison_Equal, 148 | DiscordLobbySearchComparison_GreaterThan, 149 | DiscordLobbySearchComparison_GreaterThanOrEqual, 150 | DiscordLobbySearchComparison_NotEqual, 151 | }; 152 | 153 | enum EDiscordLobbySearchCast { 154 | DiscordLobbySearchCast_String = 1, 155 | DiscordLobbySearchCast_Number, 156 | }; 157 | 158 | enum EDiscordLobbySearchDistance { 159 | DiscordLobbySearchDistance_Local, 160 | DiscordLobbySearchDistance_Default, 161 | DiscordLobbySearchDistance_Extended, 162 | DiscordLobbySearchDistance_Global, 163 | }; 164 | 165 | enum EDiscordEntitlementType { 166 | DiscordEntitlementType_Purchase = 1, 167 | DiscordEntitlementType_PremiumSubscription, 168 | DiscordEntitlementType_DeveloperGift, 169 | DiscordEntitlementType_TestModePurchase, 170 | DiscordEntitlementType_FreePurchase, 171 | DiscordEntitlementType_UserGift, 172 | DiscordEntitlementType_PremiumPurchase, 173 | }; 174 | 175 | enum EDiscordSkuType { 176 | DiscordSkuType_Application = 1, 177 | DiscordSkuType_DLC, 178 | DiscordSkuType_Consumable, 179 | DiscordSkuType_Bundle, 180 | }; 181 | 182 | enum EDiscordInputModeType { 183 | DiscordInputModeType_VoiceActivity = 0, 184 | DiscordInputModeType_PushToTalk, 185 | }; 186 | 187 | typedef int64_t DiscordClientId; 188 | typedef int32_t DiscordVersion; 189 | typedef int64_t DiscordSnowflake; 190 | typedef int64_t DiscordTimestamp; 191 | typedef DiscordSnowflake DiscordUserId; 192 | typedef char DiscordLocale[128]; 193 | typedef char DiscordBranch[4096]; 194 | typedef DiscordSnowflake DiscordLobbyId; 195 | typedef char DiscordLobbySecret[128]; 196 | typedef char DiscordMetadataKey[256]; 197 | typedef char DiscordMetadataValue[4096]; 198 | typedef uint64_t DiscordNetworkPeerId; 199 | typedef uint8_t DiscordNetworkChannelId; 200 | typedef char DiscordPath[4096]; 201 | typedef char DiscordDateTime[64]; 202 | 203 | struct DiscordUser { 204 | DiscordUserId id; 205 | char username[256]; 206 | char discriminator[8]; 207 | char avatar[128]; 208 | bool bot; 209 | }; 210 | 211 | struct DiscordOAuth2Token { 212 | char access_token[128]; 213 | char scopes[1024]; 214 | DiscordTimestamp expires; 215 | }; 216 | 217 | struct DiscordImageHandle { 218 | enum EDiscordImageType type; 219 | int64_t id; 220 | uint32_t size; 221 | }; 222 | 223 | struct DiscordImageDimensions { 224 | uint32_t width; 225 | uint32_t height; 226 | }; 227 | 228 | struct DiscordActivityTimestamps { 229 | DiscordTimestamp start; 230 | DiscordTimestamp end; 231 | }; 232 | 233 | struct DiscordActivityAssets { 234 | char large_image[128]; 235 | char large_text[128]; 236 | char small_image[128]; 237 | char small_text[128]; 238 | }; 239 | 240 | struct DiscordPartySize { 241 | int32_t current_size; 242 | int32_t max_size; 243 | }; 244 | 245 | struct DiscordActivityParty { 246 | char id[128]; 247 | struct DiscordPartySize size; 248 | }; 249 | 250 | struct DiscordActivitySecrets { 251 | char match[128]; 252 | char join[128]; 253 | char spectate[128]; 254 | }; 255 | 256 | struct DiscordActivity { 257 | enum EDiscordActivityType type; 258 | int64_t application_id; 259 | char name[128]; 260 | char state[128]; 261 | char details[128]; 262 | struct DiscordActivityTimestamps timestamps; 263 | struct DiscordActivityAssets assets; 264 | struct DiscordActivityParty party; 265 | struct DiscordActivitySecrets secrets; 266 | bool instance; 267 | }; 268 | 269 | struct DiscordPresence { 270 | enum EDiscordStatus status; 271 | struct DiscordActivity activity; 272 | }; 273 | 274 | struct DiscordRelationship { 275 | enum EDiscordRelationshipType type; 276 | struct DiscordUser user; 277 | struct DiscordPresence presence; 278 | }; 279 | 280 | struct DiscordLobby { 281 | DiscordLobbyId id; 282 | enum EDiscordLobbyType type; 283 | DiscordUserId owner_id; 284 | DiscordLobbySecret secret; 285 | uint32_t capacity; 286 | bool locked; 287 | }; 288 | 289 | struct DiscordFileStat { 290 | char filename[260]; 291 | uint64_t size; 292 | uint64_t last_modified; 293 | }; 294 | 295 | struct DiscordEntitlement { 296 | DiscordSnowflake id; 297 | enum EDiscordEntitlementType type; 298 | DiscordSnowflake sku_id; 299 | }; 300 | 301 | struct DiscordSkuPrice { 302 | uint32_t amount; 303 | char currency[16]; 304 | }; 305 | 306 | struct DiscordSku { 307 | DiscordSnowflake id; 308 | enum EDiscordSkuType type; 309 | char name[256]; 310 | struct DiscordSkuPrice price; 311 | }; 312 | 313 | struct DiscordInputMode { 314 | enum EDiscordInputModeType type; 315 | char shortcut[256]; 316 | }; 317 | 318 | struct DiscordUserAchievement { 319 | DiscordSnowflake user_id; 320 | DiscordSnowflake achievement_id; 321 | uint8_t percent_complete; 322 | DiscordDateTime unlocked_at; 323 | }; 324 | 325 | struct IDiscordLobbyTransaction { 326 | enum EDiscordResult (*set_type)(struct IDiscordLobbyTransaction* lobby_transaction, enum EDiscordLobbyType type); 327 | enum EDiscordResult (*set_owner)(struct IDiscordLobbyTransaction* lobby_transaction, DiscordUserId owner_id); 328 | enum EDiscordResult (*set_capacity)(struct IDiscordLobbyTransaction* lobby_transaction, uint32_t capacity); 329 | enum EDiscordResult (*set_metadata)(struct IDiscordLobbyTransaction* lobby_transaction, DiscordMetadataKey key, DiscordMetadataValue value); 330 | enum EDiscordResult (*delete_metadata)(struct IDiscordLobbyTransaction* lobby_transaction, DiscordMetadataKey key); 331 | enum EDiscordResult (*set_locked)(struct IDiscordLobbyTransaction* lobby_transaction, bool locked); 332 | }; 333 | 334 | struct IDiscordLobbyMemberTransaction { 335 | enum EDiscordResult (*set_metadata)(struct IDiscordLobbyMemberTransaction* lobby_member_transaction, DiscordMetadataKey key, DiscordMetadataValue value); 336 | enum EDiscordResult (*delete_metadata)(struct IDiscordLobbyMemberTransaction* lobby_member_transaction, DiscordMetadataKey key); 337 | }; 338 | 339 | struct IDiscordLobbySearchQuery { 340 | enum EDiscordResult (*filter)(struct IDiscordLobbySearchQuery* lobby_search_query, DiscordMetadataKey key, enum EDiscordLobbySearchComparison comparison, enum EDiscordLobbySearchCast cast, DiscordMetadataValue value); 341 | enum EDiscordResult (*sort)(struct IDiscordLobbySearchQuery* lobby_search_query, DiscordMetadataKey key, enum EDiscordLobbySearchCast cast, DiscordMetadataValue value); 342 | enum EDiscordResult (*limit)(struct IDiscordLobbySearchQuery* lobby_search_query, uint32_t limit); 343 | enum EDiscordResult (*distance)(struct IDiscordLobbySearchQuery* lobby_search_query, enum EDiscordLobbySearchDistance distance); 344 | }; 345 | 346 | typedef void* IDiscordApplicationEvents; 347 | 348 | struct IDiscordApplicationManager { 349 | void (*validate_or_exit)(struct IDiscordApplicationManager* manager, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 350 | void (*get_current_locale)(struct IDiscordApplicationManager* manager, DiscordLocale* locale); 351 | void (*get_current_branch)(struct IDiscordApplicationManager* manager, DiscordBranch* branch); 352 | void (*get_oauth2_token)(struct IDiscordApplicationManager* manager, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordOAuth2Token* oauth2_token)); 353 | void (*get_ticket)(struct IDiscordApplicationManager* manager, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, const char* data)); 354 | }; 355 | 356 | struct IDiscordUserEvents { 357 | void (*on_current_user_update)(void* event_data); 358 | }; 359 | 360 | struct IDiscordUserManager { 361 | enum EDiscordResult (*get_current_user)(struct IDiscordUserManager* manager, struct DiscordUser* current_user); 362 | void (*get_user)(struct IDiscordUserManager* manager, DiscordUserId user_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordUser* user)); 363 | enum EDiscordResult (*get_current_user_premium_type)(struct IDiscordUserManager* manager, enum EDiscordPremiumType* premium_type); 364 | enum EDiscordResult (*current_user_has_flag)(struct IDiscordUserManager* manager, enum EDiscordUserFlag flag, bool* has_flag); 365 | }; 366 | 367 | typedef void* IDiscordImageEvents; 368 | 369 | struct IDiscordImageManager { 370 | void (*fetch)(struct IDiscordImageManager* manager, struct DiscordImageHandle handle, bool refresh, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordImageHandle handle_result)); 371 | enum EDiscordResult (*get_dimensions)(struct IDiscordImageManager* manager, struct DiscordImageHandle handle, struct DiscordImageDimensions* dimensions); 372 | enum EDiscordResult (*get_data)(struct IDiscordImageManager* manager, struct DiscordImageHandle handle, uint8_t* data, uint32_t data_length); 373 | }; 374 | 375 | struct IDiscordActivityEvents { 376 | void (*on_activity_join)(void* event_data, const char* secret); 377 | void (*on_activity_spectate)(void* event_data, const char* secret); 378 | void (*on_activity_join_request)(void* event_data, struct DiscordUser* user); 379 | void (*on_activity_invite)(void* event_data, enum EDiscordActivityActionType type, struct DiscordUser* user, struct DiscordActivity* activity); 380 | }; 381 | 382 | struct IDiscordActivityManager { 383 | enum EDiscordResult (*register_command)(struct IDiscordActivityManager* manager, const char* command); 384 | enum EDiscordResult (*register_steam)(struct IDiscordActivityManager* manager, uint32_t steam_id); 385 | void (*update_activity)(struct IDiscordActivityManager* manager, struct DiscordActivity* activity, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 386 | void (*clear_activity)(struct IDiscordActivityManager* manager, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 387 | void (*send_request_reply)(struct IDiscordActivityManager* manager, DiscordUserId user_id, enum EDiscordActivityJoinRequestReply reply, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 388 | void (*send_invite)(struct IDiscordActivityManager* manager, DiscordUserId user_id, enum EDiscordActivityActionType type, const char* content, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 389 | void (*accept_invite)(struct IDiscordActivityManager* manager, DiscordUserId user_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 390 | }; 391 | 392 | struct IDiscordRelationshipEvents { 393 | void (*on_refresh)(void* event_data); 394 | void (*on_relationship_update)(void* event_data, struct DiscordRelationship* relationship); 395 | }; 396 | 397 | struct IDiscordRelationshipManager { 398 | void (*filter)(struct IDiscordRelationshipManager* manager, void* filter_data, bool (*filter)(void* filter_data, struct DiscordRelationship* relationship)); 399 | enum EDiscordResult (*count)(struct IDiscordRelationshipManager* manager, int32_t* count); 400 | enum EDiscordResult (*get)(struct IDiscordRelationshipManager* manager, DiscordUserId user_id, struct DiscordRelationship* relationship); 401 | enum EDiscordResult (*get_at)(struct IDiscordRelationshipManager* manager, uint32_t index, struct DiscordRelationship* relationship); 402 | }; 403 | 404 | struct IDiscordLobbyEvents { 405 | void (*on_lobby_update)(void* event_data, int64_t lobby_id); 406 | void (*on_lobby_delete)(void* event_data, int64_t lobby_id, uint32_t reason); 407 | void (*on_member_connect)(void* event_data, int64_t lobby_id, int64_t user_id); 408 | void (*on_member_update)(void* event_data, int64_t lobby_id, int64_t user_id); 409 | void (*on_member_disconnect)(void* event_data, int64_t lobby_id, int64_t user_id); 410 | void (*on_lobby_message)(void* event_data, int64_t lobby_id, int64_t user_id, uint8_t* data, uint32_t data_length); 411 | void (*on_speaking)(void* event_data, int64_t lobby_id, int64_t user_id, bool speaking); 412 | void (*on_network_message)(void* event_data, int64_t lobby_id, int64_t user_id, uint8_t channel_id, uint8_t* data, uint32_t data_length); 413 | }; 414 | 415 | struct IDiscordLobbyManager { 416 | enum EDiscordResult (*get_lobby_create_transaction)(struct IDiscordLobbyManager* manager, struct IDiscordLobbyTransaction** transaction); 417 | enum EDiscordResult (*get_lobby_update_transaction)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, struct IDiscordLobbyTransaction** transaction); 418 | enum EDiscordResult (*get_member_update_transaction)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, DiscordUserId user_id, struct IDiscordLobbyMemberTransaction** transaction); 419 | void (*create_lobby)(struct IDiscordLobbyManager* manager, struct IDiscordLobbyTransaction* transaction, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordLobby* lobby)); 420 | void (*update_lobby)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, struct IDiscordLobbyTransaction* transaction, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 421 | void (*delete_lobby)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 422 | void (*connect_lobby)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, DiscordLobbySecret secret, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordLobby* lobby)); 423 | void (*connect_lobby_with_activity_secret)(struct IDiscordLobbyManager* manager, DiscordLobbySecret activity_secret, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordLobby* lobby)); 424 | void (*disconnect_lobby)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 425 | enum EDiscordResult (*get_lobby)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, struct DiscordLobby* lobby); 426 | enum EDiscordResult (*get_lobby_activity_secret)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, DiscordLobbySecret* secret); 427 | enum EDiscordResult (*get_lobby_metadata_value)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, DiscordMetadataKey key, DiscordMetadataValue* value); 428 | enum EDiscordResult (*get_lobby_metadata_key)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, int32_t index, DiscordMetadataKey* key); 429 | enum EDiscordResult (*lobby_metadata_count)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, int32_t* count); 430 | enum EDiscordResult (*member_count)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, int32_t* count); 431 | enum EDiscordResult (*get_member_user_id)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, int32_t index, DiscordUserId* user_id); 432 | enum EDiscordResult (*get_member_user)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, DiscordUserId user_id, struct DiscordUser* user); 433 | enum EDiscordResult (*get_member_metadata_value)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, DiscordUserId user_id, DiscordMetadataKey key, DiscordMetadataValue* value); 434 | enum EDiscordResult (*get_member_metadata_key)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, DiscordUserId user_id, int32_t index, DiscordMetadataKey* key); 435 | enum EDiscordResult (*member_metadata_count)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, DiscordUserId user_id, int32_t* count); 436 | void (*update_member)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, DiscordUserId user_id, struct IDiscordLobbyMemberTransaction* transaction, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 437 | void (*send_lobby_message)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, uint8_t* data, uint32_t data_length, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 438 | enum EDiscordResult (*get_search_query)(struct IDiscordLobbyManager* manager, struct IDiscordLobbySearchQuery** query); 439 | void (*search)(struct IDiscordLobbyManager* manager, struct IDiscordLobbySearchQuery* query, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 440 | void (*lobby_count)(struct IDiscordLobbyManager* manager, int32_t* count); 441 | enum EDiscordResult (*get_lobby_id)(struct IDiscordLobbyManager* manager, int32_t index, DiscordLobbyId* lobby_id); 442 | void (*connect_voice)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 443 | void (*disconnect_voice)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 444 | enum EDiscordResult (*connect_network)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id); 445 | enum EDiscordResult (*disconnect_network)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id); 446 | enum EDiscordResult (*flush_network)(struct IDiscordLobbyManager* manager); 447 | enum EDiscordResult (*open_network_channel)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, uint8_t channel_id, bool reliable); 448 | enum EDiscordResult (*send_network_message)(struct IDiscordLobbyManager* manager, DiscordLobbyId lobby_id, DiscordUserId user_id, uint8_t channel_id, uint8_t* data, uint32_t data_length); 449 | }; 450 | 451 | struct IDiscordNetworkEvents { 452 | void (*on_message)(void* event_data, DiscordNetworkPeerId peer_id, DiscordNetworkChannelId channel_id, uint8_t* data, uint32_t data_length); 453 | void (*on_route_update)(void* event_data, const char* route_data); 454 | }; 455 | 456 | struct IDiscordNetworkManager { 457 | /** 458 | * Get the local peer ID for this process. 459 | */ 460 | void (*get_peer_id)(struct IDiscordNetworkManager* manager, DiscordNetworkPeerId* peer_id); 461 | /** 462 | * Send pending network messages. 463 | */ 464 | enum EDiscordResult (*flush)(struct IDiscordNetworkManager* manager); 465 | /** 466 | * Open a connection to a remote peer. 467 | */ 468 | enum EDiscordResult (*open_peer)(struct IDiscordNetworkManager* manager, DiscordNetworkPeerId peer_id, const char* route_data); 469 | /** 470 | * Update the route data for a connected peer. 471 | */ 472 | enum EDiscordResult (*update_peer)(struct IDiscordNetworkManager* manager, DiscordNetworkPeerId peer_id, const char* route_data); 473 | /** 474 | * Close the connection to a remote peer. 475 | */ 476 | enum EDiscordResult (*close_peer)(struct IDiscordNetworkManager* manager, DiscordNetworkPeerId peer_id); 477 | /** 478 | * Open a message channel to a connected peer. 479 | */ 480 | enum EDiscordResult (*open_channel)(struct IDiscordNetworkManager* manager, DiscordNetworkPeerId peer_id, DiscordNetworkChannelId channel_id, bool reliable); 481 | /** 482 | * Close a message channel to a connected peer. 483 | */ 484 | enum EDiscordResult (*close_channel)(struct IDiscordNetworkManager* manager, DiscordNetworkPeerId peer_id, DiscordNetworkChannelId channel_id); 485 | /** 486 | * Send a message to a connected peer over an opened message channel. 487 | */ 488 | enum EDiscordResult (*send_message)(struct IDiscordNetworkManager* manager, DiscordNetworkPeerId peer_id, DiscordNetworkChannelId channel_id, uint8_t* data, uint32_t data_length); 489 | }; 490 | 491 | struct IDiscordOverlayEvents { 492 | void (*on_toggle)(void* event_data, bool locked); 493 | }; 494 | 495 | struct IDiscordOverlayManager { 496 | void (*is_enabled)(struct IDiscordOverlayManager* manager, bool* enabled); 497 | void (*is_locked)(struct IDiscordOverlayManager* manager, bool* locked); 498 | void (*set_locked)(struct IDiscordOverlayManager* manager, bool locked, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 499 | void (*open_activity_invite)(struct IDiscordOverlayManager* manager, enum EDiscordActivityActionType type, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 500 | void (*open_guild_invite)(struct IDiscordOverlayManager* manager, const char* code, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 501 | void (*open_voice_settings)(struct IDiscordOverlayManager* manager, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 502 | }; 503 | 504 | typedef void* IDiscordStorageEvents; 505 | 506 | struct IDiscordStorageManager { 507 | enum EDiscordResult (*read)(struct IDiscordStorageManager* manager, const char* name, uint8_t* data, uint32_t data_length, uint32_t* read); 508 | void (*read_async)(struct IDiscordStorageManager* manager, const char* name, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, uint8_t* data, uint32_t data_length)); 509 | void (*read_async_partial)(struct IDiscordStorageManager* manager, const char* name, uint64_t offset, uint64_t length, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, uint8_t* data, uint32_t data_length)); 510 | enum EDiscordResult (*write)(struct IDiscordStorageManager* manager, const char* name, uint8_t* data, uint32_t data_length); 511 | void (*write_async)(struct IDiscordStorageManager* manager, const char* name, uint8_t* data, uint32_t data_length, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 512 | enum EDiscordResult (*delete_)(struct IDiscordStorageManager* manager, const char* name); 513 | enum EDiscordResult (*exists)(struct IDiscordStorageManager* manager, const char* name, bool* exists); 514 | void (*count)(struct IDiscordStorageManager* manager, int32_t* count); 515 | enum EDiscordResult (*stat)(struct IDiscordStorageManager* manager, const char* name, struct DiscordFileStat* stat); 516 | enum EDiscordResult (*stat_at)(struct IDiscordStorageManager* manager, int32_t index, struct DiscordFileStat* stat); 517 | enum EDiscordResult (*get_path)(struct IDiscordStorageManager* manager, DiscordPath* path); 518 | }; 519 | 520 | struct IDiscordStoreEvents { 521 | void (*on_entitlement_create)(void* event_data, struct DiscordEntitlement* entitlement); 522 | void (*on_entitlement_delete)(void* event_data, struct DiscordEntitlement* entitlement); 523 | }; 524 | 525 | struct IDiscordStoreManager { 526 | void (*fetch_skus)(struct IDiscordStoreManager* manager, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 527 | void (*count_skus)(struct IDiscordStoreManager* manager, int32_t* count); 528 | enum EDiscordResult (*get_sku)(struct IDiscordStoreManager* manager, DiscordSnowflake sku_id, struct DiscordSku* sku); 529 | enum EDiscordResult (*get_sku_at)(struct IDiscordStoreManager* manager, int32_t index, struct DiscordSku* sku); 530 | void (*fetch_entitlements)(struct IDiscordStoreManager* manager, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 531 | void (*count_entitlements)(struct IDiscordStoreManager* manager, int32_t* count); 532 | enum EDiscordResult (*get_entitlement)(struct IDiscordStoreManager* manager, DiscordSnowflake entitlement_id, struct DiscordEntitlement* entitlement); 533 | enum EDiscordResult (*get_entitlement_at)(struct IDiscordStoreManager* manager, int32_t index, struct DiscordEntitlement* entitlement); 534 | enum EDiscordResult (*has_sku_entitlement)(struct IDiscordStoreManager* manager, DiscordSnowflake sku_id, bool* has_entitlement); 535 | void (*start_purchase)(struct IDiscordStoreManager* manager, DiscordSnowflake sku_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 536 | }; 537 | 538 | struct IDiscordVoiceEvents { 539 | void (*on_settings_update)(void* event_data); 540 | }; 541 | 542 | struct IDiscordVoiceManager { 543 | enum EDiscordResult (*get_input_mode)(struct IDiscordVoiceManager* manager, struct DiscordInputMode* input_mode); 544 | void (*set_input_mode)(struct IDiscordVoiceManager* manager, struct DiscordInputMode input_mode, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 545 | enum EDiscordResult (*is_self_mute)(struct IDiscordVoiceManager* manager, bool* mute); 546 | enum EDiscordResult (*set_self_mute)(struct IDiscordVoiceManager* manager, bool mute); 547 | enum EDiscordResult (*is_self_deaf)(struct IDiscordVoiceManager* manager, bool* deaf); 548 | enum EDiscordResult (*set_self_deaf)(struct IDiscordVoiceManager* manager, bool deaf); 549 | enum EDiscordResult (*is_local_mute)(struct IDiscordVoiceManager* manager, DiscordSnowflake user_id, bool* mute); 550 | enum EDiscordResult (*set_local_mute)(struct IDiscordVoiceManager* manager, DiscordSnowflake user_id, bool mute); 551 | enum EDiscordResult (*get_local_volume)(struct IDiscordVoiceManager* manager, DiscordSnowflake user_id, uint8_t* volume); 552 | enum EDiscordResult (*set_local_volume)(struct IDiscordVoiceManager* manager, DiscordSnowflake user_id, uint8_t volume); 553 | }; 554 | 555 | struct IDiscordAchievementEvents { 556 | void (*on_user_achievement_update)(void* event_data, struct DiscordUserAchievement* user_achievement); 557 | }; 558 | 559 | struct IDiscordAchievementManager { 560 | void (*set_user_achievement)(struct IDiscordAchievementManager* manager, DiscordSnowflake achievement_id, uint8_t percent_complete, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 561 | void (*fetch_user_achievements)(struct IDiscordAchievementManager* manager, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); 562 | void (*count_user_achievements)(struct IDiscordAchievementManager* manager, int32_t* count); 563 | enum EDiscordResult (*get_user_achievement)(struct IDiscordAchievementManager* manager, DiscordSnowflake user_achievement_id, struct DiscordUserAchievement* user_achievement); 564 | enum EDiscordResult (*get_user_achievement_at)(struct IDiscordAchievementManager* manager, int32_t index, struct DiscordUserAchievement* user_achievement); 565 | }; 566 | 567 | typedef void* IDiscordCoreEvents; 568 | 569 | struct IDiscordCore { 570 | void (*destroy)(struct IDiscordCore* core); 571 | enum EDiscordResult (*run_callbacks)(struct IDiscordCore* core); 572 | void (*set_log_hook)(struct IDiscordCore* core, enum EDiscordLogLevel min_level, void* hook_data, void (*hook)(void* hook_data, enum EDiscordLogLevel level, const char* message)); 573 | struct IDiscordApplicationManager* (*get_application_manager)(struct IDiscordCore* core); 574 | struct IDiscordUserManager* (*get_user_manager)(struct IDiscordCore* core); 575 | struct IDiscordImageManager* (*get_image_manager)(struct IDiscordCore* core); 576 | struct IDiscordActivityManager* (*get_activity_manager)(struct IDiscordCore* core); 577 | struct IDiscordRelationshipManager* (*get_relationship_manager)(struct IDiscordCore* core); 578 | struct IDiscordLobbyManager* (*get_lobby_manager)(struct IDiscordCore* core); 579 | struct IDiscordNetworkManager* (*get_network_manager)(struct IDiscordCore* core); 580 | struct IDiscordOverlayManager* (*get_overlay_manager)(struct IDiscordCore* core); 581 | struct IDiscordStorageManager* (*get_storage_manager)(struct IDiscordCore* core); 582 | struct IDiscordStoreManager* (*get_store_manager)(struct IDiscordCore* core); 583 | struct IDiscordVoiceManager* (*get_voice_manager)(struct IDiscordCore* core); 584 | struct IDiscordAchievementManager* (*get_achievement_manager)(struct IDiscordCore* core); 585 | }; 586 | 587 | struct DiscordCreateParams { 588 | DiscordClientId client_id; 589 | uint64_t flags; 590 | IDiscordCoreEvents* events; 591 | void* event_data; 592 | IDiscordApplicationEvents* application_events; 593 | DiscordVersion application_version; 594 | struct IDiscordUserEvents* user_events; 595 | DiscordVersion user_version; 596 | IDiscordImageEvents* image_events; 597 | DiscordVersion image_version; 598 | struct IDiscordActivityEvents* activity_events; 599 | DiscordVersion activity_version; 600 | struct IDiscordRelationshipEvents* relationship_events; 601 | DiscordVersion relationship_version; 602 | struct IDiscordLobbyEvents* lobby_events; 603 | DiscordVersion lobby_version; 604 | struct IDiscordNetworkEvents* network_events; 605 | DiscordVersion network_version; 606 | struct IDiscordOverlayEvents* overlay_events; 607 | DiscordVersion overlay_version; 608 | IDiscordStorageEvents* storage_events; 609 | DiscordVersion storage_version; 610 | struct IDiscordStoreEvents* store_events; 611 | DiscordVersion store_version; 612 | struct IDiscordVoiceEvents* voice_events; 613 | DiscordVersion voice_version; 614 | struct IDiscordAchievementEvents* achievement_events; 615 | DiscordVersion achievement_version; 616 | }; 617 | 618 | #ifdef __cplusplus 619 | inline 620 | #else 621 | static 622 | #endif 623 | void DiscordCreateParamsSetDefault(struct DiscordCreateParams* params) 624 | { 625 | memset(params, 0, sizeof(struct DiscordCreateParams)); 626 | params->application_version = DISCORD_APPLICATION_MANAGER_VERSION; 627 | params->user_version = DISCORD_USER_MANAGER_VERSION; 628 | params->image_version = DISCORD_IMAGE_MANAGER_VERSION; 629 | params->activity_version = DISCORD_ACTIVITY_MANAGER_VERSION; 630 | params->relationship_version = DISCORD_RELATIONSHIP_MANAGER_VERSION; 631 | params->lobby_version = DISCORD_LOBBY_MANAGER_VERSION; 632 | params->network_version = DISCORD_NETWORK_MANAGER_VERSION; 633 | params->overlay_version = DISCORD_OVERLAY_MANAGER_VERSION; 634 | params->storage_version = DISCORD_STORAGE_MANAGER_VERSION; 635 | params->store_version = DISCORD_STORE_MANAGER_VERSION; 636 | params->voice_version = DISCORD_VOICE_MANAGER_VERSION; 637 | params->achievement_version = DISCORD_ACHIEVEMENT_MANAGER_VERSION; 638 | } 639 | 640 | enum EDiscordResult DiscordCreate(DiscordVersion version, struct DiscordCreateParams* params, struct IDiscordCore** result); 641 | 642 | #ifdef __cplusplus 643 | } 644 | #endif 645 | 646 | #endif -------------------------------------------------------------------------------- /sdk/x86/discord_game_sdk.dll: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d8e7d9feb3de8482b186ae44fd1c9abb41fe2b3b3d2c7cd3a4d742ebbad30cdf 3 | size 3154744 4 | -------------------------------------------------------------------------------- /sdk/x86/discord_game_sdk.dll.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-unlight/node-discord-game/1b34e09fb26d1b54b1b7f796eb80e7941b4014e3/sdk/x86/discord_game_sdk.dll.lib -------------------------------------------------------------------------------- /sdk/x86_64/discord_game_sdk.bundle: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:57ec2f8882a1a552aaf826af98dd42621d11cef01a5e3e499e082a51c60dde8c 3 | size 4130000 4 | -------------------------------------------------------------------------------- /sdk/x86_64/discord_game_sdk.dll: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:527768710ddb0953fce5eb1700c2566b6451135d76f1d0610b63907cd5ba94c5 3 | size 3891512 4 | -------------------------------------------------------------------------------- /sdk/x86_64/discord_game_sdk.dll.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-unlight/node-discord-game/1b34e09fb26d1b54b1b7f796eb80e7941b4014e3/sdk/x86_64/discord_game_sdk.dll.lib -------------------------------------------------------------------------------- /sdk/x86_64/discord_game_sdk.dylib: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:57ec2f8882a1a552aaf826af98dd42621d11cef01a5e3e499e082a51c60dde8c 3 | size 4130000 4 | -------------------------------------------------------------------------------- /sdk/x86_64/discord_game_sdk.so: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f52f9a7f9358f07a18e65a9e26a2943caf73cd681b2fea015c95a32e4239eb17 3 | size 7122200 4 | -------------------------------------------------------------------------------- /src/activity.c: -------------------------------------------------------------------------------- 1 | #include "activity.h" 2 | 3 | void OnActivityUpdated(void* data, enum EDiscordResult result) { 4 | Promise *promise = data; 5 | napi_value undefined; 6 | napi_get_undefined(promise->env, &undefined); 7 | 8 | if (result == DiscordResult_Ok) { 9 | napi_resolve_deferred(promise->env, promise->deferred, undefined); 10 | } else { 11 | napi_value result; 12 | NAPI_REQUIRE(napi_create_uint32(promise->env, (uint32_t)sizeof(result), &result)); 13 | napi_reject_deferred(promise->env, promise->deferred, result); 14 | } 15 | 16 | promise->env = NULL; 17 | promise->deferred = NULL; 18 | free(promise); 19 | } 20 | 21 | void SetActivityAssets(napi_env env, napi_value assets, struct DiscordActivity* activity) { 22 | NAPI_HAS_PROPERTY_DO(assets, largeImage) { 23 | napi_value large_image; 24 | NAPI_REQUIRE(napi_get_named_property(env, assets, "largeImage", &large_image)); 25 | NAPI_REQUIRE(napi_get_value_string_utf8(env, large_image, activity->assets.large_image, 0, NULL)); 26 | } 27 | 28 | NAPI_HAS_PROPERTY_DO(assets, largeText) { 29 | napi_value large_text; 30 | NAPI_REQUIRE(napi_get_named_property(env, assets, "largeText", &large_text)); 31 | NAPI_REQUIRE(napi_get_value_string_utf8(env, large_text, activity->assets.large_text, 0, NULL)); 32 | } 33 | 34 | NAPI_HAS_PROPERTY_DO(assets, smallImage) { 35 | napi_value small_image; 36 | NAPI_REQUIRE(napi_get_named_property(env, assets, "smallImage", &small_image)); 37 | NAPI_REQUIRE(napi_get_value_string_utf8(env, small_image, activity->assets.small_image, 0, NULL)); 38 | } 39 | 40 | NAPI_HAS_PROPERTY_DO(assets, smallText) { 41 | napi_value small_text; 42 | NAPI_REQUIRE(napi_get_named_property(env, assets, "smallText", &small_text)); 43 | NAPI_REQUIRE(napi_get_value_string_utf8(env, small_text, activity->assets.small_text, 0, NULL)); 44 | } 45 | } 46 | 47 | void SetActivityTimestamps(napi_env env, napi_value timestamps, struct DiscordActivity* activity) { 48 | NAPI_HAS_PROPERTY_DO(timestamps, startAt) { 49 | napi_value start_at; 50 | double start_timestamp; 51 | NAPI_REQUIRE(napi_get_named_property(env, timestamps, "startAt", &start_at)); 52 | NAPI_REQUIRE(napi_get_date_value(env, start_at, &start_timestamp)); 53 | activity->timestamps.start = (unsigned long)start_timestamp; 54 | } 55 | 56 | NAPI_HAS_PROPERTY_DO(timestamps, endAt) { 57 | napi_value end_at; 58 | double end_timestamp; 59 | NAPI_REQUIRE(napi_get_named_property(env, timestamps, "endAt", &end_at)); 60 | NAPI_REQUIRE(napi_get_date_value(env, end_at, &end_timestamp)); 61 | activity->timestamps.end = (unsigned long)end_timestamp; 62 | } 63 | } 64 | 65 | void SetActivitySecrets(napi_env env, napi_value secrets, struct DiscordActivity* activity) { 66 | NAPI_HAS_PROPERTY_DO(secrets, match) { 67 | napi_value match; 68 | NAPI_REQUIRE(napi_get_named_property(env, secrets, "match", &match)); 69 | NAPI_REQUIRE(napi_get_value_string_utf8(env, match, activity->secrets.match, 0, NULL)); 70 | } 71 | 72 | NAPI_HAS_PROPERTY_DO(secrets, join) { 73 | napi_value join; 74 | NAPI_REQUIRE(napi_get_named_property(env, secrets, "join", &join)); 75 | NAPI_REQUIRE(napi_get_value_string_utf8(env, join, activity->secrets.join, 0, NULL)); 76 | } 77 | 78 | NAPI_HAS_PROPERTY_DO(secrets, spectate) { 79 | napi_value spectate; 80 | NAPI_REQUIRE(napi_get_named_property(env, secrets, "spectate", &spectate)); 81 | NAPI_REQUIRE(napi_get_value_string_utf8(env, spectate, activity->secrets.spectate, 0, NULL)); 82 | } 83 | } 84 | 85 | void SetActivityParty(napi_env env, napi_value party, struct DiscordActivity* activity) { 86 | NAPI_HAS_PROPERTY_DO(party, id) { 87 | napi_value id; 88 | NAPI_REQUIRE(napi_get_named_property(env, party, "id", &id)); 89 | NAPI_REQUIRE(napi_get_value_string_utf8(env, id, activity->party.id, 0, NULL)); 90 | } 91 | 92 | NAPI_HAS_PROPERTY_DO(party, currentSize) { 93 | napi_value current_size; 94 | int32_t current_size_int32; 95 | NAPI_REQUIRE(napi_get_named_property(env, party, "currentSize", ¤t_size)); 96 | NAPI_REQUIRE(napi_get_value_int32(env, current_size, ¤t_size_int32)); 97 | activity->party.size.current_size = current_size_int32; 98 | } 99 | 100 | NAPI_HAS_PROPERTY_DO(party, maxSize) { 101 | napi_value max_size; 102 | int32_t max_size_int32; 103 | NAPI_REQUIRE(napi_get_named_property(env, party, "maxSize", &max_size)); 104 | NAPI_REQUIRE(napi_get_value_int32(env, max_size, &max_size_int32)); 105 | activity->party.size.max_size = max_size_int32; 106 | } 107 | } 108 | 109 | napi_value UpdateActivity(napi_env env, napi_callback_info info) { 110 | void* data; 111 | AddonState* state; 112 | size_t argc = 1; 113 | napi_value settings; 114 | 115 | NAPI_REQUIRE(napi_get_cb_info(env, info, &argc, &settings, NULL, &data)); 116 | state = data; 117 | 118 | struct DiscordActivity activity; 119 | memset(&activity, 0, sizeof(activity)); 120 | 121 | NAPI_HAS_PROPERTY_DO(settings, details) { 122 | napi_value details; 123 | NAPI_REQUIRE(napi_get_named_property(env, settings, "details", &details)); 124 | NAPI_REQUIRE(napi_get_value_string_utf8(env, details, activity.details, 0, NULL)); 125 | } 126 | 127 | NAPI_HAS_PROPERTY_DO(settings, state) { 128 | napi_value state; 129 | NAPI_REQUIRE(napi_get_named_property(env, settings, "state", &state)); 130 | NAPI_REQUIRE(napi_get_value_string_utf8(env, state, activity.state, 0, NULL)); 131 | } 132 | 133 | NAPI_HAS_PROPERTY_DO(settings, assets) { 134 | napi_value assets; 135 | NAPI_REQUIRE(napi_get_named_property(env, settings, "assets", &assets)); 136 | SetActivityAssets(env, assets, &activity); 137 | } 138 | 139 | NAPI_HAS_PROPERTY_DO(settings, timestamps) { 140 | napi_value timestamps; 141 | NAPI_REQUIRE(napi_get_named_property(env, settings, "timestamps", ×tamps)); 142 | SetActivityTimestamps(env, timestamps, &activity); 143 | } 144 | 145 | NAPI_HAS_PROPERTY_DO(settings, secrets) { 146 | napi_value secrets; 147 | NAPI_REQUIRE(napi_get_named_property(env, settings, "secrets", &secrets)); 148 | SetActivitySecrets(env, secrets, &activity); 149 | } 150 | 151 | NAPI_HAS_PROPERTY_DO(settings, party) { 152 | napi_value party; 153 | NAPI_REQUIRE(napi_get_named_property(env, settings, "party", &party)); 154 | SetActivityParty(env, party, &activity); 155 | } 156 | 157 | napi_value ret; 158 | napi_deferred deferred; 159 | NAPI_REQUIRE(napi_create_promise(env, &deferred, &ret)); 160 | 161 | Promise *promise = malloc(sizeof(*promise)); 162 | promise->env = env; 163 | promise->deferred = deferred; 164 | promise->state = state; 165 | 166 | state->app.activities->update_activity(state->app.activities, &activity, promise, OnActivityUpdated); 167 | 168 | return ret; 169 | } 170 | 171 | void OnActivityCleared(void* data, enum EDiscordResult result) { 172 | Promise *promise = data; 173 | napi_value undefined; 174 | napi_get_undefined(promise->env, &undefined); 175 | 176 | if (result == DiscordResult_Ok) { 177 | napi_resolve_deferred(promise->env, promise->deferred, undefined); 178 | } else { 179 | napi_value result; 180 | NAPI_REQUIRE(napi_create_uint32(promise->env, (uint32_t)sizeof(result), &result)); 181 | napi_reject_deferred(promise->env, promise->deferred, result); 182 | } 183 | 184 | promise->env = NULL; 185 | promise->deferred = NULL; 186 | free(promise); 187 | } 188 | 189 | napi_value ClearActivity(napi_env env, napi_callback_info info) { 190 | void* data; 191 | AddonState* state; 192 | size_t argc = 0; 193 | napi_value argv; 194 | 195 | NAPI_REQUIRE(napi_get_cb_info(env, info, &argc, &argv, NULL, &data)); 196 | state = data; 197 | 198 | napi_value ret; 199 | napi_deferred deferred; 200 | NAPI_REQUIRE(napi_create_promise(env, &deferred, &ret)); 201 | 202 | Promise *promise = malloc(sizeof(*promise)); 203 | promise->env = env; 204 | promise->deferred = deferred; 205 | promise->state = state; 206 | 207 | state->app.activities->clear_activity(state->app.activities, promise, OnActivityCleared); 208 | 209 | return ret; 210 | } 211 | 212 | napi_value Activity_Init(napi_env env, AddonState* state) { 213 | napi_value exports; 214 | NAPI_REQUIRE(napi_create_object(env, &exports)); 215 | 216 | napi_property_descriptor desc[] = { 217 | { "update", NULL, UpdateActivity, NULL, NULL, NULL, napi_default, state }, 218 | { "clear", NULL, ClearActivity, NULL, NULL, NULL, napi_default, state }, 219 | }; 220 | 221 | NAPI_REQUIRE(napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 222 | 223 | return exports; 224 | } 225 | -------------------------------------------------------------------------------- /src/application.c: -------------------------------------------------------------------------------- 1 | #include "application.h" 2 | 3 | napi_value GetApplicationLocale(napi_env env, napi_callback_info info) { 4 | void* data; 5 | AddonState* state; 6 | 7 | NAPI_REQUIRE(napi_get_cb_info(env, info, 0, NULL, NULL, &data)); 8 | state = data; 9 | 10 | napi_value ret; 11 | if (!state->initialized) { 12 | NAPI_REQUIRE(napi_get_boolean(env, false, &ret)); 13 | return ret; 14 | } 15 | 16 | DiscordLocale current_locale; 17 | state->app.application->get_current_locale(state->app.application, ¤t_locale); 18 | 19 | NAPI_REQUIRE(napi_create_string_utf8(env, current_locale, NAPI_AUTO_LENGTH, &ret)); 20 | 21 | return ret; 22 | } 23 | 24 | napi_value GetApplicationBranch(napi_env env, napi_callback_info info) { 25 | void* data; 26 | AddonState* state; 27 | 28 | NAPI_REQUIRE(napi_get_cb_info(env, info, 0, NULL, NULL, &data)); 29 | state = data; 30 | 31 | napi_value ret; 32 | if (!state->initialized) { 33 | NAPI_REQUIRE(napi_get_boolean(env, false, &ret)); 34 | return ret; 35 | } 36 | 37 | DiscordBranch current_branch; 38 | state->app.application->get_current_branch(state->app.application, ¤t_branch); 39 | 40 | NAPI_REQUIRE(napi_create_string_utf8(env, current_branch, NAPI_AUTO_LENGTH, &ret)); 41 | 42 | return ret; 43 | } 44 | 45 | void OnOAuth2Token(void* data, enum EDiscordResult result, struct DiscordOAuth2Token* token) { 46 | Promise* promise = data; 47 | napi_value ret; 48 | if (result != DiscordResult_Ok) { 49 | NAPI_REQUIRE(napi_create_uint32(promise->env, (uint32_t)result, &ret)); 50 | NAPI_REQUIRE(napi_reject_deferred(promise->env, promise->deferred, ret)); 51 | return; 52 | } 53 | 54 | // TODO: Return OAuth2Token Object 55 | NAPI_REQUIRE(napi_create_string_utf8(promise->env, token->access_token, NAPI_AUTO_LENGTH, &ret)); 56 | NAPI_REQUIRE(napi_resolve_deferred(promise->env, promise->deferred, ret)); 57 | 58 | promise->env = NULL; 59 | promise->deferred = NULL; 60 | free(promise); 61 | } 62 | 63 | napi_value GetOAuth2Token(napi_env env, napi_callback_info info) { 64 | void* data; 65 | AddonState* state; 66 | 67 | NAPI_REQUIRE(napi_get_cb_info(env, info, 0, NULL, NULL, &data)); 68 | state = data; 69 | 70 | napi_value ret; 71 | napi_deferred deferred; 72 | NAPI_REQUIRE(napi_create_promise(env, &deferred, &ret)); 73 | 74 | if (!state->initialized) { 75 | napi_value undefiend; 76 | NAPI_REQUIRE(napi_get_undefined(env, &undefiend)); 77 | NAPI_REQUIRE(napi_reject_deferred(env, deferred, undefiend)); 78 | 79 | return ret; 80 | } 81 | 82 | Promise *promise = malloc(sizeof(*promise)); 83 | 84 | promise->env = env; 85 | promise->deferred = deferred; 86 | promise->state = state; 87 | 88 | state->app.application->get_oauth2_token(state->app.application, promise, OnOAuth2Token); 89 | 90 | return ret; 91 | } 92 | 93 | napi_value Application_Init(napi_env env, AddonState* state) { 94 | napi_value exports; 95 | NAPI_REQUIRE(napi_create_object(env, &exports)); 96 | 97 | napi_property_descriptor desc[] = { 98 | { "locale", NULL, NULL, GetApplicationLocale, NULL, NULL, napi_default, state }, 99 | { "branch", NULL, NULL, GetApplicationBranch, NULL, NULL, napi_default, state }, 100 | { "getOAuth2Token", NULL, GetOAuth2Token, NULL, NULL, NULL, napi_default, state } 101 | }; 102 | 103 | NAPI_REQUIRE(napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 104 | 105 | return exports; 106 | } 107 | -------------------------------------------------------------------------------- /src/discord_game.c: -------------------------------------------------------------------------------- 1 | #include "discord_game.h" 2 | 3 | static void Destroy(napi_env env, void* data, void* hint) { 4 | if (!data) { 5 | return; 6 | } 7 | 8 | AddonState* state = (AddonState*)data; 9 | Application *app = &state->app; 10 | 11 | if (state->initialized && app->core) { 12 | app->core->destroy(app->core); 13 | } 14 | 15 | free(state); 16 | } 17 | 18 | napi_value RunCallback(napi_env env, napi_callback_info info) { 19 | void *data; 20 | AddonState *state; 21 | napi_value ret; 22 | 23 | NAPI_REQUIRE(napi_get_cb_info(env, info, 0, NULL, NULL, &data)); 24 | state = data; 25 | 26 | if (!state->initialized) { 27 | NAPI_REQUIRE(napi_get_boolean(env, false, &ret)); 28 | return ret; 29 | } 30 | 31 | enum EDiscordResult result; 32 | result = state->app.core->run_callbacks(state->app.core); 33 | 34 | if (result != DiscordResult_Ok) { 35 | NAPI_REQUIRE(napi_get_boolean(env, false, &ret)); 36 | return ret; 37 | } 38 | 39 | NAPI_REQUIRE(napi_get_boolean(env, true, &ret)); 40 | return ret; 41 | } 42 | 43 | napi_value Create(napi_env env, napi_callback_info info) { 44 | size_t argc = 2; 45 | napi_value argv[2]; 46 | napi_value ret; 47 | void* data; 48 | AddonState *state; 49 | 50 | NAPI_REQUIRE(napi_get_cb_info(env, info, &argc, argv, NULL, &data)); 51 | 52 | char c; 53 | bool is_required; 54 | char raw_app_id[64]; 55 | int64_t app_id; 56 | NAPI_REQUIRE(napi_get_value_string_utf8(env, argv[0], raw_app_id, 0, NULL)); 57 | NAPI_REQUIRE(napi_get_value_bool(env, argv[1], &is_required)); 58 | 59 | int app_id_convert_success = sscanf(raw_app_id, "%" SCNi64 "%c", &app_id, &c); 60 | if (!app_id_convert_success) { 61 | NAPI_REQUIRE(napi_get_boolean(env, false, &ret)); 62 | return ret; 63 | } 64 | 65 | state = data; 66 | memset(&state->app, 0, sizeof(state->app)); 67 | memset(&state->users_events, 0, sizeof(state->users_events)); 68 | memset(&state->activities_events, 0, sizeof(state->activities_events)); 69 | memset(&state->relationships_events, 0, sizeof(state->relationships_events)); 70 | 71 | // Register Events 72 | // TODO 73 | // state->users_events.on_current_user_update = OnUserUpdated; 74 | // state->relationships_events.on_refresh = OnRelationshipsRefresh; 75 | 76 | Application *app = &state->app; 77 | 78 | 79 | struct DiscordCreateParams params; 80 | DiscordCreateParamsSetDefault(¶ms); 81 | params.client_id = (DiscordClientId)app_id; 82 | params.flags = is_required ? DiscordCreateFlags_Default : DiscordCreateFlags_NoRequireDiscord; 83 | params.event_data = state; 84 | params.activity_events = &state->activities_events; 85 | params.relationship_events = &state->relationships_events; 86 | params.user_events = &state->users_events; 87 | 88 | enum EDiscordResult result; 89 | result = DiscordCreate(DISCORD_VERSION, ¶ms, &app->core); 90 | 91 | if (result != DiscordResult_Ok) { 92 | NAPI_REQUIRE(napi_get_boolean(env, false, &ret)); 93 | return ret; 94 | } 95 | 96 | app->users = app->core->get_user_manager(app->core); 97 | app->achievements = app->core->get_achievement_manager(app->core); 98 | app->activities = app->core->get_activity_manager(app->core); 99 | app->application = app->core->get_application_manager(app->core); 100 | app->lobbies = app->core->get_lobby_manager(app->core); 101 | app->relationships = app->core->get_relationship_manager(app->core); 102 | 103 | state->initialized = true; 104 | 105 | NAPI_REQUIRE(napi_get_boolean(env, true, &ret)); 106 | return ret; 107 | } 108 | 109 | napi_value Init(napi_env env, napi_value exports) 110 | { 111 | // Setup Module State 112 | AddonState* state = malloc(sizeof(*state)); 113 | state->initialized = false; 114 | napi_wrap(env, exports, state, Destroy, NULL, NULL); 115 | 116 | // Setup Objects 117 | napi_value version, 118 | application, 119 | activity; 120 | NAPI_REQUIRE(napi_create_uint32(env, DISCORD_VERSION, &version)); 121 | application = Application_Init(env, state); 122 | activity = Activity_Init(env, state); 123 | 124 | napi_property_descriptor desc[] = { 125 | { "version", NULL, NULL, NULL, NULL, version, napi_default, NULL }, 126 | { "create", NULL, Create, NULL, NULL, NULL, napi_default, state }, 127 | { "runCallback", NULL, RunCallback, NULL, NULL, NULL, napi_default, state }, 128 | { "Application", NULL, NULL, NULL, NULL, application, napi_default, NULL }, 129 | { "Activity", NULL, NULL, NULL, NULL, activity, napi_default, NULL } 130 | }; 131 | 132 | NAPI_REQUIRE(napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 133 | 134 | return exports; 135 | } 136 | 137 | NAPI_MODULE(NODE_GYP_MODULE_NAME, Init) 138 | -------------------------------------------------------------------------------- /test/application.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const Discord = require('../'); 3 | 4 | describe('Application', () => { 5 | describe('branch', () => { 6 | it('should be false', () => { 7 | assert.equal(false, Discord.Application.branch); 8 | }); 9 | 10 | // TODO: Test with Discord created status 11 | }); 12 | 13 | describe('locale', () => { 14 | it('should be false', () => { 15 | assert.equal(false, Discord.Application.locale); 16 | }); 17 | 18 | // TODO: Test with Discord created status 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /test/discord.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const Discord = require('../'); 3 | 4 | describe('Discord', () => { 5 | describe('version', () => { 6 | it('should be 2', () => { 7 | assert.equal(2, Discord.version); 8 | }); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /types/discord_game.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for Discord Game 2 | // Project: Open Unlight 3 | // Definitions by: Aotokitsuruya 4 | 5 | /** 6 | * Discord Main Function 7 | */ 8 | export as namespace Discord; 9 | 10 | export const version: number; 11 | export function create(appId: string); 12 | export function runCallback(): boolean; 13 | 14 | /** 15 | * Application 16 | */ 17 | 18 | export namespace Application { 19 | export const locale: string; 20 | export const branch: string; 21 | export function getOAuth2Token(): Promise; 22 | } 23 | 24 | /** 25 | * Activity 26 | */ 27 | 28 | export namespace Activity { 29 | export interface ActivityAssets { 30 | largeImage?: string; 31 | largeText?: string; 32 | smallImage?: string; 33 | smallText?: string 34 | } 35 | 36 | export interface ActivityTimestamps { 37 | startAt?: Date; 38 | endAt?: Date; 39 | } 40 | 41 | export interface ActivitySecrets { 42 | match?: string; 43 | join?: string; 44 | spectate?: string; 45 | } 46 | 47 | export interface ActivityParty { 48 | id?: string; 49 | currentSize?: number; 50 | maxSize?: number; 51 | } 52 | 53 | export interface Activity { 54 | state?: string; 55 | details?: string; 56 | assets?: ActivityAssets; 57 | timestamps?: ActivityTimestamps; 58 | secrets?: ActivitySecrets; 59 | party?: ActivityParty; 60 | } 61 | export function update(activity: Activity): Promise; 62 | export function clear(): Promise; 63 | } 64 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/color-name@^1.1.1": 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 8 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 9 | 10 | ansi-colors@4.1.1: 11 | version "4.1.1" 12 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 13 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 14 | 15 | ansi-regex@^3.0.0: 16 | version "3.0.0" 17 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 18 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 19 | 20 | ansi-regex@^4.1.0: 21 | version "4.1.0" 22 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 23 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 24 | 25 | ansi-styles@^3.2.0: 26 | version "3.2.1" 27 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 28 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 29 | dependencies: 30 | color-convert "^1.9.0" 31 | 32 | ansi-styles@^4.1.0: 33 | version "4.2.1" 34 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 35 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 36 | dependencies: 37 | "@types/color-name" "^1.1.1" 38 | color-convert "^2.0.1" 39 | 40 | anymatch@~3.1.1: 41 | version "3.1.1" 42 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 43 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 44 | dependencies: 45 | normalize-path "^3.0.0" 46 | picomatch "^2.0.4" 47 | 48 | argparse@^1.0.7: 49 | version "1.0.10" 50 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 51 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 52 | dependencies: 53 | sprintf-js "~1.0.2" 54 | 55 | array.prototype.map@^1.0.1: 56 | version "1.0.2" 57 | resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.2.tgz#9a4159f416458a23e9483078de1106b2ef68f8ec" 58 | integrity sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw== 59 | dependencies: 60 | define-properties "^1.1.3" 61 | es-abstract "^1.17.0-next.1" 62 | es-array-method-boxes-properly "^1.0.0" 63 | is-string "^1.0.4" 64 | 65 | balanced-match@^1.0.0: 66 | version "1.0.0" 67 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 68 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 69 | 70 | binary-extensions@^2.0.0: 71 | version "2.1.0" 72 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" 73 | integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== 74 | 75 | bindings@^1.5.0: 76 | version "1.5.0" 77 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" 78 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 79 | dependencies: 80 | file-uri-to-path "1.0.0" 81 | 82 | brace-expansion@^1.1.7: 83 | version "1.1.11" 84 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 85 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 86 | dependencies: 87 | balanced-match "^1.0.0" 88 | concat-map "0.0.1" 89 | 90 | braces@~3.0.2: 91 | version "3.0.2" 92 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 93 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 94 | dependencies: 95 | fill-range "^7.0.1" 96 | 97 | browser-stdout@1.3.1: 98 | version "1.3.1" 99 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 100 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 101 | 102 | camelcase@^5.0.0, camelcase@^5.3.1: 103 | version "5.3.1" 104 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 105 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 106 | 107 | chalk@^4.0.0: 108 | version "4.1.0" 109 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 110 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 111 | dependencies: 112 | ansi-styles "^4.1.0" 113 | supports-color "^7.1.0" 114 | 115 | chokidar@3.4.2: 116 | version "3.4.2" 117 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" 118 | integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== 119 | dependencies: 120 | anymatch "~3.1.1" 121 | braces "~3.0.2" 122 | glob-parent "~5.1.0" 123 | is-binary-path "~2.1.0" 124 | is-glob "~4.0.1" 125 | normalize-path "~3.0.0" 126 | readdirp "~3.4.0" 127 | optionalDependencies: 128 | fsevents "~2.1.2" 129 | 130 | cliui@^5.0.0: 131 | version "5.0.0" 132 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 133 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 134 | dependencies: 135 | string-width "^3.1.0" 136 | strip-ansi "^5.2.0" 137 | wrap-ansi "^5.1.0" 138 | 139 | color-convert@^1.9.0: 140 | version "1.9.3" 141 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 142 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 143 | dependencies: 144 | color-name "1.1.3" 145 | 146 | color-convert@^2.0.1: 147 | version "2.0.1" 148 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 149 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 150 | dependencies: 151 | color-name "~1.1.4" 152 | 153 | color-name@1.1.3: 154 | version "1.1.3" 155 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 156 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 157 | 158 | color-name@~1.1.4: 159 | version "1.1.4" 160 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 161 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 162 | 163 | concat-map@0.0.1: 164 | version "0.0.1" 165 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 166 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 167 | 168 | debug@4.1.1: 169 | version "4.1.1" 170 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 171 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 172 | dependencies: 173 | ms "^2.1.1" 174 | 175 | decamelize@^1.2.0: 176 | version "1.2.0" 177 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 178 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 179 | 180 | define-properties@^1.1.2, define-properties@^1.1.3: 181 | version "1.1.3" 182 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 183 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 184 | dependencies: 185 | object-keys "^1.0.12" 186 | 187 | diff@4.0.2: 188 | version "4.0.2" 189 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 190 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 191 | 192 | emoji-regex@^7.0.1: 193 | version "7.0.3" 194 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 195 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 196 | 197 | es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: 198 | version "1.17.6" 199 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" 200 | integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== 201 | dependencies: 202 | es-to-primitive "^1.2.1" 203 | function-bind "^1.1.1" 204 | has "^1.0.3" 205 | has-symbols "^1.0.1" 206 | is-callable "^1.2.0" 207 | is-regex "^1.1.0" 208 | object-inspect "^1.7.0" 209 | object-keys "^1.1.1" 210 | object.assign "^4.1.0" 211 | string.prototype.trimend "^1.0.1" 212 | string.prototype.trimstart "^1.0.1" 213 | 214 | es-array-method-boxes-properly@^1.0.0: 215 | version "1.0.0" 216 | resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" 217 | integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== 218 | 219 | es-get-iterator@^1.0.2: 220 | version "1.1.0" 221 | resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" 222 | integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== 223 | dependencies: 224 | es-abstract "^1.17.4" 225 | has-symbols "^1.0.1" 226 | is-arguments "^1.0.4" 227 | is-map "^2.0.1" 228 | is-set "^2.0.1" 229 | is-string "^1.0.5" 230 | isarray "^2.0.5" 231 | 232 | es-to-primitive@^1.2.1: 233 | version "1.2.1" 234 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 235 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 236 | dependencies: 237 | is-callable "^1.1.4" 238 | is-date-object "^1.0.1" 239 | is-symbol "^1.0.2" 240 | 241 | escape-string-regexp@4.0.0: 242 | version "4.0.0" 243 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 244 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 245 | 246 | esprima@^4.0.0: 247 | version "4.0.1" 248 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 249 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 250 | 251 | file-uri-to-path@1.0.0: 252 | version "1.0.0" 253 | resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" 254 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 255 | 256 | fill-range@^7.0.1: 257 | version "7.0.1" 258 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 259 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 260 | dependencies: 261 | to-regex-range "^5.0.1" 262 | 263 | find-up@5.0.0: 264 | version "5.0.0" 265 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 266 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 267 | dependencies: 268 | locate-path "^6.0.0" 269 | path-exists "^4.0.0" 270 | 271 | find-up@^3.0.0: 272 | version "3.0.0" 273 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 274 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 275 | dependencies: 276 | locate-path "^3.0.0" 277 | 278 | flat@^4.1.0: 279 | version "4.1.0" 280 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 281 | integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== 282 | dependencies: 283 | is-buffer "~2.0.3" 284 | 285 | fs.realpath@^1.0.0: 286 | version "1.0.0" 287 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 288 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 289 | 290 | fsevents@~2.1.2: 291 | version "2.1.3" 292 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 293 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 294 | 295 | function-bind@^1.1.1: 296 | version "1.1.1" 297 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 298 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 299 | 300 | get-caller-file@^2.0.1: 301 | version "2.0.5" 302 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 303 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 304 | 305 | glob-parent@~5.1.0: 306 | version "5.1.1" 307 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 308 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 309 | dependencies: 310 | is-glob "^4.0.1" 311 | 312 | glob@7.1.6: 313 | version "7.1.6" 314 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 315 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 316 | dependencies: 317 | fs.realpath "^1.0.0" 318 | inflight "^1.0.4" 319 | inherits "2" 320 | minimatch "^3.0.4" 321 | once "^1.3.0" 322 | path-is-absolute "^1.0.0" 323 | 324 | growl@1.10.5: 325 | version "1.10.5" 326 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 327 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 328 | 329 | has-flag@^4.0.0: 330 | version "4.0.0" 331 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 332 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 333 | 334 | has-symbols@^1.0.0: 335 | version "1.0.0" 336 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 337 | integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 338 | 339 | has-symbols@^1.0.1: 340 | version "1.0.1" 341 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 342 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 343 | 344 | has@^1.0.3: 345 | version "1.0.3" 346 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 347 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 348 | dependencies: 349 | function-bind "^1.1.1" 350 | 351 | he@1.2.0: 352 | version "1.2.0" 353 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 354 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 355 | 356 | inflight@^1.0.4: 357 | version "1.0.6" 358 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 359 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 360 | dependencies: 361 | once "^1.3.0" 362 | wrappy "1" 363 | 364 | inherits@2: 365 | version "2.0.4" 366 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 367 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 368 | 369 | is-arguments@^1.0.4: 370 | version "1.0.4" 371 | resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" 372 | integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== 373 | 374 | is-binary-path@~2.1.0: 375 | version "2.1.0" 376 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 377 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 378 | dependencies: 379 | binary-extensions "^2.0.0" 380 | 381 | is-buffer@~2.0.3: 382 | version "2.0.4" 383 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" 384 | integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== 385 | 386 | is-callable@^1.1.4: 387 | version "1.1.4" 388 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 389 | integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 390 | 391 | is-callable@^1.2.0: 392 | version "1.2.0" 393 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" 394 | integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== 395 | 396 | is-date-object@^1.0.1: 397 | version "1.0.1" 398 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 399 | integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 400 | 401 | is-extglob@^2.1.1: 402 | version "2.1.1" 403 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 404 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 405 | 406 | is-fullwidth-code-point@^2.0.0: 407 | version "2.0.0" 408 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 409 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 410 | 411 | is-glob@^4.0.1, is-glob@~4.0.1: 412 | version "4.0.1" 413 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 414 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 415 | dependencies: 416 | is-extglob "^2.1.1" 417 | 418 | is-map@^2.0.1: 419 | version "2.0.1" 420 | resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" 421 | integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== 422 | 423 | is-number@^7.0.0: 424 | version "7.0.0" 425 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 426 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 427 | 428 | is-plain-obj@^1.1.0: 429 | version "1.1.0" 430 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 431 | integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= 432 | 433 | is-regex@^1.1.0: 434 | version "1.1.1" 435 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" 436 | integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== 437 | dependencies: 438 | has-symbols "^1.0.1" 439 | 440 | is-set@^2.0.1: 441 | version "2.0.1" 442 | resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" 443 | integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== 444 | 445 | is-string@^1.0.4, is-string@^1.0.5: 446 | version "1.0.5" 447 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 448 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== 449 | 450 | is-symbol@^1.0.2: 451 | version "1.0.2" 452 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 453 | integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 454 | dependencies: 455 | has-symbols "^1.0.0" 456 | 457 | isarray@^2.0.5: 458 | version "2.0.5" 459 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" 460 | integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== 461 | 462 | isexe@^2.0.0: 463 | version "2.0.0" 464 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 465 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 466 | 467 | iterate-iterator@^1.0.1: 468 | version "1.0.1" 469 | resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" 470 | integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== 471 | 472 | iterate-value@^1.0.0: 473 | version "1.0.2" 474 | resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" 475 | integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== 476 | dependencies: 477 | es-get-iterator "^1.0.2" 478 | iterate-iterator "^1.0.1" 479 | 480 | js-yaml@3.14.0: 481 | version "3.14.0" 482 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" 483 | integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== 484 | dependencies: 485 | argparse "^1.0.7" 486 | esprima "^4.0.0" 487 | 488 | locate-path@^3.0.0: 489 | version "3.0.0" 490 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 491 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 492 | dependencies: 493 | p-locate "^3.0.0" 494 | path-exists "^3.0.0" 495 | 496 | locate-path@^6.0.0: 497 | version "6.0.0" 498 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 499 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 500 | dependencies: 501 | p-locate "^5.0.0" 502 | 503 | log-symbols@4.0.0: 504 | version "4.0.0" 505 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" 506 | integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== 507 | dependencies: 508 | chalk "^4.0.0" 509 | 510 | minimatch@3.0.4, minimatch@^3.0.4: 511 | version "3.0.4" 512 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 513 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 514 | dependencies: 515 | brace-expansion "^1.1.7" 516 | 517 | mocha@^8.1.3: 518 | version "8.1.3" 519 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.1.3.tgz#5e93f873e35dfdd69617ea75f9c68c2ca61c2ac5" 520 | integrity sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw== 521 | dependencies: 522 | ansi-colors "4.1.1" 523 | browser-stdout "1.3.1" 524 | chokidar "3.4.2" 525 | debug "4.1.1" 526 | diff "4.0.2" 527 | escape-string-regexp "4.0.0" 528 | find-up "5.0.0" 529 | glob "7.1.6" 530 | growl "1.10.5" 531 | he "1.2.0" 532 | js-yaml "3.14.0" 533 | log-symbols "4.0.0" 534 | minimatch "3.0.4" 535 | ms "2.1.2" 536 | object.assign "4.1.0" 537 | promise.allsettled "1.0.2" 538 | serialize-javascript "4.0.0" 539 | strip-json-comments "3.0.1" 540 | supports-color "7.1.0" 541 | which "2.0.2" 542 | wide-align "1.1.3" 543 | workerpool "6.0.0" 544 | yargs "13.3.2" 545 | yargs-parser "13.1.2" 546 | yargs-unparser "1.6.1" 547 | 548 | ms@2.1.2, ms@^2.1.1: 549 | version "2.1.2" 550 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 551 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 552 | 553 | normalize-path@^3.0.0, normalize-path@~3.0.0: 554 | version "3.0.0" 555 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 556 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 557 | 558 | object-inspect@^1.7.0: 559 | version "1.8.0" 560 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" 561 | integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== 562 | 563 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 564 | version "1.1.1" 565 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 566 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 567 | 568 | object.assign@4.1.0, object.assign@^4.1.0: 569 | version "4.1.0" 570 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 571 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 572 | dependencies: 573 | define-properties "^1.1.2" 574 | function-bind "^1.1.1" 575 | has-symbols "^1.0.0" 576 | object-keys "^1.0.11" 577 | 578 | once@^1.3.0: 579 | version "1.4.0" 580 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 581 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 582 | dependencies: 583 | wrappy "1" 584 | 585 | p-limit@^2.0.0: 586 | version "2.2.1" 587 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" 588 | integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== 589 | dependencies: 590 | p-try "^2.0.0" 591 | 592 | p-limit@^3.0.2: 593 | version "3.0.2" 594 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" 595 | integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== 596 | dependencies: 597 | p-try "^2.0.0" 598 | 599 | p-locate@^3.0.0: 600 | version "3.0.0" 601 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 602 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 603 | dependencies: 604 | p-limit "^2.0.0" 605 | 606 | p-locate@^5.0.0: 607 | version "5.0.0" 608 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 609 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 610 | dependencies: 611 | p-limit "^3.0.2" 612 | 613 | p-try@^2.0.0: 614 | version "2.2.0" 615 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 616 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 617 | 618 | path-exists@^3.0.0: 619 | version "3.0.0" 620 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 621 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 622 | 623 | path-exists@^4.0.0: 624 | version "4.0.0" 625 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 626 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 627 | 628 | path-is-absolute@^1.0.0: 629 | version "1.0.1" 630 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 631 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 632 | 633 | picomatch@^2.0.4, picomatch@^2.2.1: 634 | version "2.2.2" 635 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 636 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 637 | 638 | promise.allsettled@1.0.2: 639 | version "1.0.2" 640 | resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9" 641 | integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg== 642 | dependencies: 643 | array.prototype.map "^1.0.1" 644 | define-properties "^1.1.3" 645 | es-abstract "^1.17.0-next.1" 646 | function-bind "^1.1.1" 647 | iterate-value "^1.0.0" 648 | 649 | randombytes@^2.1.0: 650 | version "2.1.0" 651 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 652 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 653 | dependencies: 654 | safe-buffer "^5.1.0" 655 | 656 | readdirp@~3.4.0: 657 | version "3.4.0" 658 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" 659 | integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== 660 | dependencies: 661 | picomatch "^2.2.1" 662 | 663 | require-directory@^2.1.1: 664 | version "2.1.1" 665 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 666 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 667 | 668 | require-main-filename@^2.0.0: 669 | version "2.0.0" 670 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 671 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 672 | 673 | safe-buffer@^5.1.0: 674 | version "5.2.1" 675 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 676 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 677 | 678 | serialize-javascript@4.0.0: 679 | version "4.0.0" 680 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" 681 | integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== 682 | dependencies: 683 | randombytes "^2.1.0" 684 | 685 | set-blocking@^2.0.0: 686 | version "2.0.0" 687 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 688 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 689 | 690 | sprintf-js@~1.0.2: 691 | version "1.0.3" 692 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 693 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 694 | 695 | "string-width@^1.0.2 || 2": 696 | version "2.1.1" 697 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 698 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 699 | dependencies: 700 | is-fullwidth-code-point "^2.0.0" 701 | strip-ansi "^4.0.0" 702 | 703 | string-width@^3.0.0, string-width@^3.1.0: 704 | version "3.1.0" 705 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 706 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 707 | dependencies: 708 | emoji-regex "^7.0.1" 709 | is-fullwidth-code-point "^2.0.0" 710 | strip-ansi "^5.1.0" 711 | 712 | string.prototype.trimend@^1.0.1: 713 | version "1.0.1" 714 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 715 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 716 | dependencies: 717 | define-properties "^1.1.3" 718 | es-abstract "^1.17.5" 719 | 720 | string.prototype.trimstart@^1.0.1: 721 | version "1.0.1" 722 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 723 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 724 | dependencies: 725 | define-properties "^1.1.3" 726 | es-abstract "^1.17.5" 727 | 728 | strip-ansi@^4.0.0: 729 | version "4.0.0" 730 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 731 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 732 | dependencies: 733 | ansi-regex "^3.0.0" 734 | 735 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 736 | version "5.2.0" 737 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 738 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 739 | dependencies: 740 | ansi-regex "^4.1.0" 741 | 742 | strip-json-comments@3.0.1: 743 | version "3.0.1" 744 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" 745 | integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== 746 | 747 | supports-color@7.1.0: 748 | version "7.1.0" 749 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 750 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 751 | dependencies: 752 | has-flag "^4.0.0" 753 | 754 | supports-color@^7.1.0: 755 | version "7.2.0" 756 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 757 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 758 | dependencies: 759 | has-flag "^4.0.0" 760 | 761 | to-regex-range@^5.0.1: 762 | version "5.0.1" 763 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 764 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 765 | dependencies: 766 | is-number "^7.0.0" 767 | 768 | which-module@^2.0.0: 769 | version "2.0.0" 770 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 771 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 772 | 773 | which@2.0.2: 774 | version "2.0.2" 775 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 776 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 777 | dependencies: 778 | isexe "^2.0.0" 779 | 780 | wide-align@1.1.3: 781 | version "1.1.3" 782 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 783 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 784 | dependencies: 785 | string-width "^1.0.2 || 2" 786 | 787 | workerpool@6.0.0: 788 | version "6.0.0" 789 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.0.tgz#85aad67fa1a2c8ef9386a1b43539900f61d03d58" 790 | integrity sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA== 791 | 792 | wrap-ansi@^5.1.0: 793 | version "5.1.0" 794 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 795 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 796 | dependencies: 797 | ansi-styles "^3.2.0" 798 | string-width "^3.0.0" 799 | strip-ansi "^5.0.0" 800 | 801 | wrappy@1: 802 | version "1.0.2" 803 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 804 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 805 | 806 | y18n@^4.0.0: 807 | version "4.0.1" 808 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" 809 | integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== 810 | 811 | yargs-parser@13.1.2, yargs-parser@^13.1.2: 812 | version "13.1.2" 813 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 814 | integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== 815 | dependencies: 816 | camelcase "^5.0.0" 817 | decamelize "^1.2.0" 818 | 819 | yargs-parser@^15.0.1: 820 | version "15.0.1" 821 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" 822 | integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== 823 | dependencies: 824 | camelcase "^5.0.0" 825 | decamelize "^1.2.0" 826 | 827 | yargs-unparser@1.6.1: 828 | version "1.6.1" 829 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.1.tgz#bd4b0ee05b4c94d058929c32cb09e3fce71d3c5f" 830 | integrity sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA== 831 | dependencies: 832 | camelcase "^5.3.1" 833 | decamelize "^1.2.0" 834 | flat "^4.1.0" 835 | is-plain-obj "^1.1.0" 836 | yargs "^14.2.3" 837 | 838 | yargs@13.3.2: 839 | version "13.3.2" 840 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 841 | integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== 842 | dependencies: 843 | cliui "^5.0.0" 844 | find-up "^3.0.0" 845 | get-caller-file "^2.0.1" 846 | require-directory "^2.1.1" 847 | require-main-filename "^2.0.0" 848 | set-blocking "^2.0.0" 849 | string-width "^3.0.0" 850 | which-module "^2.0.0" 851 | y18n "^4.0.0" 852 | yargs-parser "^13.1.2" 853 | 854 | yargs@^14.2.3: 855 | version "14.2.3" 856 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" 857 | integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== 858 | dependencies: 859 | cliui "^5.0.0" 860 | decamelize "^1.2.0" 861 | find-up "^3.0.0" 862 | get-caller-file "^2.0.1" 863 | require-directory "^2.1.1" 864 | require-main-filename "^2.0.0" 865 | set-blocking "^2.0.0" 866 | string-width "^3.0.0" 867 | which-module "^2.0.0" 868 | y18n "^4.0.0" 869 | yargs-parser "^15.0.1" 870 | --------------------------------------------------------------------------------