#ifndef _DISCORD_GAME_SDK_H_ #define _DISCORD_GAME_SDK_H_ #ifdef __cplusplus extern "C" { #endif #include #define DISCORD_VERSION 1 #define DISCORD_APPLICATION_VERSION 1 #define DISCORD_USERS_VERSION 1 #define DISCORD_IMAGES_VERSION 1 #define DISCORD_ACTIVITIES_VERSION 1 #define DISCORD_RELATIONSHIPS_VERSION 1 #define DISCORD_LOBBIES_VERSION 1 #define DISCORD_NETWORK_VERSION 1 #define DISCORD_OVERLAY_VERSION 1 #define DISCORD_STORAGE_VERSION 1 enum EDiscordResult { DiscordResult_Ok, DiscordResult_ServiceUnavailable, DiscordResult_InvalidVersion, DiscordResult_LockFailed, DiscordResult_InternalError, DiscordResult_InvalidPaylaod, DiscordResult_InvalidCommand, DiscordResult_InvalidPermissions, DiscordResult_NotFetched, DiscordResult_NotFound, DiscordResult_Conflict, DiscordResult_InvalidSecret, DiscordResult_InvalidJoinSecret, DiscordResult_NoEligibleActivity, DiscordResult_InvalidInvite, DiscordResult_NotAuthenticated, DiscordResult_InvalidAccessToken, DiscordResult_ApplicationMismatch, DiscordResult_InvalidDataUrl, DiscordResult_InvalidBase64, DiscordResult_NotFiltered, DiscordResult_LobbyFull, DiscordResult_InvalidLobbySecret, DiscordResult_InvalidFilename, DiscordResult_InvalidFileSize, DiscordResult_InvalidEntitlement, DiscordResult_NotInstalled, DiscordResult_NotRunning, }; enum EDiscordCreateFlags { DiscordCreateFlags_Default = 0, DiscordCreateFlags_NoRequireDiscord = 1, }; enum EDiscordLogLevel { DiscordLogLevel_Error = 1, DiscordLogLevel_Warn, DiscordLogLevel_Info, DiscordLogLevel_Debug, }; enum EDiscordImageType { DiscordImageType_User, }; enum EDiscordActivityType { DiscordActivityType_Playing, DiscordActivityType_Streaming, DiscordActivityType_Listening, DiscordActivityType_Watching, }; enum EDiscordActivityActionType { DiscordActivityActionType_Join = 1, DiscordActivityActionType_Spectate, }; enum EDiscordActivityJoinRequestReply { DiscordActivityJoinRequestReply_No, DiscordActivityJoinRequestReply_Yes, DiscordActivityJoinRequestReply_Ignore, }; enum EDiscordStatus { DiscordStatus_Offline = 0, DiscordStatus_Online = 1, DiscordStatus_Idle = 2, DiscordStatus_DoNotDisturb = 4, }; enum EDiscordRelationshipType { DiscordRelationshipType_None, DiscordRelationshipType_Friend, DiscordRelationshipType_Blocked, DiscordRelationshipType_PendingIncoming, DiscordRelationshipType_PendingOutgoing, DiscordRelationshipType_Implicit, }; enum EDiscordLobbyType { DiscordLobbyType_Private = 1, DiscordLobbyType_Public, }; enum EDiscordLobbySearchComparison { DiscordLobbySearchComparison_LessThanOrEqual = -2, DiscordLobbySearchComparison_LessThan, DiscordLobbySearchComparison_Equal, DiscordLobbySearchComparison_GreaterThan, DiscordLobbySearchComparison_GreaterThanOrEqual, DiscordLobbySearchComparison_NotEqual, }; enum EDiscordLobbySearchCast { DiscordLobbySearchCast_String = 1, DiscordLobbySearchCast_Number, }; typedef int64_t DiscordClientId; typedef int32_t DiscordVersion; typedef int64_t DiscordSnowflake; typedef int64_t DiscordTimestamp; typedef DiscordSnowflake DiscordUserId; typedef char DiscordUserName[256]; typedef char DiscordUserAvatar[128]; typedef char DiscordUserDiscriminator[8]; typedef char DiscordAccessToken[128]; typedef char DiscordOAuth2Scopes[1024]; typedef char DiscordLocale[128]; typedef char DiscordBranch[4096]; typedef uint8_t* DiscordImageData; typedef char DiscordImageId[128]; typedef char DiscordImageCaption[128]; typedef char DiscordPartyId[128]; typedef int32_t DiscordPartyMemberCount; typedef char DiscordSecret[128]; typedef DiscordSnowflake DiscordLobbyId; typedef char DiscordLobbySecret[128]; typedef char DiscordMetadataKey[256]; typedef char DiscordMetadataValue[4096]; typedef uint8_t* DiscordLobbyData; typedef uint64_t DiscordNetworkSessionId; typedef uint8_t DiscordNetworkChannelId; typedef uint8_t* DiscordNetworkData; typedef char DiscordStorageFileName[260]; typedef uint8_t* DiscordStorageData; struct DiscordUser { DiscordUserId id; DiscordUserName username; DiscordUserDiscriminator discriminator; DiscordUserAvatar avatar; int bot; }; struct DiscordOAuth2Token { DiscordAccessToken access_token; DiscordOAuth2Scopes scopes; DiscordTimestamp expires; }; struct DiscordImageHandle { enum EDiscordImageType type; int64_t id; uint32_t size; }; struct DiscordImageDimensions { uint32_t width; uint32_t height; }; struct DiscordActivityTimestamps { DiscordTimestamp start; DiscordTimestamp end; }; struct DiscordActivityAssets { DiscordImageId large_image; DiscordImageCaption large_text; DiscordImageId small_image; DiscordImageCaption small_text; }; struct DiscordPartySize { DiscordPartyMemberCount current_size; DiscordPartyMemberCount max_size; }; struct DiscordActivityParty { DiscordPartyId id; struct DiscordPartySize size; }; struct DiscordActivitySecrets { DiscordSecret match; DiscordSecret join; DiscordSecret spectate; }; struct DiscordActivity { enum EDiscordActivityType type; char name[128]; char state[128]; char details[128]; struct DiscordActivityTimestamps timestamps; struct DiscordActivityAssets assets; struct DiscordActivityParty party; struct DiscordActivitySecrets secrets; int instance; }; struct DiscordPresence { enum EDiscordStatus status; struct DiscordActivity activity; }; struct DiscordRelationship { enum EDiscordRelationshipType type; struct DiscordUser user; struct DiscordPresence presence; }; struct DiscordLobby { DiscordLobbyId id; enum EDiscordLobbyType type; DiscordSnowflake owner_id; DiscordLobbySecret secret; uint32_t capacity; }; struct DiscordFileStat { DiscordStorageFileName filename; uint64_t size; uint64_t last_modified; }; struct IDiscordLobbyTransaction { enum EDiscordResult (*set_type)(struct IDiscordLobbyTransaction* lobby_transaction, enum EDiscordLobbyType type); enum EDiscordResult (*set_owner)(struct IDiscordLobbyTransaction* lobby_transaction, DiscordSnowflake owner_id); enum EDiscordResult (*set_capacity)(struct IDiscordLobbyTransaction* lobby_transaction, uint32_t capacity); enum EDiscordResult (*set_metadata)(struct IDiscordLobbyTransaction* lobby_transaction, DiscordMetadataKey key, DiscordMetadataValue value); enum EDiscordResult (*delete_metadata)(struct IDiscordLobbyTransaction* lobby_transaction, DiscordMetadataKey key); }; struct IDiscordLobbyMemberTransaction { enum EDiscordResult (*set_metadata)(struct IDiscordLobbyMemberTransaction* lobby_member_transaction, DiscordMetadataKey key, DiscordMetadataValue value); enum EDiscordResult (*delete_metadata)(struct IDiscordLobbyMemberTransaction* lobby_member_transaction, DiscordMetadataKey key); }; struct IDiscordLobbySearch { enum EDiscordResult (*filter)(struct IDiscordLobbySearch* lobby_search, DiscordMetadataKey key, enum EDiscordLobbySearchComparison comparison, enum EDiscordLobbySearchCast cast, DiscordMetadataValue value); enum EDiscordResult (*sort)(struct IDiscordLobbySearch* lobby_search, DiscordMetadataKey key, enum EDiscordLobbySearchCast cast, DiscordMetadataValue value); enum EDiscordResult (*limit)(struct IDiscordLobbySearch* lobby_search, uint32_t limit); }; typedef void IDiscordApplicationEvents; struct IDiscordApplication { enum EDiscordResult (*destroy)(struct IDiscordApplication* application); enum EDiscordResult (*validate_or_exit)(struct IDiscordApplication* application, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*get_current_locale)(struct IDiscordApplication* application, DiscordLocale* locale); enum EDiscordResult (*get_current_branch)(struct IDiscordApplication* application, DiscordBranch* branch); enum EDiscordResult (*get_oauth2_token)(struct IDiscordApplication* application, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordOAuth2Token* oauth2_token)); }; struct IDiscordUsersEvents { void (*on_current_user_update)(void* event_data); }; struct IDiscordUsers { enum EDiscordResult (*destroy)(struct IDiscordUsers* users); enum EDiscordResult (*get_current_user)(struct IDiscordUsers* users, struct DiscordUser* current_user); enum EDiscordResult (*fetch)(struct IDiscordUsers* users, DiscordUserId user_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordUser* user)); }; typedef void IDiscordImagesEvents; struct IDiscordImages { enum EDiscordResult (*destroy)(struct IDiscordImages* images); enum EDiscordResult (*fetch)(struct IDiscordImages* images, struct DiscordImageHandle handle, int refresh, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordImageHandle handle_result)); enum EDiscordResult (*get_dimensions)(struct IDiscordImages* images, struct DiscordImageHandle handle, struct DiscordImageDimensions* dimensions); enum EDiscordResult (*get_data)(struct IDiscordImages* images, struct DiscordImageHandle handle, DiscordImageData data, uint32_t data_length); }; struct IDiscordActivitiesEvents { void (*on_activity_join)(void* event_data, DiscordSecret secret); void (*on_activity_spectate)(void* event_data, DiscordSecret secret); void (*on_activity_join_request)(void* event_data, struct DiscordUser* user); void (*on_activity_invite)(void* event_data, enum EDiscordActivityActionType type, struct DiscordUser* user, struct DiscordActivity* activity); }; struct IDiscordActivities { enum EDiscordResult (*destroy)(struct IDiscordActivities* activities); enum EDiscordResult (*register_)(struct IDiscordActivities* activities, const char* command); enum EDiscordResult (*register_steam)(struct IDiscordActivities* activities, uint32_t steam_id); enum EDiscordResult (*update_activity)(struct IDiscordActivities* activities, struct DiscordActivity* activity, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*clear_activity)(struct IDiscordActivities* activities, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*respond)(struct IDiscordActivities* activities, DiscordUserId user_id, enum EDiscordActivityJoinRequestReply reply, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*invite_user)(struct IDiscordActivities* activities, DiscordUserId user_id, enum EDiscordActivityActionType type, const char* content, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*accept_invite)(struct IDiscordActivities* activities, DiscordUserId user_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); }; struct IDiscordRelationshipsEvents { void (*on_relationships_update)(void* event_data); void (*on_relationship_update)(void* event_data, struct DiscordRelationship* relationship); }; struct IDiscordRelationships { enum EDiscordResult (*destroy)(struct IDiscordRelationships* relationships); enum EDiscordResult (*filter)(struct IDiscordRelationships* relationships, void* filter_data, int (*filter)(void* filter_data, struct DiscordRelationship* relationship)); enum EDiscordResult (*count)(struct IDiscordRelationships* relationships, int32_t* count); enum EDiscordResult (*get)(struct IDiscordRelationships* relationships, DiscordUserId user_id, struct DiscordRelationship* relationship); enum EDiscordResult (*at)(struct IDiscordRelationships* relationships, uint32_t index, struct DiscordRelationship* relationship); }; struct IDiscordLobbiesEvents { void (*on_lobby_update)(void* event_data, int64_t lobby_id); void (*on_lobby_delete)(void* event_data, int64_t lobby_id, uint32_t reason); void (*on_lobby_member_connect)(void* event_data, int64_t lobby_id, int64_t user_id); void (*on_lobby_member_update)(void* event_data, int64_t lobby_id, int64_t user_id); void (*on_lobby_member_disconnect)(void* event_data, int64_t lobby_id, int64_t user_id); void (*on_lobby_message)(void* event_data, int64_t lobby_id, int64_t user_id, DiscordLobbyData data, uint32_t data_length); void (*on_lobby_speaking)(void* event_data, int64_t lobby_id, int64_t user_id, int speaking); }; struct IDiscordLobbies { enum EDiscordResult (*destroy)(struct IDiscordLobbies* lobbies); enum EDiscordResult (*create_lobby_transaction)(struct IDiscordLobbies* lobbies, struct IDiscordLobbyTransaction** transaction); enum EDiscordResult (*get_lobby_transaction)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, struct IDiscordLobbyTransaction** transaction); enum EDiscordResult (*get_member_transaction)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, DiscordUserId user_id, struct IDiscordLobbyMemberTransaction** transaction); enum EDiscordResult (*create_lobby)(struct IDiscordLobbies* lobbies, struct IDiscordLobbyTransaction* transaction, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordLobby* lobby)); enum EDiscordResult (*update_lobby)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, struct IDiscordLobbyTransaction* transaction, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*delete_lobby)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*connect)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, DiscordLobbySecret lobby_secret, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, struct DiscordLobby* lobby)); enum EDiscordResult (*disconnect)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*get_lobby)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, struct DiscordLobby* lobby); enum EDiscordResult (*get_lobby_metadata)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, DiscordMetadataKey key, DiscordMetadataValue* value); enum EDiscordResult (*get_member_count)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, int32_t* count); enum EDiscordResult (*get_member_user_id)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, int32_t index, DiscordUserId* user_id); enum EDiscordResult (*get_member_user)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, DiscordUserId user_id, struct DiscordUser* user); enum EDiscordResult (*get_member_metadata)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, DiscordUserId user_id, DiscordMetadataKey key, DiscordMetadataValue* value); enum EDiscordResult (*update_member)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, DiscordUserId user_id, struct IDiscordLobbyMemberTransaction* transaction, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*send)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, DiscordLobbyData data, uint32_t data_length); enum EDiscordResult (*create_lobby_search)(struct IDiscordLobbies* lobbies, struct IDiscordLobbySearch** lobby_search); enum EDiscordResult (*search)(struct IDiscordLobbies* lobbies, struct IDiscordLobbySearch* query, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*get_lobby_count)(struct IDiscordLobbies* lobbies, int32_t* count); enum EDiscordResult (*get_lobby_id)(struct IDiscordLobbies* lobbies, int32_t index, DiscordLobbyId* lobby_id); enum EDiscordResult (*voice_connect)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*voice_disconnect)(struct IDiscordLobbies* lobbies, DiscordLobbyId lobby_id, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); }; struct IDiscordNetworkEvents { void (*on_message)(void* event_data, DiscordNetworkSessionId from, DiscordNetworkChannelId channel, DiscordNetworkData data, uint32_t data_length); }; struct IDiscordNetwork { enum EDiscordResult (*destroy)(struct IDiscordNetwork* network); enum EDiscordResult (*get_session_id)(struct IDiscordNetwork* network, DiscordNetworkSessionId* session_id); enum EDiscordResult (*flush)(struct IDiscordNetwork* network); enum EDiscordResult (*open_channel)(struct IDiscordNetwork* network, DiscordNetworkSessionId remote, DiscordNetworkChannelId channel); enum EDiscordResult (*open_reliable_channel)(struct IDiscordNetwork* network, DiscordNetworkSessionId remote, DiscordNetworkChannelId channel); enum EDiscordResult (*send)(struct IDiscordNetwork* network, DiscordNetworkSessionId remote, DiscordNetworkChannelId channel, DiscordNetworkData data, uint32_t data_length); enum EDiscordResult (*close_channel)(struct IDiscordNetwork* network, DiscordNetworkSessionId remote, DiscordNetworkChannelId channel); }; struct IDiscordOverlayEvents { void (*on_overlay_locked)(void* event_data, int locked); }; struct IDiscordOverlay { enum EDiscordResult (*destroy)(struct IDiscordOverlay* overlay); enum EDiscordResult (*is_enabled)(struct IDiscordOverlay* overlay, int* enabled); enum EDiscordResult (*is_locked)(struct IDiscordOverlay* overlay, int* locked); enum EDiscordResult (*set_locked)(struct IDiscordOverlay* overlay, int locked); enum EDiscordResult (*open_activity_invite)(struct IDiscordOverlay* overlay, enum EDiscordActivityActionType type, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); }; typedef void IDiscordStorageEvents; struct IDiscordStorage { enum EDiscordResult (*destroy)(struct IDiscordStorage* storage); enum EDiscordResult (*read)(struct IDiscordStorage* storage, DiscordStorageFileName name, DiscordStorageData data, uint32_t data_length, uint32_t* read); enum EDiscordResult (*read_async)(struct IDiscordStorage* storage, DiscordStorageFileName name, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, DiscordStorageData data, uint32_t data_length)); enum EDiscordResult (*read_async_partial)(struct IDiscordStorage* storage, DiscordStorageFileName name, uint64_t offset, uint64_t length, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result, DiscordStorageData data, uint32_t data_length)); enum EDiscordResult (*write)(struct IDiscordStorage* storage, DiscordStorageFileName name, DiscordStorageData data, uint32_t data_length); enum EDiscordResult (*write_async)(struct IDiscordStorage* storage, DiscordStorageFileName name, DiscordStorageData data, uint32_t data_length, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result)); enum EDiscordResult (*delete_)(struct IDiscordStorage* storage, DiscordStorageFileName name); enum EDiscordResult (*exists)(struct IDiscordStorage* storage, DiscordStorageFileName name, int* exists); enum EDiscordResult (*count)(struct IDiscordStorage* storage, int32_t* count); enum EDiscordResult (*stat)(struct IDiscordStorage* storage, DiscordStorageFileName name, struct DiscordFileStat* stat); enum EDiscordResult (*stat_index)(struct IDiscordStorage* storage, int32_t index, struct DiscordFileStat* stat); }; struct IDiscordCoreEvents { void (*on_ready)(void* event_data); }; struct IDiscordCore { enum EDiscordResult (*destroy)(struct IDiscordCore* core); enum EDiscordResult (*run_callbacks)(struct IDiscordCore* core); enum EDiscordResult (*set_log_hook)(struct IDiscordCore* core, enum EDiscordLogLevel min_level, void* hook_data, void (*hook)(void* hook_data, enum EDiscordLogLevel level, const char* message)); enum EDiscordResult (*create_application)(struct IDiscordCore* core, DiscordVersion version, struct IDiscordApplicationEvents* events, void* event_data, struct IDiscordApplication** result); enum EDiscordResult (*create_users)(struct IDiscordCore* core, DiscordVersion version, struct IDiscordUsersEvents* events, void* event_data, struct IDiscordUsers** result); enum EDiscordResult (*create_images)(struct IDiscordCore* core, DiscordVersion version, struct IDiscordImagesEvents* events, void* event_data, struct IDiscordImages** result); enum EDiscordResult (*create_activities)(struct IDiscordCore* core, DiscordVersion version, struct IDiscordActivitiesEvents* events, void* event_data, struct IDiscordActivities** result); enum EDiscordResult (*create_relationships)(struct IDiscordCore* core, DiscordVersion version, struct IDiscordRelationshipsEvents* events, void* event_data, struct IDiscordRelationships** result); enum EDiscordResult (*create_lobbies)(struct IDiscordCore* core, DiscordVersion version, struct IDiscordLobbiesEvents* events, void* event_data, struct IDiscordLobbies** result); enum EDiscordResult (*create_network)(struct IDiscordCore* core, DiscordVersion version, struct IDiscordNetworkEvents* events, void* event_data, struct IDiscordNetwork** result); enum EDiscordResult (*create_overlay)(struct IDiscordCore* core, DiscordVersion version, struct IDiscordOverlayEvents* events, void* event_data, struct IDiscordOverlay** result); enum EDiscordResult (*create_storage)(struct IDiscordCore* core, DiscordVersion version, struct IDiscordStorageEvents* events, void* event_data, struct IDiscordStorage** result); }; struct DiscordCreateParams { DiscordClientId client_id; uint64_t flags; struct IDiscordCoreEvents* events; void* event_data; }; enum EDiscordResult DiscordCreate(DiscordVersion version, struct DiscordCreateParams* params, struct IDiscordCore** result); #ifdef __cplusplus } #endif #endif