mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-01-19 03:57:14 +01:00
4f70f89b78
Foundation for the discord library bindings. To be gradually exposed to the script.
253 lines
5.8 KiB
C++
253 lines
5.8 KiB
C++
/************************************************************************************
|
|
*
|
|
* D++, A Lightweight C++ library for Discord
|
|
*
|
|
* Copyright 2021 Craig Edwards and D++ contributors
|
|
* (https://github.com/brainboxdotcc/DPP/graphs/contributors)
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
************************************************************************************/
|
|
#pragma once
|
|
#include <dpp/export.h>
|
|
#include <dpp/discord.h>
|
|
#include <dpp/json_fwd.hpp>
|
|
|
|
namespace dpp {
|
|
|
|
/**
|
|
* @brief Presence flags bitmask
|
|
*/
|
|
enum presence_flags {
|
|
/// Desktop: Online
|
|
p_desktop_online = 0b00000001,
|
|
/// Desktop: DND
|
|
p_desktop_dnd = 0b00000010,
|
|
/// Desktop: Idle
|
|
p_desktop_idle = 0b00000011,
|
|
/// Web: Online
|
|
p_web_online = 0b00000100,
|
|
/// Web: DND
|
|
p_web_dnd = 0b00001000,
|
|
/// Web: Idle
|
|
p_web_idle = 0b00001100,
|
|
/// Mobile: Online
|
|
p_mobile_online = 0b00010000,
|
|
/// Mobile: DND
|
|
p_mobile_dnd = 0b00100000,
|
|
/// Mobile: Idle
|
|
p_mobile_idle = 0b00110000,
|
|
/// General: Online
|
|
p_status_online = 0b01000000,
|
|
/// General: DND
|
|
p_status_dnd = 0b10000000,
|
|
/// General: Idle
|
|
p_status_idle = 0b11000000
|
|
};
|
|
|
|
/**
|
|
* @brief Online presence status values
|
|
*/
|
|
enum presence_status : uint8_t {
|
|
/// Offline
|
|
ps_offline = 0,
|
|
/// Online
|
|
ps_online = 1,
|
|
/// DND
|
|
ps_dnd = 2,
|
|
/// Idle
|
|
ps_idle = 3
|
|
};
|
|
|
|
/**
|
|
* @brief Bit shift for desktop status
|
|
*/
|
|
#define PF_SHIFT_DESKTOP 0
|
|
/** Bit shift for web status */
|
|
#define PF_SHIFT_WEB 2
|
|
/** Bit shift for mobile status */
|
|
#define PF_SHIFT_MOBILE 4
|
|
/** Bit shift for main status */
|
|
#define PF_SHIFT_MAIN 6
|
|
/** Bit mask for status */
|
|
#define PF_STATUS_MASK 0b00000011
|
|
/** Bit mask for clearing desktop status */
|
|
#define PF_CLEAR_DESKTOP 0b11111100
|
|
/** Bit mask for clearing web status */
|
|
#define PF_CLEAR_WEB 0b11110011
|
|
/** Bit mask for clearing mobile status */
|
|
#define PF_CLEAR_MOBILE 0b11001111
|
|
/** Bit mask for clearing main status */
|
|
#define PF_CLEAR_STATUS 0b00111111
|
|
|
|
/**
|
|
* @brief Game types
|
|
*/
|
|
enum activity_type : uint8_t {
|
|
/// "Playing ..."
|
|
at_game = 0,
|
|
/// "Streaming ..."
|
|
at_streaming = 1,
|
|
/// "Listening to..."
|
|
at_listening = 2,
|
|
/// "Watching..."
|
|
at_custom = 3,
|
|
/// "Competing in..."
|
|
at_competing = 4
|
|
};
|
|
|
|
/**
|
|
* @brief Activity types for rich presence
|
|
*/
|
|
enum activity_flags {
|
|
/// In an instance
|
|
af_instance = 0b00000001,
|
|
/// Joining
|
|
af_join = 0b00000010,
|
|
/// Spectating
|
|
af_spectate = 0b00000100,
|
|
/// Sending join request
|
|
af_join_request = 0b00001000,
|
|
/// Synchronising
|
|
af_sync = 0b00010000,
|
|
/// Playing
|
|
af_play = 0b00100000
|
|
};
|
|
|
|
/**
|
|
* @brief An activity is a representation of what a user is doing. It might be a game, or a website, or a movie. Whatever.
|
|
*/
|
|
class CoreExport activity {
|
|
public:
|
|
/** Name of ativity
|
|
* e.g. "Fortnite"
|
|
*/
|
|
std::string name;
|
|
/** State of activity.
|
|
* e.g. "Waiting in lobby"
|
|
*/
|
|
std::string state;
|
|
/** URL.
|
|
* Only applicable for certain sites such a YouTube
|
|
* Alias: details
|
|
*/
|
|
std::string url;
|
|
/** Activity type
|
|
*/
|
|
activity_type type;
|
|
/** Time activity was created
|
|
*/
|
|
time_t created_at;
|
|
/** Start time. e.g. when game was started
|
|
*/
|
|
time_t start;
|
|
/** End time, e.g. for songs on spotify
|
|
*/
|
|
time_t end;
|
|
/** Creating application (e.g. a linked account on the user's client)
|
|
*/
|
|
snowflake application_id;
|
|
/** Flags bitmask from activity_flags
|
|
*/
|
|
uint8_t flags;
|
|
|
|
activity() = default;
|
|
|
|
/**
|
|
* @brief Construct a new activity
|
|
*
|
|
* @param typ
|
|
* @param nam
|
|
* @param stat
|
|
* @param url_
|
|
*/
|
|
activity(const activity_type typ, const std::string& nam, const std::string& stat, const std::string& url_);
|
|
};
|
|
|
|
/**
|
|
* @brief Represents user presence, e.g. what game they are playing and if they are online
|
|
*/
|
|
class CoreExport presence {
|
|
public:
|
|
/** The user the presence applies to */
|
|
snowflake user_id;
|
|
|
|
/** Guild ID. Apparently, Discord supports this internally but the client doesnt... */
|
|
snowflake guild_id;
|
|
|
|
/** Flags bitmask containing presence_flags */
|
|
uint8_t flags;
|
|
|
|
/** List of activities */
|
|
std::vector<activity> activities;
|
|
|
|
/** Constructor */
|
|
presence();
|
|
|
|
/**
|
|
* @brief Construct a new presence object with some parameters for sending to a websocket
|
|
*
|
|
* @param status
|
|
* @param type
|
|
* @param activity_description
|
|
*/
|
|
presence(presence_status status, activity_type type, const std::string& activity_description);
|
|
|
|
/**
|
|
* @brief Construct a new presence object with some parameters for sending to a websocket
|
|
*
|
|
* @param status
|
|
* @param a Activity itself
|
|
*/
|
|
presence(presence_status status, activity a);
|
|
|
|
/** Destructor */
|
|
~presence();
|
|
|
|
/** Fill this object from json.
|
|
* @param j JSON object to fill from
|
|
* @return A reference to self
|
|
*/
|
|
presence& fill_from_json(nlohmann::json* j);
|
|
|
|
/** Build JSON from this object.
|
|
* @return The JSON text of the presence
|
|
*/
|
|
std::string build_json() const;
|
|
|
|
/** The users status on desktop
|
|
* @return The user's status on desktop
|
|
*/
|
|
presence_status desktop_status() const;
|
|
|
|
/** The user's status on web
|
|
* @return The user's status on web
|
|
*/
|
|
presence_status web_status() const;
|
|
|
|
/** The user's status on mobile
|
|
* @return The user's status on mobile
|
|
*/
|
|
presence_status mobile_status() const;
|
|
|
|
/** The user's status as shown to other users
|
|
* @return The user's status as shown to other users
|
|
*/
|
|
presence_status status() const;
|
|
};
|
|
|
|
/** A container of presences */
|
|
typedef std::unordered_map<std::string, presence> presence_map;
|
|
|
|
};
|