mirror of
https://github.com/mkxp-z/mkxp-z.git
synced 2025-09-10 12:02:53 +02:00
Add DiscordActivity bindings
This commit is contained in:
parent
2abb0cdc1c
commit
5ec235ba31
7 changed files with 279 additions and 1 deletions
|
@ -37,6 +37,7 @@ DECL_TYPE(Plane);
|
|||
DECL_TYPE(Viewport);
|
||||
DECL_TYPE(Tilemap);
|
||||
DECL_TYPE(Window);
|
||||
|
||||
#else
|
||||
#define TableType "Table"
|
||||
#define RectType "Rect"
|
||||
|
@ -52,4 +53,15 @@ DECL_TYPE(Window);
|
|||
#define WindowType "Window"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_DISCORDSDK
|
||||
|
||||
#ifndef OLD_RUBY
|
||||
DECL_TYPE(DCActivity);
|
||||
|
||||
#else
|
||||
#define DiscordActivityType "DCActivity"
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // BINDINGTYPES_H
|
||||
|
|
237
binding/discord-binding.cpp
Normal file
237
binding/discord-binding.cpp
Normal file
|
@ -0,0 +1,237 @@
|
|||
#include <discord_game_sdk.h>
|
||||
|
||||
#include "discordstate.h"
|
||||
#include "sharedstate.h"
|
||||
#include "binding-util.h"
|
||||
|
||||
//NYI
|
||||
void discordResultCb(void *callback_data, enum EDiscordResult result)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#ifndef OLD_RUBY
|
||||
DEF_TYPE_CUSTOMFREE(DCActivity, free);
|
||||
#else
|
||||
DEF_ALLOCFUNC_CUSTOMFREE(DCActivity, free);
|
||||
#endif
|
||||
|
||||
RB_METHOD(DiscordGetUsername)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
return rb_str_new_cstr(shState->discord().userName().c_str());
|
||||
}
|
||||
|
||||
RB_METHOD(DiscordGetDiscriminator)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
return rb_str_new_cstr(shState->discord().userDiscrim().c_str());
|
||||
}
|
||||
|
||||
RB_METHOD(DiscordGetUserId)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
return LL2NUM(shState->discord().userId());
|
||||
}
|
||||
|
||||
RB_METHOD(DiscordActivityInitialize)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
DiscordActivity *activity = ALLOC(DiscordActivity);
|
||||
setPrivateData(self, activity);
|
||||
|
||||
memset(activity, 0, sizeof(DiscordActivity));
|
||||
|
||||
activity->type = DiscordActivityType_Playing;
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(DiscordActivitySend)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
IDiscordActivityManager *am = shState->discord().activityManager();
|
||||
|
||||
DiscordActivity *activity = getPrivateData<DiscordActivity>(self);
|
||||
|
||||
if (am) am->update_activity(am, activity, 0, discordResultCb);
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
RB_METHOD(DiscordActivityClear)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
IDiscordActivityManager *am = shState->discord().activityManager();
|
||||
if (am) am->clear_activity(am, 0, discordResultCb);
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
#define DEF_DCPROP_S(basename, propname, maxsz) \
|
||||
RB_METHOD(Discord##basename##Get##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
return rb_str_new_cstr(p->propname); \
|
||||
} \
|
||||
RB_METHOD(Discord##basename##Set##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
VALUE str; \
|
||||
rb_scan_args(argc, argv, "1", &str); \
|
||||
SafeStringValue(str); \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
strncpy(p->propname, RSTRING_PTR(str), maxsz); \
|
||||
return str; \
|
||||
}
|
||||
|
||||
#define DEF_DCPROP_S_SUB(basename, subname, propname, maxsz) \
|
||||
RB_METHOD(Discord##basename##Get##subname##_##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
return rb_str_new_cstr(p->subname.propname); \
|
||||
} \
|
||||
RB_METHOD(Discord##basename##Set##subname##_##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
VALUE str; \
|
||||
rb_scan_args(argc, argv, "1", &str); \
|
||||
SafeStringValue(str); \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
strncpy(p->subname.propname, RSTRING_PTR(str), maxsz); \
|
||||
return str; \
|
||||
}
|
||||
|
||||
#define DEF_DCPROP_I(basename, propname, convtype, cast) \
|
||||
RB_METHOD(Discord##basename##Get##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
return convtype##2NUM(p->propname); \
|
||||
} \
|
||||
RB_METHOD(Discord##basename##Set##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
VALUE num; \
|
||||
rb_scan_args(argc, argv, "1", &num); \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
p->propname = (cast)NUM2##convtype(num); \
|
||||
return num; \
|
||||
}
|
||||
|
||||
#define DEF_DCPROP_I_SUB(basename, subname, propname, convtype, cast) \
|
||||
RB_METHOD(Discord##basename##Get##subname##_##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
return convtype##2NUM(p->subname.propname); \
|
||||
} \
|
||||
RB_METHOD(Discord##basename##Set##subname##_##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
VALUE num; \
|
||||
rb_scan_args(argc, argv, "1", &num); \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
p->subname.propname = (cast)NUM2##convtype(num); \
|
||||
return num; \
|
||||
}
|
||||
|
||||
#define DEF_DCPROP_B(basename, propname) \
|
||||
RB_METHOD(Discord##basename##Get##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
return rb_bool_new(p->propname); \
|
||||
} \
|
||||
RB_METHOD(Discord##basename##Set##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
bool b; \
|
||||
rb_get_args(argc, argv, "b", &b RB_ARG_END); \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
p->propname = b; \
|
||||
return rb_bool_new(b); \
|
||||
}
|
||||
|
||||
#define DEF_DCPROP_B_SUB(basename, propname, subname) \
|
||||
RB_METHOD(Discord##basename##Get##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
return rb_bool_new(p->subname.propname); \
|
||||
} \
|
||||
RB_METHOD(Discord##basename##Set##propname) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
bool b; \
|
||||
rb_get_args(argc, argv, "b", &b RB_ARG_END); \
|
||||
Discord##basename *p = getPrivateData<Discord##basename>(self); \
|
||||
p->subname.propname = b; \
|
||||
return rb_bool_new(b); \
|
||||
}
|
||||
|
||||
DEF_DCPROP_S(Activity, name, 128);
|
||||
DEF_DCPROP_S(Activity, state, 128);
|
||||
DEF_DCPROP_S(Activity, details, 128);
|
||||
DEF_DCPROP_S_SUB(Activity, assets, large_image, 128);
|
||||
DEF_DCPROP_S_SUB(Activity, assets, large_text, 128);
|
||||
DEF_DCPROP_S_SUB(Activity, assets, small_image, 128);
|
||||
DEF_DCPROP_S_SUB(Activity, assets, small_text, 128);
|
||||
DEF_DCPROP_S_SUB(Activity, secrets, match, 128);
|
||||
DEF_DCPROP_S_SUB(Activity, secrets, join, 128);
|
||||
DEF_DCPROP_S_SUB(Activity, secrets, spectate, 128);
|
||||
|
||||
DEF_DCPROP_I(Activity, type, INT, EDiscordActivityType);
|
||||
DEF_DCPROP_I(Activity, application_id, LL, int64_t);
|
||||
DEF_DCPROP_I_SUB(Activity, timestamps, start, LL, DiscordTimestamp);
|
||||
DEF_DCPROP_I_SUB(Activity, timestamps, end, LL, DiscordTimestamp);
|
||||
DEF_DCPROP_B(Activity, instance);
|
||||
|
||||
#define BIND_DCPROP(basename, b, f) \
|
||||
_rb_define_method(activityClass, b, Discord##basename##Get##f); \
|
||||
_rb_define_method(activityClass, b "=", Discord##basename##Set##f);
|
||||
|
||||
|
||||
void DiscordBindingInit()
|
||||
{
|
||||
VALUE mod = rb_define_module("Discord");
|
||||
_rb_define_module_function(mod, "user_name", DiscordGetUsername);
|
||||
_rb_define_module_function(mod, "user_discriminator", DiscordGetDiscriminator);
|
||||
_rb_define_module_function(mod, "user_id", DiscordGetUserId);
|
||||
|
||||
VALUE activityClass = rb_define_class_under(mod, "Activity", rb_cObject);
|
||||
#ifndef OLD_RUBY
|
||||
rb_define_alloc_func(activityClass, classAllocate<&DCActivityType>);
|
||||
#else
|
||||
rb_define_alloc_func(activityClass, DCActivityAllocate);
|
||||
#endif
|
||||
|
||||
_rb_define_method(activityClass, "initialize", DiscordActivityInitialize);
|
||||
|
||||
rb_define_class_method(activityClass, "clear", DiscordActivityClear);
|
||||
|
||||
_rb_define_method(activityClass, "send", DiscordActivitySend);
|
||||
|
||||
BIND_DCPROP(Activity, "name", name);
|
||||
BIND_DCPROP(Activity, "state", state);
|
||||
BIND_DCPROP(Activity, "details", details);
|
||||
BIND_DCPROP(Activity, "large_image", assets_large_image);
|
||||
BIND_DCPROP(Activity, "large_text", assets_large_text);
|
||||
BIND_DCPROP(Activity, "small_image", assets_small_image);
|
||||
BIND_DCPROP(Activity, "small_text", assets_small_text);
|
||||
BIND_DCPROP(Activity, "match_secret", secrets_match);
|
||||
BIND_DCPROP(Activity, "join_secret", secrets_join);
|
||||
BIND_DCPROP(Activity, "spectate_secret", secrets_spectate);
|
||||
|
||||
BIND_DCPROP(Activity, "type", type);
|
||||
BIND_DCPROP(Activity, "application_id", application_id);
|
||||
BIND_DCPROP(Activity, "start_time", timestamps_start);
|
||||
BIND_DCPROP(Activity, "end_time", timestamps_end);
|
||||
BIND_DCPROP(Activity, "instance", instance);
|
||||
|
||||
}
|
|
@ -48,4 +48,8 @@ if ver.version_compare('<=1.8') == true
|
|||
binding_source += files('miniffi-binding.cpp')
|
||||
endif
|
||||
|
||||
if discord == true
|
||||
binding_source += files('discord-binding.cpp')
|
||||
endif
|
||||
|
||||
bindings = [binding_headers, binding_source]
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include <discord_game_sdk.h>
|
||||
|
||||
#include "sharedstate.h"
|
||||
#include "eventthread.h"
|
||||
#include "discordstate.h"
|
||||
|
@ -117,6 +118,7 @@ int discordTryConnect(DiscordStatePrivate *p)
|
|||
DiscordState::DiscordState(DiscordClientId clientId, int *result)
|
||||
{
|
||||
p = new DiscordStatePrivate();
|
||||
memset(&p->app, 0, sizeof(Application));
|
||||
p->clientId = clientId;
|
||||
int rc = discordTryConnect(p);
|
||||
if (result) *result = rc;
|
||||
|
@ -127,6 +129,16 @@ DiscordState::~DiscordState()
|
|||
delete p;
|
||||
}
|
||||
|
||||
IDiscordActivityManager *DiscordState::activityManager()
|
||||
{
|
||||
return p->app.activities;
|
||||
}
|
||||
|
||||
IDiscordUserManager *DiscordState::userManager()
|
||||
{
|
||||
return p->app.users;
|
||||
}
|
||||
|
||||
int DiscordState::update()
|
||||
{
|
||||
if (!p->discordInstalled) return DiscordResult_NotInstalled;
|
||||
|
@ -138,6 +150,7 @@ int DiscordState::update()
|
|||
{
|
||||
p->connected = false;
|
||||
memset(&p->currentUser, 0, sizeof(DiscordUser));
|
||||
memset(&p->app, 0, sizeof(Application));
|
||||
p->userPresent = false;
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -15,6 +15,9 @@ public:
|
|||
DiscordState(DiscordClientId clientId, int *result);
|
||||
~DiscordState();
|
||||
|
||||
IDiscordActivityManager *activityManager();
|
||||
IDiscordUserManager *userManager();
|
||||
|
||||
int update();
|
||||
bool isConnected();
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include "scene.h"
|
||||
#include "quad.h"
|
||||
#include "eventthread.h"
|
||||
#include "discordstate.h"
|
||||
#include "texpool.h"
|
||||
#include "filesystem.h"
|
||||
#include "bitmap.h"
|
||||
|
@ -45,6 +44,10 @@
|
|||
#include <SDL_timer.h>
|
||||
#include <SDL_image.h>
|
||||
|
||||
#ifdef HAVE_DISCORDSDK
|
||||
#include "discordstate.h"
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <errno.h>
|
||||
|
|
|
@ -37,7 +37,10 @@
|
|||
#include "binding.h"
|
||||
#include "exception.h"
|
||||
#include "sharedmidistate.h"
|
||||
|
||||
#ifdef HAVE_DISCORDSDK
|
||||
#include "discordstate.h"
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
|
@ -242,7 +245,10 @@ GSATT(TexPool&, texPool)
|
|||
GSATT(Quad&, gpQuad)
|
||||
GSATT(SharedFontState&, fontState)
|
||||
GSATT(SharedMidiState&, midiState)
|
||||
|
||||
#ifdef HAVE_DISCORDSDK
|
||||
GSATT(DiscordState&, discord)
|
||||
#endif
|
||||
|
||||
void SharedState::setBindingData(void *data)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue