156 lines
4.8 KiB
C
156 lines
4.8 KiB
C
|
#include <stdint.h>
|
||
|
#include <stdio.h>
|
||
|
#include <assert.h>
|
||
|
#include "discord_game_sdk.h"
|
||
|
#ifdef _WIN32
|
||
|
#include <Windows.h>
|
||
|
#else
|
||
|
#include <unistd.h>
|
||
|
#include <string.h>
|
||
|
#endif
|
||
|
|
||
|
#define DISCORD_REQUIRE(x) assert(x == DiscordResult_Ok)
|
||
|
|
||
|
struct Application {
|
||
|
struct IDiscordCore* core;
|
||
|
struct IDiscordUserManager* users;
|
||
|
struct IDiscordAchievementManager* achievements;
|
||
|
struct IDiscordActivityManager* activities;
|
||
|
struct IDiscordRelationshipManager* relationships;
|
||
|
struct IDiscordApplicationManager* application;
|
||
|
struct IDiscordLobbyManager* lobbies;
|
||
|
DiscordUserId user_id;
|
||
|
};
|
||
|
|
||
|
void UpdateActivityCallback(void* data, enum EDiscordResult result)
|
||
|
{
|
||
|
DISCORD_REQUIRE(result);
|
||
|
}
|
||
|
|
||
|
int RelationshipPassFilter(void* data, struct DiscordRelationship* relationship)
|
||
|
{
|
||
|
return (relationship->type == DiscordRelationshipType_Friend);
|
||
|
}
|
||
|
|
||
|
int RelationshipSnowflakeFilter(void* data, struct DiscordRelationship* relationship)
|
||
|
{
|
||
|
struct Application* app = (struct Application*)data;
|
||
|
|
||
|
return (relationship->type == DiscordRelationshipType_Friend &&
|
||
|
relationship->user.id < app->user_id);
|
||
|
}
|
||
|
|
||
|
void OnRelationshipsRefresh(void* data)
|
||
|
{
|
||
|
struct Application* app = (struct Application*)data;
|
||
|
struct IDiscordRelationshipManager* module = app->relationships;
|
||
|
|
||
|
module->filter(module, app, RelationshipPassFilter);
|
||
|
|
||
|
int32_t unfiltered_count = 0;
|
||
|
DISCORD_REQUIRE(module->count(module, &unfiltered_count));
|
||
|
|
||
|
module->filter(module, app, RelationshipSnowflakeFilter);
|
||
|
|
||
|
int32_t filtered_count = 0;
|
||
|
DISCORD_REQUIRE(module->count(module, &filtered_count));
|
||
|
|
||
|
printf("=== Cool Friends ===\n");
|
||
|
for (int32_t i = 0; i < filtered_count; i += 1) {
|
||
|
struct DiscordRelationship relationship;
|
||
|
DISCORD_REQUIRE(module->get_at(module, i, &relationship));
|
||
|
|
||
|
printf("%lld %s#%s\n",
|
||
|
relationship.user.id,
|
||
|
relationship.user.username,
|
||
|
relationship.user.discriminator);
|
||
|
}
|
||
|
printf("(%d friends less cool than you omitted)\n", unfiltered_count - filtered_count);
|
||
|
|
||
|
struct DiscordActivity activity;
|
||
|
memset(&activity, 0, sizeof(activity));
|
||
|
sprintf(activity.details, "Cooler than %d friends", unfiltered_count - filtered_count);
|
||
|
sprintf(activity.state, "%d friends total", unfiltered_count);
|
||
|
|
||
|
app->activities->update_activity(app->activities, &activity, app, UpdateActivityCallback);
|
||
|
}
|
||
|
|
||
|
void OnUserUpdated(void* data)
|
||
|
{
|
||
|
struct Application* app = (struct Application*)data;
|
||
|
struct DiscordUser user;
|
||
|
app->users->get_current_user(app->users, &user);
|
||
|
app->user_id = user.id;
|
||
|
}
|
||
|
|
||
|
void OnOAuth2Token(void* data, enum EDiscordResult result, struct DiscordOAuth2Token* token)
|
||
|
{
|
||
|
if (result == DiscordResult_Ok) {
|
||
|
printf("OAuth2 token: %s\n", token->access_token);
|
||
|
}
|
||
|
else {
|
||
|
printf("GetOAuth2Token failed with %d\n", (int)result);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void OnLobbyConnect(void* data, enum EDiscordResult result, struct DiscordLobby* lobby)
|
||
|
{
|
||
|
printf("LobbyConnect returned %d\n", (int)result);
|
||
|
}
|
||
|
|
||
|
int main(int argc, char** argv)
|
||
|
{
|
||
|
struct Application app;
|
||
|
memset(&app, 0, sizeof(app));
|
||
|
|
||
|
struct IDiscordUserEvents users_events;
|
||
|
memset(&users_events, 0, sizeof(users_events));
|
||
|
users_events.on_current_user_update = OnUserUpdated;
|
||
|
|
||
|
struct IDiscordActivityEvents activities_events;
|
||
|
memset(&activities_events, 0, sizeof(activities_events));
|
||
|
|
||
|
struct IDiscordRelationshipEvents relationships_events;
|
||
|
memset(&relationships_events, 0, sizeof(relationships_events));
|
||
|
relationships_events.on_refresh = OnRelationshipsRefresh;
|
||
|
|
||
|
struct DiscordCreateParams params;
|
||
|
DiscordCreateParamsSetDefault(¶ms);
|
||
|
params.client_id = 418559331265675294;
|
||
|
params.flags = DiscordCreateFlags_Default;
|
||
|
params.event_data = &app;
|
||
|
params.activity_events = &activities_events;
|
||
|
params.relationship_events = &relationships_events;
|
||
|
params.user_events = &users_events;
|
||
|
DISCORD_REQUIRE(DiscordCreate(DISCORD_VERSION, ¶ms, &app.core));
|
||
|
|
||
|
app.users = app.core->get_user_manager(app.core);
|
||
|
app.achievements = app.core->get_achievement_manager(app.core);
|
||
|
app.activities = app.core->get_activity_manager(app.core);
|
||
|
app.application = app.core->get_application_manager(app.core);
|
||
|
app.lobbies = app.core->get_lobby_manager(app.core);
|
||
|
|
||
|
app.lobbies->connect_lobby_with_activity_secret(
|
||
|
app.lobbies, "invalid_secret", &app, OnLobbyConnect);
|
||
|
|
||
|
app.application->get_oauth2_token(app.application, &app, OnOAuth2Token);
|
||
|
|
||
|
DiscordBranch branch;
|
||
|
app.application->get_current_branch(app.application, &branch);
|
||
|
printf("Current branch %s\n", branch);
|
||
|
|
||
|
app.relationships = app.core->get_relationship_manager(app.core);
|
||
|
|
||
|
for (;;) {
|
||
|
DISCORD_REQUIRE(app.core->run_callbacks(app.core));
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
Sleep(16);
|
||
|
#else
|
||
|
usleep(16 * 1000);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|