From 13fc02e9ca312cb13b7f06f65828674bd590680e Mon Sep 17 00:00:00 2001 From: Sandu Liviu Catalin Date: Sun, 12 Sep 2021 17:53:57 +0300 Subject: [PATCH] Restructure discord API files. --- module/CMakeLists.txt | 16 +- module/Library/DPP.cpp | 780 +-------- module/Library/DPP.hpp | 418 +---- module/Library/DPP/Channel.cpp | 16 + module/Library/DPP/Channel.hpp | 19 + module/Library/DPP/Client.cpp | 16 + module/Library/DPP/Client.hpp | 19 + module/Library/DPP/Cluster.cpp | 757 ++++++++ module/Library/DPP/Cluster.hpp | 431 +++++ module/Library/DPP/Command.cpp | 16 + module/Library/DPP/Command.hpp | 19 + .../Library/{DPPTy.cpp => DPP/Constants.cpp} | 396 +---- module/Library/DPP/Constants.hpp | 91 + module/Library/{DPPEv.cpp => DPP/Events.cpp} | 140 +- module/Library/{DPPEv.hpp => DPP/Events.hpp} | 89 +- module/Library/DPP/Guild.cpp | 146 ++ module/Library/DPP/Guild.hpp | 464 +++++ module/Library/DPP/Integration.cpp | 16 + module/Library/DPP/Integration.hpp | 19 + module/Library/DPP/Message.cpp | 16 + module/Library/DPP/Message.hpp | 19 + module/Library/DPP/Other.cpp | 141 ++ module/Library/DPP/Other.hpp | 589 +++++++ module/Library/DPP/Role.cpp | 74 + module/Library/DPP/Role.hpp | 295 ++++ module/Library/DPP/User.cpp | 48 + module/Library/DPP/User.hpp | 200 +++ module/Library/DPPTy.hpp | 1540 ----------------- 28 files changed, 3538 insertions(+), 3252 deletions(-) create mode 100644 module/Library/DPP/Channel.cpp create mode 100644 module/Library/DPP/Channel.hpp create mode 100644 module/Library/DPP/Client.cpp create mode 100644 module/Library/DPP/Client.hpp create mode 100644 module/Library/DPP/Cluster.cpp create mode 100644 module/Library/DPP/Cluster.hpp create mode 100644 module/Library/DPP/Command.cpp create mode 100644 module/Library/DPP/Command.hpp rename module/Library/{DPPTy.cpp => DPP/Constants.cpp} (51%) create mode 100644 module/Library/DPP/Constants.hpp rename module/Library/{DPPEv.cpp => DPP/Events.cpp} (81%) rename module/Library/{DPPEv.hpp => DPP/Events.hpp} (98%) create mode 100644 module/Library/DPP/Guild.cpp create mode 100644 module/Library/DPP/Guild.hpp create mode 100644 module/Library/DPP/Integration.cpp create mode 100644 module/Library/DPP/Integration.hpp create mode 100644 module/Library/DPP/Message.cpp create mode 100644 module/Library/DPP/Message.hpp create mode 100644 module/Library/DPP/Other.cpp create mode 100644 module/Library/DPP/Other.hpp create mode 100644 module/Library/DPP/Role.cpp create mode 100644 module/Library/DPP/Role.hpp create mode 100644 module/Library/DPP/User.cpp create mode 100644 module/Library/DPP/User.hpp delete mode 100644 module/Library/DPPTy.hpp diff --git a/module/CMakeLists.txt b/module/CMakeLists.txt index 953874d0..c895399e 100644 --- a/module/CMakeLists.txt +++ b/module/CMakeLists.txt @@ -136,7 +136,21 @@ target_link_libraries(SqModule Squirrel fmt::fmt SimpleINI TinyDir xxHash Concur if(ENABLE_DISCORD) target_link_libraries(SqModule DPP) target_compile_definitions(SqModule PRIVATE VCMP_ENABLE_DISCORD=1) - target_sources(SqModule PRIVATE Library/DPP.cpp Library/DPP.hpp Library/DPPEv.cpp Library/DPPEv.hpp Library/DPPTy.cpp Library/DPPTy.hpp) + target_sources(SqModule PRIVATE + Library/DPP.cpp Library/DPP.hpp + Library/DPP/Channel.cpp Library/DPP/Channel.hpp + Library/DPP/Client.cpp Library/DPP/Client.hpp + Library/DPP/Cluster.cpp Library/DPP/Cluster.hpp + Library/DPP/Command.cpp Library/DPP/Command.hpp + Library/DPP/Constants.cpp Library/DPP/Constants.hpp + Library/DPP/Events.cpp Library/DPP/Events.hpp + Library/DPP/Guild.cpp Library/DPP/Guild.hpp + Library/DPP/Integration.cpp Library/DPP/Integration.hpp + Library/DPP/Message.cpp Library/DPP/Message.hpp + Library/DPP/Other.cpp Library/DPP/Other.hpp + Library/DPP/Role.cpp Library/DPP/Role.hpp + Library/DPP/User.cpp Library/DPP/User.hpp + ) endif() # Link to POCO libraries target_link_libraries(SqModule Poco::Foundation Poco::Crypto Poco::Data Poco::Net Poco::JSON Poco::XML) diff --git a/module/Library/DPP.cpp b/module/Library/DPP.cpp index 45c79bdc..94486605 100644 --- a/module/Library/DPP.cpp +++ b/module/Library/DPP.cpp @@ -1,9 +1,6 @@ // ------------------------------------------------------------------------------------------------ #include "Library/DPP.hpp" -#include "Core/Signal.hpp" - -// ------------------------------------------------------------------------------------------------ -#include +#include "Library/DPP/Cluster.hpp" // ------------------------------------------------------------------------------------------------ #include @@ -11,9 +8,6 @@ // ------------------------------------------------------------------------------------------------ namespace SqMod { -// ------------------------------------------------------------------------------------------------ -SQMOD_DECL_TYPENAME(SqDppCluster, _SC("SqDppCluster")) - // ------------------------------------------------------------------------------------------------ void TerminateDPP() { @@ -35,766 +29,44 @@ void ProcessDPP() } // ------------------------------------------------------------------------------------------------ -extern void Register_DPPTy(HSQUIRRELVM vm, Table & ns); -extern void Register_DPPEv(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Channel(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Client(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Cluster(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Command(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Constants(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Events(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Guild(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Integration(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Message(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Other(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_Role(HSQUIRRELVM vm, Table & ns); +extern void Register_DPP_User(HSQUIRRELVM vm, Table & ns); // ================================================================================================ void Register_DPP(HSQUIRRELVM vm) { Table ns(vm); // -------------------------------------------------------------------------------------------- + Register_DPP_Constants(vm, ns); + Register_DPP_Client(vm, ns); + Register_DPP_Integration(vm, ns); + Register_DPP_Command(vm, ns); + Register_DPP_Message(vm, ns); + Register_DPP_Channel(vm, ns); + Register_DPP_Other(vm, ns); + Register_DPP_Role(vm, ns); + Register_DPP_User(vm, ns); + Register_DPP_Guild(vm, ns); { Table ens(vm); - Register_DPPEv(vm, ens); + Register_DPP_Events(vm, ens); ns.Bind(_SC("Events"), ens); } - // Register base types - Register_DPPTy(vm, ns); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("Cluster"), - Class< DpCluster, NoCopy< DpCluster > >(vm, SqDppCluster::Str) - // Constructors - .Ctor< StackStrF & >() - .Ctor< StackStrF &, SQInteger >() - .Ctor< StackStrF &, SQInteger, SQInteger >() - .Ctor< StackStrF &, SQInteger, SQInteger, SQInteger >() - .Ctor< StackStrF &, SQInteger, SQInteger, SQInteger, SQInteger >() - .Ctor< StackStrF &, SQInteger, SQInteger, SQInteger, SQInteger, bool >() - .Ctor< StackStrF &, SQInteger, SQInteger, SQInteger, SQInteger, bool, const DpCachePolicy & >() - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppCluster::Fn) - // Member Properties - .Prop(_SC("On"), &DpCluster::GetEvents) - .Prop(_SC("UpTime"), &DpCluster::UpTime) - // Member Methods - .Func(_SC("Start"), &DpCluster::Start) - .Func(_SC("Log"), &DpCluster::Log) - .Func(_SC("GetDmChannel"), &DpCluster::GetDmChannel) - .Func(_SC("SetDmChannel"), &DpCluster::SetDmChannel) - .Func(_SC("SetPresence"), &DpCluster::SetPresence) - .Func(_SC("EnableEvent"), &DpCluster::EnableEvent) - .Func(_SC("DisableEvent"), &DpCluster::DisableEvent) - ); + Register_DPP_Cluster(vm, ns); // -------------------------------------------------------------------------------------------- ns.Func(_SC("HasVoice"), dpp::utility::has_voice); - + // -------------------------------------------------------------------------------------------- RootTable(vm).Bind(_SC("SqDiscord"), ns); } -// ------------------------------------------------------------------------------------------------ -SQMOD_NODISCARD LightObj EventToScriptObject(uint8_t type, uintptr_t data); -void EventInvokeCleanup(uint8_t type, uintptr_t data); - -// ------------------------------------------------------------------------------------------------ -void DpCluster::Process(bool force) -{ - // Is there a valid connection? - if (!mC && !force) - { - return; // No point in going forward - } - DpInternalEvent event; - // Retrieve each event individually and process it - for (size_t count = mQueue.size_approx(), n = 0; n <= count; ++n) - { - // Try to get an event from the queue - if (mQueue.try_dequeue(event)) - { - // Fetch the type of event - const auto type = event.GetType(); - // Fetch the event itself - const auto data = event.GetData(); - // Is this a valid event and is anyone listening to it? - if (event.mData == 0 || mEvents[type].first == nullptr || mEvents[type].first->IsEmpty()) - { - continue; // Move on - } - // Transform the event instance into a script object - LightObj obj = EventToScriptObject(type, data); - // Allow the script to take ownership of the event instance now - event.Reset(); - // Forward the call to the associated signal - (*mEvents[type].first)(obj); - // Allow the event instance to clean itself - EventInvokeCleanup(type, data); - } - } -} - -/* ================================================================================================ - * Event handlers. -*/ -void DpCluster::OnVoiceStateUpdate(const dpp::voice_state_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::VoiceStateUpdate, new DpVoiceStateUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnLog(const dpp::log_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::Log, new DpLogEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildJoinRequestDelete(const dpp::guild_join_request_delete_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildJoinRequestDelete, new DpGuildJoinRequestDeleteEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnInteractionCreate(const dpp::interaction_create_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::InteractionCreate, new DpInteractionCreateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnButtonClick(const dpp::button_click_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ButtonClick, new DpButtonClickEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnSelectClick(const dpp::select_click_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::SelectClick, new DpSelectClickEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildDelete(const dpp::guild_delete_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildDelete, new DpGuildDeleteEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnChannelDelete(const dpp::channel_delete_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ChannelDelete, new DpChannelDeleteEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnChannelUpdate(const dpp::channel_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ChannelUpdate, new DpChannelUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnReady(const dpp::ready_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::Ready, new DpReadyEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnMessageDelete(const dpp::message_delete_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::MessageDelete, new DpMessageDeleteEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnApplicationCommandDelete(const dpp::application_command_delete_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ApplicationCommandDelete, new DpApplicationCommandDeleteEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildMemberRemove(const dpp::guild_member_remove_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildMemberRemove, new DpGuildMemberRemoveEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnApplicationCommandCreate(const dpp::application_command_create_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ApplicationCommandCreate, new DpApplicationCommandCreateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnResumed(const dpp::resumed_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::Resumed, new DpResumedEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildRoleCreate(const dpp::guild_role_create_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildRoleCreate, new DpGuildRoleCreateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnTypingStart(const dpp::typing_start_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::TypingStart, new DpTypingStartEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnMessageReactionAdd(const dpp::message_reaction_add_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::MessageReactionAdd, new DpMessageReactionAddEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildMembersChunk(const dpp::guild_members_chunk_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildMembersChunk, new DpGuildMembersChunkEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnMessageReactionRemove(const dpp::message_reaction_remove_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::MessageReactionRemove, new DpMessageReactionRemoveEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildCreate(const dpp::guild_create_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildCreate, new DpGuildCreateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnChannelCreate(const dpp::channel_create_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ChannelCreate, new DpChannelCreateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnMessageReactionRemoveEmoji(const dpp::message_reaction_remove_emoji_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::MessageReactionRemoveEmoji, new DpMessageReactionRemoveEmojiEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnMessageDeleteBulk(const dpp::message_delete_bulk_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::MessageDeleteBulk, new DpMessageDeleteBulkEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildRoleUpdate(const dpp::guild_role_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildRoleUpdate, new DpGuildRoleUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildRoleDelete(const dpp::guild_role_delete_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildRoleDelete, new DpGuildRoleDeleteEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnChannelPinsUpdate(const dpp::channel_pins_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ChannelPinsUpdate, new DpChannelPinsUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnMessageReactionRemoveAll(const dpp::message_reaction_remove_all_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::MessageReactionRemoveAll, new DpMessageReactionRemoveAllEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnVoiceServerUpdate(const dpp::voice_server_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::VoiceServerUpdate, new DpVoiceServerUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildEmojisUpdate(const dpp::guild_emojis_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildEmojisUpdate, new DpGuildEmojisUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildStickersUpdate(const dpp::guild_stickers_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildStickersUpdate, new DpGuildStickersUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnPresenceUpdate(const dpp::presence_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::PresenceUpdate, new DpPresenceUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnWebhooksUpdate(const dpp::webhooks_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::WebhooksUpdate, new DpWebhooksUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildMemberAdd(const dpp::guild_member_add_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildMemberAdd, new DpGuildMemberAddEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnInviteDelete(const dpp::invite_delete_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::InviteDelete, new DpInviteDeleteEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildUpdate(const dpp::guild_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildUpdate, new DpGuildUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildIntegrationsUpdate(const dpp::guild_integrations_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildIntegrationsUpdate, new DpGuildIntegrationsUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildMemberUpdate(const dpp::guild_member_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildMemberUpdate, new DpGuildMemberUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnApplicationCommandUpdate(const dpp::application_command_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ApplicationCommandUpdate, new DpApplicationCommandUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnInviteCreate(const dpp::invite_create_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::InviteCreate, new DpInviteCreateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnMessageUpdate(const dpp::message_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::MessageUpdate, new DpMessageUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnUserUpdate(const dpp::user_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::UserUpdate, new DpUserUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnMessageCreate(const dpp::message_create_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::MessageCreate, new DpMessageCreateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildBanAdd(const dpp::guild_ban_add_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildBanAdd, new DpGuildBanAddEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnGuildBanRemove(const dpp::guild_ban_remove_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::GuildBanRemove, new DpGuildBanRemoveEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnIntegrationCreate(const dpp::integration_create_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::IntegrationCreate, new DpIntegrationCreateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnIntegrationUpdate(const dpp::integration_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::IntegrationUpdate, new DpIntegrationUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnIntegrationDelete(const dpp::integration_delete_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::IntegrationDelete, new DpIntegrationDeleteEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnThreadCreate(const dpp::thread_create_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ThreadCreate, new DpThreadCreateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnThreadUpdate(const dpp::thread_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ThreadUpdate, new DpThreadUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnThreadDelete(const dpp::thread_delete_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ThreadDelete, new DpThreadDeleteEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnThreadListSync(const dpp::thread_list_sync_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ThreadListSync, new DpThreadListSyncEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnThreadMemberUpdate(const dpp::thread_member_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ThreadMemberUpdate, new DpThreadMemberUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnThreadMembersUpdate(const dpp::thread_members_update_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::ThreadMembersUpdate, new DpThreadMembersUpdateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnVoiceBufferSend(const dpp::voice_buffer_send_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::VoiceBufferSend, new DpVoiceBufferSendEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnVoiceUserTalking(const dpp::voice_user_talking_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::VoiceUserTalking, new DpVoiceUserTalkingEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnVoiceReady(const dpp::voice_ready_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::VoiceReady, new DpVoiceReadyEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnVoiceReceive(const dpp::voice_receive_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::VoiceReceive, new DpVoiceReceiveEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnVoiceTrackMarker(const dpp::voice_track_marker_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::VoiceTrackMarker, new DpVoiceTrackMarkerEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnStageInstanceCreate(const dpp::stage_instance_create_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::StageInstanceCreate, new DpStageInstanceCreateEvent(ev))); -} -// ------------------------------------------------------------------------------------------------ -void DpCluster::OnStageInstanceDelete(const dpp::stage_instance_delete_t & ev) -{ - mQueue.enqueue(DpInternalEvent(DpEventID::StageInstanceDelete, new DpStageInstanceDeleteEvent(ev))); -} - -// ------------------------------------------------------------------------------------------------ -DpCluster & DpCluster::EnableEvent(SQInteger id) -{ - switch (id) - { - case DpEventID::VoiceStateUpdate: mC->on_voice_state_update([this](auto && e) { OnVoiceStateUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::Log: mC->on_log([this](auto && e) { OnLog(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildJoinRequestDelete: mC->on_guild_join_request_delete([this](auto && e) { OnGuildJoinRequestDelete(std::forward< decltype(e) >(e)); }); break; - case DpEventID::InteractionCreate: mC->on_interaction_create([this](auto && e) { OnInteractionCreate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ButtonClick: mC->on_button_click([this](auto && e) { OnButtonClick(std::forward< decltype(e) >(e)); }); break; - case DpEventID::SelectClick: mC->on_select_click([this](auto && e) { OnSelectClick(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildDelete: mC->on_guild_delete([this](auto && e) { OnGuildDelete(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ChannelDelete: mC->on_channel_delete([this](auto && e) { OnChannelDelete(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ChannelUpdate: mC->on_channel_update([this](auto && e) { OnChannelUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::Ready: mC->on_ready([this](auto && e) { OnReady(std::forward< decltype(e) >(e)); }); break; - case DpEventID::MessageDelete: mC->on_message_delete([this](auto && e) { OnMessageDelete(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ApplicationCommandDelete: mC->on_application_command_delete([this](auto && e) { OnApplicationCommandDelete(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildMemberRemove: mC->on_guild_member_remove([this](auto && e) { OnGuildMemberRemove(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ApplicationCommandCreate: mC->on_application_command_create([this](auto && e) { OnApplicationCommandCreate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::Resumed: mC->on_resumed([this](auto && e) { OnResumed(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildRoleCreate: mC->on_guild_role_create([this](auto && e) { OnGuildRoleCreate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::TypingStart: mC->on_typing_start([this](auto && e) { OnTypingStart(std::forward< decltype(e) >(e)); }); break; - case DpEventID::MessageReactionAdd: mC->on_message_reaction_add([this](auto && e) { OnMessageReactionAdd(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildMembersChunk: mC->on_guild_members_chunk([this](auto && e) { OnGuildMembersChunk(std::forward< decltype(e) >(e)); }); break; - case DpEventID::MessageReactionRemove: mC->on_message_reaction_remove([this](auto && e) { OnMessageReactionRemove(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildCreate: mC->on_guild_create([this](auto && e) { OnGuildCreate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ChannelCreate: mC->on_channel_create([this](auto && e) { OnChannelCreate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::MessageReactionRemoveEmoji: mC->on_message_reaction_remove_emoji([this](auto && e) { OnMessageReactionRemoveEmoji(std::forward< decltype(e) >(e)); }); break; - case DpEventID::MessageDeleteBulk: mC->on_message_delete_bulk([this](auto && e) { OnMessageDeleteBulk(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildRoleUpdate: mC->on_guild_role_update([this](auto && e) { OnGuildRoleUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildRoleDelete: mC->on_guild_role_delete([this](auto && e) { OnGuildRoleDelete(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ChannelPinsUpdate: mC->on_channel_pins_update([this](auto && e) { OnChannelPinsUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::MessageReactionRemoveAll: mC->on_message_reaction_remove_all([this](auto && e) { OnMessageReactionRemoveAll(std::forward< decltype(e) >(e)); }); break; - case DpEventID::VoiceServerUpdate: mC->on_voice_server_update([this](auto && e) { OnVoiceServerUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildEmojisUpdate: mC->on_guild_emojis_update([this](auto && e) { OnGuildEmojisUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildStickersUpdate: mC->on_guild_stickers_update([this](auto && e) { OnGuildStickersUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::PresenceUpdate: mC->on_presence_update([this](auto && e) { OnPresenceUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::WebhooksUpdate: mC->on_webhooks_update([this](auto && e) { OnWebhooksUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildMemberAdd: mC->on_guild_member_add([this](auto && e) { OnGuildMemberAdd(std::forward< decltype(e) >(e)); }); break; - case DpEventID::InviteDelete: mC->on_invite_delete([this](auto && e) { OnInviteDelete(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildUpdate: mC->on_guild_update([this](auto && e) { OnGuildUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildIntegrationsUpdate: mC->on_guild_integrations_update([this](auto && e) { OnGuildIntegrationsUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildMemberUpdate: mC->on_guild_member_update([this](auto && e) { OnGuildMemberUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ApplicationCommandUpdate: mC->on_application_command_update([this](auto && e) { OnApplicationCommandUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::InviteCreate: mC->on_invite_create([this](auto && e) { OnInviteCreate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::MessageUpdate: mC->on_message_update([this](auto && e) { OnMessageUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::UserUpdate: mC->on_user_update([this](auto && e) { OnUserUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::MessageCreate: mC->on_message_create([this](auto && e) { OnMessageCreate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildBanAdd: mC->on_guild_ban_add([this](auto && e) { OnGuildBanAdd(std::forward< decltype(e) >(e)); }); break; - case DpEventID::GuildBanRemove: mC->on_guild_ban_remove([this](auto && e) { OnGuildBanRemove(std::forward< decltype(e) >(e)); }); break; - case DpEventID::IntegrationCreate: mC->on_integration_create([this](auto && e) { OnIntegrationCreate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::IntegrationUpdate: mC->on_integration_update([this](auto && e) { OnIntegrationUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::IntegrationDelete: mC->on_integration_delete([this](auto && e) { OnIntegrationDelete(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ThreadCreate: mC->on_thread_create([this](auto && e) { OnThreadCreate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ThreadUpdate: mC->on_thread_update([this](auto && e) { OnThreadUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ThreadDelete: mC->on_thread_delete([this](auto && e) { OnThreadDelete(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ThreadListSync: mC->on_thread_list_sync([this](auto && e) { OnThreadListSync(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ThreadMemberUpdate: mC->on_thread_member_update([this](auto && e) { OnThreadMemberUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::ThreadMembersUpdate: mC->on_thread_members_update([this](auto && e) { OnThreadMembersUpdate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::VoiceBufferSend: mC->on_voice_buffer_send([this](auto && e) { OnVoiceBufferSend(std::forward< decltype(e) >(e)); }); break; - case DpEventID::VoiceUserTalking: mC->on_voice_user_talking([this](auto && e) { OnVoiceUserTalking(std::forward< decltype(e) >(e)); }); break; - case DpEventID::VoiceReady: mC->on_voice_ready([this](auto && e) { OnVoiceReady(std::forward< decltype(e) >(e)); }); break; - case DpEventID::VoiceReceive: mC->on_voice_receive([this](auto && e) { OnVoiceReceive(std::forward< decltype(e) >(e)); }); break; - case DpEventID::VoiceTrackMarker: mC->on_voice_track_marker([this](auto && e) { OnVoiceTrackMarker(std::forward< decltype(e) >(e)); }); break; - case DpEventID::StageInstanceCreate: mC->on_stage_instance_create([this](auto && e) { OnStageInstanceCreate(std::forward< decltype(e) >(e)); }); break; - case DpEventID::StageInstanceDelete: mC->on_stage_instance_delete([this](auto && e) { OnStageInstanceDelete(std::forward< decltype(e) >(e)); }); break; - case DpEventID::Max: // Fall through - default: STHROWF("Invalid discord event identifier {}", id); - } - // Allow chaining - return *this; -} - -// ------------------------------------------------------------------------------------------------ -DpCluster & DpCluster::DisableEvent(SQInteger id) -{ - switch (id) - { - case DpEventID::VoiceStateUpdate: mC->on_voice_state_update(std::function{}); break; - case DpEventID::Log: mC->on_log(std::function{}); break; - case DpEventID::GuildJoinRequestDelete: mC->on_guild_join_request_delete(std::function{}); break; - case DpEventID::InteractionCreate: mC->on_interaction_create(std::function{}); break; - case DpEventID::ButtonClick: mC->on_button_click(std::function{}); break; - case DpEventID::SelectClick: mC->on_select_click(std::function{}); break; - case DpEventID::GuildDelete: mC->on_guild_delete(std::function{}); break; - case DpEventID::ChannelDelete: mC->on_channel_delete(std::function{}); break; - case DpEventID::ChannelUpdate: mC->on_channel_update(std::function{}); break; - case DpEventID::Ready: mC->on_ready(std::function{}); break; - case DpEventID::MessageDelete: mC->on_message_delete(std::function{}); break; - case DpEventID::ApplicationCommandDelete: mC->on_application_command_delete(std::function{}); break; - case DpEventID::GuildMemberRemove: mC->on_guild_member_remove(std::function{}); break; - case DpEventID::ApplicationCommandCreate: mC->on_application_command_create(std::function{}); break; - case DpEventID::Resumed: mC->on_resumed(std::function{}); break; - case DpEventID::GuildRoleCreate: mC->on_guild_role_create(std::function{}); break; - case DpEventID::TypingStart: mC->on_typing_start(std::function{}); break; - case DpEventID::MessageReactionAdd: mC->on_message_reaction_add(std::function{}); break; - case DpEventID::GuildMembersChunk: mC->on_guild_members_chunk(std::function{}); break; - case DpEventID::MessageReactionRemove: mC->on_message_reaction_remove(std::function{}); break; - case DpEventID::GuildCreate: mC->on_guild_create(std::function{}); break; - case DpEventID::ChannelCreate: mC->on_channel_create(std::function{}); break; - case DpEventID::MessageReactionRemoveEmoji: mC->on_message_reaction_remove_emoji(std::function{}); break; - case DpEventID::MessageDeleteBulk: mC->on_message_delete_bulk(std::function{}); break; - case DpEventID::GuildRoleUpdate: mC->on_guild_role_update(std::function{}); break; - case DpEventID::GuildRoleDelete: mC->on_guild_role_delete(std::function{}); break; - case DpEventID::ChannelPinsUpdate: mC->on_channel_pins_update(std::function{}); break; - case DpEventID::MessageReactionRemoveAll: mC->on_message_reaction_remove_all(std::function{}); break; - case DpEventID::VoiceServerUpdate: mC->on_voice_server_update(std::function{}); break; - case DpEventID::GuildEmojisUpdate: mC->on_guild_emojis_update(std::function{}); break; - case DpEventID::GuildStickersUpdate: mC->on_guild_stickers_update(std::function{}); break; - case DpEventID::PresenceUpdate: mC->on_presence_update(std::function{}); break; - case DpEventID::WebhooksUpdate: mC->on_webhooks_update(std::function{}); break; - case DpEventID::GuildMemberAdd: mC->on_guild_member_add(std::function{}); break; - case DpEventID::InviteDelete: mC->on_invite_delete(std::function{}); break; - case DpEventID::GuildUpdate: mC->on_guild_update(std::function{}); break; - case DpEventID::GuildIntegrationsUpdate: mC->on_guild_integrations_update(std::function{}); break; - case DpEventID::GuildMemberUpdate: mC->on_guild_member_update(std::function{}); break; - case DpEventID::ApplicationCommandUpdate: mC->on_application_command_update(std::function{}); break; - case DpEventID::InviteCreate: mC->on_invite_create(std::function{}); break; - case DpEventID::MessageUpdate: mC->on_message_update(std::function{}); break; - case DpEventID::UserUpdate: mC->on_user_update(std::function{}); break; - case DpEventID::MessageCreate: mC->on_message_create(std::function{}); break; - case DpEventID::GuildBanAdd: mC->on_guild_ban_add(std::function{}); break; - case DpEventID::GuildBanRemove: mC->on_guild_ban_remove(std::function{}); break; - case DpEventID::IntegrationCreate: mC->on_integration_create(std::function{}); break; - case DpEventID::IntegrationUpdate: mC->on_integration_update(std::function{}); break; - case DpEventID::IntegrationDelete: mC->on_integration_delete(std::function{}); break; - case DpEventID::ThreadCreate: mC->on_thread_create(std::function{}); break; - case DpEventID::ThreadUpdate: mC->on_thread_update(std::function{}); break; - case DpEventID::ThreadDelete: mC->on_thread_delete(std::function{}); break; - case DpEventID::ThreadListSync: mC->on_thread_list_sync(std::function{}); break; - case DpEventID::ThreadMemberUpdate: mC->on_thread_member_update(std::function{}); break; - case DpEventID::ThreadMembersUpdate: mC->on_thread_members_update(std::function{}); break; - case DpEventID::VoiceBufferSend: mC->on_voice_buffer_send(std::function{}); break; - case DpEventID::VoiceUserTalking: mC->on_voice_user_talking(std::function{}); break; - case DpEventID::VoiceReady: mC->on_voice_ready(std::function{}); break; - case DpEventID::VoiceReceive: mC->on_voice_receive(std::function{}); break; - case DpEventID::VoiceTrackMarker: mC->on_voice_track_marker(std::function{}); break; - case DpEventID::StageInstanceCreate: mC->on_stage_instance_create(std::function{}); break; - case DpEventID::StageInstanceDelete: mC->on_stage_instance_delete(std::function{}); break; - case DpEventID::Max: // Fall through - default: STHROWF("Invalid discord event identifier {}", id); - } - // Allow chaining - return *this; -} - -// ------------------------------------------------------------------------------------------------ -void DpInternalEvent::Release() -{ - // Make sure we actually manage something - if (mData == 0) return; - // Fetch the type of data - const auto type = GetType(); - // Fetch the data itself - const auto data = GetData(); - // Identify data type - switch (type) - { - case DpEventID::VoiceStateUpdate: delete reinterpret_cast< DpVoiceStateUpdateEvent * >(data); break; - case DpEventID::Log: delete reinterpret_cast< DpLogEvent * >(data); break; - case DpEventID::GuildJoinRequestDelete: delete reinterpret_cast< DpGuildJoinRequestDeleteEvent * >(data); break; - case DpEventID::InteractionCreate: delete reinterpret_cast< DpInteractionCreateEvent * >(data); break; - case DpEventID::ButtonClick: delete reinterpret_cast< DpButtonClickEvent * >(data); break; - case DpEventID::SelectClick: delete reinterpret_cast< DpSelectClickEvent * >(data); break; - case DpEventID::GuildDelete: delete reinterpret_cast< DpGuildDeleteEvent * >(data); break; - case DpEventID::ChannelDelete: delete reinterpret_cast< DpChannelDeleteEvent * >(data); break; - case DpEventID::ChannelUpdate: delete reinterpret_cast< DpChannelUpdateEvent * >(data); break; - case DpEventID::Ready: delete reinterpret_cast< DpReadyEvent * >(data); break; - case DpEventID::MessageDelete: delete reinterpret_cast< DpMessageDeleteEvent * >(data); break; - case DpEventID::ApplicationCommandDelete: delete reinterpret_cast< DpApplicationCommandDeleteEvent * >(data); break; - case DpEventID::GuildMemberRemove: delete reinterpret_cast< DpGuildMemberRemoveEvent * >(data); break; - case DpEventID::ApplicationCommandCreate: delete reinterpret_cast< DpApplicationCommandCreateEvent * >(data); break; - case DpEventID::Resumed: delete reinterpret_cast< DpResumedEvent * >(data); break; - case DpEventID::GuildRoleCreate: delete reinterpret_cast< DpGuildRoleCreateEvent * >(data); break; - case DpEventID::TypingStart: delete reinterpret_cast< DpTypingStartEvent * >(data); break; - case DpEventID::MessageReactionAdd: delete reinterpret_cast< DpMessageReactionAddEvent * >(data); break; - case DpEventID::GuildMembersChunk: delete reinterpret_cast< DpGuildMembersChunkEvent * >(data); break; - case DpEventID::MessageReactionRemove: delete reinterpret_cast< DpMessageReactionRemoveEvent * >(data); break; - case DpEventID::GuildCreate: delete reinterpret_cast< DpGuildCreateEvent * >(data); break; - case DpEventID::ChannelCreate: delete reinterpret_cast< DpChannelCreateEvent * >(data); break; - case DpEventID::MessageReactionRemoveEmoji: delete reinterpret_cast< DpMessageReactionRemoveEmojiEvent * >(data); break; - case DpEventID::MessageDeleteBulk: delete reinterpret_cast< DpMessageDeleteBulkEvent * >(data); break; - case DpEventID::GuildRoleUpdate: delete reinterpret_cast< DpGuildRoleUpdateEvent * >(data); break; - case DpEventID::GuildRoleDelete: delete reinterpret_cast< DpGuildRoleDeleteEvent * >(data); break; - case DpEventID::ChannelPinsUpdate: delete reinterpret_cast< DpChannelPinsUpdateEvent * >(data); break; - case DpEventID::MessageReactionRemoveAll: delete reinterpret_cast< DpMessageReactionRemoveAllEvent * >(data); break; - case DpEventID::VoiceServerUpdate: delete reinterpret_cast< DpVoiceServerUpdateEvent * >(data); break; - case DpEventID::GuildEmojisUpdate: delete reinterpret_cast< DpGuildEmojisUpdateEvent * >(data); break; - case DpEventID::GuildStickersUpdate: delete reinterpret_cast< DpGuildStickersUpdateEvent * >(data); break; - case DpEventID::PresenceUpdate: delete reinterpret_cast< DpPresenceUpdateEvent * >(data); break; - case DpEventID::WebhooksUpdate: delete reinterpret_cast< DpWebhooksUpdateEvent * >(data); break; - case DpEventID::GuildMemberAdd: delete reinterpret_cast< DpGuildMemberAddEvent * >(data); break; - case DpEventID::InviteDelete: delete reinterpret_cast< DpInviteDeleteEvent * >(data); break; - case DpEventID::GuildUpdate: delete reinterpret_cast< DpGuildUpdateEvent * >(data); break; - case DpEventID::GuildIntegrationsUpdate: delete reinterpret_cast< DpGuildIntegrationsUpdateEvent * >(data); break; - case DpEventID::GuildMemberUpdate: delete reinterpret_cast< DpGuildMemberUpdateEvent * >(data); break; - case DpEventID::ApplicationCommandUpdate: delete reinterpret_cast< DpApplicationCommandUpdateEvent * >(data); break; - case DpEventID::InviteCreate: delete reinterpret_cast< DpInviteCreateEvent * >(data); break; - case DpEventID::MessageUpdate: delete reinterpret_cast< DpMessageUpdateEvent * >(data); break; - case DpEventID::UserUpdate: delete reinterpret_cast< DpUserUpdateEvent * >(data); break; - case DpEventID::MessageCreate: delete reinterpret_cast< DpMessageCreateEvent * >(data); break; - case DpEventID::GuildBanAdd: delete reinterpret_cast< DpGuildBanAddEvent * >(data); break; - case DpEventID::GuildBanRemove: delete reinterpret_cast< DpGuildBanRemoveEvent * >(data); break; - case DpEventID::IntegrationCreate: delete reinterpret_cast< DpIntegrationCreateEvent * >(data); break; - case DpEventID::IntegrationUpdate: delete reinterpret_cast< DpIntegrationUpdateEvent * >(data); break; - case DpEventID::IntegrationDelete: delete reinterpret_cast< DpIntegrationDeleteEvent * >(data); break; - case DpEventID::ThreadCreate: delete reinterpret_cast< DpThreadCreateEvent * >(data); break; - case DpEventID::ThreadUpdate: delete reinterpret_cast< DpThreadUpdateEvent * >(data); break; - case DpEventID::ThreadDelete: delete reinterpret_cast< DpThreadDeleteEvent * >(data); break; - case DpEventID::ThreadListSync: delete reinterpret_cast< DpThreadListSyncEvent * >(data); break; - case DpEventID::ThreadMemberUpdate: delete reinterpret_cast< DpThreadMemberUpdateEvent * >(data); break; - case DpEventID::ThreadMembersUpdate: delete reinterpret_cast< DpThreadMembersUpdateEvent * >(data); break; - case DpEventID::VoiceBufferSend: delete reinterpret_cast< DpVoiceBufferSendEvent * >(data); break; - case DpEventID::VoiceUserTalking: delete reinterpret_cast< DpVoiceUserTalkingEvent * >(data); break; - case DpEventID::VoiceReady: delete reinterpret_cast< DpVoiceReadyEvent * >(data); break; - case DpEventID::VoiceReceive: delete reinterpret_cast< DpVoiceReceiveEvent * >(data); break; - case DpEventID::VoiceTrackMarker: delete reinterpret_cast< DpVoiceTrackMarkerEvent * >(data); break; - case DpEventID::StageInstanceCreate: delete reinterpret_cast< DpStageInstanceCreateEvent * >(data); break; - case DpEventID::StageInstanceDelete: delete reinterpret_cast< DpStageInstanceDeleteEvent * >(data); break; - case DpEventID::Max: // Fall through - default: LogFtl("Unrecognized discord event instance type"); assert(0); break; - } - // Forget about it - Reset(); -} - -// ------------------------------------------------------------------------------------------------ -SQMOD_NODISCARD LightObj EventToScriptObject(uint8_t type, uintptr_t data) -{ - switch (type) - { - case DpEventID::VoiceStateUpdate: return LightObj(reinterpret_cast< DpVoiceStateUpdateEvent * >(data)); - case DpEventID::Log: return LightObj(reinterpret_cast< DpLogEvent * >(data)); - case DpEventID::GuildJoinRequestDelete: return LightObj(reinterpret_cast< DpGuildJoinRequestDeleteEvent * >(data)); - case DpEventID::InteractionCreate: return LightObj(reinterpret_cast< DpInteractionCreateEvent * >(data)); - case DpEventID::ButtonClick: return LightObj(reinterpret_cast< DpButtonClickEvent * >(data)); - case DpEventID::SelectClick: return LightObj(reinterpret_cast< DpSelectClickEvent * >(data)); - case DpEventID::GuildDelete: return LightObj(reinterpret_cast< DpGuildDeleteEvent * >(data)); - case DpEventID::ChannelDelete: return LightObj(reinterpret_cast< DpChannelDeleteEvent * >(data)); - case DpEventID::ChannelUpdate: return LightObj(reinterpret_cast< DpChannelUpdateEvent * >(data)); - case DpEventID::Ready: return LightObj(reinterpret_cast< DpReadyEvent * >(data)); - case DpEventID::MessageDelete: return LightObj(reinterpret_cast< DpMessageDeleteEvent * >(data)); - case DpEventID::ApplicationCommandDelete: return LightObj(reinterpret_cast< DpApplicationCommandDeleteEvent * >(data)); - case DpEventID::GuildMemberRemove: return LightObj(reinterpret_cast< DpGuildMemberRemoveEvent * >(data)); - case DpEventID::ApplicationCommandCreate: return LightObj(reinterpret_cast< DpApplicationCommandCreateEvent * >(data)); - case DpEventID::Resumed: return LightObj(reinterpret_cast< DpResumedEvent * >(data)); - case DpEventID::GuildRoleCreate: return LightObj(reinterpret_cast< DpGuildRoleCreateEvent * >(data)); - case DpEventID::TypingStart: return LightObj(reinterpret_cast< DpTypingStartEvent * >(data)); - case DpEventID::MessageReactionAdd: return LightObj(reinterpret_cast< DpMessageReactionAddEvent * >(data)); - case DpEventID::GuildMembersChunk: return LightObj(reinterpret_cast< DpGuildMembersChunkEvent * >(data)); - case DpEventID::MessageReactionRemove: return LightObj(reinterpret_cast< DpMessageReactionRemoveEvent * >(data)); - case DpEventID::GuildCreate: return LightObj(reinterpret_cast< DpGuildCreateEvent * >(data)); - case DpEventID::ChannelCreate: return LightObj(reinterpret_cast< DpChannelCreateEvent * >(data)); - case DpEventID::MessageReactionRemoveEmoji: return LightObj(reinterpret_cast< DpMessageReactionRemoveEmojiEvent * >(data)); - case DpEventID::MessageDeleteBulk: return LightObj(reinterpret_cast< DpMessageDeleteBulkEvent * >(data)); - case DpEventID::GuildRoleUpdate: return LightObj(reinterpret_cast< DpGuildRoleUpdateEvent * >(data)); - case DpEventID::GuildRoleDelete: return LightObj(reinterpret_cast< DpGuildRoleDeleteEvent * >(data)); - case DpEventID::ChannelPinsUpdate: return LightObj(reinterpret_cast< DpChannelPinsUpdateEvent * >(data)); - case DpEventID::MessageReactionRemoveAll: return LightObj(reinterpret_cast< DpMessageReactionRemoveAllEvent * >(data)); - case DpEventID::VoiceServerUpdate: return LightObj(reinterpret_cast< DpVoiceServerUpdateEvent * >(data)); - case DpEventID::GuildEmojisUpdate: return LightObj(reinterpret_cast< DpGuildEmojisUpdateEvent * >(data)); - case DpEventID::GuildStickersUpdate: return LightObj(reinterpret_cast< DpGuildStickersUpdateEvent * >(data)); - case DpEventID::PresenceUpdate: return LightObj(reinterpret_cast< DpPresenceUpdateEvent * >(data)); - case DpEventID::WebhooksUpdate: return LightObj(reinterpret_cast< DpWebhooksUpdateEvent * >(data)); - case DpEventID::GuildMemberAdd: return LightObj(reinterpret_cast< DpGuildMemberAddEvent * >(data)); - case DpEventID::InviteDelete: return LightObj(reinterpret_cast< DpInviteDeleteEvent * >(data)); - case DpEventID::GuildUpdate: return LightObj(reinterpret_cast< DpGuildUpdateEvent * >(data)); - case DpEventID::GuildIntegrationsUpdate: return LightObj(reinterpret_cast< DpGuildIntegrationsUpdateEvent * >(data)); - case DpEventID::GuildMemberUpdate: return LightObj(reinterpret_cast< DpGuildMemberUpdateEvent * >(data)); - case DpEventID::ApplicationCommandUpdate: return LightObj(reinterpret_cast< DpApplicationCommandUpdateEvent * >(data)); - case DpEventID::InviteCreate: return LightObj(reinterpret_cast< DpInviteCreateEvent * >(data)); - case DpEventID::MessageUpdate: return LightObj(reinterpret_cast< DpMessageUpdateEvent * >(data)); - case DpEventID::UserUpdate: return LightObj(reinterpret_cast< DpUserUpdateEvent * >(data)); - case DpEventID::MessageCreate: return LightObj(reinterpret_cast< DpMessageCreateEvent * >(data)); - case DpEventID::GuildBanAdd: return LightObj(reinterpret_cast< DpGuildBanAddEvent * >(data)); - case DpEventID::GuildBanRemove: return LightObj(reinterpret_cast< DpGuildBanRemoveEvent * >(data)); - case DpEventID::IntegrationCreate: return LightObj(reinterpret_cast< DpIntegrationCreateEvent * >(data)); - case DpEventID::IntegrationUpdate: return LightObj(reinterpret_cast< DpIntegrationUpdateEvent * >(data)); - case DpEventID::IntegrationDelete: return LightObj(reinterpret_cast< DpIntegrationDeleteEvent * >(data)); - case DpEventID::ThreadCreate: return LightObj(reinterpret_cast< DpThreadCreateEvent * >(data)); - case DpEventID::ThreadUpdate: return LightObj(reinterpret_cast< DpThreadUpdateEvent * >(data)); - case DpEventID::ThreadDelete: return LightObj(reinterpret_cast< DpThreadDeleteEvent * >(data)); - case DpEventID::ThreadListSync: return LightObj(reinterpret_cast< DpThreadListSyncEvent * >(data)); - case DpEventID::ThreadMemberUpdate: return LightObj(reinterpret_cast< DpThreadMemberUpdateEvent * >(data)); - case DpEventID::ThreadMembersUpdate: return LightObj(reinterpret_cast< DpThreadMembersUpdateEvent * >(data)); - case DpEventID::VoiceBufferSend: return LightObj(reinterpret_cast< DpVoiceBufferSendEvent * >(data)); - case DpEventID::VoiceUserTalking: return LightObj(reinterpret_cast< DpVoiceUserTalkingEvent * >(data)); - case DpEventID::VoiceReady: return LightObj(reinterpret_cast< DpVoiceReadyEvent * >(data)); - case DpEventID::VoiceReceive: return LightObj(reinterpret_cast< DpVoiceReceiveEvent * >(data)); - case DpEventID::VoiceTrackMarker: return LightObj(reinterpret_cast< DpVoiceTrackMarkerEvent * >(data)); - case DpEventID::StageInstanceCreate: return LightObj(reinterpret_cast< DpStageInstanceCreateEvent * >(data)); - case DpEventID::StageInstanceDelete: return LightObj(reinterpret_cast< DpStageInstanceDeleteEvent * >(data)); - case DpEventID::Max: // Fall through - default: assert(0); return LightObj{}; - } -} - -// ------------------------------------------------------------------------------------------------ -void EventInvokeCleanup(uint8_t type, uintptr_t data) -{ - switch (type) - { - case DpEventID::VoiceStateUpdate: reinterpret_cast< DpVoiceStateUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::Log: reinterpret_cast< DpLogEvent * >(data)->Cleanup(); break; - case DpEventID::GuildJoinRequestDelete: reinterpret_cast< DpGuildJoinRequestDeleteEvent * >(data)->Cleanup(); break; - case DpEventID::InteractionCreate: reinterpret_cast< DpInteractionCreateEvent * >(data)->Cleanup(); break; - case DpEventID::ButtonClick: reinterpret_cast< DpButtonClickEvent * >(data)->Cleanup(); break; - case DpEventID::SelectClick: reinterpret_cast< DpSelectClickEvent * >(data)->Cleanup(); break; - case DpEventID::GuildDelete: reinterpret_cast< DpGuildDeleteEvent * >(data)->Cleanup(); break; - case DpEventID::ChannelDelete: reinterpret_cast< DpChannelDeleteEvent * >(data)->Cleanup(); break; - case DpEventID::ChannelUpdate: reinterpret_cast< DpChannelUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::Ready: reinterpret_cast< DpReadyEvent * >(data)->Cleanup(); break; - case DpEventID::MessageDelete: reinterpret_cast< DpMessageDeleteEvent * >(data)->Cleanup(); break; - case DpEventID::ApplicationCommandDelete: reinterpret_cast< DpApplicationCommandDeleteEvent * >(data)->Cleanup(); break; - case DpEventID::GuildMemberRemove: reinterpret_cast< DpGuildMemberRemoveEvent * >(data)->Cleanup(); break; - case DpEventID::ApplicationCommandCreate: reinterpret_cast< DpApplicationCommandCreateEvent * >(data)->Cleanup(); break; - case DpEventID::Resumed: reinterpret_cast< DpResumedEvent * >(data)->Cleanup(); break; - case DpEventID::GuildRoleCreate: reinterpret_cast< DpGuildRoleCreateEvent * >(data)->Cleanup(); break; - case DpEventID::TypingStart: reinterpret_cast< DpTypingStartEvent * >(data)->Cleanup(); break; - case DpEventID::MessageReactionAdd: reinterpret_cast< DpMessageReactionAddEvent * >(data)->Cleanup(); break; - case DpEventID::GuildMembersChunk: reinterpret_cast< DpGuildMembersChunkEvent * >(data)->Cleanup(); break; - case DpEventID::MessageReactionRemove: reinterpret_cast< DpMessageReactionRemoveEvent * >(data)->Cleanup(); break; - case DpEventID::GuildCreate: reinterpret_cast< DpGuildCreateEvent * >(data)->Cleanup(); break; - case DpEventID::ChannelCreate: reinterpret_cast< DpChannelCreateEvent * >(data)->Cleanup(); break; - case DpEventID::MessageReactionRemoveEmoji: reinterpret_cast< DpMessageReactionRemoveEmojiEvent * >(data)->Cleanup(); break; - case DpEventID::MessageDeleteBulk: reinterpret_cast< DpMessageDeleteBulkEvent * >(data)->Cleanup(); break; - case DpEventID::GuildRoleUpdate: reinterpret_cast< DpGuildRoleUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::GuildRoleDelete: reinterpret_cast< DpGuildRoleDeleteEvent * >(data)->Cleanup(); break; - case DpEventID::ChannelPinsUpdate: reinterpret_cast< DpChannelPinsUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::MessageReactionRemoveAll: reinterpret_cast< DpMessageReactionRemoveAllEvent * >(data)->Cleanup(); break; - case DpEventID::VoiceServerUpdate: reinterpret_cast< DpVoiceServerUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::GuildEmojisUpdate: reinterpret_cast< DpGuildEmojisUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::GuildStickersUpdate: reinterpret_cast< DpGuildStickersUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::PresenceUpdate: reinterpret_cast< DpPresenceUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::WebhooksUpdate: reinterpret_cast< DpWebhooksUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::GuildMemberAdd: reinterpret_cast< DpGuildMemberAddEvent * >(data)->Cleanup(); break; - case DpEventID::InviteDelete: reinterpret_cast< DpInviteDeleteEvent * >(data)->Cleanup(); break; - case DpEventID::GuildUpdate: reinterpret_cast< DpGuildUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::GuildIntegrationsUpdate: reinterpret_cast< DpGuildIntegrationsUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::GuildMemberUpdate: reinterpret_cast< DpGuildMemberUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::ApplicationCommandUpdate: reinterpret_cast< DpApplicationCommandUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::InviteCreate: reinterpret_cast< DpInviteCreateEvent * >(data)->Cleanup(); break; - case DpEventID::MessageUpdate: reinterpret_cast< DpMessageUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::UserUpdate: reinterpret_cast< DpUserUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::MessageCreate: reinterpret_cast< DpMessageCreateEvent * >(data)->Cleanup(); break; - case DpEventID::GuildBanAdd: reinterpret_cast< DpGuildBanAddEvent * >(data)->Cleanup(); break; - case DpEventID::GuildBanRemove: reinterpret_cast< DpGuildBanRemoveEvent * >(data)->Cleanup(); break; - case DpEventID::IntegrationCreate: reinterpret_cast< DpIntegrationCreateEvent * >(data)->Cleanup(); break; - case DpEventID::IntegrationUpdate: reinterpret_cast< DpIntegrationUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::IntegrationDelete: reinterpret_cast< DpIntegrationDeleteEvent * >(data)->Cleanup(); break; - case DpEventID::ThreadCreate: reinterpret_cast< DpThreadCreateEvent * >(data)->Cleanup(); break; - case DpEventID::ThreadUpdate: reinterpret_cast< DpThreadUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::ThreadDelete: reinterpret_cast< DpThreadDeleteEvent * >(data)->Cleanup(); break; - case DpEventID::ThreadListSync: reinterpret_cast< DpThreadListSyncEvent * >(data)->Cleanup(); break; - case DpEventID::ThreadMemberUpdate: reinterpret_cast< DpThreadMemberUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::ThreadMembersUpdate: reinterpret_cast< DpThreadMembersUpdateEvent * >(data)->Cleanup(); break; - case DpEventID::VoiceBufferSend: reinterpret_cast< DpVoiceBufferSendEvent * >(data)->Cleanup(); break; - case DpEventID::VoiceUserTalking: reinterpret_cast< DpVoiceUserTalkingEvent * >(data)->Cleanup(); break; - case DpEventID::VoiceReady: reinterpret_cast< DpVoiceReadyEvent * >(data)->Cleanup(); break; - case DpEventID::VoiceReceive: reinterpret_cast< DpVoiceReceiveEvent * >(data)->Cleanup(); break; - case DpEventID::VoiceTrackMarker: reinterpret_cast< DpVoiceTrackMarkerEvent * >(data)->Cleanup(); break; - case DpEventID::StageInstanceCreate: reinterpret_cast< DpStageInstanceCreateEvent * >(data)->Cleanup(); break; - case DpEventID::StageInstanceDelete: reinterpret_cast< DpStageInstanceDeleteEvent * >(data)->Cleanup(); break; - case DpEventID::Max: // Fall through - default: assert(0); return; - } -} - } // Namespace:: SqMod diff --git a/module/Library/DPP.hpp b/module/Library/DPP.hpp index a096b9f4..bcbdd664 100644 --- a/module/Library/DPP.hpp +++ b/module/Library/DPP.hpp @@ -1,428 +1,12 @@ #pragma once // ------------------------------------------------------------------------------------------------ -#include "Library/DPPEv.hpp" -#include "Library/DPPTy.hpp" -#include "Core/Signal.hpp" +#include "Core/Utility.hpp" // ------------------------------------------------------------------------------------------------ -#include -#include -#include -// ------------------------------------------------------------------------------------------------ -#include -#include // ------------------------------------------------------------------------------------------------ namespace SqMod { -/* ------------------------------------------------------------------------------------------------ - * WebSocket frame. -*/ -struct DpInternalEvent -{ - /* -------------------------------------------------------------------------------------------- - * Event data. - */ - uint64_t mData{0llu}; - - /* -------------------------------------------------------------------------------------------- - * Default constructor. - */ - DpInternalEvent() noexcept = default; - - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - DpInternalEvent(uint64_t type, void * data) noexcept - : mData((type << 56u) | reinterpret_cast< uint64_t >(data)) - { - } - - /* -------------------------------------------------------------------------------------------- - * Copy constructor (disabled). - */ - DpInternalEvent(const DpInternalEvent & o) = delete; - - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - DpInternalEvent(DpInternalEvent && o) noexcept - : mData(o.mData) - { - o.mData = 0llu; // Take ownership - } - - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~DpInternalEvent() - { - Release(); - } - - /* -------------------------------------------------------------------------------------------- - * Copy assignment operator (disabled). - */ - DpInternalEvent & operator = (const DpInternalEvent & o) = delete; - - /* -------------------------------------------------------------------------------------------- - * Move assignment operator. - */ - DpInternalEvent & operator = (DpInternalEvent && o) noexcept - { - if (mData != o.mData) - { - // Release current information - Release(); - // Replicate members - mData = o.mData; - // Take ownership - o.mData = 0llu; - } - return *this; - } - - /* -------------------------------------------------------------------------------------------- - * Forget about the managed event data. - */ - void Reset() noexcept - { - mData = 0llu; - } - - /* -------------------------------------------------------------------------------------------- - * Retrieve the event type. - */ - SQMOD_NODISCARD uint8_t GetType() const noexcept - { - return static_cast< uint8_t >((mData >> 56u) & 0xFFllu); - } - - /* -------------------------------------------------------------------------------------------- - * Retrieve the event data. - */ - SQMOD_NODISCARD uintptr_t GetData() const noexcept - { - return static_cast< uintptr_t >((~(0xFFllu << 56u)) & mData); - } - - /* -------------------------------------------------------------------------------------------- - * Release associated event data, if any. - */ - void Release(); -}; - -/* ------------------------------------------------------------------------------------------------ - * The cluster class represents a group of shards and a command queue for sending and receiving - * commands from discord via HTTP. -*/ -struct DpCluster : public SqChainedInstances< DpCluster > -{ - /* -------------------------------------------------------------------------------------------- - * Queue of events generated from other threads. - */ - using EventQueue = moodycamel::ConcurrentQueue< DpInternalEvent >; - - /* -------------------------------------------------------------------------------------------- - * Managed cluster instance. - */ - std::unique_ptr< dpp::cluster > mC{nullptr}; - - /* -------------------------------------------------------------------------------------------- - * Event queue. - */ - EventQueue mQueue{4096}; - - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpCluster(StackStrF & token) - : mC(std::make_unique< dpp::cluster >(token.ToStr())) - , mQueue(4096) - { - Initialize(); - } - - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - DpCluster(StackStrF & token, SQInteger intents) - : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents))) - , mQueue(4096) - { - Initialize(); - } - - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - DpCluster(StackStrF & token, SQInteger intents, SQInteger shards) - : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents), static_cast< uint32_t >(shards))) - , mQueue(4096) - { - Initialize(); - } - - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - DpCluster(StackStrF & token, SQInteger intents, SQInteger shards, SQInteger cluster_id) - : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents), static_cast< uint32_t >(shards), static_cast< uint32_t >(cluster_id))) - , mQueue(4096) - { - Initialize(); - } - - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - DpCluster(StackStrF & token, SQInteger intents, SQInteger shards, SQInteger cluster_id, SQInteger max_clusters) - : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents), static_cast< uint32_t >(shards), static_cast< uint32_t >(cluster_id), static_cast< uint32_t >(max_clusters))) - , mQueue(4096) - { - Initialize(); - } - - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - DpCluster(StackStrF & token, SQInteger intents, SQInteger shards, SQInteger cluster_id, SQInteger max_clusters, bool compressed) - : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents), static_cast< uint32_t >(shards), static_cast< uint32_t >(cluster_id), static_cast< uint32_t >(max_clusters), compressed)) - , mQueue(4096) - { - Initialize(); - } - - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - DpCluster(StackStrF & token, SQInteger intents, SQInteger shards, SQInteger cluster_id, SQInteger max_clusters, bool compressed, const DpCachePolicy & cp) - : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents), static_cast< uint32_t >(shards), static_cast< uint32_t >(cluster_id), static_cast< uint32_t >(max_clusters), compressed, cp.ToNative())) - , mQueue(4096) - { - Initialize(); - } - - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~DpCluster() - { - DropEvents(); - // Forget about this instance - UnchainInstance(); - } - - /* -------------------------------------------------------------------------------------------- - * Start the cluster, connecting all its shards. Returns once all shards are connected. - */ - DpCluster & Start() - { - LogInf("Before start..."); - mC->start(true); - LogInf("After start..."); - return *this; - } - - /* -------------------------------------------------------------------------------------------- - * Log a message to whatever log the user is using. - */ - DpCluster & Log(SQInteger severity, StackStrF & message) - { - mC->log(static_cast< dpp::loglevel >(severity), message.ToStr()); - return *this; - } - - /* -------------------------------------------------------------------------------------------- - * Get the dm channel for a user id. - */ - SQMOD_NODISCARD dpp::snowflake GetDmChannel(dpp::snowflake user_id) const - { - return mC->get_dm_channel(static_cast< dpp::snowflake >(user_id)); - } - - /* -------------------------------------------------------------------------------------------- - * Set the dm channel id for a user id. - */ - DpCluster & SetDmChannel(dpp::snowflake user_id, dpp::snowflake channel_id) - { - mC->set_dm_channel(user_id, channel_id); - return *this; - } - - /* -------------------------------------------------------------------------------------------- - * Returns the uptime of the cluster. - */ - SQMOD_NODISCARD dpp::utility::uptime UpTime() const - { - return mC->uptime(); - } - - /* -------------------------------------------------------------------------------------------- - * Returns the uptime of the cluster. - */ - DpCluster & SetPresence(const DpPresence & p) - { - mC->set_presence(p.Valid()); - return *this; - } - - // -------------------------------------------------------------------------------------------- - LightObj mSqEvents{}; // Table containing the emitted cluster events. - - /* -------------------------------------------------------------------------------------------- - * Retrieve the events table of this cluster. - */ - SQMOD_NODISCARD LightObj & GetEvents() - { - return mSqEvents; - } - - /* -------------------------------------------------------------------------------------------- - * Cluster signals. - */ - std::array< SignalPair, static_cast< size_t >(DpEventID::Max) > mEvents{}; - - /* -------------------------------------------------------------------------------------------- - * Process the cluster. - */ - void Process(bool force = false); - - /* -------------------------------------------------------------------------------------------- - * Terminate the cluster. - */ - void Terminate() - { - // Delete the cluster instance - mC.reset(); - // Release associated script objects - mSqEvents.Release(); - // Release event signal objects - DropEvents(); - } - - /* -------------------------------------------------------------------------------------------- - * Enable a certain event for the cluster. - */ - DpCluster & EnableEvent(SQInteger id); - - /* -------------------------------------------------------------------------------------------- - * Disable a certain event for the cluster. - */ - DpCluster & DisableEvent(SQInteger id); - -private: - - /* -------------------------------------------------------------------------------------------- - * Initialize the cluster. - */ - void Initialize() - { - InitEvents(); - // Remember this instance - ChainInstance(); - } - - /* -------------------------------------------------------------------------------------------- - * Signal initialization. - */ - void InitEvents() - { - // Ignore the call if already initialized - if (!mSqEvents.IsNull()) - { - return; - } - // Create a new table on the stack - sq_newtableex(SqVM(), 64); - // Grab the table object from the stack - mSqEvents = LightObj(-1, SqVM()); - // Pop the table object from the stack - sq_pop(SqVM(), 1); - // Proceed to initializing the events - for (size_t i = 0; i < mEvents.size(); ++i) - { - InitSignalPair(mEvents[i], mSqEvents, DpEventID::NAME[i]); - } - } - - /* -------------------------------------------------------------------------------------------- - * Signal termination. - */ - void DropEvents() - { - for (auto & e : mEvents) - { - ResetSignalPair(e); - } - } - - /* -------------------------------------------------------------------------------------------- - * Event handlers. - */ - void OnVoiceStateUpdate(const dpp::voice_state_update_t & ev); - void OnLog(const dpp::log_t & ev); - void OnGuildJoinRequestDelete(const dpp::guild_join_request_delete_t & ev); - void OnInteractionCreate(const dpp::interaction_create_t & ev); - void OnButtonClick(const dpp::button_click_t & ev); - void OnSelectClick(const dpp::select_click_t & ev); - void OnGuildDelete(const dpp::guild_delete_t & ev); - void OnChannelDelete(const dpp::channel_delete_t & ev); - void OnChannelUpdate(const dpp::channel_update_t & ev); - void OnReady(const dpp::ready_t & ev); - void OnMessageDelete(const dpp::message_delete_t & ev); - void OnApplicationCommandDelete(const dpp::application_command_delete_t & ev); - void OnGuildMemberRemove(const dpp::guild_member_remove_t & ev); - void OnApplicationCommandCreate(const dpp::application_command_create_t & ev); - void OnResumed(const dpp::resumed_t & ev); - void OnGuildRoleCreate(const dpp::guild_role_create_t & ev); - void OnTypingStart(const dpp::typing_start_t & ev); - void OnMessageReactionAdd(const dpp::message_reaction_add_t & ev); - void OnGuildMembersChunk(const dpp::guild_members_chunk_t & ev); - void OnMessageReactionRemove(const dpp::message_reaction_remove_t & ev); - void OnGuildCreate(const dpp::guild_create_t & ev); - void OnChannelCreate(const dpp::channel_create_t & ev); - void OnMessageReactionRemoveEmoji(const dpp::message_reaction_remove_emoji_t & ev); - void OnMessageDeleteBulk(const dpp::message_delete_bulk_t & ev); - void OnGuildRoleUpdate(const dpp::guild_role_update_t & ev); - void OnGuildRoleDelete(const dpp::guild_role_delete_t & ev); - void OnChannelPinsUpdate(const dpp::channel_pins_update_t & ev); - void OnMessageReactionRemoveAll(const dpp::message_reaction_remove_all_t & ev); - void OnVoiceServerUpdate(const dpp::voice_server_update_t & ev); - void OnGuildEmojisUpdate(const dpp::guild_emojis_update_t & ev); - void OnGuildStickersUpdate(const dpp::guild_stickers_update_t & ev); - void OnPresenceUpdate(const dpp::presence_update_t & ev); - void OnWebhooksUpdate(const dpp::webhooks_update_t & ev); - void OnGuildMemberAdd(const dpp::guild_member_add_t & ev); - void OnInviteDelete(const dpp::invite_delete_t & ev); - void OnGuildUpdate(const dpp::guild_update_t & ev); - void OnGuildIntegrationsUpdate(const dpp::guild_integrations_update_t & ev); - void OnGuildMemberUpdate(const dpp::guild_member_update_t & ev); - void OnApplicationCommandUpdate(const dpp::application_command_update_t & ev); - void OnInviteCreate(const dpp::invite_create_t & ev); - void OnMessageUpdate(const dpp::message_update_t & ev); - void OnUserUpdate(const dpp::user_update_t & ev); - void OnMessageCreate(const dpp::message_create_t & ev); - void OnGuildBanAdd(const dpp::guild_ban_add_t & ev); - void OnGuildBanRemove(const dpp::guild_ban_remove_t & ev); - void OnIntegrationCreate(const dpp::integration_create_t & ev); - void OnIntegrationUpdate(const dpp::integration_update_t & ev); - void OnIntegrationDelete(const dpp::integration_delete_t & ev); - void OnThreadCreate(const dpp::thread_create_t & ev); - void OnThreadUpdate(const dpp::thread_update_t & ev); - void OnThreadDelete(const dpp::thread_delete_t & ev); - void OnThreadListSync(const dpp::thread_list_sync_t & ev); - void OnThreadMemberUpdate(const dpp::thread_member_update_t & ev); - void OnThreadMembersUpdate(const dpp::thread_members_update_t & ev); - void OnVoiceBufferSend(const dpp::voice_buffer_send_t & ev); - void OnVoiceUserTalking(const dpp::voice_user_talking_t & ev); - void OnVoiceReady(const dpp::voice_ready_t & ev); - void OnVoiceReceive(const dpp::voice_receive_t & ev); - void OnVoiceTrackMarker(const dpp::voice_track_marker_t & ev); - void OnStageInstanceCreate(const dpp::stage_instance_create_t & ev); - void OnStageInstanceDelete(const dpp::stage_instance_delete_t & ev); -}; - } // Namespace:: SqMod diff --git a/module/Library/DPP/Channel.cpp b/module/Library/DPP/Channel.cpp new file mode 100644 index 00000000..5e1208ef --- /dev/null +++ b/module/Library/DPP/Channel.cpp @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/Channel.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ + + +// ------------------------------------------------------------------------------------------------ +void Register_DPP_Channel(HSQUIRRELVM vm, Table & ns) +{ + +} + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Channel.hpp b/module/Library/DPP/Channel.hpp new file mode 100644 index 00000000..854a24c2 --- /dev/null +++ b/module/Library/DPP/Channel.hpp @@ -0,0 +1,19 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * +*/ + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Client.cpp b/module/Library/DPP/Client.cpp new file mode 100644 index 00000000..bf82ca2f --- /dev/null +++ b/module/Library/DPP/Client.cpp @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/Client.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ + + +// ------------------------------------------------------------------------------------------------ +void Register_DPP_Client(HSQUIRRELVM vm, Table & ns) +{ + +} + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Client.hpp b/module/Library/DPP/Client.hpp new file mode 100644 index 00000000..854a24c2 --- /dev/null +++ b/module/Library/DPP/Client.hpp @@ -0,0 +1,19 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * +*/ + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Cluster.cpp b/module/Library/DPP/Cluster.cpp new file mode 100644 index 00000000..1ce5543a --- /dev/null +++ b/module/Library/DPP/Cluster.cpp @@ -0,0 +1,757 @@ +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/Cluster.hpp" +#include "Library/DPP/Events.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ +SQMOD_DECL_TYPENAME(SqDppCluster, _SC("SqDppCluster")) + +// ------------------------------------------------------------------------------------------------ +void Register_DPP_Cluster(HSQUIRRELVM vm, Table & ns) +{ + // -------------------------------------------------------------------------------------------- + ns.Bind(_SC("Cluster"), + Class< DpCluster, NoCopy< DpCluster > >(vm, SqDppCluster::Str) + // Constructors + .Ctor< StackStrF & >() + .Ctor< StackStrF &, SQInteger >() + .Ctor< StackStrF &, SQInteger, SQInteger >() + .Ctor< StackStrF &, SQInteger, SQInteger, SQInteger >() + .Ctor< StackStrF &, SQInteger, SQInteger, SQInteger, SQInteger >() + .Ctor< StackStrF &, SQInteger, SQInteger, SQInteger, SQInteger, bool >() + .Ctor< StackStrF &, SQInteger, SQInteger, SQInteger, SQInteger, bool, const DpCachePolicy & >() + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppCluster::Fn) + // Member Properties + .Prop(_SC("On"), &DpCluster::GetEvents) + .Prop(_SC("UpTime"), &DpCluster::UpTime) + // Member Methods + .Func(_SC("Start"), &DpCluster::Start) + .Func(_SC("Log"), &DpCluster::Log) + .Func(_SC("GetDmChannel"), &DpCluster::GetDmChannel) + .Func(_SC("SetDmChannel"), &DpCluster::SetDmChannel) + .Func(_SC("SetPresence"), &DpCluster::SetPresence) + .Func(_SC("EnableEvent"), &DpCluster::EnableEvent) + .Func(_SC("DisableEvent"), &DpCluster::DisableEvent) + ); +} + +// ------------------------------------------------------------------------------------------------ +SQMOD_NODISCARD LightObj EventToScriptObject(uint8_t type, uintptr_t data); +void EventInvokeCleanup(uint8_t type, uintptr_t data); + +// ------------------------------------------------------------------------------------------------ +void DpCluster::Process(bool force) +{ + // Is there a valid connection? + if (!mC && !force) + { + return; // No point in going forward + } + DpInternalEvent event; + // Retrieve each event individually and process it + for (size_t count = mQueue.size_approx(), n = 0; n <= count; ++n) + { + // Try to get an event from the queue + if (mQueue.try_dequeue(event)) + { + // Fetch the type of event + const auto type = event.GetType(); + // Fetch the event itself + const auto data = event.GetData(); + // Is this a valid event and is anyone listening to it? + if (event.mData == 0 || mEvents[type].first == nullptr || mEvents[type].first->IsEmpty()) + { + continue; // Move on + } + // Transform the event instance into a script object + LightObj obj = EventToScriptObject(type, data); + // Allow the script to take ownership of the event instance now + event.Reset(); + // Forward the call to the associated signal + (*mEvents[type].first)(obj); + // Allow the event instance to clean itself + EventInvokeCleanup(type, data); + } + } +} + +/* ================================================================================================ + * Event handlers. +*/ +void DpCluster::OnVoiceStateUpdate(const dpp::voice_state_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::VoiceStateUpdate, new DpVoiceStateUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnLog(const dpp::log_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::Log, new DpLogEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildJoinRequestDelete(const dpp::guild_join_request_delete_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildJoinRequestDelete, new DpGuildJoinRequestDeleteEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnInteractionCreate(const dpp::interaction_create_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::InteractionCreate, new DpInteractionCreateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnButtonClick(const dpp::button_click_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ButtonClick, new DpButtonClickEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnSelectClick(const dpp::select_click_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::SelectClick, new DpSelectClickEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildDelete(const dpp::guild_delete_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildDelete, new DpGuildDeleteEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnChannelDelete(const dpp::channel_delete_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ChannelDelete, new DpChannelDeleteEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnChannelUpdate(const dpp::channel_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ChannelUpdate, new DpChannelUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnReady(const dpp::ready_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::Ready, new DpReadyEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnMessageDelete(const dpp::message_delete_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::MessageDelete, new DpMessageDeleteEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnApplicationCommandDelete(const dpp::application_command_delete_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ApplicationCommandDelete, new DpApplicationCommandDeleteEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildMemberRemove(const dpp::guild_member_remove_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildMemberRemove, new DpGuildMemberRemoveEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnApplicationCommandCreate(const dpp::application_command_create_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ApplicationCommandCreate, new DpApplicationCommandCreateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnResumed(const dpp::resumed_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::Resumed, new DpResumedEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildRoleCreate(const dpp::guild_role_create_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildRoleCreate, new DpGuildRoleCreateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnTypingStart(const dpp::typing_start_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::TypingStart, new DpTypingStartEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnMessageReactionAdd(const dpp::message_reaction_add_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::MessageReactionAdd, new DpMessageReactionAddEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildMembersChunk(const dpp::guild_members_chunk_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildMembersChunk, new DpGuildMembersChunkEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnMessageReactionRemove(const dpp::message_reaction_remove_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::MessageReactionRemove, new DpMessageReactionRemoveEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildCreate(const dpp::guild_create_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildCreate, new DpGuildCreateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnChannelCreate(const dpp::channel_create_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ChannelCreate, new DpChannelCreateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnMessageReactionRemoveEmoji(const dpp::message_reaction_remove_emoji_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::MessageReactionRemoveEmoji, new DpMessageReactionRemoveEmojiEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnMessageDeleteBulk(const dpp::message_delete_bulk_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::MessageDeleteBulk, new DpMessageDeleteBulkEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildRoleUpdate(const dpp::guild_role_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildRoleUpdate, new DpGuildRoleUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildRoleDelete(const dpp::guild_role_delete_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildRoleDelete, new DpGuildRoleDeleteEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnChannelPinsUpdate(const dpp::channel_pins_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ChannelPinsUpdate, new DpChannelPinsUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnMessageReactionRemoveAll(const dpp::message_reaction_remove_all_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::MessageReactionRemoveAll, new DpMessageReactionRemoveAllEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnVoiceServerUpdate(const dpp::voice_server_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::VoiceServerUpdate, new DpVoiceServerUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildEmojisUpdate(const dpp::guild_emojis_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildEmojisUpdate, new DpGuildEmojisUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildStickersUpdate(const dpp::guild_stickers_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildStickersUpdate, new DpGuildStickersUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnPresenceUpdate(const dpp::presence_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::PresenceUpdate, new DpPresenceUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnWebhooksUpdate(const dpp::webhooks_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::WebhooksUpdate, new DpWebhooksUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildMemberAdd(const dpp::guild_member_add_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildMemberAdd, new DpGuildMemberAddEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnInviteDelete(const dpp::invite_delete_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::InviteDelete, new DpInviteDeleteEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildUpdate(const dpp::guild_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildUpdate, new DpGuildUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildIntegrationsUpdate(const dpp::guild_integrations_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildIntegrationsUpdate, new DpGuildIntegrationsUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildMemberUpdate(const dpp::guild_member_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildMemberUpdate, new DpGuildMemberUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnApplicationCommandUpdate(const dpp::application_command_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ApplicationCommandUpdate, new DpApplicationCommandUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnInviteCreate(const dpp::invite_create_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::InviteCreate, new DpInviteCreateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnMessageUpdate(const dpp::message_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::MessageUpdate, new DpMessageUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnUserUpdate(const dpp::user_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::UserUpdate, new DpUserUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnMessageCreate(const dpp::message_create_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::MessageCreate, new DpMessageCreateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildBanAdd(const dpp::guild_ban_add_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildBanAdd, new DpGuildBanAddEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnGuildBanRemove(const dpp::guild_ban_remove_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::GuildBanRemove, new DpGuildBanRemoveEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnIntegrationCreate(const dpp::integration_create_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::IntegrationCreate, new DpIntegrationCreateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnIntegrationUpdate(const dpp::integration_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::IntegrationUpdate, new DpIntegrationUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnIntegrationDelete(const dpp::integration_delete_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::IntegrationDelete, new DpIntegrationDeleteEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnThreadCreate(const dpp::thread_create_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ThreadCreate, new DpThreadCreateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnThreadUpdate(const dpp::thread_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ThreadUpdate, new DpThreadUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnThreadDelete(const dpp::thread_delete_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ThreadDelete, new DpThreadDeleteEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnThreadListSync(const dpp::thread_list_sync_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ThreadListSync, new DpThreadListSyncEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnThreadMemberUpdate(const dpp::thread_member_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ThreadMemberUpdate, new DpThreadMemberUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnThreadMembersUpdate(const dpp::thread_members_update_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::ThreadMembersUpdate, new DpThreadMembersUpdateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnVoiceBufferSend(const dpp::voice_buffer_send_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::VoiceBufferSend, new DpVoiceBufferSendEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnVoiceUserTalking(const dpp::voice_user_talking_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::VoiceUserTalking, new DpVoiceUserTalkingEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnVoiceReady(const dpp::voice_ready_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::VoiceReady, new DpVoiceReadyEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnVoiceReceive(const dpp::voice_receive_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::VoiceReceive, new DpVoiceReceiveEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnVoiceTrackMarker(const dpp::voice_track_marker_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::VoiceTrackMarker, new DpVoiceTrackMarkerEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnStageInstanceCreate(const dpp::stage_instance_create_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::StageInstanceCreate, new DpStageInstanceCreateEvent(ev))); +} +// ------------------------------------------------------------------------------------------------ +void DpCluster::OnStageInstanceDelete(const dpp::stage_instance_delete_t & ev) +{ + mQueue.enqueue(DpInternalEvent(DpEventID::StageInstanceDelete, new DpStageInstanceDeleteEvent(ev))); +} + +// ------------------------------------------------------------------------------------------------ +DpCluster & DpCluster::EnableEvent(SQInteger id) +{ + switch (id) + { + case DpEventID::VoiceStateUpdate: mC->on_voice_state_update([this](auto && e) { OnVoiceStateUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::Log: mC->on_log([this](auto && e) { OnLog(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildJoinRequestDelete: mC->on_guild_join_request_delete([this](auto && e) { OnGuildJoinRequestDelete(std::forward< decltype(e) >(e)); }); break; + case DpEventID::InteractionCreate: mC->on_interaction_create([this](auto && e) { OnInteractionCreate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ButtonClick: mC->on_button_click([this](auto && e) { OnButtonClick(std::forward< decltype(e) >(e)); }); break; + case DpEventID::SelectClick: mC->on_select_click([this](auto && e) { OnSelectClick(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildDelete: mC->on_guild_delete([this](auto && e) { OnGuildDelete(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ChannelDelete: mC->on_channel_delete([this](auto && e) { OnChannelDelete(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ChannelUpdate: mC->on_channel_update([this](auto && e) { OnChannelUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::Ready: mC->on_ready([this](auto && e) { OnReady(std::forward< decltype(e) >(e)); }); break; + case DpEventID::MessageDelete: mC->on_message_delete([this](auto && e) { OnMessageDelete(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ApplicationCommandDelete: mC->on_application_command_delete([this](auto && e) { OnApplicationCommandDelete(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildMemberRemove: mC->on_guild_member_remove([this](auto && e) { OnGuildMemberRemove(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ApplicationCommandCreate: mC->on_application_command_create([this](auto && e) { OnApplicationCommandCreate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::Resumed: mC->on_resumed([this](auto && e) { OnResumed(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildRoleCreate: mC->on_guild_role_create([this](auto && e) { OnGuildRoleCreate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::TypingStart: mC->on_typing_start([this](auto && e) { OnTypingStart(std::forward< decltype(e) >(e)); }); break; + case DpEventID::MessageReactionAdd: mC->on_message_reaction_add([this](auto && e) { OnMessageReactionAdd(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildMembersChunk: mC->on_guild_members_chunk([this](auto && e) { OnGuildMembersChunk(std::forward< decltype(e) >(e)); }); break; + case DpEventID::MessageReactionRemove: mC->on_message_reaction_remove([this](auto && e) { OnMessageReactionRemove(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildCreate: mC->on_guild_create([this](auto && e) { OnGuildCreate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ChannelCreate: mC->on_channel_create([this](auto && e) { OnChannelCreate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::MessageReactionRemoveEmoji: mC->on_message_reaction_remove_emoji([this](auto && e) { OnMessageReactionRemoveEmoji(std::forward< decltype(e) >(e)); }); break; + case DpEventID::MessageDeleteBulk: mC->on_message_delete_bulk([this](auto && e) { OnMessageDeleteBulk(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildRoleUpdate: mC->on_guild_role_update([this](auto && e) { OnGuildRoleUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildRoleDelete: mC->on_guild_role_delete([this](auto && e) { OnGuildRoleDelete(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ChannelPinsUpdate: mC->on_channel_pins_update([this](auto && e) { OnChannelPinsUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::MessageReactionRemoveAll: mC->on_message_reaction_remove_all([this](auto && e) { OnMessageReactionRemoveAll(std::forward< decltype(e) >(e)); }); break; + case DpEventID::VoiceServerUpdate: mC->on_voice_server_update([this](auto && e) { OnVoiceServerUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildEmojisUpdate: mC->on_guild_emojis_update([this](auto && e) { OnGuildEmojisUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildStickersUpdate: mC->on_guild_stickers_update([this](auto && e) { OnGuildStickersUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::PresenceUpdate: mC->on_presence_update([this](auto && e) { OnPresenceUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::WebhooksUpdate: mC->on_webhooks_update([this](auto && e) { OnWebhooksUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildMemberAdd: mC->on_guild_member_add([this](auto && e) { OnGuildMemberAdd(std::forward< decltype(e) >(e)); }); break; + case DpEventID::InviteDelete: mC->on_invite_delete([this](auto && e) { OnInviteDelete(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildUpdate: mC->on_guild_update([this](auto && e) { OnGuildUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildIntegrationsUpdate: mC->on_guild_integrations_update([this](auto && e) { OnGuildIntegrationsUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildMemberUpdate: mC->on_guild_member_update([this](auto && e) { OnGuildMemberUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ApplicationCommandUpdate: mC->on_application_command_update([this](auto && e) { OnApplicationCommandUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::InviteCreate: mC->on_invite_create([this](auto && e) { OnInviteCreate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::MessageUpdate: mC->on_message_update([this](auto && e) { OnMessageUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::UserUpdate: mC->on_user_update([this](auto && e) { OnUserUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::MessageCreate: mC->on_message_create([this](auto && e) { OnMessageCreate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildBanAdd: mC->on_guild_ban_add([this](auto && e) { OnGuildBanAdd(std::forward< decltype(e) >(e)); }); break; + case DpEventID::GuildBanRemove: mC->on_guild_ban_remove([this](auto && e) { OnGuildBanRemove(std::forward< decltype(e) >(e)); }); break; + case DpEventID::IntegrationCreate: mC->on_integration_create([this](auto && e) { OnIntegrationCreate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::IntegrationUpdate: mC->on_integration_update([this](auto && e) { OnIntegrationUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::IntegrationDelete: mC->on_integration_delete([this](auto && e) { OnIntegrationDelete(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ThreadCreate: mC->on_thread_create([this](auto && e) { OnThreadCreate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ThreadUpdate: mC->on_thread_update([this](auto && e) { OnThreadUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ThreadDelete: mC->on_thread_delete([this](auto && e) { OnThreadDelete(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ThreadListSync: mC->on_thread_list_sync([this](auto && e) { OnThreadListSync(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ThreadMemberUpdate: mC->on_thread_member_update([this](auto && e) { OnThreadMemberUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::ThreadMembersUpdate: mC->on_thread_members_update([this](auto && e) { OnThreadMembersUpdate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::VoiceBufferSend: mC->on_voice_buffer_send([this](auto && e) { OnVoiceBufferSend(std::forward< decltype(e) >(e)); }); break; + case DpEventID::VoiceUserTalking: mC->on_voice_user_talking([this](auto && e) { OnVoiceUserTalking(std::forward< decltype(e) >(e)); }); break; + case DpEventID::VoiceReady: mC->on_voice_ready([this](auto && e) { OnVoiceReady(std::forward< decltype(e) >(e)); }); break; + case DpEventID::VoiceReceive: mC->on_voice_receive([this](auto && e) { OnVoiceReceive(std::forward< decltype(e) >(e)); }); break; + case DpEventID::VoiceTrackMarker: mC->on_voice_track_marker([this](auto && e) { OnVoiceTrackMarker(std::forward< decltype(e) >(e)); }); break; + case DpEventID::StageInstanceCreate: mC->on_stage_instance_create([this](auto && e) { OnStageInstanceCreate(std::forward< decltype(e) >(e)); }); break; + case DpEventID::StageInstanceDelete: mC->on_stage_instance_delete([this](auto && e) { OnStageInstanceDelete(std::forward< decltype(e) >(e)); }); break; + case DpEventID::Max: // Fall through + default: STHROWF("Invalid discord event identifier {}", id); + } + // Allow chaining + return *this; +} + +// ------------------------------------------------------------------------------------------------ +DpCluster & DpCluster::DisableEvent(SQInteger id) +{ + switch (id) + { + case DpEventID::VoiceStateUpdate: mC->on_voice_state_update(std::function{}); break; + case DpEventID::Log: mC->on_log(std::function{}); break; + case DpEventID::GuildJoinRequestDelete: mC->on_guild_join_request_delete(std::function{}); break; + case DpEventID::InteractionCreate: mC->on_interaction_create(std::function{}); break; + case DpEventID::ButtonClick: mC->on_button_click(std::function{}); break; + case DpEventID::SelectClick: mC->on_select_click(std::function{}); break; + case DpEventID::GuildDelete: mC->on_guild_delete(std::function{}); break; + case DpEventID::ChannelDelete: mC->on_channel_delete(std::function{}); break; + case DpEventID::ChannelUpdate: mC->on_channel_update(std::function{}); break; + case DpEventID::Ready: mC->on_ready(std::function{}); break; + case DpEventID::MessageDelete: mC->on_message_delete(std::function{}); break; + case DpEventID::ApplicationCommandDelete: mC->on_application_command_delete(std::function{}); break; + case DpEventID::GuildMemberRemove: mC->on_guild_member_remove(std::function{}); break; + case DpEventID::ApplicationCommandCreate: mC->on_application_command_create(std::function{}); break; + case DpEventID::Resumed: mC->on_resumed(std::function{}); break; + case DpEventID::GuildRoleCreate: mC->on_guild_role_create(std::function{}); break; + case DpEventID::TypingStart: mC->on_typing_start(std::function{}); break; + case DpEventID::MessageReactionAdd: mC->on_message_reaction_add(std::function{}); break; + case DpEventID::GuildMembersChunk: mC->on_guild_members_chunk(std::function{}); break; + case DpEventID::MessageReactionRemove: mC->on_message_reaction_remove(std::function{}); break; + case DpEventID::GuildCreate: mC->on_guild_create(std::function{}); break; + case DpEventID::ChannelCreate: mC->on_channel_create(std::function{}); break; + case DpEventID::MessageReactionRemoveEmoji: mC->on_message_reaction_remove_emoji(std::function{}); break; + case DpEventID::MessageDeleteBulk: mC->on_message_delete_bulk(std::function{}); break; + case DpEventID::GuildRoleUpdate: mC->on_guild_role_update(std::function{}); break; + case DpEventID::GuildRoleDelete: mC->on_guild_role_delete(std::function{}); break; + case DpEventID::ChannelPinsUpdate: mC->on_channel_pins_update(std::function{}); break; + case DpEventID::MessageReactionRemoveAll: mC->on_message_reaction_remove_all(std::function{}); break; + case DpEventID::VoiceServerUpdate: mC->on_voice_server_update(std::function{}); break; + case DpEventID::GuildEmojisUpdate: mC->on_guild_emojis_update(std::function{}); break; + case DpEventID::GuildStickersUpdate: mC->on_guild_stickers_update(std::function{}); break; + case DpEventID::PresenceUpdate: mC->on_presence_update(std::function{}); break; + case DpEventID::WebhooksUpdate: mC->on_webhooks_update(std::function{}); break; + case DpEventID::GuildMemberAdd: mC->on_guild_member_add(std::function{}); break; + case DpEventID::InviteDelete: mC->on_invite_delete(std::function{}); break; + case DpEventID::GuildUpdate: mC->on_guild_update(std::function{}); break; + case DpEventID::GuildIntegrationsUpdate: mC->on_guild_integrations_update(std::function{}); break; + case DpEventID::GuildMemberUpdate: mC->on_guild_member_update(std::function{}); break; + case DpEventID::ApplicationCommandUpdate: mC->on_application_command_update(std::function{}); break; + case DpEventID::InviteCreate: mC->on_invite_create(std::function{}); break; + case DpEventID::MessageUpdate: mC->on_message_update(std::function{}); break; + case DpEventID::UserUpdate: mC->on_user_update(std::function{}); break; + case DpEventID::MessageCreate: mC->on_message_create(std::function{}); break; + case DpEventID::GuildBanAdd: mC->on_guild_ban_add(std::function{}); break; + case DpEventID::GuildBanRemove: mC->on_guild_ban_remove(std::function{}); break; + case DpEventID::IntegrationCreate: mC->on_integration_create(std::function{}); break; + case DpEventID::IntegrationUpdate: mC->on_integration_update(std::function{}); break; + case DpEventID::IntegrationDelete: mC->on_integration_delete(std::function{}); break; + case DpEventID::ThreadCreate: mC->on_thread_create(std::function{}); break; + case DpEventID::ThreadUpdate: mC->on_thread_update(std::function{}); break; + case DpEventID::ThreadDelete: mC->on_thread_delete(std::function{}); break; + case DpEventID::ThreadListSync: mC->on_thread_list_sync(std::function{}); break; + case DpEventID::ThreadMemberUpdate: mC->on_thread_member_update(std::function{}); break; + case DpEventID::ThreadMembersUpdate: mC->on_thread_members_update(std::function{}); break; + case DpEventID::VoiceBufferSend: mC->on_voice_buffer_send(std::function{}); break; + case DpEventID::VoiceUserTalking: mC->on_voice_user_talking(std::function{}); break; + case DpEventID::VoiceReady: mC->on_voice_ready(std::function{}); break; + case DpEventID::VoiceReceive: mC->on_voice_receive(std::function{}); break; + case DpEventID::VoiceTrackMarker: mC->on_voice_track_marker(std::function{}); break; + case DpEventID::StageInstanceCreate: mC->on_stage_instance_create(std::function{}); break; + case DpEventID::StageInstanceDelete: mC->on_stage_instance_delete(std::function{}); break; + case DpEventID::Max: // Fall through + default: STHROWF("Invalid discord event identifier {}", id); + } + // Allow chaining + return *this; +} + +// ------------------------------------------------------------------------------------------------ +void DpInternalEvent::Release() +{ + // Make sure we actually manage something + if (mData == 0) return; + // Fetch the type of data + const auto type = GetType(); + // Fetch the data itself + const auto data = GetData(); + // Identify data type + switch (type) + { + case DpEventID::VoiceStateUpdate: delete reinterpret_cast< DpVoiceStateUpdateEvent * >(data); break; + case DpEventID::Log: delete reinterpret_cast< DpLogEvent * >(data); break; + case DpEventID::GuildJoinRequestDelete: delete reinterpret_cast< DpGuildJoinRequestDeleteEvent * >(data); break; + case DpEventID::InteractionCreate: delete reinterpret_cast< DpInteractionCreateEvent * >(data); break; + case DpEventID::ButtonClick: delete reinterpret_cast< DpButtonClickEvent * >(data); break; + case DpEventID::SelectClick: delete reinterpret_cast< DpSelectClickEvent * >(data); break; + case DpEventID::GuildDelete: delete reinterpret_cast< DpGuildDeleteEvent * >(data); break; + case DpEventID::ChannelDelete: delete reinterpret_cast< DpChannelDeleteEvent * >(data); break; + case DpEventID::ChannelUpdate: delete reinterpret_cast< DpChannelUpdateEvent * >(data); break; + case DpEventID::Ready: delete reinterpret_cast< DpReadyEvent * >(data); break; + case DpEventID::MessageDelete: delete reinterpret_cast< DpMessageDeleteEvent * >(data); break; + case DpEventID::ApplicationCommandDelete: delete reinterpret_cast< DpApplicationCommandDeleteEvent * >(data); break; + case DpEventID::GuildMemberRemove: delete reinterpret_cast< DpGuildMemberRemoveEvent * >(data); break; + case DpEventID::ApplicationCommandCreate: delete reinterpret_cast< DpApplicationCommandCreateEvent * >(data); break; + case DpEventID::Resumed: delete reinterpret_cast< DpResumedEvent * >(data); break; + case DpEventID::GuildRoleCreate: delete reinterpret_cast< DpGuildRoleCreateEvent * >(data); break; + case DpEventID::TypingStart: delete reinterpret_cast< DpTypingStartEvent * >(data); break; + case DpEventID::MessageReactionAdd: delete reinterpret_cast< DpMessageReactionAddEvent * >(data); break; + case DpEventID::GuildMembersChunk: delete reinterpret_cast< DpGuildMembersChunkEvent * >(data); break; + case DpEventID::MessageReactionRemove: delete reinterpret_cast< DpMessageReactionRemoveEvent * >(data); break; + case DpEventID::GuildCreate: delete reinterpret_cast< DpGuildCreateEvent * >(data); break; + case DpEventID::ChannelCreate: delete reinterpret_cast< DpChannelCreateEvent * >(data); break; + case DpEventID::MessageReactionRemoveEmoji: delete reinterpret_cast< DpMessageReactionRemoveEmojiEvent * >(data); break; + case DpEventID::MessageDeleteBulk: delete reinterpret_cast< DpMessageDeleteBulkEvent * >(data); break; + case DpEventID::GuildRoleUpdate: delete reinterpret_cast< DpGuildRoleUpdateEvent * >(data); break; + case DpEventID::GuildRoleDelete: delete reinterpret_cast< DpGuildRoleDeleteEvent * >(data); break; + case DpEventID::ChannelPinsUpdate: delete reinterpret_cast< DpChannelPinsUpdateEvent * >(data); break; + case DpEventID::MessageReactionRemoveAll: delete reinterpret_cast< DpMessageReactionRemoveAllEvent * >(data); break; + case DpEventID::VoiceServerUpdate: delete reinterpret_cast< DpVoiceServerUpdateEvent * >(data); break; + case DpEventID::GuildEmojisUpdate: delete reinterpret_cast< DpGuildEmojisUpdateEvent * >(data); break; + case DpEventID::GuildStickersUpdate: delete reinterpret_cast< DpGuildStickersUpdateEvent * >(data); break; + case DpEventID::PresenceUpdate: delete reinterpret_cast< DpPresenceUpdateEvent * >(data); break; + case DpEventID::WebhooksUpdate: delete reinterpret_cast< DpWebhooksUpdateEvent * >(data); break; + case DpEventID::GuildMemberAdd: delete reinterpret_cast< DpGuildMemberAddEvent * >(data); break; + case DpEventID::InviteDelete: delete reinterpret_cast< DpInviteDeleteEvent * >(data); break; + case DpEventID::GuildUpdate: delete reinterpret_cast< DpGuildUpdateEvent * >(data); break; + case DpEventID::GuildIntegrationsUpdate: delete reinterpret_cast< DpGuildIntegrationsUpdateEvent * >(data); break; + case DpEventID::GuildMemberUpdate: delete reinterpret_cast< DpGuildMemberUpdateEvent * >(data); break; + case DpEventID::ApplicationCommandUpdate: delete reinterpret_cast< DpApplicationCommandUpdateEvent * >(data); break; + case DpEventID::InviteCreate: delete reinterpret_cast< DpInviteCreateEvent * >(data); break; + case DpEventID::MessageUpdate: delete reinterpret_cast< DpMessageUpdateEvent * >(data); break; + case DpEventID::UserUpdate: delete reinterpret_cast< DpUserUpdateEvent * >(data); break; + case DpEventID::MessageCreate: delete reinterpret_cast< DpMessageCreateEvent * >(data); break; + case DpEventID::GuildBanAdd: delete reinterpret_cast< DpGuildBanAddEvent * >(data); break; + case DpEventID::GuildBanRemove: delete reinterpret_cast< DpGuildBanRemoveEvent * >(data); break; + case DpEventID::IntegrationCreate: delete reinterpret_cast< DpIntegrationCreateEvent * >(data); break; + case DpEventID::IntegrationUpdate: delete reinterpret_cast< DpIntegrationUpdateEvent * >(data); break; + case DpEventID::IntegrationDelete: delete reinterpret_cast< DpIntegrationDeleteEvent * >(data); break; + case DpEventID::ThreadCreate: delete reinterpret_cast< DpThreadCreateEvent * >(data); break; + case DpEventID::ThreadUpdate: delete reinterpret_cast< DpThreadUpdateEvent * >(data); break; + case DpEventID::ThreadDelete: delete reinterpret_cast< DpThreadDeleteEvent * >(data); break; + case DpEventID::ThreadListSync: delete reinterpret_cast< DpThreadListSyncEvent * >(data); break; + case DpEventID::ThreadMemberUpdate: delete reinterpret_cast< DpThreadMemberUpdateEvent * >(data); break; + case DpEventID::ThreadMembersUpdate: delete reinterpret_cast< DpThreadMembersUpdateEvent * >(data); break; + case DpEventID::VoiceBufferSend: delete reinterpret_cast< DpVoiceBufferSendEvent * >(data); break; + case DpEventID::VoiceUserTalking: delete reinterpret_cast< DpVoiceUserTalkingEvent * >(data); break; + case DpEventID::VoiceReady: delete reinterpret_cast< DpVoiceReadyEvent * >(data); break; + case DpEventID::VoiceReceive: delete reinterpret_cast< DpVoiceReceiveEvent * >(data); break; + case DpEventID::VoiceTrackMarker: delete reinterpret_cast< DpVoiceTrackMarkerEvent * >(data); break; + case DpEventID::StageInstanceCreate: delete reinterpret_cast< DpStageInstanceCreateEvent * >(data); break; + case DpEventID::StageInstanceDelete: delete reinterpret_cast< DpStageInstanceDeleteEvent * >(data); break; + case DpEventID::Max: // Fall through + default: LogFtl("Unrecognized discord event instance type"); assert(0); break; + } + // Forget about it + Reset(); +} + +// ------------------------------------------------------------------------------------------------ +SQMOD_NODISCARD LightObj EventToScriptObject(uint8_t type, uintptr_t data) +{ + switch (type) + { + case DpEventID::VoiceStateUpdate: return LightObj(reinterpret_cast< DpVoiceStateUpdateEvent * >(data)); + case DpEventID::Log: return LightObj(reinterpret_cast< DpLogEvent * >(data)); + case DpEventID::GuildJoinRequestDelete: return LightObj(reinterpret_cast< DpGuildJoinRequestDeleteEvent * >(data)); + case DpEventID::InteractionCreate: return LightObj(reinterpret_cast< DpInteractionCreateEvent * >(data)); + case DpEventID::ButtonClick: return LightObj(reinterpret_cast< DpButtonClickEvent * >(data)); + case DpEventID::SelectClick: return LightObj(reinterpret_cast< DpSelectClickEvent * >(data)); + case DpEventID::GuildDelete: return LightObj(reinterpret_cast< DpGuildDeleteEvent * >(data)); + case DpEventID::ChannelDelete: return LightObj(reinterpret_cast< DpChannelDeleteEvent * >(data)); + case DpEventID::ChannelUpdate: return LightObj(reinterpret_cast< DpChannelUpdateEvent * >(data)); + case DpEventID::Ready: return LightObj(reinterpret_cast< DpReadyEvent * >(data)); + case DpEventID::MessageDelete: return LightObj(reinterpret_cast< DpMessageDeleteEvent * >(data)); + case DpEventID::ApplicationCommandDelete: return LightObj(reinterpret_cast< DpApplicationCommandDeleteEvent * >(data)); + case DpEventID::GuildMemberRemove: return LightObj(reinterpret_cast< DpGuildMemberRemoveEvent * >(data)); + case DpEventID::ApplicationCommandCreate: return LightObj(reinterpret_cast< DpApplicationCommandCreateEvent * >(data)); + case DpEventID::Resumed: return LightObj(reinterpret_cast< DpResumedEvent * >(data)); + case DpEventID::GuildRoleCreate: return LightObj(reinterpret_cast< DpGuildRoleCreateEvent * >(data)); + case DpEventID::TypingStart: return LightObj(reinterpret_cast< DpTypingStartEvent * >(data)); + case DpEventID::MessageReactionAdd: return LightObj(reinterpret_cast< DpMessageReactionAddEvent * >(data)); + case DpEventID::GuildMembersChunk: return LightObj(reinterpret_cast< DpGuildMembersChunkEvent * >(data)); + case DpEventID::MessageReactionRemove: return LightObj(reinterpret_cast< DpMessageReactionRemoveEvent * >(data)); + case DpEventID::GuildCreate: return LightObj(reinterpret_cast< DpGuildCreateEvent * >(data)); + case DpEventID::ChannelCreate: return LightObj(reinterpret_cast< DpChannelCreateEvent * >(data)); + case DpEventID::MessageReactionRemoveEmoji: return LightObj(reinterpret_cast< DpMessageReactionRemoveEmojiEvent * >(data)); + case DpEventID::MessageDeleteBulk: return LightObj(reinterpret_cast< DpMessageDeleteBulkEvent * >(data)); + case DpEventID::GuildRoleUpdate: return LightObj(reinterpret_cast< DpGuildRoleUpdateEvent * >(data)); + case DpEventID::GuildRoleDelete: return LightObj(reinterpret_cast< DpGuildRoleDeleteEvent * >(data)); + case DpEventID::ChannelPinsUpdate: return LightObj(reinterpret_cast< DpChannelPinsUpdateEvent * >(data)); + case DpEventID::MessageReactionRemoveAll: return LightObj(reinterpret_cast< DpMessageReactionRemoveAllEvent * >(data)); + case DpEventID::VoiceServerUpdate: return LightObj(reinterpret_cast< DpVoiceServerUpdateEvent * >(data)); + case DpEventID::GuildEmojisUpdate: return LightObj(reinterpret_cast< DpGuildEmojisUpdateEvent * >(data)); + case DpEventID::GuildStickersUpdate: return LightObj(reinterpret_cast< DpGuildStickersUpdateEvent * >(data)); + case DpEventID::PresenceUpdate: return LightObj(reinterpret_cast< DpPresenceUpdateEvent * >(data)); + case DpEventID::WebhooksUpdate: return LightObj(reinterpret_cast< DpWebhooksUpdateEvent * >(data)); + case DpEventID::GuildMemberAdd: return LightObj(reinterpret_cast< DpGuildMemberAddEvent * >(data)); + case DpEventID::InviteDelete: return LightObj(reinterpret_cast< DpInviteDeleteEvent * >(data)); + case DpEventID::GuildUpdate: return LightObj(reinterpret_cast< DpGuildUpdateEvent * >(data)); + case DpEventID::GuildIntegrationsUpdate: return LightObj(reinterpret_cast< DpGuildIntegrationsUpdateEvent * >(data)); + case DpEventID::GuildMemberUpdate: return LightObj(reinterpret_cast< DpGuildMemberUpdateEvent * >(data)); + case DpEventID::ApplicationCommandUpdate: return LightObj(reinterpret_cast< DpApplicationCommandUpdateEvent * >(data)); + case DpEventID::InviteCreate: return LightObj(reinterpret_cast< DpInviteCreateEvent * >(data)); + case DpEventID::MessageUpdate: return LightObj(reinterpret_cast< DpMessageUpdateEvent * >(data)); + case DpEventID::UserUpdate: return LightObj(reinterpret_cast< DpUserUpdateEvent * >(data)); + case DpEventID::MessageCreate: return LightObj(reinterpret_cast< DpMessageCreateEvent * >(data)); + case DpEventID::GuildBanAdd: return LightObj(reinterpret_cast< DpGuildBanAddEvent * >(data)); + case DpEventID::GuildBanRemove: return LightObj(reinterpret_cast< DpGuildBanRemoveEvent * >(data)); + case DpEventID::IntegrationCreate: return LightObj(reinterpret_cast< DpIntegrationCreateEvent * >(data)); + case DpEventID::IntegrationUpdate: return LightObj(reinterpret_cast< DpIntegrationUpdateEvent * >(data)); + case DpEventID::IntegrationDelete: return LightObj(reinterpret_cast< DpIntegrationDeleteEvent * >(data)); + case DpEventID::ThreadCreate: return LightObj(reinterpret_cast< DpThreadCreateEvent * >(data)); + case DpEventID::ThreadUpdate: return LightObj(reinterpret_cast< DpThreadUpdateEvent * >(data)); + case DpEventID::ThreadDelete: return LightObj(reinterpret_cast< DpThreadDeleteEvent * >(data)); + case DpEventID::ThreadListSync: return LightObj(reinterpret_cast< DpThreadListSyncEvent * >(data)); + case DpEventID::ThreadMemberUpdate: return LightObj(reinterpret_cast< DpThreadMemberUpdateEvent * >(data)); + case DpEventID::ThreadMembersUpdate: return LightObj(reinterpret_cast< DpThreadMembersUpdateEvent * >(data)); + case DpEventID::VoiceBufferSend: return LightObj(reinterpret_cast< DpVoiceBufferSendEvent * >(data)); + case DpEventID::VoiceUserTalking: return LightObj(reinterpret_cast< DpVoiceUserTalkingEvent * >(data)); + case DpEventID::VoiceReady: return LightObj(reinterpret_cast< DpVoiceReadyEvent * >(data)); + case DpEventID::VoiceReceive: return LightObj(reinterpret_cast< DpVoiceReceiveEvent * >(data)); + case DpEventID::VoiceTrackMarker: return LightObj(reinterpret_cast< DpVoiceTrackMarkerEvent * >(data)); + case DpEventID::StageInstanceCreate: return LightObj(reinterpret_cast< DpStageInstanceCreateEvent * >(data)); + case DpEventID::StageInstanceDelete: return LightObj(reinterpret_cast< DpStageInstanceDeleteEvent * >(data)); + case DpEventID::Max: // Fall through + default: assert(0); return LightObj{}; + } +} + +// ------------------------------------------------------------------------------------------------ +void EventInvokeCleanup(uint8_t type, uintptr_t data) +{ + switch (type) + { + case DpEventID::VoiceStateUpdate: reinterpret_cast< DpVoiceStateUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::Log: reinterpret_cast< DpLogEvent * >(data)->Cleanup(); break; + case DpEventID::GuildJoinRequestDelete: reinterpret_cast< DpGuildJoinRequestDeleteEvent * >(data)->Cleanup(); break; + case DpEventID::InteractionCreate: reinterpret_cast< DpInteractionCreateEvent * >(data)->Cleanup(); break; + case DpEventID::ButtonClick: reinterpret_cast< DpButtonClickEvent * >(data)->Cleanup(); break; + case DpEventID::SelectClick: reinterpret_cast< DpSelectClickEvent * >(data)->Cleanup(); break; + case DpEventID::GuildDelete: reinterpret_cast< DpGuildDeleteEvent * >(data)->Cleanup(); break; + case DpEventID::ChannelDelete: reinterpret_cast< DpChannelDeleteEvent * >(data)->Cleanup(); break; + case DpEventID::ChannelUpdate: reinterpret_cast< DpChannelUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::Ready: reinterpret_cast< DpReadyEvent * >(data)->Cleanup(); break; + case DpEventID::MessageDelete: reinterpret_cast< DpMessageDeleteEvent * >(data)->Cleanup(); break; + case DpEventID::ApplicationCommandDelete: reinterpret_cast< DpApplicationCommandDeleteEvent * >(data)->Cleanup(); break; + case DpEventID::GuildMemberRemove: reinterpret_cast< DpGuildMemberRemoveEvent * >(data)->Cleanup(); break; + case DpEventID::ApplicationCommandCreate: reinterpret_cast< DpApplicationCommandCreateEvent * >(data)->Cleanup(); break; + case DpEventID::Resumed: reinterpret_cast< DpResumedEvent * >(data)->Cleanup(); break; + case DpEventID::GuildRoleCreate: reinterpret_cast< DpGuildRoleCreateEvent * >(data)->Cleanup(); break; + case DpEventID::TypingStart: reinterpret_cast< DpTypingStartEvent * >(data)->Cleanup(); break; + case DpEventID::MessageReactionAdd: reinterpret_cast< DpMessageReactionAddEvent * >(data)->Cleanup(); break; + case DpEventID::GuildMembersChunk: reinterpret_cast< DpGuildMembersChunkEvent * >(data)->Cleanup(); break; + case DpEventID::MessageReactionRemove: reinterpret_cast< DpMessageReactionRemoveEvent * >(data)->Cleanup(); break; + case DpEventID::GuildCreate: reinterpret_cast< DpGuildCreateEvent * >(data)->Cleanup(); break; + case DpEventID::ChannelCreate: reinterpret_cast< DpChannelCreateEvent * >(data)->Cleanup(); break; + case DpEventID::MessageReactionRemoveEmoji: reinterpret_cast< DpMessageReactionRemoveEmojiEvent * >(data)->Cleanup(); break; + case DpEventID::MessageDeleteBulk: reinterpret_cast< DpMessageDeleteBulkEvent * >(data)->Cleanup(); break; + case DpEventID::GuildRoleUpdate: reinterpret_cast< DpGuildRoleUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::GuildRoleDelete: reinterpret_cast< DpGuildRoleDeleteEvent * >(data)->Cleanup(); break; + case DpEventID::ChannelPinsUpdate: reinterpret_cast< DpChannelPinsUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::MessageReactionRemoveAll: reinterpret_cast< DpMessageReactionRemoveAllEvent * >(data)->Cleanup(); break; + case DpEventID::VoiceServerUpdate: reinterpret_cast< DpVoiceServerUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::GuildEmojisUpdate: reinterpret_cast< DpGuildEmojisUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::GuildStickersUpdate: reinterpret_cast< DpGuildStickersUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::PresenceUpdate: reinterpret_cast< DpPresenceUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::WebhooksUpdate: reinterpret_cast< DpWebhooksUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::GuildMemberAdd: reinterpret_cast< DpGuildMemberAddEvent * >(data)->Cleanup(); break; + case DpEventID::InviteDelete: reinterpret_cast< DpInviteDeleteEvent * >(data)->Cleanup(); break; + case DpEventID::GuildUpdate: reinterpret_cast< DpGuildUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::GuildIntegrationsUpdate: reinterpret_cast< DpGuildIntegrationsUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::GuildMemberUpdate: reinterpret_cast< DpGuildMemberUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::ApplicationCommandUpdate: reinterpret_cast< DpApplicationCommandUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::InviteCreate: reinterpret_cast< DpInviteCreateEvent * >(data)->Cleanup(); break; + case DpEventID::MessageUpdate: reinterpret_cast< DpMessageUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::UserUpdate: reinterpret_cast< DpUserUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::MessageCreate: reinterpret_cast< DpMessageCreateEvent * >(data)->Cleanup(); break; + case DpEventID::GuildBanAdd: reinterpret_cast< DpGuildBanAddEvent * >(data)->Cleanup(); break; + case DpEventID::GuildBanRemove: reinterpret_cast< DpGuildBanRemoveEvent * >(data)->Cleanup(); break; + case DpEventID::IntegrationCreate: reinterpret_cast< DpIntegrationCreateEvent * >(data)->Cleanup(); break; + case DpEventID::IntegrationUpdate: reinterpret_cast< DpIntegrationUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::IntegrationDelete: reinterpret_cast< DpIntegrationDeleteEvent * >(data)->Cleanup(); break; + case DpEventID::ThreadCreate: reinterpret_cast< DpThreadCreateEvent * >(data)->Cleanup(); break; + case DpEventID::ThreadUpdate: reinterpret_cast< DpThreadUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::ThreadDelete: reinterpret_cast< DpThreadDeleteEvent * >(data)->Cleanup(); break; + case DpEventID::ThreadListSync: reinterpret_cast< DpThreadListSyncEvent * >(data)->Cleanup(); break; + case DpEventID::ThreadMemberUpdate: reinterpret_cast< DpThreadMemberUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::ThreadMembersUpdate: reinterpret_cast< DpThreadMembersUpdateEvent * >(data)->Cleanup(); break; + case DpEventID::VoiceBufferSend: reinterpret_cast< DpVoiceBufferSendEvent * >(data)->Cleanup(); break; + case DpEventID::VoiceUserTalking: reinterpret_cast< DpVoiceUserTalkingEvent * >(data)->Cleanup(); break; + case DpEventID::VoiceReady: reinterpret_cast< DpVoiceReadyEvent * >(data)->Cleanup(); break; + case DpEventID::VoiceReceive: reinterpret_cast< DpVoiceReceiveEvent * >(data)->Cleanup(); break; + case DpEventID::VoiceTrackMarker: reinterpret_cast< DpVoiceTrackMarkerEvent * >(data)->Cleanup(); break; + case DpEventID::StageInstanceCreate: reinterpret_cast< DpStageInstanceCreateEvent * >(data)->Cleanup(); break; + case DpEventID::StageInstanceDelete: reinterpret_cast< DpStageInstanceDeleteEvent * >(data)->Cleanup(); break; + case DpEventID::Max: // Fall through + default: assert(0); return; + } +} + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Cluster.hpp b/module/Library/DPP/Cluster.hpp new file mode 100644 index 00000000..9b27102b --- /dev/null +++ b/module/Library/DPP/Cluster.hpp @@ -0,0 +1,431 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" +#include "Core/Signal.hpp" + +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/Other.hpp" +#include "Library/DPP/Constants.hpp" + +// ------------------------------------------------------------------------------------------------ +#include +#include +#include + +// ------------------------------------------------------------------------------------------------ +#include +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * Internal event proxy. +*/ +struct DpInternalEvent +{ + /* -------------------------------------------------------------------------------------------- + * Event data. + */ + uint64_t mData{0llu}; + + /* -------------------------------------------------------------------------------------------- + * Default constructor. + */ + DpInternalEvent() noexcept = default; + + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + DpInternalEvent(uint64_t type, void * data) noexcept + : mData((type << 56u) | reinterpret_cast< uint64_t >(data)) + { + } + + /* -------------------------------------------------------------------------------------------- + * Copy constructor (disabled). + */ + DpInternalEvent(const DpInternalEvent & o) = delete; + + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + DpInternalEvent(DpInternalEvent && o) noexcept + : mData(o.mData) + { + o.mData = 0llu; // Take ownership + } + + /* -------------------------------------------------------------------------------------------- + * Destructor. + */ + ~DpInternalEvent() + { + Release(); + } + + /* -------------------------------------------------------------------------------------------- + * Copy assignment operator (disabled). + */ + DpInternalEvent & operator = (const DpInternalEvent & o) = delete; + + /* -------------------------------------------------------------------------------------------- + * Move assignment operator. + */ + DpInternalEvent & operator = (DpInternalEvent && o) noexcept + { + if (mData != o.mData) + { + // Release current information + Release(); + // Replicate members + mData = o.mData; + // Take ownership + o.mData = 0llu; + } + return *this; + } + + /* -------------------------------------------------------------------------------------------- + * Forget about the managed event data. + */ + void Reset() noexcept + { + mData = 0llu; + } + + /* -------------------------------------------------------------------------------------------- + * Retrieve the event type. + */ + SQMOD_NODISCARD uint8_t GetType() const noexcept + { + return static_cast< uint8_t >((mData >> 56u) & 0xFFllu); + } + + /* -------------------------------------------------------------------------------------------- + * Retrieve the event data. + */ + SQMOD_NODISCARD uintptr_t GetData() const noexcept + { + return static_cast< uintptr_t >((~(0xFFllu << 56u)) & mData); + } + + /* -------------------------------------------------------------------------------------------- + * Release associated event data, if any. + */ + void Release(); +}; + +/* ------------------------------------------------------------------------------------------------ + * The cluster class represents a group of shards and a command queue for sending and receiving + * commands from discord via HTTP. +*/ +struct DpCluster : public SqChainedInstances< DpCluster > +{ + /* -------------------------------------------------------------------------------------------- + * Queue of events generated from other threads. + */ + using EventQueue = moodycamel::ConcurrentQueue< DpInternalEvent >; + + /* -------------------------------------------------------------------------------------------- + * Managed cluster instance. + */ + std::unique_ptr< dpp::cluster > mC{nullptr}; + + /* -------------------------------------------------------------------------------------------- + * Event queue. + */ + EventQueue mQueue{4096}; + + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpCluster(StackStrF & token) + : mC(std::make_unique< dpp::cluster >(token.ToStr())) + , mQueue(4096) + { + Initialize(); + } + + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + DpCluster(StackStrF & token, SQInteger intents) + : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents))) + , mQueue(4096) + { + Initialize(); + } + + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + DpCluster(StackStrF & token, SQInteger intents, SQInteger shards) + : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents), static_cast< uint32_t >(shards))) + , mQueue(4096) + { + Initialize(); + } + + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + DpCluster(StackStrF & token, SQInteger intents, SQInteger shards, SQInteger cluster_id) + : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents), static_cast< uint32_t >(shards), static_cast< uint32_t >(cluster_id))) + , mQueue(4096) + { + Initialize(); + } + + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + DpCluster(StackStrF & token, SQInteger intents, SQInteger shards, SQInteger cluster_id, SQInteger max_clusters) + : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents), static_cast< uint32_t >(shards), static_cast< uint32_t >(cluster_id), static_cast< uint32_t >(max_clusters))) + , mQueue(4096) + { + Initialize(); + } + + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + DpCluster(StackStrF & token, SQInteger intents, SQInteger shards, SQInteger cluster_id, SQInteger max_clusters, bool compressed) + : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents), static_cast< uint32_t >(shards), static_cast< uint32_t >(cluster_id), static_cast< uint32_t >(max_clusters), compressed)) + , mQueue(4096) + { + Initialize(); + } + + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + DpCluster(StackStrF & token, SQInteger intents, SQInteger shards, SQInteger cluster_id, SQInteger max_clusters, bool compressed, const DpCachePolicy & cp) + : mC(std::make_unique< dpp::cluster >(token.ToStr(), static_cast< uint32_t >(intents), static_cast< uint32_t >(shards), static_cast< uint32_t >(cluster_id), static_cast< uint32_t >(max_clusters), compressed, cp.ToNative())) + , mQueue(4096) + { + Initialize(); + } + + /* -------------------------------------------------------------------------------------------- + * Destructor. + */ + ~DpCluster() + { + DropEvents(); + // Forget about this instance + UnchainInstance(); + } + + /* -------------------------------------------------------------------------------------------- + * Start the cluster, connecting all its shards. Returns once all shards are connected. + */ + DpCluster & Start() + { + LogInf("Before start..."); + mC->start(true); + LogInf("After start..."); + return *this; + } + + /* -------------------------------------------------------------------------------------------- + * Log a message to whatever log the user is using. + */ + DpCluster & Log(SQInteger severity, StackStrF & message) + { + mC->log(static_cast< dpp::loglevel >(severity), message.ToStr()); + return *this; + } + + /* -------------------------------------------------------------------------------------------- + * Get the dm channel for a user id. + */ + SQMOD_NODISCARD dpp::snowflake GetDmChannel(dpp::snowflake user_id) const + { + return mC->get_dm_channel(static_cast< dpp::snowflake >(user_id)); + } + + /* -------------------------------------------------------------------------------------------- + * Set the dm channel id for a user id. + */ + DpCluster & SetDmChannel(dpp::snowflake user_id, dpp::snowflake channel_id) + { + mC->set_dm_channel(user_id, channel_id); + return *this; + } + + /* -------------------------------------------------------------------------------------------- + * Returns the uptime of the cluster. + */ + SQMOD_NODISCARD dpp::utility::uptime UpTime() const + { + return mC->uptime(); + } + + /* -------------------------------------------------------------------------------------------- + * Returns the uptime of the cluster. + */ + DpCluster & SetPresence(const DpPresence & p) + { + mC->set_presence(p.Valid()); + return *this; + } + + // -------------------------------------------------------------------------------------------- + LightObj mSqEvents{}; // Table containing the emitted cluster events. + + /* -------------------------------------------------------------------------------------------- + * Retrieve the events table of this cluster. + */ + SQMOD_NODISCARD LightObj & GetEvents() + { + return mSqEvents; + } + + /* -------------------------------------------------------------------------------------------- + * Cluster signals. + */ + std::array< SignalPair, static_cast< size_t >(DpEventID::Max) > mEvents{}; + + /* -------------------------------------------------------------------------------------------- + * Process the cluster. + */ + void Process(bool force = false); + + /* -------------------------------------------------------------------------------------------- + * Terminate the cluster. + */ + void Terminate() + { + // Delete the cluster instance + mC.reset(); + // Release associated script objects + mSqEvents.Release(); + // Release event signal objects + DropEvents(); + } + + /* -------------------------------------------------------------------------------------------- + * Enable a certain event for the cluster. + */ + DpCluster & EnableEvent(SQInteger id); + + /* -------------------------------------------------------------------------------------------- + * Disable a certain event for the cluster. + */ + DpCluster & DisableEvent(SQInteger id); + +private: + + /* -------------------------------------------------------------------------------------------- + * Initialize the cluster. + */ + void Initialize() + { + InitEvents(); + // Remember this instance + ChainInstance(); + } + + /* -------------------------------------------------------------------------------------------- + * Signal initialization. + */ + void InitEvents() + { + // Ignore the call if already initialized + if (!mSqEvents.IsNull()) + { + return; + } + // Create a new table on the stack + sq_newtableex(SqVM(), 64); + // Grab the table object from the stack + mSqEvents = LightObj(-1, SqVM()); + // Pop the table object from the stack + sq_pop(SqVM(), 1); + // Proceed to initializing the events + for (size_t i = 0; i < mEvents.size(); ++i) + { + InitSignalPair(mEvents[i], mSqEvents, DpEventID::NAME[i]); + } + } + + /* -------------------------------------------------------------------------------------------- + * Signal termination. + */ + void DropEvents() + { + for (auto & e : mEvents) + { + ResetSignalPair(e); + } + } + + /* -------------------------------------------------------------------------------------------- + * Event handlers. + */ + void OnVoiceStateUpdate(const dpp::voice_state_update_t & ev); + void OnLog(const dpp::log_t & ev); + void OnGuildJoinRequestDelete(const dpp::guild_join_request_delete_t & ev); + void OnInteractionCreate(const dpp::interaction_create_t & ev); + void OnButtonClick(const dpp::button_click_t & ev); + void OnSelectClick(const dpp::select_click_t & ev); + void OnGuildDelete(const dpp::guild_delete_t & ev); + void OnChannelDelete(const dpp::channel_delete_t & ev); + void OnChannelUpdate(const dpp::channel_update_t & ev); + void OnReady(const dpp::ready_t & ev); + void OnMessageDelete(const dpp::message_delete_t & ev); + void OnApplicationCommandDelete(const dpp::application_command_delete_t & ev); + void OnGuildMemberRemove(const dpp::guild_member_remove_t & ev); + void OnApplicationCommandCreate(const dpp::application_command_create_t & ev); + void OnResumed(const dpp::resumed_t & ev); + void OnGuildRoleCreate(const dpp::guild_role_create_t & ev); + void OnTypingStart(const dpp::typing_start_t & ev); + void OnMessageReactionAdd(const dpp::message_reaction_add_t & ev); + void OnGuildMembersChunk(const dpp::guild_members_chunk_t & ev); + void OnMessageReactionRemove(const dpp::message_reaction_remove_t & ev); + void OnGuildCreate(const dpp::guild_create_t & ev); + void OnChannelCreate(const dpp::channel_create_t & ev); + void OnMessageReactionRemoveEmoji(const dpp::message_reaction_remove_emoji_t & ev); + void OnMessageDeleteBulk(const dpp::message_delete_bulk_t & ev); + void OnGuildRoleUpdate(const dpp::guild_role_update_t & ev); + void OnGuildRoleDelete(const dpp::guild_role_delete_t & ev); + void OnChannelPinsUpdate(const dpp::channel_pins_update_t & ev); + void OnMessageReactionRemoveAll(const dpp::message_reaction_remove_all_t & ev); + void OnVoiceServerUpdate(const dpp::voice_server_update_t & ev); + void OnGuildEmojisUpdate(const dpp::guild_emojis_update_t & ev); + void OnGuildStickersUpdate(const dpp::guild_stickers_update_t & ev); + void OnPresenceUpdate(const dpp::presence_update_t & ev); + void OnWebhooksUpdate(const dpp::webhooks_update_t & ev); + void OnGuildMemberAdd(const dpp::guild_member_add_t & ev); + void OnInviteDelete(const dpp::invite_delete_t & ev); + void OnGuildUpdate(const dpp::guild_update_t & ev); + void OnGuildIntegrationsUpdate(const dpp::guild_integrations_update_t & ev); + void OnGuildMemberUpdate(const dpp::guild_member_update_t & ev); + void OnApplicationCommandUpdate(const dpp::application_command_update_t & ev); + void OnInviteCreate(const dpp::invite_create_t & ev); + void OnMessageUpdate(const dpp::message_update_t & ev); + void OnUserUpdate(const dpp::user_update_t & ev); + void OnMessageCreate(const dpp::message_create_t & ev); + void OnGuildBanAdd(const dpp::guild_ban_add_t & ev); + void OnGuildBanRemove(const dpp::guild_ban_remove_t & ev); + void OnIntegrationCreate(const dpp::integration_create_t & ev); + void OnIntegrationUpdate(const dpp::integration_update_t & ev); + void OnIntegrationDelete(const dpp::integration_delete_t & ev); + void OnThreadCreate(const dpp::thread_create_t & ev); + void OnThreadUpdate(const dpp::thread_update_t & ev); + void OnThreadDelete(const dpp::thread_delete_t & ev); + void OnThreadListSync(const dpp::thread_list_sync_t & ev); + void OnThreadMemberUpdate(const dpp::thread_member_update_t & ev); + void OnThreadMembersUpdate(const dpp::thread_members_update_t & ev); + void OnVoiceBufferSend(const dpp::voice_buffer_send_t & ev); + void OnVoiceUserTalking(const dpp::voice_user_talking_t & ev); + void OnVoiceReady(const dpp::voice_ready_t & ev); + void OnVoiceReceive(const dpp::voice_receive_t & ev); + void OnVoiceTrackMarker(const dpp::voice_track_marker_t & ev); + void OnStageInstanceCreate(const dpp::stage_instance_create_t & ev); + void OnStageInstanceDelete(const dpp::stage_instance_delete_t & ev); +}; + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Command.cpp b/module/Library/DPP/Command.cpp new file mode 100644 index 00000000..adc9e7d9 --- /dev/null +++ b/module/Library/DPP/Command.cpp @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/Command.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ + + +// ------------------------------------------------------------------------------------------------ +void Register_DPP_Command(HSQUIRRELVM vm, Table & ns) +{ + +} + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Command.hpp b/module/Library/DPP/Command.hpp new file mode 100644 index 00000000..854a24c2 --- /dev/null +++ b/module/Library/DPP/Command.hpp @@ -0,0 +1,19 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * +*/ + +} // Namespace:: SqMod diff --git a/module/Library/DPPTy.cpp b/module/Library/DPP/Constants.cpp similarity index 51% rename from module/Library/DPPTy.cpp rename to module/Library/DPP/Constants.cpp index 79b489f7..c3bb0966 100644 --- a/module/Library/DPPTy.cpp +++ b/module/Library/DPP/Constants.cpp @@ -1,5 +1,5 @@ // ------------------------------------------------------------------------------------------------ -#include "Library/DPPTy.hpp" +#include "Library/DPP/Constants.hpp" // ------------------------------------------------------------------------------------------------ #include @@ -8,326 +8,69 @@ namespace SqMod { // ------------------------------------------------------------------------------------------------ -SQMOD_DECL_TYPENAME(SqDppCachePolicy, _SC("SqDppCachePolicy")) -SQMOD_DECL_TYPENAME(SqDppIconHash, _SC("SqDppIconHash")) -SQMOD_DECL_TYPENAME(SqDppUptime, _SC("SqDppUptime")) -SQMOD_DECL_TYPENAME(SqDppActivity, _SC("SqDppActivity")) -SQMOD_DECL_TYPENAME(SqDppPresence, _SC("SqDppPresence")) -SQMOD_DECL_TYPENAME(SqDppVoiceState, _SC("SqDppVoiceState")) -SQMOD_DECL_TYPENAME(SqDppRole, _SC("SqDppRole")) -SQMOD_DECL_TYPENAME(SqDppUser, _SC("SqDppUser")) -SQMOD_DECL_TYPENAME(SqDppGuildMember, _SC("SqDppGuildMember")) -SQMOD_DECL_TYPENAME(SqDppGuild, _SC("SqDppGuild")) - -// ------------------------------------------------------------------------------------------------ -void Register_DPPConst(HSQUIRRELVM vm, Table & ns); - -// ------------------------------------------------------------------------------------------------ -void Register_DPPTy(HSQUIRRELVM vm, Table & ns) -{ - Register_DPPConst(vm, ns); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("Uptime"), - Class< dpp::utility::uptime >(vm, SqDppUptime::Str) - // Constructors - .Ctor() - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppUptime::Fn) - .Func(_SC("_tostring"), &dpp::utility::uptime::to_string) - // Member Variables - .Var(_SC("Days"), &dpp::utility::uptime::days) - .Var(_SC("Hours"), &dpp::utility::uptime::hours) - .Var(_SC("Minutes"), &dpp::utility::uptime::mins) - .Var(_SC("Seconds"), &dpp::utility::uptime::secs) - // Member Methods - .Func(_SC("ToSeconds"), &dpp::utility::uptime::to_secs) - .Func(_SC("ToMilliseconds"), &dpp::utility::uptime::to_msecs) - ); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("IconHash"), - Class< dpp::utility::iconhash >(vm, SqDppIconHash::Str) - // Constructors - .Ctor() - .Ctor< const std::string & >() - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppIconHash::Fn) - .Func(_SC("_tostring"), &dpp::utility::iconhash::to_string) - // Member Variables - .Var(_SC("High"), &dpp::utility::iconhash::first) - .Var(_SC("Low"), &dpp::utility::iconhash::second) - // Member Methods - .Func(_SC("Set"), &dpp::utility::iconhash::set) - ); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("CachePolicy"), - Class< DpCachePolicy >(vm, SqDppCachePolicy::Str) - // Constructors - .Ctor() - .Ctor< SQInteger >() - .Ctor< SQInteger, SQInteger >() - .Ctor< SQInteger, SQInteger, SQInteger >() - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppCachePolicy::Fn) - // Member Variables - .Var(_SC("UserPolicy"), &DpCachePolicy::mUserPolicy) - .Var(_SC("EmojiPolicy"), &DpCachePolicy::mEmojiPolicy) - .Var(_SC("RolePolicy"), &DpCachePolicy::mRolePolicy) - ); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("Activity"), - Class< DpActivity, NoCopy< DpActivity > >(vm, SqDppActivity::Str) - // Constructors - .Ctor() - .Ctor< SQInteger, StackStrF &, StackStrF &, StackStrF & >() - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppActivity::Fn) - // Member Properties - .Prop(_SC("Name"), &DpActivity::GetName, &DpActivity::SetName) - .Prop(_SC("State"), &DpActivity::GetState, &DpActivity::SetState) - .Prop(_SC("URL"), &DpActivity::GetURL, &DpActivity::SetURL) - .Prop(_SC("Type"), &DpActivity::GetType, &DpActivity::SetType) - .Prop(_SC("CreatedAt"), &DpActivity::GetCreatedAt, &DpActivity::SetCreatedAt) - .Prop(_SC("Start"), &DpActivity::GetStart, &DpActivity::SetStart) - .Prop(_SC("End"), &DpActivity::GetEnd, &DpActivity::SetEnd) - // Member Methods - .Func(_SC("SetName"), &DpActivity::ApplyName) - .Func(_SC("SetState"), &DpActivity::ApplyState) - .Func(_SC("SetURL"), &DpActivity::ApplyURL) - .Func(_SC("SetType"), &DpActivity::ApplyType) - .Func(_SC("SetCreatedAt"), &DpActivity::ApplyCreatedAt) - .Func(_SC("SetStart"), &DpActivity::ApplyStart) - .Func(_SC("SetEnd"), &DpActivity::ApplyEnd) - ); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("Presence"), - Class< DpPresence, NoCopy< DpPresence > >(vm, SqDppPresence::Str) - // Constructors - .Ctor() - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppPresence::Fn) - // Member Properties - .Prop(_SC("Valid"), &DpPresence::IsValid) - .Prop(_SC("UserID"), &DpPresence::GetUserID, &DpPresence::SetUserID) - .Prop(_SC("GuildID"), &DpPresence::GetGuildID, &DpPresence::SetGuildID) - .Prop(_SC("Flags"), &DpPresence::GetFlags, &DpPresence::SetFlags) - .Prop(_SC("ActivityCount"), &DpPresence::ActivityCount) - .Prop(_SC("DesktopStatus"), &DpPresence::GetDesktopStatus) - .Prop(_SC("WebStatus"), &DpPresence::GetWebStatus) - .Prop(_SC("MobileStatus"), &DpPresence::GetMobileStatus) - .Prop(_SC("Status"), &DpPresence::GetStatus) - // Member Methods - .Func(_SC("SetUserID"), &DpPresence::ApplyUserID) - .Func(_SC("SetGuildID"), &DpPresence::ApplyGuildID) - .Func(_SC("SetFlags"), &DpPresence::ApplyFlags) - .Func(_SC("AddActivity"), &DpPresence::AddActivity) - .Func(_SC("EachActivity"), &DpPresence::EachActivity) - .Func(_SC("ClearActivities"), &DpPresence::ClearActivities) - .Func(_SC("FilterActivities"), &DpPresence::FilterActivities) - .Func(_SC("BuildJSON"), &DpPresence::BuildJSON) - ); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("VoiceState"), - Class< DpVoiceState, NoConstructor< DpVoiceState > >(vm, SqDppVoiceState::Str) - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppVoiceState::Fn) - .Func(_SC("_tojson"), &DpVoiceState::BuildJSON) - // Member Properties - .Prop(_SC("Valid"), &DpVoiceState::IsValid) - .Prop(_SC("JSON"), &DpVoiceState::BuildJSON) - .Prop(_SC("GuildID"), &DpVoiceState::GetGuildID) - .Prop(_SC("ChannelID"), &DpVoiceState::GetChannelID) - .Prop(_SC("UserID"), &DpVoiceState::GetUserID) - .Prop(_SC("SessionID"), &DpVoiceState::GetSessionID) - .Prop(_SC("Flags"), &DpVoiceState::GetFlags, &DpVoiceState::SetFlags) - .Prop(_SC("IsDeaf"), &DpVoiceState::IsDeaf) - .Prop(_SC("IsMute"), &DpVoiceState::IsMute) - .Prop(_SC("IsSelfMute"), &DpVoiceState::IsSelfMute) - .Prop(_SC("IsSelfDeaf"), &DpVoiceState::IsSelfDeaf) - .Prop(_SC("SelfStream"), &DpVoiceState::SelfStream) - .Prop(_SC("SelfVideo"), &DpVoiceState::SelfVideo) - .Prop(_SC("IsSupressed"), &DpVoiceState::IsSupressed) - ); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("Role"), - Class< DpRole, NoConstructor< DpRole > >(vm, SqDppRole::Str) - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppRole::Fn) - .Func(_SC("_tojson"), &DpRole::BuildJSON) - // Member Properties - .Prop(_SC("Valid"), &DpRole::IsValid) - .Prop(_SC("JSON"), &DpRole::BuildJSON) - .Prop(_SC("Name"), &DpRole::GetName) - .Prop(_SC("GuildID"), &DpRole::GetGuildID) - .Prop(_SC("Color"), &DpRole::GetColour) - .Prop(_SC("Colour"), &DpRole::GetColour) - .Prop(_SC("Position"), &DpRole::GetPosition) - .Prop(_SC("Permissions"), &DpRole::GetPermissions) - .Prop(_SC("Flags"), &DpRole::GetFlags) - .Prop(_SC("IntegrationID"), &DpRole::GetIntegrationID) - .Prop(_SC("BotID"), &DpRole::GetBotID) - .Prop(_SC("IsHoisted"), &DpRole::IsHoisted) - .Prop(_SC("IsMentionable"), &DpRole::IsMentionable) - .Prop(_SC("IsManaged"), &DpRole::IsManaged) - .Prop(_SC("CanCreateInstantInvite"), &DpRole::CanCreateInstantInvite) - .Prop(_SC("CanKickMembers"), &DpRole::CanKickMembers) - .Prop(_SC("CanBanMembers"), &DpRole::CanBanMembers) - .Prop(_SC("IsAdministrator"), &DpRole::IsAdministrator) - .Prop(_SC("CanManageChannels"), &DpRole::CanManageChannels) - .Prop(_SC("CanManageGuild"), &DpRole::CanManageGuild) - .Prop(_SC("CanAddReactions"), &DpRole::CanAddReactions) - .Prop(_SC("CanViewAuditLog"), &DpRole::CanViewAuditLog) - .Prop(_SC("IsPrioritySpeaker"), &DpRole::IsPrioritySpeaker) - .Prop(_SC("CanStream"), &DpRole::CanStream) - .Prop(_SC("CanViewChannel"), &DpRole::CanViewChannel) - .Prop(_SC("CanSendMessages"), &DpRole::CanSendMessages) - .Prop(_SC("CanSendTtsMessages"), &DpRole::CanSendTtsMessages) - .Prop(_SC("CanManageMessages"), &DpRole::CanManageMessages) - .Prop(_SC("CanEmbedLinks"), &DpRole::CanEmbedLinks) - .Prop(_SC("CanAttachFiles"), &DpRole::CanAttachFiles) - .Prop(_SC("CanReadMessageHistory"), &DpRole::CanReadMessageHistory) - .Prop(_SC("CanMentionEveryone"), &DpRole::CanMentionEveryone) - .Prop(_SC("CanUseExternalEmojis"), &DpRole::CanUseExternalEmojis) - .Prop(_SC("CanViewGuildInsights"), &DpRole::CanViewGuildInsights) - .Prop(_SC("CanConnect"), &DpRole::CanConnect) - .Prop(_SC("CanSpeak"), &DpRole::CanSpeak) - .Prop(_SC("CanMuteMembers"), &DpRole::CanMuteMembers) - .Prop(_SC("CanDeafenMembers"), &DpRole::CanDeafenMembers) - .Prop(_SC("CanMoveMembers"), &DpRole::CanMoveMembers) - .Prop(_SC("CanUseVAT"), &DpRole::CanUseVAT) - .Prop(_SC("CanChangeNickname"), &DpRole::CanChangeNickname) - .Prop(_SC("CanManageNicknames"), &DpRole::CanManageNicknames) - .Prop(_SC("CanManageRoles"), &DpRole::CanManageRoles) - .Prop(_SC("CanManageWebhooks"), &DpRole::CanManageWebhooks) - .Prop(_SC("CanManageEmojis"), &DpRole::CanManageEmojis) - .Prop(_SC("CanUseSlashCommands"), &DpRole::CanUseSlashCommands) - .Prop(_SC("HasRequestToSpeak"), &DpRole::HasRequestToSpeak) - .Prop(_SC("CanManageThreads"), &DpRole::CanManageThreads) - .Prop(_SC("HasUsePublicThreads"), &DpRole::HasUsePublicThreads) - .Prop(_SC("HasUsePrivateThreads"), &DpRole::HasUsePrivateThreads) - // Member Methods - .Func(_SC("BuildJSON"), &DpRole::BuildJSON_) - ); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("User"), - Class< DpUser, NoConstructor< DpUser > >(vm, SqDppUser::Str) - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppUser::Fn) - // Member Properties - .Prop(_SC("Valid"), &DpUser::IsValid) - .Prop(_SC("Username"), &DpUser::GetUsername) - .Prop(_SC("Discriminator"), &DpUser::GetDiscriminator) - .Prop(_SC("Avatar"), &DpUser::GetAvatar) - .Prop(_SC("Flags"), &DpUser::GetFlags) - .Prop(_SC("RefCount"), &DpUser::GetRefCount) - .Prop(_SC("AvatarURL"), &DpUser::GetAvatarURL) - .Prop(_SC("IsBot"), &DpUser::IsBot) - .Prop(_SC("IsSystem"), &DpUser::IsSystem) - .Prop(_SC("IsMfaEnabled"), &DpUser::IsMfaEnabled) - .Prop(_SC("IsVerified"), &DpUser::IsVerified) - .Prop(_SC("HasNitroFull"), &DpUser::HasNitroFull) - .Prop(_SC("HasNitroClassic"), &DpUser::HasNitroClassic) - .Prop(_SC("IsDiscordEmployee"), &DpUser::IsDiscordEmployee) - .Prop(_SC("IsPartneredOwner"), &DpUser::IsPartneredOwner) - .Prop(_SC("HasHypesquadEvents"), &DpUser::HasHypesquadEvents) - .Prop(_SC("IsBughunter1"), &DpUser::IsBughunter1) - .Prop(_SC("IsHouseBravery"), &DpUser::IsHouseBravery) - .Prop(_SC("IsHouseBrilliance"), &DpUser::IsHouseBrilliance) - .Prop(_SC("IsHouseBalanace"), &DpUser::IsHouseBalanace) - .Prop(_SC("IsEarlySupporter"), &DpUser::IsEarlySupporter) - .Prop(_SC("IsTeamUser"), &DpUser::IsTeamUser) - .Prop(_SC("IsBughunter2"), &DpUser::IsBughunter2) - .Prop(_SC("IsVerifiedBot"), &DpUser::IsVerifiedBot) - .Prop(_SC("IsVerifiedBotDev"), &DpUser::IsVerifiedBotDev) - .Prop(_SC("IsCertifiedDoderator"), &DpUser::IsCertifiedDoderator) - .Prop(_SC("HasAnimatedIcon"), &DpUser::HasAnimatedIcon) - ); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("GuildMember"), - Class< DpGuildMember, NoConstructor< DpGuildMember > >(vm, SqDppGuildMember::Str) - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppGuildMember::Fn) - .Func(_SC("_tojson"), &DpGuildMember::BuildJSON) - // Member Properties - .Prop(_SC("Valid"), &DpGuildMember::IsValid) - .Prop(_SC("JSON"), &DpGuildMember::BuildJSON) - .Prop(_SC("Nickname"), &DpGuildMember::GetNickname) - .Prop(_SC("GuildID"), &DpGuildMember::GetGuildID) - .Prop(_SC("UserID"), &DpGuildMember::GetUserID) - .Prop(_SC("JoinedAt"), &DpGuildMember::GetJoinedAt) - .Prop(_SC("PremiumSince"), &DpGuildMember::GetPremiumSince) - .Prop(_SC("Flags"), &DpGuildMember::GetFlags) - .Prop(_SC("IsDeaf"), &DpGuildMember::IsDeaf) - .Prop(_SC("IsMuted"), &DpGuildMember::IsMuted) - .Prop(_SC("IsPending"), &DpGuildMember::IsPending) - // Member Methods - .Func(_SC("GetRoles"), &DpGuildMember::GetRoles) - ); - // -------------------------------------------------------------------------------------------- - ns.Bind(_SC("Guild"), - Class< DpGuild, NoConstructor< DpGuild > >(vm, SqDppGuild::Str) - // Meta-methods - .SquirrelFunc(_SC("_typename"), &SqDppGuild::Fn) - .Func(_SC("_tojson"), &DpGuild::BuildJSON) - // Member Properties - .Prop(_SC("Valid"), &DpGuild::IsValid) - .Prop(_SC("JSON"), &DpGuild::BuildJSON) - .Prop(_SC("ShardID"), &DpGuild::GetShardID) - .Prop(_SC("Flags"), &DpGuild::GetFlags) - .Prop(_SC("Name"), &DpGuild::GetName) - .Prop(_SC("Description"), &DpGuild::GetDescription) - .Prop(_SC("VanityUrlCode"), &DpGuild::GetVanityUrlCode) - .Prop(_SC("Icon"), &DpGuild::GetIcon) - .Prop(_SC("Splash"), &DpGuild::GetSplash) - .Prop(_SC("DiscoverySplash"), &DpGuild::GetDiscoverySplash) - .Prop(_SC("OwnerID"), &DpGuild::GetOwnerID) - .Prop(_SC("VoiceRegion"), &DpGuild::GetVoiceRegion) - .Prop(_SC("AfkChannelID"), &DpGuild::GetAfkChannelID) - .Prop(_SC("AfkTimeout"), &DpGuild::GetAfkTimeout) - .Prop(_SC("WidgetChannelID"), &DpGuild::GetWidgetChannelID) - .Prop(_SC("VerificationLevel"), &DpGuild::GetVerificationLevel) - .Prop(_SC("DefaultMessageNotifications"), &DpGuild::GetDefaultMessageNotifications) - .Prop(_SC("ExplicitContentFilter"), &DpGuild::GetExplicitContentFilter) - .Prop(_SC("MfaLevel"), &DpGuild::GetMfaLevel) - .Prop(_SC("ApplicationID"), &DpGuild::GetApplicationID) - .Prop(_SC("SystemChannelID"), &DpGuild::GetSystemChannelID) - .Prop(_SC("RulesChannelID"), &DpGuild::GetRulesChannelID) - .Prop(_SC("MemberCount"), &DpGuild::GetMemberCount) - .Prop(_SC("Banner"), &DpGuild::GetBanner) - .Prop(_SC("PremiumTier"), &DpGuild::GetPremiumTier) - .Prop(_SC("PremiumSubscriptionCount"), &DpGuild::GetPremiumSubscriptionCount) - .Prop(_SC("PublicUpdatesChannelID"), &DpGuild::GetPublicUpdatesChannelID) - .Prop(_SC("MaxVideoChannelUsers"), &DpGuild::GetMaxVideoChannelUsers) - .Prop(_SC("IsLarge"), &DpGuild::IsLarge) - .Prop(_SC("IsUnavailable"), &DpGuild::IsUnavailable) - .Prop(_SC("WidgetEnabled"), &DpGuild::WidgetEnabled) - .Prop(_SC("HasInviteSplash"), &DpGuild::HasInviteSplash) - .Prop(_SC("HasVipRegions"), &DpGuild::HasVipRegions) - .Prop(_SC("HasVanityURL"), &DpGuild::HasVanityURL) - .Prop(_SC("IsVerified"), &DpGuild::IsVerified) - .Prop(_SC("IsPartnered"), &DpGuild::IsPartnered) - .Prop(_SC("IsCommunity"), &DpGuild::IsCommunity) - .Prop(_SC("HasCommerce"), &DpGuild::HasCommerce) - .Prop(_SC("HasNews"), &DpGuild::HasNews) - .Prop(_SC("IsDiscoverable"), &DpGuild::IsDiscoverable) - .Prop(_SC("IsFeatureable"), &DpGuild::IsFeatureable) - .Prop(_SC("HasAnimatedIcon"), &DpGuild::HasAnimatedIcon) - .Prop(_SC("BasBanner"), &DpGuild::BasBanner) - .Prop(_SC("WelcomeScreenEnabled"), &DpGuild::WelcomeScreenEnabled) - .Prop(_SC("HasMemberVerificationGate"), &DpGuild::HasMemberVerificationGate) - .Prop(_SC("IsPreviewEnabled"), &DpGuild::IsPreviewEnabled) - .Prop(_SC("HasAnimatedIconHash"), &DpGuild::HasAnimatedIconHash) - // Member Methods - .Func(_SC("BuildJSON"), &DpGuild::BuildJSON_) - .Func(_SC("GetRoles"), &DpGuild::GetRoles) - .Func(_SC("GetChannels"), &DpGuild::GetChannels) - .Func(_SC("GetThreads"), &DpGuild::GetThreads) - .Func(_SC("GetMembers"), &DpGuild::GetMembers) - .Func(_SC("GetVoiceMembers"), &DpGuild::GetVoiceMembers) - .Func(_SC("GetEmojis"), &DpGuild::GetEmojis) - .Func(_SC("RehashMembers"), &DpGuild::RehashMembers) - .Func(_SC("ConnectMemberVoice"), &DpGuild::ConnectMemberVoice) - ); -} +const std::array< const char *, static_cast< size_t >(DpEventID::Max) > DpEventID::NAME{ + "VoiceStateUpdate", + "Log", + "GuildJoinRequestDelete", + "InteractionCreate", + "ButtonClick", + "SelectClick", + "GuildDelete", + "ChannelDelete", + "ChannelUpdate", + "Ready", + "MessageDelete", + "ApplicationCommandDelete", + "GuildMemberRemove", + "ApplicationCommandCreate", + "Resumed", + "GuildRoleCreate", + "TypingStart", + "MessageReactionAdd", + "GuildMembersChunk", + "MessageReactionRemove", + "GuildCreate", + "ChannelCreate", + "MessageReactionRemoveEmoji", + "MessageDeleteBulk", + "GuildRoleUpdate", + "GuildRoleDelete", + "ChannelPinsUpdate", + "MessageReactionRemoveAll", + "VoiceServerUpdate", + "GuildEmojisUpdate", + "GuildStickersUpdate", + "PresenceUpdate", + "WebhooksUpdate", + "GuildMemberAdd", + "InviteDelete", + "GuildUpdate", + "GuildIntegrationsUpdate", + "GuildMemberUpdate", + "ApplicationCommandUpdate", + "InviteCreate", + "MessageUpdate", + "UserUpdate", + "MessageCreate", + "GuildBanAdd", + "GuildBanRemove", + "IntegrationCreate", + "IntegrationUpdate", + "IntegrationDelete", + "ThreadCreate", + "ThreadUpdate", + "ThreadDelete", + "ThreadListSync", + "ThreadMemberUpdate", + "ThreadMembersUpdate", + "VoiceBufferSend", + "VoiceUserTalking", + "VoiceReady", + "VoiceReceive", + "VoiceTrackMarker", + "StageInstanceCreate", + "StageInstanceDelete" +}; // ------------------------------------------------------------------------------------------------ static const EnumElement g_DpLogLevelEnum[] = { @@ -595,9 +338,18 @@ static const EnumElements g_EnumList[] = { }; // ------------------------------------------------------------------------------------------------ -void Register_DPPConst(HSQUIRRELVM vm, Table &) +void Register_DPP_Constants(HSQUIRRELVM vm, Table & ns) { RegisterEnumerations(vm, g_EnumList); + // -------------------------------------------------------------------------------------------- + Enumeration e(vm); + // Bind all events using their associated name + for (SQInteger i = 0; i < static_cast< SQInteger >(DpEventID::Max); ++i) + { + e.Const(DpEventID::NAME[i], i); + } + // Expose the constants + ConstTable(vm).Enum(_SC("SqDiscordEvent"), e); } } // Namespace:: SqMod diff --git a/module/Library/DPP/Constants.hpp b/module/Library/DPP/Constants.hpp new file mode 100644 index 00000000..fecbae08 --- /dev/null +++ b/module/Library/DPP/Constants.hpp @@ -0,0 +1,91 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * Unique ID for each event. +*/ +struct DpEventID +{ + /* -------------------------------------------------------------------------------------------- + * ID enumeration. + */ + enum Type + { + VoiceStateUpdate=0, + Log, + GuildJoinRequestDelete, + InteractionCreate, + ButtonClick, + SelectClick, + GuildDelete, + ChannelDelete, + ChannelUpdate, + Ready, + MessageDelete, + ApplicationCommandDelete, + GuildMemberRemove, + ApplicationCommandCreate, + Resumed, + GuildRoleCreate, + TypingStart, + MessageReactionAdd, + GuildMembersChunk, + MessageReactionRemove, + GuildCreate, + ChannelCreate, + MessageReactionRemoveEmoji, + MessageDeleteBulk, + GuildRoleUpdate, + GuildRoleDelete, + ChannelPinsUpdate, + MessageReactionRemoveAll, + VoiceServerUpdate, + GuildEmojisUpdate, + GuildStickersUpdate, + PresenceUpdate, + WebhooksUpdate, + GuildMemberAdd, + InviteDelete, + GuildUpdate, + GuildIntegrationsUpdate, + GuildMemberUpdate, + ApplicationCommandUpdate, + InviteCreate, + MessageUpdate, + UserUpdate, + MessageCreate, + GuildBanAdd, + GuildBanRemove, + IntegrationCreate, + IntegrationUpdate, + IntegrationDelete, + ThreadCreate, + ThreadUpdate, + ThreadDelete, + ThreadListSync, + ThreadMemberUpdate, + ThreadMembersUpdate, + VoiceBufferSend, + VoiceUserTalking, + VoiceReady, + VoiceReceive, + VoiceTrackMarker, + StageInstanceCreate, + StageInstanceDelete, + Max + }; + /* -------------------------------------------------------------------------------------------- + * String identification for each event ID. + */ + static const std::array< const char *, static_cast< size_t >(Max) > NAME; +}; + +} // Namespace:: SqMod diff --git a/module/Library/DPPEv.cpp b/module/Library/DPP/Events.cpp similarity index 81% rename from module/Library/DPPEv.cpp rename to module/Library/DPP/Events.cpp index a3703106..54d98d3f 100644 --- a/module/Library/DPPEv.cpp +++ b/module/Library/DPP/Events.cpp @@ -1,11 +1,5 @@ // ------------------------------------------------------------------------------------------------ -#include "Library/DPPEv.hpp" - -// ------------------------------------------------------------------------------------------------ -#include - -// ------------------------------------------------------------------------------------------------ -#include +#include "Library/DPP/Events.hpp" // ------------------------------------------------------------------------------------------------ namespace SqMod { @@ -74,72 +68,7 @@ SQMOD_DECL_TYPENAME(SqDppStageInstanceCreateEvent, _SC("SqDppStageInstanceCreate SQMOD_DECL_TYPENAME(SqDppStageInstanceDeleteEvent, _SC("SqDppStageInstanceDeleteEvent")) // ------------------------------------------------------------------------------------------------ -const std::array< const char *, static_cast< size_t >(DpEventID::Max) > DpEventID::NAME{ - "VoiceStateUpdate", - "Log", - "GuildJoinRequestDelete", - "InteractionCreate", - "ButtonClick", - "SelectClick", - "GuildDelete", - "ChannelDelete", - "ChannelUpdate", - "Ready", - "MessageDelete", - "ApplicationCommandDelete", - "GuildMemberRemove", - "ApplicationCommandCreate", - "Resumed", - "GuildRoleCreate", - "TypingStart", - "MessageReactionAdd", - "GuildMembersChunk", - "MessageReactionRemove", - "GuildCreate", - "ChannelCreate", - "MessageReactionRemoveEmoji", - "MessageDeleteBulk", - "GuildRoleUpdate", - "GuildRoleDelete", - "ChannelPinsUpdate", - "MessageReactionRemoveAll", - "VoiceServerUpdate", - "GuildEmojisUpdate", - "GuildStickersUpdate", - "PresenceUpdate", - "WebhooksUpdate", - "GuildMemberAdd", - "InviteDelete", - "GuildUpdate", - "GuildIntegrationsUpdate", - "GuildMemberUpdate", - "ApplicationCommandUpdate", - "InviteCreate", - "MessageUpdate", - "UserUpdate", - "MessageCreate", - "GuildBanAdd", - "GuildBanRemove", - "IntegrationCreate", - "IntegrationUpdate", - "IntegrationDelete", - "ThreadCreate", - "ThreadUpdate", - "ThreadDelete", - "ThreadListSync", - "ThreadMemberUpdate", - "ThreadMembersUpdate", - "VoiceBufferSend", - "VoiceUserTalking", - "VoiceReady", - "VoiceReceive", - "VoiceTrackMarker", - "StageInstanceCreate", - "StageInstanceDelete" -}; - -// ------------------------------------------------------------------------------------------------ -void Register_DPPEv(HSQUIRRELVM vm, Table & ns) +void Register_DPP_Events(HSQUIRRELVM vm, Table & ns) { // -------------------------------------------------------------------------------------------- ns.Bind(_SC("VoiceStateUpdate"), @@ -696,71 +625,6 @@ void Register_DPPEv(HSQUIRRELVM vm, Table & ns) // Member Properties .Prop(_SC("RawEvent"), &DpStageInstanceDeleteEvent::GetRawEvent) ); - // -------------------------------------------------------------------------------------------- - ConstTable(vm).Enum(_SC("SqDiscordEvent"), Enumeration(vm) - .Const(_SC("VoiceStateUpdate"), static_cast< SQInteger >(DpEventID::VoiceStateUpdate)) - .Const(_SC("Log"), static_cast< SQInteger >(DpEventID::Log)) - .Const(_SC("GuildJoinRequestDelete"), static_cast< SQInteger >(DpEventID::GuildJoinRequestDelete)) - .Const(_SC("InteractionCreate"), static_cast< SQInteger >(DpEventID::InteractionCreate)) - .Const(_SC("ButtonClick"), static_cast< SQInteger >(DpEventID::ButtonClick)) - .Const(_SC("SelectClick"), static_cast< SQInteger >(DpEventID::SelectClick)) - .Const(_SC("GuildDelete"), static_cast< SQInteger >(DpEventID::GuildDelete)) - .Const(_SC("ChannelDelete"), static_cast< SQInteger >(DpEventID::ChannelDelete)) - .Const(_SC("ChannelUpdate"), static_cast< SQInteger >(DpEventID::ChannelUpdate)) - .Const(_SC("Ready"), static_cast< SQInteger >(DpEventID::Ready)) - .Const(_SC("MessageDelete"), static_cast< SQInteger >(DpEventID::MessageDelete)) - .Const(_SC("ApplicationCommandDelete"), static_cast< SQInteger >(DpEventID::ApplicationCommandDelete)) - .Const(_SC("GuildMemberRemove"), static_cast< SQInteger >(DpEventID::GuildMemberRemove)) - .Const(_SC("ApplicationCommandCreate"), static_cast< SQInteger >(DpEventID::ApplicationCommandCreate)) - .Const(_SC("Resumed"), static_cast< SQInteger >(DpEventID::Resumed)) - .Const(_SC("GuildRoleCreate"), static_cast< SQInteger >(DpEventID::GuildRoleCreate)) - .Const(_SC("TypingStart"), static_cast< SQInteger >(DpEventID::TypingStart)) - .Const(_SC("MessageReactionAdd"), static_cast< SQInteger >(DpEventID::MessageReactionAdd)) - .Const(_SC("GuildMembersChunk"), static_cast< SQInteger >(DpEventID::GuildMembersChunk)) - .Const(_SC("MessageReactionRemove"), static_cast< SQInteger >(DpEventID::MessageReactionRemove)) - .Const(_SC("GuildCreate"), static_cast< SQInteger >(DpEventID::GuildCreate)) - .Const(_SC("ChannelCreate"), static_cast< SQInteger >(DpEventID::ChannelCreate)) - .Const(_SC("MessageReactionRemoveEmoji"), static_cast< SQInteger >(DpEventID::MessageReactionRemoveEmoji)) - .Const(_SC("MessageDeleteBulk"), static_cast< SQInteger >(DpEventID::MessageDeleteBulk)) - .Const(_SC("GuildRoleUpdate"), static_cast< SQInteger >(DpEventID::GuildRoleUpdate)) - .Const(_SC("GuildRoleDelete"), static_cast< SQInteger >(DpEventID::GuildRoleDelete)) - .Const(_SC("ChannelPinsUpdate"), static_cast< SQInteger >(DpEventID::ChannelPinsUpdate)) - .Const(_SC("MessageReactionRemoveAll"), static_cast< SQInteger >(DpEventID::MessageReactionRemoveAll)) - .Const(_SC("VoiceServerUpdate"), static_cast< SQInteger >(DpEventID::VoiceServerUpdate)) - .Const(_SC("GuildEmojisUpdate"), static_cast< SQInteger >(DpEventID::GuildEmojisUpdate)) - .Const(_SC("GuildStickersUpdate"), static_cast< SQInteger >(DpEventID::GuildStickersUpdate)) - .Const(_SC("PresenceUpdate"), static_cast< SQInteger >(DpEventID::PresenceUpdate)) - .Const(_SC("WebhooksUpdate"), static_cast< SQInteger >(DpEventID::WebhooksUpdate)) - .Const(_SC("GuildMemberAdd"), static_cast< SQInteger >(DpEventID::GuildMemberAdd)) - .Const(_SC("InviteDelete"), static_cast< SQInteger >(DpEventID::InviteDelete)) - .Const(_SC("GuildUpdate"), static_cast< SQInteger >(DpEventID::GuildUpdate)) - .Const(_SC("GuildIntegrationsUpdate"), static_cast< SQInteger >(DpEventID::GuildIntegrationsUpdate)) - .Const(_SC("GuildMemberUpdate"), static_cast< SQInteger >(DpEventID::GuildMemberUpdate)) - .Const(_SC("ApplicationCommandUpdate"), static_cast< SQInteger >(DpEventID::ApplicationCommandUpdate)) - .Const(_SC("InviteCreate"), static_cast< SQInteger >(DpEventID::InviteCreate)) - .Const(_SC("MessageUpdate"), static_cast< SQInteger >(DpEventID::MessageUpdate)) - .Const(_SC("UserUpdate"), static_cast< SQInteger >(DpEventID::UserUpdate)) - .Const(_SC("MessageCreate"), static_cast< SQInteger >(DpEventID::MessageCreate)) - .Const(_SC("GuildBanAdd"), static_cast< SQInteger >(DpEventID::GuildBanAdd)) - .Const(_SC("GuildBanRemove"), static_cast< SQInteger >(DpEventID::GuildBanRemove)) - .Const(_SC("IntegrationCreate"), static_cast< SQInteger >(DpEventID::IntegrationCreate)) - .Const(_SC("IntegrationUpdate"), static_cast< SQInteger >(DpEventID::IntegrationUpdate)) - .Const(_SC("IntegrationDelete"), static_cast< SQInteger >(DpEventID::IntegrationDelete)) - .Const(_SC("ThreadCreate"), static_cast< SQInteger >(DpEventID::ThreadCreate)) - .Const(_SC("ThreadUpdate"), static_cast< SQInteger >(DpEventID::ThreadUpdate)) - .Const(_SC("ThreadDelete"), static_cast< SQInteger >(DpEventID::ThreadDelete)) - .Const(_SC("ThreadListSync"), static_cast< SQInteger >(DpEventID::ThreadListSync)) - .Const(_SC("ThreadMemberUpdate"), static_cast< SQInteger >(DpEventID::ThreadMemberUpdate)) - .Const(_SC("ThreadMembersUpdate"), static_cast< SQInteger >(DpEventID::ThreadMembersUpdate)) - .Const(_SC("VoiceBufferSend"), static_cast< SQInteger >(DpEventID::VoiceBufferSend)) - .Const(_SC("VoiceUserTalking"), static_cast< SQInteger >(DpEventID::VoiceUserTalking)) - .Const(_SC("VoiceReady"), static_cast< SQInteger >(DpEventID::VoiceReady)) - .Const(_SC("VoiceReceive"), static_cast< SQInteger >(DpEventID::VoiceReceive)) - .Const(_SC("VoiceTrackMarker"), static_cast< SQInteger >(DpEventID::VoiceTrackMarker)) - .Const(_SC("StageInstanceCreate"), static_cast< SQInteger >(DpEventID::StageInstanceCreate)) - .Const(_SC("StageInstanceDelete"), static_cast< SQInteger >(DpEventID::StageInstanceDelete)) - .Const(_SC("Max"), static_cast< SQInteger >(DpEventID::Max)) - ); } } // Namespace:: SqMod diff --git a/module/Library/DPPEv.hpp b/module/Library/DPP/Events.hpp similarity index 98% rename from module/Library/DPPEv.hpp rename to module/Library/DPP/Events.hpp index 2611d5de..a752d67f 100644 --- a/module/Library/DPPEv.hpp +++ b/module/Library/DPP/Events.hpp @@ -1,7 +1,15 @@ #pragma once // ------------------------------------------------------------------------------------------------ -#include "Library/DPPTy.hpp" +#include "Library/DPP/Channel.hpp" +#include "Library/DPP/Client.hpp" +#include "Library/DPP/Command.hpp" +#include "Library/DPP/Guild.hpp" +#include "Library/DPP/Integration.hpp" +#include "Library/DPP/Message.hpp" +#include "Library/DPP/Other.hpp" +#include "Library/DPP/Role.hpp" +#include "Library/DPP/User.hpp" // ------------------------------------------------------------------------------------------------ #include @@ -13,85 +21,6 @@ // ------------------------------------------------------------------------------------------------ namespace SqMod { -/* ------------------------------------------------------------------------------------------------ - * Unique ID for each event. -*/ -struct DpEventID -{ - /* -------------------------------------------------------------------------------------------- - * ID enumeration. - */ - enum Type - { - VoiceStateUpdate=0, - Log, - GuildJoinRequestDelete, - InteractionCreate, - ButtonClick, - SelectClick, - GuildDelete, - ChannelDelete, - ChannelUpdate, - Ready, - MessageDelete, - ApplicationCommandDelete, - GuildMemberRemove, - ApplicationCommandCreate, - Resumed, - GuildRoleCreate, - TypingStart, - MessageReactionAdd, - GuildMembersChunk, - MessageReactionRemove, - GuildCreate, - ChannelCreate, - MessageReactionRemoveEmoji, - MessageDeleteBulk, - GuildRoleUpdate, - GuildRoleDelete, - ChannelPinsUpdate, - MessageReactionRemoveAll, - VoiceServerUpdate, - GuildEmojisUpdate, - GuildStickersUpdate, - PresenceUpdate, - WebhooksUpdate, - GuildMemberAdd, - InviteDelete, - GuildUpdate, - GuildIntegrationsUpdate, - GuildMemberUpdate, - ApplicationCommandUpdate, - InviteCreate, - MessageUpdate, - UserUpdate, - MessageCreate, - GuildBanAdd, - GuildBanRemove, - IntegrationCreate, - IntegrationUpdate, - IntegrationDelete, - ThreadCreate, - ThreadUpdate, - ThreadDelete, - ThreadListSync, - ThreadMemberUpdate, - ThreadMembersUpdate, - VoiceBufferSend, - VoiceUserTalking, - VoiceReady, - VoiceReceive, - VoiceTrackMarker, - StageInstanceCreate, - StageInstanceDelete, - Max - }; - /* -------------------------------------------------------------------------------------------- - * String identification. - */ - static const std::array< const char *, static_cast< size_t >(Max) > NAME; -}; - /* ------------------------------------------------------------------------------------------------ * Base class of an event handler. */ diff --git a/module/Library/DPP/Guild.cpp b/module/Library/DPP/Guild.cpp new file mode 100644 index 00000000..cd5ddc0b --- /dev/null +++ b/module/Library/DPP/Guild.cpp @@ -0,0 +1,146 @@ +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/Guild.hpp" +#include "Library/DPP/Other.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ +SQMOD_DECL_TYPENAME(SqDppGuildMember, _SC("SqDppGuildMember")) +SQMOD_DECL_TYPENAME(SqDppGuild, _SC("SqDppGuild")) + +// ------------------------------------------------------------------------------------------------ +Table DpGuild::GetMembers() const +{ + Table t(SqVM(), static_cast< SQInteger >(Valid().members.size())); + // Attempt to convert the [members] associative container into a script table + const auto r = t.InsertFromMapWith(mPtr->members, [](HSQUIRRELVM vm, auto id, auto & m) -> SQRESULT { + // The [id] is a dpp::snowflake which is basically a uint64_t so let's leave that as is + sq_pushinteger(vm, static_cast< SQInteger >(id)); + // Wrap the dpp::guild_member type into a DpGuildMember instance + ClassType< DpGuildMember >::PushInstance(vm, new DpGuildMember(m)); + // The elements are now on the stack and can be inserted in the table + return SQ_OK; + }); + // Did anything fail? + if (SQ_FAILED(r)) + { + STHROWF("Unable to convert [members] container"); + } + // Return the resulted table + return t; +} + +// ------------------------------------------------------------------------------------------------ +Table DpGuild::GetVoiceMembers() const +{ + Table t(SqVM(), static_cast< SQInteger >(Valid().voice_members.size())); + // Attempt to convert the [voice_members] associative container into a script table + const auto r = t.InsertFromMapWith(mPtr->voice_members, [](HSQUIRRELVM vm, auto id, auto & m) -> SQRESULT { + // The [id] is a dpp::snowflake which is basically a uint64_t so let's leave that as is + sq_pushinteger(vm, static_cast< SQInteger >(id)); + // Wrap the dpp::guild_member type into a DpGuildMember instance + ClassType< DpVoiceState >::PushInstance(vm, new DpVoiceState(m)); + // The elements are now on the stack and can be inserted in the table + return SQ_OK; + }); + // Did anything fail? + if (SQ_FAILED(r)) + { + STHROWF("Unable to convert [voice_members] container"); + } + // Return the resulted table + return t; +} + +// ------------------------------------------------------------------------------------------------ +void Register_DPP_Guild(HSQUIRRELVM vm, Table & ns) +{ + ns.Bind(_SC("GuildMember"), + Class< DpGuildMember, NoConstructor< DpGuildMember > >(vm, SqDppGuildMember::Str) + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppGuildMember::Fn) + .Func(_SC("_tojson"), &DpGuildMember::BuildJSON) + // Member Properties + .Prop(_SC("Valid"), &DpGuildMember::IsValid) + .Prop(_SC("JSON"), &DpGuildMember::BuildJSON) + .Prop(_SC("Nickname"), &DpGuildMember::GetNickname) + .Prop(_SC("GuildID"), &DpGuildMember::GetGuildID) + .Prop(_SC("UserID"), &DpGuildMember::GetUserID) + .Prop(_SC("JoinedAt"), &DpGuildMember::GetJoinedAt) + .Prop(_SC("PremiumSince"), &DpGuildMember::GetPremiumSince) + .Prop(_SC("Flags"), &DpGuildMember::GetFlags) + .Prop(_SC("IsDeaf"), &DpGuildMember::IsDeaf) + .Prop(_SC("IsMuted"), &DpGuildMember::IsMuted) + .Prop(_SC("IsPending"), &DpGuildMember::IsPending) + // Member Methods + .Func(_SC("GetRoles"), &DpGuildMember::GetRoles) + ); + // -------------------------------------------------------------------------------------------- + ns.Bind(_SC("Guild"), + Class< DpGuild, NoConstructor< DpGuild > >(vm, SqDppGuild::Str) + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppGuild::Fn) + .Func(_SC("_tojson"), &DpGuild::BuildJSON) + // Member Properties + .Prop(_SC("Valid"), &DpGuild::IsValid) + .Prop(_SC("JSON"), &DpGuild::BuildJSON) + .Prop(_SC("ShardID"), &DpGuild::GetShardID) + .Prop(_SC("Flags"), &DpGuild::GetFlags) + .Prop(_SC("Name"), &DpGuild::GetName) + .Prop(_SC("Description"), &DpGuild::GetDescription) + .Prop(_SC("VanityUrlCode"), &DpGuild::GetVanityUrlCode) + .Prop(_SC("Icon"), &DpGuild::GetIcon) + .Prop(_SC("Splash"), &DpGuild::GetSplash) + .Prop(_SC("DiscoverySplash"), &DpGuild::GetDiscoverySplash) + .Prop(_SC("OwnerID"), &DpGuild::GetOwnerID) + .Prop(_SC("VoiceRegion"), &DpGuild::GetVoiceRegion) + .Prop(_SC("AfkChannelID"), &DpGuild::GetAfkChannelID) + .Prop(_SC("AfkTimeout"), &DpGuild::GetAfkTimeout) + .Prop(_SC("WidgetChannelID"), &DpGuild::GetWidgetChannelID) + .Prop(_SC("VerificationLevel"), &DpGuild::GetVerificationLevel) + .Prop(_SC("DefaultMessageNotifications"), &DpGuild::GetDefaultMessageNotifications) + .Prop(_SC("ExplicitContentFilter"), &DpGuild::GetExplicitContentFilter) + .Prop(_SC("MfaLevel"), &DpGuild::GetMfaLevel) + .Prop(_SC("ApplicationID"), &DpGuild::GetApplicationID) + .Prop(_SC("SystemChannelID"), &DpGuild::GetSystemChannelID) + .Prop(_SC("RulesChannelID"), &DpGuild::GetRulesChannelID) + .Prop(_SC("MemberCount"), &DpGuild::GetMemberCount) + .Prop(_SC("Banner"), &DpGuild::GetBanner) + .Prop(_SC("PremiumTier"), &DpGuild::GetPremiumTier) + .Prop(_SC("PremiumSubscriptionCount"), &DpGuild::GetPremiumSubscriptionCount) + .Prop(_SC("PublicUpdatesChannelID"), &DpGuild::GetPublicUpdatesChannelID) + .Prop(_SC("MaxVideoChannelUsers"), &DpGuild::GetMaxVideoChannelUsers) + .Prop(_SC("IsLarge"), &DpGuild::IsLarge) + .Prop(_SC("IsUnavailable"), &DpGuild::IsUnavailable) + .Prop(_SC("WidgetEnabled"), &DpGuild::WidgetEnabled) + .Prop(_SC("HasInviteSplash"), &DpGuild::HasInviteSplash) + .Prop(_SC("HasVipRegions"), &DpGuild::HasVipRegions) + .Prop(_SC("HasVanityURL"), &DpGuild::HasVanityURL) + .Prop(_SC("IsVerified"), &DpGuild::IsVerified) + .Prop(_SC("IsPartnered"), &DpGuild::IsPartnered) + .Prop(_SC("IsCommunity"), &DpGuild::IsCommunity) + .Prop(_SC("HasCommerce"), &DpGuild::HasCommerce) + .Prop(_SC("HasNews"), &DpGuild::HasNews) + .Prop(_SC("IsDiscoverable"), &DpGuild::IsDiscoverable) + .Prop(_SC("IsFeatureable"), &DpGuild::IsFeatureable) + .Prop(_SC("HasAnimatedIcon"), &DpGuild::HasAnimatedIcon) + .Prop(_SC("BasBanner"), &DpGuild::BasBanner) + .Prop(_SC("WelcomeScreenEnabled"), &DpGuild::WelcomeScreenEnabled) + .Prop(_SC("HasMemberVerificationGate"), &DpGuild::HasMemberVerificationGate) + .Prop(_SC("IsPreviewEnabled"), &DpGuild::IsPreviewEnabled) + .Prop(_SC("HasAnimatedIconHash"), &DpGuild::HasAnimatedIconHash) + // Member Methods + .Func(_SC("BuildJSON"), &DpGuild::BuildJSON_) + .Func(_SC("GetRoles"), &DpGuild::GetRoles) + .Func(_SC("GetChannels"), &DpGuild::GetChannels) + .Func(_SC("GetThreads"), &DpGuild::GetThreads) + .Func(_SC("GetMembers"), &DpGuild::GetMembers) + .Func(_SC("GetVoiceMembers"), &DpGuild::GetVoiceMembers) + .Func(_SC("GetEmojis"), &DpGuild::GetEmojis) + .Func(_SC("RehashMembers"), &DpGuild::RehashMembers) + .Func(_SC("ConnectMemberVoice"), &DpGuild::ConnectMemberVoice) + ); +} + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Guild.hpp b/module/Library/DPP/Guild.hpp new file mode 100644 index 00000000..121e286b --- /dev/null +++ b/module/Library/DPP/Guild.hpp @@ -0,0 +1,464 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * Represents a guild on Discord (AKA a server). +*/ +struct DpGuildMember +{ + using Ptr = std::unique_ptr< dpp::guild_member >; + /* -------------------------------------------------------------------------------------------- + * Referenced guild member instance. + */ + Ptr mPtr{nullptr}; + /* -------------------------------------------------------------------------------------------- + * Wether the referenced pointer is owned. + */ + bool mOwned{false}; + /* -------------------------------------------------------------------------------------------- + * Default constructor. + */ + DpGuildMember() noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpGuildMember(Ptr::pointer ptr, bool owned = false) noexcept + : mPtr(ptr), mOwned(owned) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor. + */ + explicit DpGuildMember(const Ptr::element_type & o) noexcept + : DpGuildMember(new Ptr::element_type(o), true) + { } + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + explicit DpGuildMember(Ptr::element_type && o) noexcept + : DpGuildMember(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor (disabled). + */ + DpGuildMember(const DpGuildMember & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + DpGuildMember(DpGuildMember && o) noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Destructor. + */ + ~DpGuildMember() noexcept + { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + } + /* -------------------------------------------------------------------------------------------- + * Copy assignment operator (disabled). + */ + DpGuildMember & operator = (const DpGuildMember & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move assignment operator. + */ + DpGuildMember & operator = (DpGuildMember && o) noexcept + { + if (this != &o) { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + // Transfer members values + mPtr = std::move(o.mPtr); + mOwned = o.mOwned; + } + return *this; + } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle. + */ + void Validate() const { if (!mPtr) STHROWF("Invalid discord voice state handle"); } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle and retrieve a const reference to it. + */ + SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } + /* -------------------------------------------------------------------------------------------- + * Check wether a valid instance is managed. + */ + SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the gickname, or empty string if they don't have a nickname on this guild. + */ + SQMOD_NODISCARD const std::string & GetNickname() const { return Valid().nickname; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild id. + */ + SQMOD_NODISCARD dpp::snowflake GetGuildID() const { return Valid().guild_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the user id. + */ + SQMOD_NODISCARD dpp::snowflake GetUserID() const { return Valid().user_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the list of roles this user has on this guild. + */ + SQMOD_NODISCARD Array GetRoles() const + { + return Array(SqVM()).Reserve(static_cast< SQInteger >(Valid().roles.size())) + .AppendFromVector(Valid().roles); + } + /* -------------------------------------------------------------------------------------------- + * Retrieve the date and time since the user joined the guild. + */ + SQMOD_NODISCARD SQInteger GetJoinedAt() const + { + return std::chrono::time_point_cast< std::chrono::seconds >( + std::chrono::system_clock::from_time_t(Valid().joined_at) + ).time_since_epoch().count(); + } + /* -------------------------------------------------------------------------------------------- + * Retrieve the date and time since the user has boosted the guild guild. + */ + SQMOD_NODISCARD SQInteger GetPremiumSince() const + { + return std::chrono::time_point_cast< std::chrono::seconds >( + std::chrono::system_clock::from_time_t(Valid().premium_since) + ).time_since_epoch().count(); + } + /* -------------------------------------------------------------------------------------------- + * Retrieve the set of flags built from the bitmask defined by dpp::guild_member_flags. + */ + SQMOD_NODISCARD SQInteger GetFlags() const { return static_cast< SQInteger >(Valid().flags); } + /* -------------------------------------------------------------------------------------------- + * Build JSON string for the member object. + */ + SQMOD_NODISCARD std::string BuildJSON() const { return Valid().build_json(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is deafened. + */ + SQMOD_NODISCARD bool IsDeaf() const { return Valid().is_deaf(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is muted. + */ + SQMOD_NODISCARD bool IsMuted() const { return Valid().is_muted(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is pending verification by membership screening. + */ + SQMOD_NODISCARD bool IsPending() const { return Valid().is_pending(); } +}; + +/* ------------------------------------------------------------------------------------------------ + * Represents a guild on Discord (AKA a server) +*/ +struct DpGuild +{ + using Ptr = std::unique_ptr< dpp::guild >; + /* -------------------------------------------------------------------------------------------- + * Referenced guild instance. + */ + Ptr mPtr{nullptr}; + /* -------------------------------------------------------------------------------------------- + * Wether the referenced pointer is owned. + */ + bool mOwned{false}; + /* -------------------------------------------------------------------------------------------- + * Default constructor. + */ + DpGuild() noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpGuild(Ptr::pointer ptr, bool owned = false) noexcept + : mPtr(ptr), mOwned(owned) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor. + */ + explicit DpGuild(const Ptr::element_type & o) noexcept + : DpGuild(new Ptr::element_type(o), true) + { } + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + explicit DpGuild(Ptr::element_type && o) noexcept + : DpGuild(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor (disabled). + */ + DpGuild(const DpGuild & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + DpGuild(DpGuild && o) noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Destructor. + */ + ~DpGuild() noexcept + { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + } + /* -------------------------------------------------------------------------------------------- + * Copy assignment operator (disabled). + */ + DpGuild & operator = (const DpGuild & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move assignment operator. + */ + DpGuild & operator = (DpGuild && o) noexcept + { + if (this != &o) { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + // Transfer members values + mPtr = std::move(o.mPtr); + mOwned = o.mOwned; + } + return *this; + } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle. + */ + void Validate() const { if (!mPtr) STHROWF("Invalid discord guild handle"); } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle and retrieve a const reference to it. + */ + SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } + /* -------------------------------------------------------------------------------------------- + * Check wether a valid instance is managed. + */ + SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the shard ID of the guild. + */ + SQMOD_NODISCARD SQInteger GetShardID() const { return static_cast< SQInteger >(Valid().shard_id); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the flags bitmask as defined by values within dpp::guild_flags. + */ + SQMOD_NODISCARD SQInteger GetFlags() const { return static_cast< SQInteger >(Valid().flags); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild name. + */ + SQMOD_NODISCARD const std::string & GetName() const { return Valid().name; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the server description for communities. + */ + SQMOD_NODISCARD const std::string & GetDescription() const { return Valid().description; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the vanity url code for verified or partnered servers and boost level 3. + */ + SQMOD_NODISCARD const std::string & GetVanityUrlCode() const { return Valid().vanity_url_code; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild icon hash. + */ + SQMOD_NODISCARD const dpp::utility::iconhash & GetIcon() const { return Valid().icon; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild splash hash. + */ + SQMOD_NODISCARD const dpp::utility::iconhash & GetSplash() const { return Valid().splash; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild discovery splash hash. + */ + SQMOD_NODISCARD const dpp::utility::iconhash & GetDiscoverySplash() const { return Valid().discovery_splash; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the snowflake id of guild owner. + */ + SQMOD_NODISCARD dpp::snowflake GetOwnerID() const { return Valid().owner_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild voice region. + */ + SQMOD_NODISCARD SQInteger GetVoiceRegion() const { return static_cast< SQInteger >(Valid().voice_region); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the snowflake ID of AFK voice channel or 0. + */ + SQMOD_NODISCARD dpp::snowflake GetAfkChannelID() const { return Valid().afk_channel_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the voice AFK timeout before moving users to AFK channel. + */ + SQMOD_NODISCARD SQInteger GetAfkTimeout() const { return static_cast< SQInteger >(Valid().afk_timeout); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the snowflake ID of widget channel, or 0. + */ + SQMOD_NODISCARD dpp::snowflake GetWidgetChannelID() const { return Valid().widget_channel_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the verification level of server. + */ + SQMOD_NODISCARD SQInteger GetVerificationLevel() const { return static_cast< SQInteger >(Valid().verification_level); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the setting for how notifications are to be delivered to users. + */ + SQMOD_NODISCARD SQInteger GetDefaultMessageNotifications() const { return static_cast< SQInteger >(Valid().default_message_notifications); } + /* -------------------------------------------------------------------------------------------- + * Check wether or not explicit content filtering is enable and what setting it is. + */ + SQMOD_NODISCARD SQInteger GetExplicitContentFilter() const { return static_cast< SQInteger >(Valid().explicit_content_filter); } + /* -------------------------------------------------------------------------------------------- + * Check wether multi factor authentication is required for moderators or not. + */ + SQMOD_NODISCARD SQInteger GetMfaLevel() const { return static_cast< SQInteger >(Valid().mfa_level); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the ID of creating application, if any, or 0. + */ + SQMOD_NODISCARD dpp::snowflake GetApplicationID() const { return Valid().application_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the ID of system channel where discord update messages are sent. + */ + SQMOD_NODISCARD dpp::snowflake GetSystemChannelID() const { return Valid().system_channel_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the ID of rules channel for communities. + */ + SQMOD_NODISCARD dpp::snowflake GetRulesChannelID() const { return Valid().rules_channel_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the approximate member count. May be sent as zero. + */ + SQMOD_NODISCARD SQInteger GetMemberCount() const { return static_cast< SQInteger >(Valid().member_count); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the server banner hash. + */ + SQMOD_NODISCARD const dpp::utility::iconhash & GetBanner() const { return Valid().banner; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the boost level. + */ + SQMOD_NODISCARD SQInteger GetPremiumTier() const { return static_cast< SQInteger >(Valid().premium_tier); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the number of boosters. + */ + SQMOD_NODISCARD SQInteger GetPremiumSubscriptionCount() const { return static_cast< SQInteger >(Valid().premium_subscription_count); } + /* -------------------------------------------------------------------------------------------- + * Retrieve public updates channel ID or 0. + */ + SQMOD_NODISCARD dpp::snowflake GetPublicUpdatesChannelID() const { return Valid().public_updates_channel_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the maximum users in a video channel, or 0. + */ + SQMOD_NODISCARD SQInteger GetMaxVideoChannelUsers() const { return static_cast< SQInteger >(Valid().max_video_channel_users); } + /* -------------------------------------------------------------------------------------------- + * Retrieve a roles defined on this server. + */ + SQMOD_NODISCARD Array GetRoles() const { return Array(SqVM()).Reserve(static_cast< SQInteger >(Valid().roles.size())).AppendFromVector(Valid().roles); } + /* -------------------------------------------------------------------------------------------- + * Retrieve a list of channels on this server. + */ + SQMOD_NODISCARD Array GetChannels() const { return Array(SqVM()).Reserve(static_cast< SQInteger >(Valid().channels.size())).AppendFromVector(Valid().channels); } + /* -------------------------------------------------------------------------------------------- + * Retrieve a list of threads on this server. + */ + SQMOD_NODISCARD Array GetThreads() const { return Array(SqVM()).Reserve(static_cast< SQInteger >(Valid().threads.size())).AppendFromVector(Valid().threads); } + /* -------------------------------------------------------------------------------------------- + * Retrieve a list of guild members. Note that when you first receive the guild create event, + * this may be empty or near empty. This depends upon your dpp::intents and the size of your bot. + * It will be filled by guild member chunk requests. + */ + SQMOD_NODISCARD Table GetMembers() const; + /* -------------------------------------------------------------------------------------------- + * Retrieve a list of members in voice channels in the guild. + */ + SQMOD_NODISCARD Table GetVoiceMembers() const; + /* -------------------------------------------------------------------------------------------- + * Retrieve a list of emojis. + */ + SQMOD_NODISCARD Array GetEmojis() const { return Array(SqVM()).Reserve(static_cast< SQInteger >(Valid().emojis.size())).AppendFromVector(Valid().emojis); } + /* -------------------------------------------------------------------------------------------- + * Build a JSON string from this object. + */ + SQMOD_NODISCARD std::string BuildJSON() const { return Valid().build_json(); } + /* -------------------------------------------------------------------------------------------- + * Build a JSON string from this object. If [with_id] is True then ID is to be included in the JSON. + */ + SQMOD_NODISCARD std::string BuildJSON_(bool with_id) const { return Valid().build_json(with_id); } + /* -------------------------------------------------------------------------------------------- + * Rehash members map. + */ + SQMOD_NODISCARD DpGuild & RehashMembers() { Valid().rehash_members(); return *this; } + /* -------------------------------------------------------------------------------------------- + * Connect to a voice channel another guild member is in. + * Returns true if the user specified is in a voice channel, false if they aren't. + */ + SQMOD_NODISCARD bool ConnectMemberVoice(SQInteger user_id) const { return Valid().connect_member_voice(user_id); } + /* -------------------------------------------------------------------------------------------- + * Is a large server (>250 users). + */ + SQMOD_NODISCARD bool IsLarge() const { return Valid().is_large(); } + /* -------------------------------------------------------------------------------------------- + * Is unavailable due to outage (most other fields will be blank or outdated). + */ + SQMOD_NODISCARD bool IsUnavailable() const { return Valid().is_unavailable(); } + /* -------------------------------------------------------------------------------------------- + * Widget is enabled for this server. + */ + SQMOD_NODISCARD bool WidgetEnabled() const { return Valid().widget_enabled(); } + /* -------------------------------------------------------------------------------------------- + * Guild has an invite splash. + */ + SQMOD_NODISCARD bool HasInviteSplash() const { return Valid().has_invite_splash(); } + /* -------------------------------------------------------------------------------------------- + * Guild has VIP regions. + */ + SQMOD_NODISCARD bool HasVipRegions() const { return Valid().has_vip_regions(); } + /* -------------------------------------------------------------------------------------------- + * Guild can have a vanity URL. + */ + SQMOD_NODISCARD bool HasVanityURL() const { return Valid().has_vanity_url(); } + /* -------------------------------------------------------------------------------------------- + * Guild is a verified server. + */ + SQMOD_NODISCARD bool IsVerified() const { return Valid().is_verified(); } + /* -------------------------------------------------------------------------------------------- + * Guild is a discord partner server. + */ + SQMOD_NODISCARD bool IsPartnered() const { return Valid().is_partnered(); } + /* -------------------------------------------------------------------------------------------- + * Guild has enabled community. + */ + SQMOD_NODISCARD bool IsCommunity() const { return Valid().is_community(); } + /* -------------------------------------------------------------------------------------------- + * Guild has enabled commerce channels. + */ + SQMOD_NODISCARD bool HasCommerce() const { return Valid().has_commerce(); } + /* -------------------------------------------------------------------------------------------- + * Guild has news channel. + */ + SQMOD_NODISCARD bool HasNews() const { return Valid().has_news(); } + /* -------------------------------------------------------------------------------------------- + * Guild is discoverable. + */ + SQMOD_NODISCARD bool IsDiscoverable() const { return Valid().is_discoverable(); } + /* -------------------------------------------------------------------------------------------- + * Guild is featureable. + */ + SQMOD_NODISCARD bool IsFeatureable() const { return Valid().is_featureable(); } + /* -------------------------------------------------------------------------------------------- + * Guild is allowed an animated icon. + */ + SQMOD_NODISCARD bool HasAnimatedIcon() const { return Valid().has_animated_icon(); } + /* -------------------------------------------------------------------------------------------- + * Guild has a banner image. + */ + SQMOD_NODISCARD bool BasBanner() const { return Valid().has_banner(); } + /* -------------------------------------------------------------------------------------------- + * Guild has enabled welcome screen. + */ + SQMOD_NODISCARD bool WelcomeScreenEnabled() const { return Valid().is_welcome_screen_enabled(); } + /* -------------------------------------------------------------------------------------------- + * Guild has enabled membership screening. + */ + SQMOD_NODISCARD bool HasMemberVerificationGate() const { return Valid().has_member_verification_gate(); } + /* -------------------------------------------------------------------------------------------- + * Guild has preview enabled. + */ + SQMOD_NODISCARD bool IsPreviewEnabled() const { return Valid().is_preview_enabled(); } + /* -------------------------------------------------------------------------------------------- + * Server icon is actually an animated gif. + */ + SQMOD_NODISCARD bool HasAnimatedIconHash() const { return Valid().has_animated_icon_hash(); } +}; + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Integration.cpp b/module/Library/DPP/Integration.cpp new file mode 100644 index 00000000..58f167cf --- /dev/null +++ b/module/Library/DPP/Integration.cpp @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/Integration.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ + + +// ------------------------------------------------------------------------------------------------ +void Register_DPP_Integration(HSQUIRRELVM vm, Table & ns) +{ + +} + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Integration.hpp b/module/Library/DPP/Integration.hpp new file mode 100644 index 00000000..854a24c2 --- /dev/null +++ b/module/Library/DPP/Integration.hpp @@ -0,0 +1,19 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * +*/ + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Message.cpp b/module/Library/DPP/Message.cpp new file mode 100644 index 00000000..22fdd8fe --- /dev/null +++ b/module/Library/DPP/Message.cpp @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/Message.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ + + +// ------------------------------------------------------------------------------------------------ +void Register_DPP_Message(HSQUIRRELVM vm, Table & ns) +{ + +} + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Message.hpp b/module/Library/DPP/Message.hpp new file mode 100644 index 00000000..854a24c2 --- /dev/null +++ b/module/Library/DPP/Message.hpp @@ -0,0 +1,19 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * +*/ + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Other.cpp b/module/Library/DPP/Other.cpp new file mode 100644 index 00000000..d9525808 --- /dev/null +++ b/module/Library/DPP/Other.cpp @@ -0,0 +1,141 @@ +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/Other.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ +SQMOD_DECL_TYPENAME(SqDppCachePolicy, _SC("SqDppCachePolicy")) +SQMOD_DECL_TYPENAME(SqDppIconHash, _SC("SqDppIconHash")) +SQMOD_DECL_TYPENAME(SqDppUptime, _SC("SqDppUptime")) +SQMOD_DECL_TYPENAME(SqDppActivity, _SC("SqDppActivity")) +SQMOD_DECL_TYPENAME(SqDppPresence, _SC("SqDppPresence")) +SQMOD_DECL_TYPENAME(SqDppVoiceState, _SC("SqDppVoiceState")) + +// ------------------------------------------------------------------------------------------------ +void Register_DPP_Other(HSQUIRRELVM vm, Table & ns) +{ + // -------------------------------------------------------------------------------------------- + ns.Bind(_SC("Uptime"), + Class< dpp::utility::uptime >(vm, SqDppUptime::Str) + // Constructors + .Ctor() + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppUptime::Fn) + .Func(_SC("_tostring"), &dpp::utility::uptime::to_string) + // Member Variables + .Var(_SC("Days"), &dpp::utility::uptime::days) + .Var(_SC("Hours"), &dpp::utility::uptime::hours) + .Var(_SC("Minutes"), &dpp::utility::uptime::mins) + .Var(_SC("Seconds"), &dpp::utility::uptime::secs) + // Member Methods + .Func(_SC("ToSeconds"), &dpp::utility::uptime::to_secs) + .Func(_SC("ToMilliseconds"), &dpp::utility::uptime::to_msecs) + ); + // -------------------------------------------------------------------------------------------- + ns.Bind(_SC("IconHash"), + Class< dpp::utility::iconhash >(vm, SqDppIconHash::Str) + // Constructors + .Ctor() + .Ctor< const std::string & >() + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppIconHash::Fn) + .Func(_SC("_tostring"), &dpp::utility::iconhash::to_string) + // Member Variables + .Var(_SC("High"), &dpp::utility::iconhash::first) + .Var(_SC("Low"), &dpp::utility::iconhash::second) + // Member Methods + .Func(_SC("Set"), &dpp::utility::iconhash::set) + ); + // -------------------------------------------------------------------------------------------- + ns.Bind(_SC("CachePolicy"), + Class< DpCachePolicy >(vm, SqDppCachePolicy::Str) + // Constructors + .Ctor() + .Ctor< SQInteger >() + .Ctor< SQInteger, SQInteger >() + .Ctor< SQInteger, SQInteger, SQInteger >() + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppCachePolicy::Fn) + // Member Variables + .Var(_SC("UserPolicy"), &DpCachePolicy::mUserPolicy) + .Var(_SC("EmojiPolicy"), &DpCachePolicy::mEmojiPolicy) + .Var(_SC("RolePolicy"), &DpCachePolicy::mRolePolicy) + ); + // -------------------------------------------------------------------------------------------- + ns.Bind(_SC("Activity"), + Class< DpActivity, NoCopy< DpActivity > >(vm, SqDppActivity::Str) + // Constructors + .Ctor() + .Ctor< SQInteger, StackStrF &, StackStrF &, StackStrF & >() + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppActivity::Fn) + // Member Properties + .Prop(_SC("Name"), &DpActivity::GetName, &DpActivity::SetName) + .Prop(_SC("State"), &DpActivity::GetState, &DpActivity::SetState) + .Prop(_SC("URL"), &DpActivity::GetURL, &DpActivity::SetURL) + .Prop(_SC("Type"), &DpActivity::GetType, &DpActivity::SetType) + .Prop(_SC("CreatedAt"), &DpActivity::GetCreatedAt, &DpActivity::SetCreatedAt) + .Prop(_SC("Start"), &DpActivity::GetStart, &DpActivity::SetStart) + .Prop(_SC("End"), &DpActivity::GetEnd, &DpActivity::SetEnd) + // Member Methods + .Func(_SC("SetName"), &DpActivity::ApplyName) + .Func(_SC("SetState"), &DpActivity::ApplyState) + .Func(_SC("SetURL"), &DpActivity::ApplyURL) + .Func(_SC("SetType"), &DpActivity::ApplyType) + .Func(_SC("SetCreatedAt"), &DpActivity::ApplyCreatedAt) + .Func(_SC("SetStart"), &DpActivity::ApplyStart) + .Func(_SC("SetEnd"), &DpActivity::ApplyEnd) + ); + // -------------------------------------------------------------------------------------------- + ns.Bind(_SC("Presence"), + Class< DpPresence, NoCopy< DpPresence > >(vm, SqDppPresence::Str) + // Constructors + .Ctor() + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppPresence::Fn) + // Member Properties + .Prop(_SC("Valid"), &DpPresence::IsValid) + .Prop(_SC("UserID"), &DpPresence::GetUserID, &DpPresence::SetUserID) + .Prop(_SC("GuildID"), &DpPresence::GetGuildID, &DpPresence::SetGuildID) + .Prop(_SC("Flags"), &DpPresence::GetFlags, &DpPresence::SetFlags) + .Prop(_SC("ActivityCount"), &DpPresence::ActivityCount) + .Prop(_SC("DesktopStatus"), &DpPresence::GetDesktopStatus) + .Prop(_SC("WebStatus"), &DpPresence::GetWebStatus) + .Prop(_SC("MobileStatus"), &DpPresence::GetMobileStatus) + .Prop(_SC("Status"), &DpPresence::GetStatus) + // Member Methods + .Func(_SC("SetUserID"), &DpPresence::ApplyUserID) + .Func(_SC("SetGuildID"), &DpPresence::ApplyGuildID) + .Func(_SC("SetFlags"), &DpPresence::ApplyFlags) + .Func(_SC("AddActivity"), &DpPresence::AddActivity) + .Func(_SC("EachActivity"), &DpPresence::EachActivity) + .Func(_SC("ClearActivities"), &DpPresence::ClearActivities) + .Func(_SC("FilterActivities"), &DpPresence::FilterActivities) + .Func(_SC("BuildJSON"), &DpPresence::BuildJSON) + ); + // -------------------------------------------------------------------------------------------- + ns.Bind(_SC("VoiceState"), + Class< DpVoiceState, NoConstructor< DpVoiceState > >(vm, SqDppVoiceState::Str) + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppVoiceState::Fn) + .Func(_SC("_tojson"), &DpVoiceState::BuildJSON) + // Member Properties + .Prop(_SC("Valid"), &DpVoiceState::IsValid) + .Prop(_SC("JSON"), &DpVoiceState::BuildJSON) + .Prop(_SC("GuildID"), &DpVoiceState::GetGuildID) + .Prop(_SC("ChannelID"), &DpVoiceState::GetChannelID) + .Prop(_SC("UserID"), &DpVoiceState::GetUserID) + .Prop(_SC("SessionID"), &DpVoiceState::GetSessionID) + .Prop(_SC("Flags"), &DpVoiceState::GetFlags, &DpVoiceState::SetFlags) + .Prop(_SC("IsDeaf"), &DpVoiceState::IsDeaf) + .Prop(_SC("IsMute"), &DpVoiceState::IsMute) + .Prop(_SC("IsSelfMute"), &DpVoiceState::IsSelfMute) + .Prop(_SC("IsSelfDeaf"), &DpVoiceState::IsSelfDeaf) + .Prop(_SC("SelfStream"), &DpVoiceState::SelfStream) + .Prop(_SC("SelfVideo"), &DpVoiceState::SelfVideo) + .Prop(_SC("IsSupressed"), &DpVoiceState::IsSupressed) + ); +} + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Other.hpp b/module/Library/DPP/Other.hpp new file mode 100644 index 00000000..f255bd45 --- /dev/null +++ b/module/Library/DPP/Other.hpp @@ -0,0 +1,589 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * Represents the caching policy of the cluster. +*/ +struct DpCachePolicy +{ + SQInteger mUserPolicy{dpp::cp_aggressive}; + SQInteger mEmojiPolicy{dpp::cp_aggressive}; + SQInteger mRolePolicy{dpp::cp_aggressive}; + /* -------------------------------------------------------------------------------------------- + * Default constructor. + */ + DpCachePolicy() noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpCachePolicy(SQInteger user) noexcept + : mUserPolicy(user), mEmojiPolicy(dpp::cp_aggressive), mRolePolicy(dpp::cp_aggressive) + { } + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + DpCachePolicy(SQInteger user, SQInteger emoji) noexcept + : mUserPolicy(user), mEmojiPolicy(emoji), mRolePolicy(dpp::cp_aggressive) + { } + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + DpCachePolicy(SQInteger user, SQInteger emoji, SQInteger role) noexcept + : mUserPolicy(user), mEmojiPolicy(emoji), mRolePolicy(role) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor. + */ + DpCachePolicy(const DpCachePolicy &) noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Convert to native cache policy type. + */ + SQMOD_NODISCARD dpp::cache_policy_t ToNative() const noexcept + { + return dpp::cache_policy_t{ + static_cast< dpp::cache_policy_setting_t >(mUserPolicy), + static_cast< dpp::cache_policy_setting_t >(mEmojiPolicy), + static_cast< dpp::cache_policy_setting_t >(mRolePolicy) + }; + } +}; + +/* ------------------------------------------------------------------------------------------------ + * An activity is a representation of what a user is doing. It might be a game, or a website, or a movie. Whatever. +*/ +struct DpActivity +{ + using Ptr = std::unique_ptr< dpp::activity >; + /* -------------------------------------------------------------------------------------------- + * Referenced activity instance. + */ + Ptr mPtr{nullptr}; + /* -------------------------------------------------------------------------------------------- + * Wether the referenced pointer is owned. + */ + bool mOwned{false}; + /* -------------------------------------------------------------------------------------------- + * Default constructor. + */ + DpActivity() noexcept + : DpActivity(new Ptr::element_type(), true) + { } + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpActivity(Ptr::pointer ptr, bool owned = false) noexcept + : mPtr(ptr), mOwned(owned) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor. + */ + explicit DpActivity(const Ptr::element_type & o) noexcept + : DpActivity(new Ptr::element_type(o), true) + { } + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + explicit DpActivity(Ptr::element_type && o) noexcept + : DpActivity(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) + { } + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + DpActivity(SQInteger type, StackStrF & name, StackStrF & state, StackStrF & url) + : DpActivity(new Ptr::element_type(static_cast< dpp::activity_type >(type), name.ToStr(), state.ToStr(), url.ToStr()), true) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor (disabled). + */ + DpActivity(const DpActivity & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + DpActivity(DpActivity && o) noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Destructor. + */ + ~DpActivity() noexcept + { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + } + /* -------------------------------------------------------------------------------------------- + * Copy assignment operator (disabled). + */ + DpActivity & operator = (const DpActivity & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move assignment operator. + */ + DpActivity & operator = (DpActivity && o) noexcept + { + if (this != &o) { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + // Transfer members values + mPtr = std::move(o.mPtr); + mOwned = o.mOwned; + } + return *this; + } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle. + */ + void Validate() const { if (!mPtr) STHROWF("Invalid discord activity handle"); } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle and retrieve a const reference to it. + */ + SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } + /* -------------------------------------------------------------------------------------------- + * Check wether a valid instance is managed. + */ + SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the name of the activity. + */ + SQMOD_NODISCARD const std::string & GetName() const { return Valid().name; } + /* -------------------------------------------------------------------------------------------- + * Modify the name of the activity. + */ + void SetName(StackStrF & name) const { Valid().name = name.ToStr(); } + /* -------------------------------------------------------------------------------------------- + * Modify the name of the activity. + */ + DpActivity & ApplyName(StackStrF & name) { SetName(name); return *this; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the state of the activity. + */ + SQMOD_NODISCARD const std::string & GetState() const { return Valid().state; } + /* -------------------------------------------------------------------------------------------- + * Modify the state of the activity. + */ + void SetState(StackStrF & state) const { Valid().state = state.ToStr(); } + /* -------------------------------------------------------------------------------------------- + * Modify the state of the activity. + */ + DpActivity & ApplyState(StackStrF & state) { SetState(state); return *this; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the url of the activity. + */ + SQMOD_NODISCARD const std::string & GetURL() const { return Valid().url; } + /* -------------------------------------------------------------------------------------------- + * Modify the url of the activity. + */ + void SetURL(StackStrF & url) const { Valid().url = url.ToStr(); } + /* -------------------------------------------------------------------------------------------- + * Modify the url of the activity. + */ + DpActivity & ApplyURL(StackStrF & url) { SetURL(url); return *this; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the type of the activity. + */ + SQMOD_NODISCARD SQInteger GetType() const { return static_cast< SQInteger >(Valid().type); } + /* -------------------------------------------------------------------------------------------- + * Modify the type of the activity. + */ + void SetType(SQInteger s) const { Valid().type = static_cast< dpp::activity_type >(s); } + /* -------------------------------------------------------------------------------------------- + * Modify the type of the activity. + */ + DpActivity & ApplyType(SQInteger s) { SetType(s); return *this; } + /* -------------------------------------------------------------------------------------------- + * Retrieve when the activity was created. + */ + SQMOD_NODISCARD SQInteger GetCreatedAt() const + { + return static_cast< SQInteger >(std::chrono::duration_cast< std::chrono::seconds >(std::chrono::system_clock::from_time_t(Valid().created_at).time_since_epoch()).count()); + } + /* -------------------------------------------------------------------------------------------- + * Modify when the activity was created. + */ + void SetCreatedAt(SQInteger s) const + { + Valid().created_at = std::chrono::system_clock::to_time_t(std::chrono::time_point< std::chrono::system_clock >{std::chrono::seconds{s}}); + } + /* -------------------------------------------------------------------------------------------- + * Modify when the activity was created. + */ + DpActivity & ApplyCreatedAt(SQInteger s) { SetCreatedAt(s); return *this; } + /* -------------------------------------------------------------------------------------------- + * Retrieve when the activity was started. + */ + SQMOD_NODISCARD SQInteger GetStart() const + { + return static_cast< SQInteger >(std::chrono::duration_cast< std::chrono::seconds >(std::chrono::system_clock::from_time_t(Valid().start).time_since_epoch()).count()); + } + /* -------------------------------------------------------------------------------------------- + * Modify when the activity was started. + */ + void SetStart(SQInteger s) const + { + Valid().start = std::chrono::system_clock::to_time_t(std::chrono::time_point< std::chrono::system_clock >{std::chrono::seconds{s}}); + } + /* -------------------------------------------------------------------------------------------- + * Modify when the activity was started. + */ + DpActivity & ApplyStart(SQInteger s) { SetStart(s); return *this; } + /* -------------------------------------------------------------------------------------------- + * Retrieve when the activity was stopped. + */ + SQMOD_NODISCARD SQInteger GetEnd() const + { + return static_cast< SQInteger >(std::chrono::duration_cast< std::chrono::seconds >(std::chrono::system_clock::from_time_t(Valid().end).time_since_epoch()).count()); + } + /* -------------------------------------------------------------------------------------------- + * Modify when the activity was stopped. + */ + void SetEnd(SQInteger s) const + { + Valid().end = std::chrono::system_clock::to_time_t(std::chrono::time_point< std::chrono::system_clock >{std::chrono::seconds{s}}); + } + /* -------------------------------------------------------------------------------------------- + * Modify when the activity was stopped. + */ + DpActivity & ApplyEnd(SQInteger s) { SetEnd(s); return *this; } +}; + +/* ------------------------------------------------------------------------------------------------ + * Represents user presence, e.g. what game they are playing and if they are online. +*/ +struct DpPresence +{ + using Ptr = std::unique_ptr< dpp::presence >; + /* -------------------------------------------------------------------------------------------- + * Referenced presence instance. + */ + Ptr mPtr{nullptr}; + /* -------------------------------------------------------------------------------------------- + * Wether the referenced pointer is owned. + */ + bool mOwned{false}; + /* -------------------------------------------------------------------------------------------- + * Default constructor. + */ + DpPresence() noexcept + : DpPresence(new Ptr::element_type(), true) + { } + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpPresence(Ptr::pointer ptr, bool owned = false) noexcept + : mPtr(ptr), mOwned(owned) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor. + */ + explicit DpPresence(const Ptr::element_type & o) noexcept + : DpPresence(new Ptr::element_type(o), true) + { } + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + explicit DpPresence(Ptr::element_type && o) noexcept + : DpPresence(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor (disabled). + */ + DpPresence(const DpPresence & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + DpPresence(DpPresence && o) noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Destructor. + */ + ~DpPresence() noexcept + { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + } + /* -------------------------------------------------------------------------------------------- + * Copy assignment operator (disabled). + */ + DpPresence & operator = (const DpPresence & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move assignment operator. + */ + DpPresence & operator = (DpPresence && o) noexcept + { + if (this != &o) { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + // Transfer members values + mPtr = std::move(o.mPtr); + mOwned = o.mOwned; + } + return *this; + } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle. + */ + void Validate() const { if (!mPtr) STHROWF("Invalid discord presence handle"); } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle and retrieve a const reference to it. + */ + SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } + /* -------------------------------------------------------------------------------------------- + * Check wether a valid instance is managed. + */ + SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the user that the presence applies to. + */ + SQMOD_NODISCARD dpp::snowflake GetUserID() const { return Valid().user_id; } + /* -------------------------------------------------------------------------------------------- + * Modify the user that the presence applies to. + */ + void SetUserID(dpp::snowflake id) const { Valid().user_id = id; } + /* -------------------------------------------------------------------------------------------- + * Modify the user that the presence applies to. + */ + DpPresence & ApplyUserID(dpp::snowflake id) { SetUserID(id); return *this; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild that the presence applies to. + */ + SQMOD_NODISCARD dpp::snowflake GetGuildID() const { return Valid().guild_id; } + /* -------------------------------------------------------------------------------------------- + * Modify the guild that the presence applies to. + */ + void SetGuildID(dpp::snowflake id) const { Valid().guild_id = id; } + /* -------------------------------------------------------------------------------------------- + * Modify the guild that the presence applies to. + */ + DpPresence & ApplyGuildID(dpp::snowflake id) { SetGuildID(id); return *this; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the presence bit-mask. + */ + SQMOD_NODISCARD SQInteger GetFlags() const { return static_cast< SQInteger >(Valid().flags); } + /* -------------------------------------------------------------------------------------------- + * Modify the presence bit-mask. + */ + void SetFlags(SQInteger f) const { Valid().flags = static_cast< uint8_t >(f); } + /* -------------------------------------------------------------------------------------------- + * Modify the presence bit-mask. + */ + DpPresence & ApplyFlags(SQInteger f) { SetFlags(f); return *this; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the number of activities. + */ + SQMOD_NODISCARD SQInteger ActivityCount() const { return static_cast< SQInteger >(Valid().activities.size()); } + /* -------------------------------------------------------------------------------------------- + * Add a new activity. + */ + DpPresence & AddActivity(const DpActivity & a) { Valid().activities.push_back(a.Valid()); return *this; } + /* -------------------------------------------------------------------------------------------- + * Iterate all activities. + */ + DpPresence & EachActivity(Function & fn) + { + for (const auto & a : Valid().activities) + { + fn.Execute(a); + } + return *this; + } + /* -------------------------------------------------------------------------------------------- + * Retrieve the number of activities. + */ + DpPresence & ClearActivities(const DpActivity & a) { Valid().activities.clear(); return *this; } + /* -------------------------------------------------------------------------------------------- + * Filter activities. + */ + DpPresence & FilterActivities(Function & fn) + { + std::vector< dpp::activity > list; + // Reserve memory in advance + list.reserve(Valid().activities.size()); + // Process each activity individually + for (const auto & a : Valid().activities) + { + auto ret = fn.Eval(a); + // (null || true) == keep & false == skip + if (!ret.IsNull() || !ret.template Cast< bool >()) + { + list.push_back(a); // Keep this activity + } + } + // Use filtered activities + Valid().activities.swap(list); + // Allow chaining + return *this; + } + /* -------------------------------------------------------------------------------------------- + * Build JSON string from this object. + */ + SQMOD_NODISCARD std::string BuildJSON() const { return Valid().build_json(); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the users status on desktop. + */ + SQMOD_NODISCARD SQInteger GetDesktopStatus() const { return static_cast< SQInteger >(Valid().desktop_status()); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the user's status on web. + */ + SQMOD_NODISCARD SQInteger GetWebStatus() const { return static_cast< SQInteger >(Valid().web_status()); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the user's status on mobile. + */ + SQMOD_NODISCARD SQInteger GetMobileStatus() const { return static_cast< SQInteger >(Valid().mobile_status()); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the user's status as shown to other users. + */ + SQMOD_NODISCARD SQInteger GetStatus() const { return static_cast< SQInteger >(Valid().status()); } +}; + +/* ------------------------------------------------------------------------------------------------ + * Represents the voice state of a user on a guild. + * These are stored in the DpGuild object, and accessible there, or via DpChannel::GetVoiceMembers. +*/ +struct DpVoiceState +{ + using Ptr = std::unique_ptr< dpp::voicestate >; + /* -------------------------------------------------------------------------------------------- + * Referenced voice state instance. + */ + Ptr mPtr{nullptr}; + /* -------------------------------------------------------------------------------------------- + * Wether the referenced pointer is owned. + */ + bool mOwned{false}; + /* -------------------------------------------------------------------------------------------- + * Default constructor. + */ + DpVoiceState() noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpVoiceState(Ptr::pointer ptr, bool owned = false) noexcept + : mPtr(ptr), mOwned(owned) + { } + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpVoiceState(const Ptr::element_type & o) noexcept + : DpVoiceState(new Ptr::element_type(o), true) + { } + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + explicit DpVoiceState(Ptr::element_type && o) noexcept + : DpVoiceState(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor (disabled). + */ + DpVoiceState(const DpVoiceState & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + DpVoiceState(DpVoiceState && o) noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Destructor. + */ + ~DpVoiceState() noexcept + { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + } + /* -------------------------------------------------------------------------------------------- + * Copy assignment operator (disabled). + */ + DpVoiceState & operator = (const DpVoiceState & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move assignment operator. + */ + DpVoiceState & operator = (DpVoiceState && o) noexcept + { + if (this != &o) { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + // Transfer members values + mPtr = std::move(o.mPtr); + mOwned = o.mOwned; + } + return *this; + } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle. + */ + void Validate() const { if (!mPtr) STHROWF("Invalid discord voice state handle"); } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle and retrieve a const reference to it. + */ + SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } + /* -------------------------------------------------------------------------------------------- + * Check wether a valid instance is managed. + */ + SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild id this voice state is for (optional). + */ + SQMOD_NODISCARD dpp::snowflake GetGuildID() const { return Valid().guild_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild id this voice state is for (optional). + */ + SQMOD_NODISCARD dpp::snowflake GetChannelID() const { return Valid().channel_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild id this voice state is for (optional). + */ + SQMOD_NODISCARD dpp::snowflake GetUserID() const { return Valid().user_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild id this voice state is for (optional). + */ + SQMOD_NODISCARD const std::string & GetSessionID() const { return Valid().session_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild id this voice state is for (optional). + */ + SQMOD_NODISCARD SQInteger GetFlags() const { return Valid().flags; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild id this voice state is for (optional). + */ + void SetFlags(SQInteger flags) const { Valid().flags = flags; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the guild id this voice state is for (optional). + */ + SQMOD_NODISCARD std::string BuildJSON() const { return Valid().build_json(); } + /* -------------------------------------------------------------------------------------------- + * Check if user is deafened. + */ + SQMOD_NODISCARD bool IsDeaf() const { return Valid().is_deaf(); } + /* -------------------------------------------------------------------------------------------- + * Check if user is muted. + */ + SQMOD_NODISCARD bool IsMute() const { return Valid().is_mute(); } + /* -------------------------------------------------------------------------------------------- + * Check if user muted themselves. + */ + SQMOD_NODISCARD bool IsSelfMute() const { return Valid().is_self_mute(); } + /* -------------------------------------------------------------------------------------------- + * Check if user deafened themselves. + */ + SQMOD_NODISCARD bool IsSelfDeaf() const { return Valid().is_self_deaf(); } + /* -------------------------------------------------------------------------------------------- + * Check if user is streamig. + */ + SQMOD_NODISCARD bool SelfStream() const { return Valid().self_stream(); } + /* -------------------------------------------------------------------------------------------- + * Check if user is in video. + */ + SQMOD_NODISCARD bool SelfVideo() const { return Valid().self_video(); } + /* -------------------------------------------------------------------------------------------- + * Check if user is surpressed. + */ + SQMOD_NODISCARD bool IsSupressed() const { return Valid().is_supressed(); } +}; + +/* ------------------------------------------------------------------------------------------------ + * +*/ + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Role.cpp b/module/Library/DPP/Role.cpp new file mode 100644 index 00000000..bbdce8da --- /dev/null +++ b/module/Library/DPP/Role.cpp @@ -0,0 +1,74 @@ +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/Role.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ +SQMOD_DECL_TYPENAME(SqDppRole, _SC("SqDppRole")) + +// ------------------------------------------------------------------------------------------------ +void Register_DPP_Role(HSQUIRRELVM vm, Table & ns) +{ + ns.Bind(_SC("Role"), + Class< DpRole, NoConstructor< DpRole > >(vm, SqDppRole::Str) + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppRole::Fn) + .Func(_SC("_tojson"), &DpRole::BuildJSON) + // Member Properties + .Prop(_SC("Valid"), &DpRole::IsValid) + .Prop(_SC("JSON"), &DpRole::BuildJSON) + .Prop(_SC("Name"), &DpRole::GetName) + .Prop(_SC("GuildID"), &DpRole::GetGuildID) + .Prop(_SC("Color"), &DpRole::GetColour) + .Prop(_SC("Colour"), &DpRole::GetColour) + .Prop(_SC("Position"), &DpRole::GetPosition) + .Prop(_SC("Permissions"), &DpRole::GetPermissions) + .Prop(_SC("Flags"), &DpRole::GetFlags) + .Prop(_SC("IntegrationID"), &DpRole::GetIntegrationID) + .Prop(_SC("BotID"), &DpRole::GetBotID) + .Prop(_SC("IsHoisted"), &DpRole::IsHoisted) + .Prop(_SC("IsMentionable"), &DpRole::IsMentionable) + .Prop(_SC("IsManaged"), &DpRole::IsManaged) + .Prop(_SC("CanCreateInstantInvite"), &DpRole::CanCreateInstantInvite) + .Prop(_SC("CanKickMembers"), &DpRole::CanKickMembers) + .Prop(_SC("CanBanMembers"), &DpRole::CanBanMembers) + .Prop(_SC("IsAdministrator"), &DpRole::IsAdministrator) + .Prop(_SC("CanManageChannels"), &DpRole::CanManageChannels) + .Prop(_SC("CanManageGuild"), &DpRole::CanManageGuild) + .Prop(_SC("CanAddReactions"), &DpRole::CanAddReactions) + .Prop(_SC("CanViewAuditLog"), &DpRole::CanViewAuditLog) + .Prop(_SC("IsPrioritySpeaker"), &DpRole::IsPrioritySpeaker) + .Prop(_SC("CanStream"), &DpRole::CanStream) + .Prop(_SC("CanViewChannel"), &DpRole::CanViewChannel) + .Prop(_SC("CanSendMessages"), &DpRole::CanSendMessages) + .Prop(_SC("CanSendTtsMessages"), &DpRole::CanSendTtsMessages) + .Prop(_SC("CanManageMessages"), &DpRole::CanManageMessages) + .Prop(_SC("CanEmbedLinks"), &DpRole::CanEmbedLinks) + .Prop(_SC("CanAttachFiles"), &DpRole::CanAttachFiles) + .Prop(_SC("CanReadMessageHistory"), &DpRole::CanReadMessageHistory) + .Prop(_SC("CanMentionEveryone"), &DpRole::CanMentionEveryone) + .Prop(_SC("CanUseExternalEmojis"), &DpRole::CanUseExternalEmojis) + .Prop(_SC("CanViewGuildInsights"), &DpRole::CanViewGuildInsights) + .Prop(_SC("CanConnect"), &DpRole::CanConnect) + .Prop(_SC("CanSpeak"), &DpRole::CanSpeak) + .Prop(_SC("CanMuteMembers"), &DpRole::CanMuteMembers) + .Prop(_SC("CanDeafenMembers"), &DpRole::CanDeafenMembers) + .Prop(_SC("CanMoveMembers"), &DpRole::CanMoveMembers) + .Prop(_SC("CanUseVAT"), &DpRole::CanUseVAT) + .Prop(_SC("CanChangeNickname"), &DpRole::CanChangeNickname) + .Prop(_SC("CanManageNicknames"), &DpRole::CanManageNicknames) + .Prop(_SC("CanManageRoles"), &DpRole::CanManageRoles) + .Prop(_SC("CanManageWebhooks"), &DpRole::CanManageWebhooks) + .Prop(_SC("CanManageEmojis"), &DpRole::CanManageEmojis) + .Prop(_SC("CanUseSlashCommands"), &DpRole::CanUseSlashCommands) + .Prop(_SC("HasRequestToSpeak"), &DpRole::HasRequestToSpeak) + .Prop(_SC("CanManageThreads"), &DpRole::CanManageThreads) + .Prop(_SC("HasUsePublicThreads"), &DpRole::HasUsePublicThreads) + .Prop(_SC("HasUsePrivateThreads"), &DpRole::HasUsePrivateThreads) + // Member Methods + .Func(_SC("BuildJSON"), &DpRole::BuildJSON_) + ); +} + +} // Namespace:: SqMod diff --git a/module/Library/DPP/Role.hpp b/module/Library/DPP/Role.hpp new file mode 100644 index 00000000..30a30fbf --- /dev/null +++ b/module/Library/DPP/Role.hpp @@ -0,0 +1,295 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * Represents a role within a DpGuild. +*/ +struct DpRole +{ + using Ptr = std::unique_ptr< dpp::role >; + /* -------------------------------------------------------------------------------------------- + * Referenced role instance. + */ + Ptr mPtr{nullptr}; + /* -------------------------------------------------------------------------------------------- + * Wether the referenced pointer is owned. + */ + bool mOwned{false}; + /* -------------------------------------------------------------------------------------------- + * Default constructor. + */ + DpRole() noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpRole(Ptr::pointer ptr, bool owned = false) noexcept + : mPtr(ptr), mOwned(owned) + { } + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpRole(const Ptr::element_type & o) noexcept + : DpRole(new Ptr::element_type(o), true) + { } + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + explicit DpRole(Ptr::element_type && o) noexcept + : DpRole(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor (disabled). + */ + DpRole(const DpRole & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + DpRole(DpRole && o) noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Destructor. + */ + ~DpRole() noexcept + { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + } + /* -------------------------------------------------------------------------------------------- + * Copy assignment operator (disabled). + */ + DpRole & operator = (const DpRole & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move assignment operator. + */ + DpRole & operator = (DpRole && o) noexcept + { + if (this != &o) { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + // Transfer members values + mPtr = std::move(o.mPtr); + mOwned = o.mOwned; + } + return *this; + } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle. + */ + void Validate() const { if (!mPtr) STHROWF("Invalid discord role handle"); } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle and retrieve a const reference to it. + */ + SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } + /* -------------------------------------------------------------------------------------------- + * Check wether a valid instance is managed. + */ + SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } + /* -------------------------------------------------------------------------------------------- + * Retrieve role name. + */ + SQMOD_NODISCARD const std::string & GetName() const { return Valid().name; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the role guild id. + */ + SQMOD_NODISCARD dpp::snowflake GetGuildID() const { return Valid().guild_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the role colour. + */ + SQMOD_NODISCARD SQInteger GetColour() const { return static_cast< SQInteger >(Valid().colour); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the role position. + */ + SQMOD_NODISCARD SQInteger GetPosition() const { return static_cast< SQInteger >(Valid().position); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the role permissions bitmask values from SqDiscordRolePermissions. + */ + SQMOD_NODISCARD SQInteger GetPermissions() const { return static_cast< SQInteger >(Valid().permissions); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the role flags from SqDiscordRoleFlags. + */ + SQMOD_NODISCARD SQInteger GetFlags() const { return static_cast< SQInteger >(Valid().flags); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the role integration id if any (e.g. role is a bot's role created when it was invited). + */ + SQMOD_NODISCARD dpp::snowflake GetIntegrationID() const { return Valid().integration_id; } + /* -------------------------------------------------------------------------------------------- + * Retrieve the role bot id if any (e.g. role is a bot's role created when it was invited). + */ + SQMOD_NODISCARD dpp::snowflake GetBotID() const { return Valid().bot_id; } + /* -------------------------------------------------------------------------------------------- + * Build a JSON string from this object. + */ + SQMOD_NODISCARD std::string BuildJSON() const { return Valid().build_json(); } + /* -------------------------------------------------------------------------------------------- + * Build a JSON string from this object. If [with_id] is True then ID is to be included in the JSON. + */ + SQMOD_NODISCARD std::string BuildJSON_(bool with_id) const { return Valid().build_json(with_id); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role is hoisted. + */ + SQMOD_NODISCARD bool IsHoisted() const { return Valid().is_hoisted(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role is mentionable. + */ + SQMOD_NODISCARD bool IsMentionable() const { return Valid().is_mentionable(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role is managed (belongs to a bot or application). + */ + SQMOD_NODISCARD bool IsManaged() const { return Valid().is_managed(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has create instant invite permission. + */ + SQMOD_NODISCARD bool CanCreateInstantInvite() const { return Valid().has_create_instant_invite(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the kick members permission. + */ + SQMOD_NODISCARD bool CanKickMembers() const { return Valid().has_kick_members(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the ban members permission. + */ + SQMOD_NODISCARD bool CanBanMembers() const { return Valid().has_ban_members(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the administrator permission. + */ + SQMOD_NODISCARD bool IsAdministrator() const { return Valid().has_administrator(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the manage channels permission. + */ + SQMOD_NODISCARD bool CanManageChannels() const { return Valid().has_manage_channels(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the manage guild permission. + */ + SQMOD_NODISCARD bool CanManageGuild() const { return Valid().has_manage_guild(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the add reactions permission. + */ + SQMOD_NODISCARD bool CanAddReactions() const { return Valid().has_add_reactions(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the view audit log permission. + */ + SQMOD_NODISCARD bool CanViewAuditLog() const { return Valid().has_view_audit_log(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the priority speaker permission. + */ + SQMOD_NODISCARD bool IsPrioritySpeaker() const { return Valid().has_priority_speaker(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the stream permission. + */ + SQMOD_NODISCARD bool CanStream() const { return Valid().has_stream(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the view channel permission. + */ + SQMOD_NODISCARD bool CanViewChannel() const { return Valid().has_view_channel(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the send messages permission. + */ + SQMOD_NODISCARD bool CanSendMessages() const { return Valid().has_send_messages(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the send TTS messages permission. + */ + SQMOD_NODISCARD bool CanSendTtsMessages() const { return Valid().has_send_tts_messages(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the manage messages permission. + */ + SQMOD_NODISCARD bool CanManageMessages() const { return Valid().has_manage_messages(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the embed links permission. + */ + SQMOD_NODISCARD bool CanEmbedLinks() const { return Valid().has_embed_links(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the attach files permission. + */ + SQMOD_NODISCARD bool CanAttachFiles() const { return Valid().has_attach_files(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the read message history permission. + */ + SQMOD_NODISCARD bool CanReadMessageHistory() const { return Valid().has_read_message_history(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the mention \@everyone and \@here permission. + */ + SQMOD_NODISCARD bool CanMentionEveryone() const { return Valid().has_mention_everyone(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the use external emojis permission. + */ + SQMOD_NODISCARD bool CanUseExternalEmojis() const { return Valid().has_use_external_emojis(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the view guild insights permission. + */ + SQMOD_NODISCARD bool CanViewGuildInsights() const { return Valid().has_view_guild_insights(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the connect voice permission. + */ + SQMOD_NODISCARD bool CanConnect() const { return Valid().has_connect(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the speak permission. + */ + SQMOD_NODISCARD bool CanSpeak() const { return Valid().has_speak(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the mute members permission. + */ + SQMOD_NODISCARD bool CanMuteMembers() const { return Valid().has_mute_members(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the deafen members permission. + */ + SQMOD_NODISCARD bool CanDeafenMembers() const { return Valid().has_deafen_members(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the move members permission. + */ + SQMOD_NODISCARD bool CanMoveMembers() const { return Valid().has_move_members(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has use voice activity detection permission. + */ + SQMOD_NODISCARD bool CanUseVAT() const { return Valid().has_use_vad(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the change nickname permission. + */ + SQMOD_NODISCARD bool CanChangeNickname() const { return Valid().has_change_nickname(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the manage nicknames permission. + */ + SQMOD_NODISCARD bool CanManageNicknames() const { return Valid().has_manage_nicknames(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the manage roles permission. + */ + SQMOD_NODISCARD bool CanManageRoles() const { return Valid().has_manage_roles(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the manage webhooks permission. + */ + SQMOD_NODISCARD bool CanManageWebhooks() const { return Valid().has_manage_webhooks(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the manage emojis permission. + */ + SQMOD_NODISCARD bool CanManageEmojis() const { return Valid().has_manage_emojis(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the use slash commands permission. + */ + SQMOD_NODISCARD bool CanUseSlashCommands() const { return Valid().has_use_slash_commands(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the request to speak permission. + */ + SQMOD_NODISCARD bool HasRequestToSpeak() const { return Valid().has_request_to_speak(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the manage threads permission. + */ + SQMOD_NODISCARD bool CanManageThreads() const { return Valid().has_manage_threads(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the use public threads permission. + */ + SQMOD_NODISCARD bool HasUsePublicThreads() const { return Valid().has_use_public_threads(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the role has the use private threads permission. + */ + SQMOD_NODISCARD bool HasUsePrivateThreads() const { return Valid().has_use_private_threads(); } +}; + +} // Namespace:: SqMod diff --git a/module/Library/DPP/User.cpp b/module/Library/DPP/User.cpp new file mode 100644 index 00000000..3a2414cd --- /dev/null +++ b/module/Library/DPP/User.cpp @@ -0,0 +1,48 @@ +// ------------------------------------------------------------------------------------------------ +#include "Library/DPP/User.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ +SQMOD_DECL_TYPENAME(SqDppUser, _SC("SqDppUser")) + +// ------------------------------------------------------------------------------------------------ +void Register_DPP_User(HSQUIRRELVM vm, Table & ns) +{ + ns.Bind(_SC("User"), + Class< DpUser, NoConstructor< DpUser > >(vm, SqDppUser::Str) + // Meta-methods + .SquirrelFunc(_SC("_typename"), &SqDppUser::Fn) + // Member Properties + .Prop(_SC("Valid"), &DpUser::IsValid) + .Prop(_SC("Username"), &DpUser::GetUsername) + .Prop(_SC("Discriminator"), &DpUser::GetDiscriminator) + .Prop(_SC("Avatar"), &DpUser::GetAvatar) + .Prop(_SC("Flags"), &DpUser::GetFlags) + .Prop(_SC("RefCount"), &DpUser::GetRefCount) + .Prop(_SC("AvatarURL"), &DpUser::GetAvatarURL) + .Prop(_SC("IsBot"), &DpUser::IsBot) + .Prop(_SC("IsSystem"), &DpUser::IsSystem) + .Prop(_SC("IsMfaEnabled"), &DpUser::IsMfaEnabled) + .Prop(_SC("IsVerified"), &DpUser::IsVerified) + .Prop(_SC("HasNitroFull"), &DpUser::HasNitroFull) + .Prop(_SC("HasNitroClassic"), &DpUser::HasNitroClassic) + .Prop(_SC("IsDiscordEmployee"), &DpUser::IsDiscordEmployee) + .Prop(_SC("IsPartneredOwner"), &DpUser::IsPartneredOwner) + .Prop(_SC("HasHypesquadEvents"), &DpUser::HasHypesquadEvents) + .Prop(_SC("IsBughunter1"), &DpUser::IsBughunter1) + .Prop(_SC("IsHouseBravery"), &DpUser::IsHouseBravery) + .Prop(_SC("IsHouseBrilliance"), &DpUser::IsHouseBrilliance) + .Prop(_SC("IsHouseBalanace"), &DpUser::IsHouseBalanace) + .Prop(_SC("IsEarlySupporter"), &DpUser::IsEarlySupporter) + .Prop(_SC("IsTeamUser"), &DpUser::IsTeamUser) + .Prop(_SC("IsBughunter2"), &DpUser::IsBughunter2) + .Prop(_SC("IsVerifiedBot"), &DpUser::IsVerifiedBot) + .Prop(_SC("IsVerifiedBotDev"), &DpUser::IsVerifiedBotDev) + .Prop(_SC("IsCertifiedDoderator"), &DpUser::IsCertifiedDoderator) + .Prop(_SC("HasAnimatedIcon"), &DpUser::HasAnimatedIcon) + ); +} + +} // Namespace:: SqMod diff --git a/module/Library/DPP/User.hpp b/module/Library/DPP/User.hpp new file mode 100644 index 00000000..c60a6fd2 --- /dev/null +++ b/module/Library/DPP/User.hpp @@ -0,0 +1,200 @@ +#pragma once + +// ------------------------------------------------------------------------------------------------ +#include "Core/Utility.hpp" + +// ------------------------------------------------------------------------------------------------ +#include + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +/* ------------------------------------------------------------------------------------------------ + * Represents a user on discord. May or may not be a member of a DpGuild. +*/ +struct DpUser +{ + using Ptr = std::unique_ptr< dpp::user >; + /* -------------------------------------------------------------------------------------------- + * Referenced user instance. + */ + Ptr mPtr{nullptr}; + /* -------------------------------------------------------------------------------------------- + * Wether the referenced pointer is owned. + */ + bool mOwned{false}; + /* -------------------------------------------------------------------------------------------- + * Default constructor. + */ + DpUser() noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Explicit constructor. + */ + explicit DpUser(Ptr::pointer ptr, bool owned = false) noexcept + : mPtr(ptr), mOwned(owned) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor. + */ + explicit DpUser(const Ptr::element_type & o) noexcept + : DpUser(new Ptr::element_type(o), true) + { } + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + explicit DpUser(Ptr::element_type && o) noexcept + : DpUser(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) + { } + /* -------------------------------------------------------------------------------------------- + * Copy constructor (disabled). + */ + DpUser(const DpUser & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move constructor. + */ + DpUser(DpUser && o) noexcept = default; + /* -------------------------------------------------------------------------------------------- + * Destructor. + */ + ~DpUser() noexcept + { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + } + /* -------------------------------------------------------------------------------------------- + * Copy assignment operator (disabled). + */ + DpUser & operator = (const DpUser & o) = delete; + /* -------------------------------------------------------------------------------------------- + * Move assignment operator. + */ + DpUser & operator = (DpUser && o) noexcept + { + if (this != &o) { + // Do we own this to try delete it? + if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); + // Transfer members values + mPtr = std::move(o.mPtr); + mOwned = o.mOwned; + } + return *this; + } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle. + */ + void Validate() const { if (!mPtr) STHROWF("Invalid discord user handle"); } + /* -------------------------------------------------------------------------------------------- + * Validate the managed handle and retrieve a const reference to it. + */ + SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } + /* -------------------------------------------------------------------------------------------- + * Check wether a valid instance is managed. + */ + SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } + /* -------------------------------------------------------------------------------------------- + * Retrieve user discord username. + */ + SQMOD_NODISCARD const std::string & GetUsername() const { return Valid().username; } + /* -------------------------------------------------------------------------------------------- + * Retrieve user discriminator (aka tag), 4 digits usually displayed with leading zeroes. + */ + SQMOD_NODISCARD SQInteger GetDiscriminator() const { return static_cast< SQInteger >(Valid().discriminator); } + /* -------------------------------------------------------------------------------------------- + * Retrieve user avatar hash. + */ + SQMOD_NODISCARD const dpp::utility::iconhash & GetAvatar() const { return Valid().avatar; } + /* -------------------------------------------------------------------------------------------- + * Retrieve user flags built from a bitmask of values in dpp::user_flags. + */ + SQMOD_NODISCARD SQInteger GetFlags() const { return static_cast< SQInteger >(Valid().flags); } + /* -------------------------------------------------------------------------------------------- + * Retrieve user feference count of how many guilds this user is in. + */ + SQMOD_NODISCARD SQInteger GetRefCount() const { return static_cast< SQInteger >(Valid().refcount); } + /* -------------------------------------------------------------------------------------------- + * Retrieve the avatar url of the user object. + */ + SQMOD_NODISCARD std::string GetAvatarURL() const { return Valid().get_avatar_url(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is a bot. + */ + SQMOD_NODISCARD bool IsBot() const { return Valid().is_bot(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is a system user (Clyde). + */ + SQMOD_NODISCARD bool IsSystem() const { return Valid().is_system(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user has multi-factor authentication enabled. + */ + SQMOD_NODISCARD bool IsMfaEnabled() const { return Valid().is_mfa_enabled(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user has verified account. + */ + SQMOD_NODISCARD bool IsVerified() const { return Valid().is_verified(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user has full nitro. + */ + SQMOD_NODISCARD bool HasNitroFull() const { return Valid().has_nitro_full(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user has nitro classic. + */ + SQMOD_NODISCARD bool HasNitroClassic() const { return Valid().has_nitro_classic(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is a discord employee. + */ + SQMOD_NODISCARD bool IsDiscordEmployee() const { return Valid().is_discord_employee(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user owns a partnered server. + */ + SQMOD_NODISCARD bool IsPartneredOwner() const { return Valid().is_partnered_owner(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user has hype-squad events. + */ + SQMOD_NODISCARD bool HasHypesquadEvents() const { return Valid().has_hypesquad_events(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user has the bug-hunter level 1 badge. + */ + SQMOD_NODISCARD bool IsBughunter1() const { return Valid().is_bughunter_1(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is in house bravery. + */ + SQMOD_NODISCARD bool IsHouseBravery() const { return Valid().is_house_bravery(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is in house brilliance. + */ + SQMOD_NODISCARD bool IsHouseBrilliance() const { return Valid().is_house_brilliance(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is in house balance. + */ + SQMOD_NODISCARD bool IsHouseBalanace() const { return Valid().is_house_balanace(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is an early supporter. + */ + SQMOD_NODISCARD bool IsEarlySupporter() const { return Valid().is_early_supporter(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is a team user. + */ + SQMOD_NODISCARD bool IsTeamUser() const { return Valid().is_team_user(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user has the bug-hunter level 2 badge. + */ + SQMOD_NODISCARD bool IsBughunter2() const { return Valid().is_bughunter_2(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user has the verified bot badge. + */ + SQMOD_NODISCARD bool IsVerifiedBot() const { return Valid().is_verified_bot(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is an early verified bot developer. + */ + SQMOD_NODISCARD bool IsVerifiedBotDev() const { return Valid().is_verified_bot_dev(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user is a certified moderator. + */ + SQMOD_NODISCARD bool IsCertifiedDoderator() const { return Valid().is_certified_moderator(); } + /* -------------------------------------------------------------------------------------------- + * Check wether the user has an animated icon. + */ + SQMOD_NODISCARD bool HasAnimatedIcon() const { return Valid().has_animated_icon(); } +}; + +} // Namespace:: SqMod diff --git a/module/Library/DPPTy.hpp b/module/Library/DPPTy.hpp deleted file mode 100644 index d431a13c..00000000 --- a/module/Library/DPPTy.hpp +++ /dev/null @@ -1,1540 +0,0 @@ -#pragma once - -// ------------------------------------------------------------------------------------------------ -#include "Core/Utility.hpp" - -// ------------------------------------------------------------------------------------------------ -#include - -// ------------------------------------------------------------------------------------------------ -#include - -// ------------------------------------------------------------------------------------------------ -namespace SqMod { - -/* ------------------------------------------------------------------------------------------------ - * Represents the caching policy of the cluster. -*/ -struct DpCachePolicy -{ - SQInteger mUserPolicy{dpp::cp_aggressive}; - SQInteger mEmojiPolicy{dpp::cp_aggressive}; - SQInteger mRolePolicy{dpp::cp_aggressive}; - /* -------------------------------------------------------------------------------------------- - * Default constructor. - */ - DpCachePolicy() noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpCachePolicy(SQInteger user) noexcept - : mUserPolicy(user), mEmojiPolicy(dpp::cp_aggressive), mRolePolicy(dpp::cp_aggressive) - { } - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - DpCachePolicy(SQInteger user, SQInteger emoji) noexcept - : mUserPolicy(user), mEmojiPolicy(emoji), mRolePolicy(dpp::cp_aggressive) - { } - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - DpCachePolicy(SQInteger user, SQInteger emoji, SQInteger role) noexcept - : mUserPolicy(user), mEmojiPolicy(emoji), mRolePolicy(role) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor. - */ - DpCachePolicy(const DpCachePolicy &) noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Convert to native cache policy type. - */ - SQMOD_NODISCARD dpp::cache_policy_t ToNative() const noexcept - { - return dpp::cache_policy_t{ - static_cast< dpp::cache_policy_setting_t >(mUserPolicy), - static_cast< dpp::cache_policy_setting_t >(mEmojiPolicy), - static_cast< dpp::cache_policy_setting_t >(mRolePolicy) - }; - } -}; - -/* ------------------------------------------------------------------------------------------------ - * An activity is a representation of what a user is doing. It might be a game, or a website, or a movie. Whatever. -*/ -struct DpActivity -{ - using Ptr = std::unique_ptr< dpp::activity >; - /* -------------------------------------------------------------------------------------------- - * Referenced activity instance. - */ - Ptr mPtr{nullptr}; - /* -------------------------------------------------------------------------------------------- - * Wether the referenced pointer is owned. - */ - bool mOwned{false}; - /* -------------------------------------------------------------------------------------------- - * Default constructor. - */ - DpActivity() noexcept - : DpActivity(new Ptr::element_type(), true) - { } - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpActivity(Ptr::pointer ptr, bool owned = false) noexcept - : mPtr(ptr), mOwned(owned) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor. - */ - explicit DpActivity(const Ptr::element_type & o) noexcept - : DpActivity(new Ptr::element_type(o), true) - { } - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - explicit DpActivity(Ptr::element_type && o) noexcept - : DpActivity(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) - { } - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - DpActivity(SQInteger type, StackStrF & name, StackStrF & state, StackStrF & url) - : DpActivity(new Ptr::element_type(static_cast< dpp::activity_type >(type), name.ToStr(), state.ToStr(), url.ToStr()), true) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor (disabled). - */ - DpActivity(const DpActivity & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - DpActivity(DpActivity && o) noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~DpActivity() noexcept - { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - } - /* -------------------------------------------------------------------------------------------- - * Copy assignment operator (disabled). - */ - DpActivity & operator = (const DpActivity & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move assignment operator. - */ - DpActivity & operator = (DpActivity && o) noexcept - { - if (this != &o) { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - // Transfer members values - mPtr = std::move(o.mPtr); - mOwned = o.mOwned; - } - return *this; - } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle. - */ - void Validate() const { if (!mPtr) STHROWF("Invalid discord activity handle"); } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle and retrieve a const reference to it. - */ - SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } - /* -------------------------------------------------------------------------------------------- - * Check wether a valid instance is managed. - */ - SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the name of the activity. - */ - SQMOD_NODISCARD const std::string & GetName() const { return Valid().name; } - /* -------------------------------------------------------------------------------------------- - * Modify the name of the activity. - */ - void SetName(StackStrF & name) const { Valid().name = name.ToStr(); } - /* -------------------------------------------------------------------------------------------- - * Modify the name of the activity. - */ - DpActivity & ApplyName(StackStrF & name) { SetName(name); return *this; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the state of the activity. - */ - SQMOD_NODISCARD const std::string & GetState() const { return Valid().state; } - /* -------------------------------------------------------------------------------------------- - * Modify the state of the activity. - */ - void SetState(StackStrF & state) const { Valid().state = state.ToStr(); } - /* -------------------------------------------------------------------------------------------- - * Modify the state of the activity. - */ - DpActivity & ApplyState(StackStrF & state) { SetState(state); return *this; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the url of the activity. - */ - SQMOD_NODISCARD const std::string & GetURL() const { return Valid().url; } - /* -------------------------------------------------------------------------------------------- - * Modify the url of the activity. - */ - void SetURL(StackStrF & url) const { Valid().url = url.ToStr(); } - /* -------------------------------------------------------------------------------------------- - * Modify the url of the activity. - */ - DpActivity & ApplyURL(StackStrF & url) { SetURL(url); return *this; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the type of the activity. - */ - SQMOD_NODISCARD SQInteger GetType() const { return static_cast< SQInteger >(Valid().type); } - /* -------------------------------------------------------------------------------------------- - * Modify the type of the activity. - */ - void SetType(SQInteger s) const { Valid().type = static_cast< dpp::activity_type >(s); } - /* -------------------------------------------------------------------------------------------- - * Modify the type of the activity. - */ - DpActivity & ApplyType(SQInteger s) { SetType(s); return *this; } - /* -------------------------------------------------------------------------------------------- - * Retrieve when the activity was created. - */ - SQMOD_NODISCARD SQInteger GetCreatedAt() const - { - return static_cast< SQInteger >(std::chrono::duration_cast< std::chrono::seconds >(std::chrono::system_clock::from_time_t(Valid().created_at).time_since_epoch()).count()); - } - /* -------------------------------------------------------------------------------------------- - * Modify when the activity was created. - */ - void SetCreatedAt(SQInteger s) const - { - Valid().created_at = std::chrono::system_clock::to_time_t(std::chrono::time_point< std::chrono::system_clock >{std::chrono::seconds{s}}); - } - /* -------------------------------------------------------------------------------------------- - * Modify when the activity was created. - */ - DpActivity & ApplyCreatedAt(SQInteger s) { SetCreatedAt(s); return *this; } - /* -------------------------------------------------------------------------------------------- - * Retrieve when the activity was started. - */ - SQMOD_NODISCARD SQInteger GetStart() const - { - return static_cast< SQInteger >(std::chrono::duration_cast< std::chrono::seconds >(std::chrono::system_clock::from_time_t(Valid().start).time_since_epoch()).count()); - } - /* -------------------------------------------------------------------------------------------- - * Modify when the activity was started. - */ - void SetStart(SQInteger s) const - { - Valid().start = std::chrono::system_clock::to_time_t(std::chrono::time_point< std::chrono::system_clock >{std::chrono::seconds{s}}); - } - /* -------------------------------------------------------------------------------------------- - * Modify when the activity was started. - */ - DpActivity & ApplyStart(SQInteger s) { SetStart(s); return *this; } - /* -------------------------------------------------------------------------------------------- - * Retrieve when the activity was stopped. - */ - SQMOD_NODISCARD SQInteger GetEnd() const - { - return static_cast< SQInteger >(std::chrono::duration_cast< std::chrono::seconds >(std::chrono::system_clock::from_time_t(Valid().end).time_since_epoch()).count()); - } - /* -------------------------------------------------------------------------------------------- - * Modify when the activity was stopped. - */ - void SetEnd(SQInteger s) const - { - Valid().end = std::chrono::system_clock::to_time_t(std::chrono::time_point< std::chrono::system_clock >{std::chrono::seconds{s}}); - } - /* -------------------------------------------------------------------------------------------- - * Modify when the activity was stopped. - */ - DpActivity & ApplyEnd(SQInteger s) { SetEnd(s); return *this; } -}; - -/* ------------------------------------------------------------------------------------------------ - * Represents user presence, e.g. what game they are playing and if they are online. -*/ -struct DpPresence -{ - using Ptr = std::unique_ptr< dpp::presence >; - /* -------------------------------------------------------------------------------------------- - * Referenced presence instance. - */ - Ptr mPtr{nullptr}; - /* -------------------------------------------------------------------------------------------- - * Wether the referenced pointer is owned. - */ - bool mOwned{false}; - /* -------------------------------------------------------------------------------------------- - * Default constructor. - */ - DpPresence() noexcept - : DpPresence(new Ptr::element_type(), true) - { } - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpPresence(Ptr::pointer ptr, bool owned = false) noexcept - : mPtr(ptr), mOwned(owned) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor. - */ - explicit DpPresence(const Ptr::element_type & o) noexcept - : DpPresence(new Ptr::element_type(o), true) - { } - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - explicit DpPresence(Ptr::element_type && o) noexcept - : DpPresence(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor (disabled). - */ - DpPresence(const DpPresence & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - DpPresence(DpPresence && o) noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~DpPresence() noexcept - { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - } - /* -------------------------------------------------------------------------------------------- - * Copy assignment operator (disabled). - */ - DpPresence & operator = (const DpPresence & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move assignment operator. - */ - DpPresence & operator = (DpPresence && o) noexcept - { - if (this != &o) { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - // Transfer members values - mPtr = std::move(o.mPtr); - mOwned = o.mOwned; - } - return *this; - } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle. - */ - void Validate() const { if (!mPtr) STHROWF("Invalid discord presence handle"); } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle and retrieve a const reference to it. - */ - SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } - /* -------------------------------------------------------------------------------------------- - * Check wether a valid instance is managed. - */ - SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the user that the presence applies to. - */ - SQMOD_NODISCARD dpp::snowflake GetUserID() const { return Valid().user_id; } - /* -------------------------------------------------------------------------------------------- - * Modify the user that the presence applies to. - */ - void SetUserID(dpp::snowflake id) const { Valid().user_id = id; } - /* -------------------------------------------------------------------------------------------- - * Modify the user that the presence applies to. - */ - DpPresence & ApplyUserID(dpp::snowflake id) { SetUserID(id); return *this; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild that the presence applies to. - */ - SQMOD_NODISCARD dpp::snowflake GetGuildID() const { return Valid().guild_id; } - /* -------------------------------------------------------------------------------------------- - * Modify the guild that the presence applies to. - */ - void SetGuildID(dpp::snowflake id) const { Valid().guild_id = id; } - /* -------------------------------------------------------------------------------------------- - * Modify the guild that the presence applies to. - */ - DpPresence & ApplyGuildID(dpp::snowflake id) { SetGuildID(id); return *this; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the presence bit-mask. - */ - SQMOD_NODISCARD SQInteger GetFlags() const { return static_cast< SQInteger >(Valid().flags); } - /* -------------------------------------------------------------------------------------------- - * Modify the presence bit-mask. - */ - void SetFlags(SQInteger f) const { Valid().flags = static_cast< uint8_t >(f); } - /* -------------------------------------------------------------------------------------------- - * Modify the presence bit-mask. - */ - DpPresence & ApplyFlags(SQInteger f) { SetFlags(f); return *this; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the number of activities. - */ - SQMOD_NODISCARD SQInteger ActivityCount() const { return static_cast< SQInteger >(Valid().activities.size()); } - /* -------------------------------------------------------------------------------------------- - * Add a new activity. - */ - DpPresence & AddActivity(const DpActivity & a) { Valid().activities.push_back(a.Valid()); return *this; } - /* -------------------------------------------------------------------------------------------- - * Iterate all activities. - */ - DpPresence & EachActivity(Function & fn) - { - for (const auto & a : Valid().activities) - { - fn.Execute(a); - } - return *this; - } - /* -------------------------------------------------------------------------------------------- - * Retrieve the number of activities. - */ - DpPresence & ClearActivities(const DpActivity & a) { Valid().activities.clear(); return *this; } - /* -------------------------------------------------------------------------------------------- - * Filter activities. - */ - DpPresence & FilterActivities(Function & fn) - { - std::vector< dpp::activity > list; - // Reserve memory in advance - list.reserve(Valid().activities.size()); - // Process each activity individually - for (const auto & a : Valid().activities) - { - auto ret = fn.Eval(a); - // (null || true) == keep & false == skip - if (!ret.IsNull() || !ret.template Cast< bool >()) - { - list.push_back(a); // Keep this activity - } - } - // Use filtered activities - Valid().activities.swap(list); - // Allow chaining - return *this; - } - /* -------------------------------------------------------------------------------------------- - * Build JSON string from this object. - */ - SQMOD_NODISCARD std::string BuildJSON() const { return Valid().build_json(); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the users status on desktop. - */ - SQMOD_NODISCARD SQInteger GetDesktopStatus() const { return static_cast< SQInteger >(Valid().desktop_status()); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the user's status on web. - */ - SQMOD_NODISCARD SQInteger GetWebStatus() const { return static_cast< SQInteger >(Valid().web_status()); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the user's status on mobile. - */ - SQMOD_NODISCARD SQInteger GetMobileStatus() const { return static_cast< SQInteger >(Valid().mobile_status()); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the user's status as shown to other users. - */ - SQMOD_NODISCARD SQInteger GetStatus() const { return static_cast< SQInteger >(Valid().status()); } -}; - -/* ------------------------------------------------------------------------------------------------ - * Represents the voice state of a user on a guild. - * These are stored in the DpGuild object, and accessible there, or via DpChannel::GetVoiceMembers. -*/ -struct DpVoiceState -{ - using Ptr = std::unique_ptr< dpp::voicestate >; - /* -------------------------------------------------------------------------------------------- - * Referenced voice state instance. - */ - Ptr mPtr{nullptr}; - /* -------------------------------------------------------------------------------------------- - * Wether the referenced pointer is owned. - */ - bool mOwned{false}; - /* -------------------------------------------------------------------------------------------- - * Default constructor. - */ - DpVoiceState() noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpVoiceState(Ptr::pointer ptr, bool owned = false) noexcept - : mPtr(ptr), mOwned(owned) - { } - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpVoiceState(const Ptr::element_type & o) noexcept - : DpVoiceState(new Ptr::element_type(o), true) - { } - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - explicit DpVoiceState(Ptr::element_type && o) noexcept - : DpVoiceState(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor (disabled). - */ - DpVoiceState(const DpVoiceState & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - DpVoiceState(DpVoiceState && o) noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~DpVoiceState() noexcept - { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - } - /* -------------------------------------------------------------------------------------------- - * Copy assignment operator (disabled). - */ - DpVoiceState & operator = (const DpVoiceState & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move assignment operator. - */ - DpVoiceState & operator = (DpVoiceState && o) noexcept - { - if (this != &o) { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - // Transfer members values - mPtr = std::move(o.mPtr); - mOwned = o.mOwned; - } - return *this; - } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle. - */ - void Validate() const { if (!mPtr) STHROWF("Invalid discord voice state handle"); } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle and retrieve a const reference to it. - */ - SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } - /* -------------------------------------------------------------------------------------------- - * Check wether a valid instance is managed. - */ - SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild id this voice state is for (optional). - */ - SQMOD_NODISCARD dpp::snowflake GetGuildID() const { return Valid().guild_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild id this voice state is for (optional). - */ - SQMOD_NODISCARD dpp::snowflake GetChannelID() const { return Valid().channel_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild id this voice state is for (optional). - */ - SQMOD_NODISCARD dpp::snowflake GetUserID() const { return Valid().user_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild id this voice state is for (optional). - */ - SQMOD_NODISCARD const std::string & GetSessionID() const { return Valid().session_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild id this voice state is for (optional). - */ - SQMOD_NODISCARD SQInteger GetFlags() const { return Valid().flags; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild id this voice state is for (optional). - */ - void SetFlags(SQInteger flags) const { Valid().flags = flags; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild id this voice state is for (optional). - */ - SQMOD_NODISCARD std::string BuildJSON() const { return Valid().build_json(); } - /* -------------------------------------------------------------------------------------------- - * Check if user is deafened. - */ - SQMOD_NODISCARD bool IsDeaf() const { return Valid().is_deaf(); } - /* -------------------------------------------------------------------------------------------- - * Check if user is muted. - */ - SQMOD_NODISCARD bool IsMute() const { return Valid().is_mute(); } - /* -------------------------------------------------------------------------------------------- - * Check if user muted themselves. - */ - SQMOD_NODISCARD bool IsSelfMute() const { return Valid().is_self_mute(); } - /* -------------------------------------------------------------------------------------------- - * Check if user deafened themselves. - */ - SQMOD_NODISCARD bool IsSelfDeaf() const { return Valid().is_self_deaf(); } - /* -------------------------------------------------------------------------------------------- - * Check if user is streamig. - */ - SQMOD_NODISCARD bool SelfStream() const { return Valid().self_stream(); } - /* -------------------------------------------------------------------------------------------- - * Check if user is in video. - */ - SQMOD_NODISCARD bool SelfVideo() const { return Valid().self_video(); } - /* -------------------------------------------------------------------------------------------- - * Check if user is surpressed. - */ - SQMOD_NODISCARD bool IsSupressed() const { return Valid().is_supressed(); } -}; - -/* ------------------------------------------------------------------------------------------------ - * Represents a role within a DpGuild. -*/ -struct DpRole -{ - using Ptr = std::unique_ptr< dpp::role >; - /* -------------------------------------------------------------------------------------------- - * Referenced role instance. - */ - Ptr mPtr{nullptr}; - /* -------------------------------------------------------------------------------------------- - * Wether the referenced pointer is owned. - */ - bool mOwned{false}; - /* -------------------------------------------------------------------------------------------- - * Default constructor. - */ - DpRole() noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpRole(Ptr::pointer ptr, bool owned = false) noexcept - : mPtr(ptr), mOwned(owned) - { } - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpRole(const Ptr::element_type & o) noexcept - : DpRole(new Ptr::element_type(o), true) - { } - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - explicit DpRole(Ptr::element_type && o) noexcept - : DpRole(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor (disabled). - */ - DpRole(const DpRole & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - DpRole(DpRole && o) noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~DpRole() noexcept - { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - } - /* -------------------------------------------------------------------------------------------- - * Copy assignment operator (disabled). - */ - DpRole & operator = (const DpRole & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move assignment operator. - */ - DpRole & operator = (DpRole && o) noexcept - { - if (this != &o) { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - // Transfer members values - mPtr = std::move(o.mPtr); - mOwned = o.mOwned; - } - return *this; - } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle. - */ - void Validate() const { if (!mPtr) STHROWF("Invalid discord role handle"); } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle and retrieve a const reference to it. - */ - SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } - /* -------------------------------------------------------------------------------------------- - * Check wether a valid instance is managed. - */ - SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } - /* -------------------------------------------------------------------------------------------- - * Retrieve role name. - */ - SQMOD_NODISCARD const std::string & GetName() const { return Valid().name; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the role guild id. - */ - SQMOD_NODISCARD dpp::snowflake GetGuildID() const { return Valid().guild_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the role colour. - */ - SQMOD_NODISCARD SQInteger GetColour() const { return static_cast< SQInteger >(Valid().colour); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the role position. - */ - SQMOD_NODISCARD SQInteger GetPosition() const { return static_cast< SQInteger >(Valid().position); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the role permissions bitmask values from SqDiscordRolePermissions. - */ - SQMOD_NODISCARD SQInteger GetPermissions() const { return static_cast< SQInteger >(Valid().permissions); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the role flags from SqDiscordRoleFlags. - */ - SQMOD_NODISCARD SQInteger GetFlags() const { return static_cast< SQInteger >(Valid().flags); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the role integration id if any (e.g. role is a bot's role created when it was invited). - */ - SQMOD_NODISCARD dpp::snowflake GetIntegrationID() const { return Valid().integration_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the role bot id if any (e.g. role is a bot's role created when it was invited). - */ - SQMOD_NODISCARD dpp::snowflake GetBotID() const { return Valid().bot_id; } - /* -------------------------------------------------------------------------------------------- - * Build a JSON string from this object. - */ - SQMOD_NODISCARD std::string BuildJSON() const { return Valid().build_json(); } - /* -------------------------------------------------------------------------------------------- - * Build a JSON string from this object. If [with_id] is True then ID is to be included in the JSON. - */ - SQMOD_NODISCARD std::string BuildJSON_(bool with_id) const { return Valid().build_json(with_id); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role is hoisted. - */ - SQMOD_NODISCARD bool IsHoisted() const { return Valid().is_hoisted(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role is mentionable. - */ - SQMOD_NODISCARD bool IsMentionable() const { return Valid().is_mentionable(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role is managed (belongs to a bot or application). - */ - SQMOD_NODISCARD bool IsManaged() const { return Valid().is_managed(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has create instant invite permission. - */ - SQMOD_NODISCARD bool CanCreateInstantInvite() const { return Valid().has_create_instant_invite(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the kick members permission. - */ - SQMOD_NODISCARD bool CanKickMembers() const { return Valid().has_kick_members(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the ban members permission. - */ - SQMOD_NODISCARD bool CanBanMembers() const { return Valid().has_ban_members(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the administrator permission. - */ - SQMOD_NODISCARD bool IsAdministrator() const { return Valid().has_administrator(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the manage channels permission. - */ - SQMOD_NODISCARD bool CanManageChannels() const { return Valid().has_manage_channels(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the manage guild permission. - */ - SQMOD_NODISCARD bool CanManageGuild() const { return Valid().has_manage_guild(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the add reactions permission. - */ - SQMOD_NODISCARD bool CanAddReactions() const { return Valid().has_add_reactions(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the view audit log permission. - */ - SQMOD_NODISCARD bool CanViewAuditLog() const { return Valid().has_view_audit_log(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the priority speaker permission. - */ - SQMOD_NODISCARD bool IsPrioritySpeaker() const { return Valid().has_priority_speaker(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the stream permission. - */ - SQMOD_NODISCARD bool CanStream() const { return Valid().has_stream(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the view channel permission. - */ - SQMOD_NODISCARD bool CanViewChannel() const { return Valid().has_view_channel(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the send messages permission. - */ - SQMOD_NODISCARD bool CanSendMessages() const { return Valid().has_send_messages(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the send TTS messages permission. - */ - SQMOD_NODISCARD bool CanSendTtsMessages() const { return Valid().has_send_tts_messages(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the manage messages permission. - */ - SQMOD_NODISCARD bool CanManageMessages() const { return Valid().has_manage_messages(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the embed links permission. - */ - SQMOD_NODISCARD bool CanEmbedLinks() const { return Valid().has_embed_links(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the attach files permission. - */ - SQMOD_NODISCARD bool CanAttachFiles() const { return Valid().has_attach_files(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the read message history permission. - */ - SQMOD_NODISCARD bool CanReadMessageHistory() const { return Valid().has_read_message_history(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the mention \@everyone and \@here permission. - */ - SQMOD_NODISCARD bool CanMentionEveryone() const { return Valid().has_mention_everyone(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the use external emojis permission. - */ - SQMOD_NODISCARD bool CanUseExternalEmojis() const { return Valid().has_use_external_emojis(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the view guild insights permission. - */ - SQMOD_NODISCARD bool CanViewGuildInsights() const { return Valid().has_view_guild_insights(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the connect voice permission. - */ - SQMOD_NODISCARD bool CanConnect() const { return Valid().has_connect(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the speak permission. - */ - SQMOD_NODISCARD bool CanSpeak() const { return Valid().has_speak(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the mute members permission. - */ - SQMOD_NODISCARD bool CanMuteMembers() const { return Valid().has_mute_members(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the deafen members permission. - */ - SQMOD_NODISCARD bool CanDeafenMembers() const { return Valid().has_deafen_members(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the move members permission. - */ - SQMOD_NODISCARD bool CanMoveMembers() const { return Valid().has_move_members(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has use voice activity detection permission. - */ - SQMOD_NODISCARD bool CanUseVAT() const { return Valid().has_use_vad(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the change nickname permission. - */ - SQMOD_NODISCARD bool CanChangeNickname() const { return Valid().has_change_nickname(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the manage nicknames permission. - */ - SQMOD_NODISCARD bool CanManageNicknames() const { return Valid().has_manage_nicknames(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the manage roles permission. - */ - SQMOD_NODISCARD bool CanManageRoles() const { return Valid().has_manage_roles(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the manage webhooks permission. - */ - SQMOD_NODISCARD bool CanManageWebhooks() const { return Valid().has_manage_webhooks(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the manage emojis permission. - */ - SQMOD_NODISCARD bool CanManageEmojis() const { return Valid().has_manage_emojis(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the use slash commands permission. - */ - SQMOD_NODISCARD bool CanUseSlashCommands() const { return Valid().has_use_slash_commands(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the request to speak permission. - */ - SQMOD_NODISCARD bool HasRequestToSpeak() const { return Valid().has_request_to_speak(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the manage threads permission. - */ - SQMOD_NODISCARD bool CanManageThreads() const { return Valid().has_manage_threads(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the use public threads permission. - */ - SQMOD_NODISCARD bool HasUsePublicThreads() const { return Valid().has_use_public_threads(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the role has the use private threads permission. - */ - SQMOD_NODISCARD bool HasUsePrivateThreads() const { return Valid().has_use_private_threads(); } -}; - -/* ------------------------------------------------------------------------------------------------ - * Represents a user on discord. May or may not be a member of a DpGuild. -*/ -struct DpUser -{ - using Ptr = std::unique_ptr< dpp::user >; - /* -------------------------------------------------------------------------------------------- - * Referenced user instance. - */ - Ptr mPtr{nullptr}; - /* -------------------------------------------------------------------------------------------- - * Wether the referenced pointer is owned. - */ - bool mOwned{false}; - /* -------------------------------------------------------------------------------------------- - * Default constructor. - */ - DpUser() noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpUser(Ptr::pointer ptr, bool owned = false) noexcept - : mPtr(ptr), mOwned(owned) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor. - */ - explicit DpUser(const Ptr::element_type & o) noexcept - : DpUser(new Ptr::element_type(o), true) - { } - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - explicit DpUser(Ptr::element_type && o) noexcept - : DpUser(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor (disabled). - */ - DpUser(const DpUser & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - DpUser(DpUser && o) noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~DpUser() noexcept - { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - } - /* -------------------------------------------------------------------------------------------- - * Copy assignment operator (disabled). - */ - DpUser & operator = (const DpUser & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move assignment operator. - */ - DpUser & operator = (DpUser && o) noexcept - { - if (this != &o) { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - // Transfer members values - mPtr = std::move(o.mPtr); - mOwned = o.mOwned; - } - return *this; - } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle. - */ - void Validate() const { if (!mPtr) STHROWF("Invalid discord user handle"); } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle and retrieve a const reference to it. - */ - SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } - /* -------------------------------------------------------------------------------------------- - * Check wether a valid instance is managed. - */ - SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } - /* -------------------------------------------------------------------------------------------- - * Retrieve user discord username. - */ - SQMOD_NODISCARD const std::string & GetUsername() const { return Valid().username; } - /* -------------------------------------------------------------------------------------------- - * Retrieve user discriminator (aka tag), 4 digits usually displayed with leading zeroes. - */ - SQMOD_NODISCARD SQInteger GetDiscriminator() const { return static_cast< SQInteger >(Valid().discriminator); } - /* -------------------------------------------------------------------------------------------- - * Retrieve user avatar hash. - */ - SQMOD_NODISCARD const dpp::utility::iconhash & GetAvatar() const { return Valid().avatar; } - /* -------------------------------------------------------------------------------------------- - * Retrieve user flags built from a bitmask of values in dpp::user_flags. - */ - SQMOD_NODISCARD SQInteger GetFlags() const { return static_cast< SQInteger >(Valid().flags); } - /* -------------------------------------------------------------------------------------------- - * Retrieve user feference count of how many guilds this user is in. - */ - SQMOD_NODISCARD SQInteger GetRefCount() const { return static_cast< SQInteger >(Valid().refcount); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the avatar url of the user object. - */ - SQMOD_NODISCARD std::string GetAvatarURL() const { return Valid().get_avatar_url(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is a bot. - */ - SQMOD_NODISCARD bool IsBot() const { return Valid().is_bot(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is a system user (Clyde). - */ - SQMOD_NODISCARD bool IsSystem() const { return Valid().is_system(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user has multi-factor authentication enabled. - */ - SQMOD_NODISCARD bool IsMfaEnabled() const { return Valid().is_mfa_enabled(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user has verified account. - */ - SQMOD_NODISCARD bool IsVerified() const { return Valid().is_verified(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user has full nitro. - */ - SQMOD_NODISCARD bool HasNitroFull() const { return Valid().has_nitro_full(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user has nitro classic. - */ - SQMOD_NODISCARD bool HasNitroClassic() const { return Valid().has_nitro_classic(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is a discord employee. - */ - SQMOD_NODISCARD bool IsDiscordEmployee() const { return Valid().is_discord_employee(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user owns a partnered server. - */ - SQMOD_NODISCARD bool IsPartneredOwner() const { return Valid().is_partnered_owner(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user has hype-squad events. - */ - SQMOD_NODISCARD bool HasHypesquadEvents() const { return Valid().has_hypesquad_events(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user has the bug-hunter level 1 badge. - */ - SQMOD_NODISCARD bool IsBughunter1() const { return Valid().is_bughunter_1(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is in house bravery. - */ - SQMOD_NODISCARD bool IsHouseBravery() const { return Valid().is_house_bravery(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is in house brilliance. - */ - SQMOD_NODISCARD bool IsHouseBrilliance() const { return Valid().is_house_brilliance(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is in house balance. - */ - SQMOD_NODISCARD bool IsHouseBalanace() const { return Valid().is_house_balanace(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is an early supporter. - */ - SQMOD_NODISCARD bool IsEarlySupporter() const { return Valid().is_early_supporter(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is a team user. - */ - SQMOD_NODISCARD bool IsTeamUser() const { return Valid().is_team_user(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user has the bug-hunter level 2 badge. - */ - SQMOD_NODISCARD bool IsBughunter2() const { return Valid().is_bughunter_2(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user has the verified bot badge. - */ - SQMOD_NODISCARD bool IsVerifiedBot() const { return Valid().is_verified_bot(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is an early verified bot developer. - */ - SQMOD_NODISCARD bool IsVerifiedBotDev() const { return Valid().is_verified_bot_dev(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is a certified moderator. - */ - SQMOD_NODISCARD bool IsCertifiedDoderator() const { return Valid().is_certified_moderator(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user has an animated icon. - */ - SQMOD_NODISCARD bool HasAnimatedIcon() const { return Valid().has_animated_icon(); } -}; - -/* ------------------------------------------------------------------------------------------------ - * Represents a guild on Discord (AKA a server). -*/ -struct DpGuildMember -{ - using Ptr = std::unique_ptr< dpp::guild_member >; - /* -------------------------------------------------------------------------------------------- - * Referenced guild member instance. - */ - Ptr mPtr{nullptr}; - /* -------------------------------------------------------------------------------------------- - * Wether the referenced pointer is owned. - */ - bool mOwned{false}; - /* -------------------------------------------------------------------------------------------- - * Default constructor. - */ - DpGuildMember() noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpGuildMember(Ptr::pointer ptr, bool owned = false) noexcept - : mPtr(ptr), mOwned(owned) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor. - */ - explicit DpGuildMember(const Ptr::element_type & o) noexcept - : DpGuildMember(new Ptr::element_type(o), true) - { } - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - explicit DpGuildMember(Ptr::element_type && o) noexcept - : DpGuildMember(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor (disabled). - */ - DpGuildMember(const DpGuildMember & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - DpGuildMember(DpGuildMember && o) noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~DpGuildMember() noexcept - { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - } - /* -------------------------------------------------------------------------------------------- - * Copy assignment operator (disabled). - */ - DpGuildMember & operator = (const DpGuildMember & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move assignment operator. - */ - DpGuildMember & operator = (DpGuildMember && o) noexcept - { - if (this != &o) { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - // Transfer members values - mPtr = std::move(o.mPtr); - mOwned = o.mOwned; - } - return *this; - } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle. - */ - void Validate() const { if (!mPtr) STHROWF("Invalid discord voice state handle"); } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle and retrieve a const reference to it. - */ - SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } - /* -------------------------------------------------------------------------------------------- - * Check wether a valid instance is managed. - */ - SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the gickname, or empty string if they don't have a nickname on this guild. - */ - SQMOD_NODISCARD const std::string & GetNickname() const { return Valid().nickname; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild id. - */ - SQMOD_NODISCARD dpp::snowflake GetGuildID() const { return Valid().guild_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the user id. - */ - SQMOD_NODISCARD dpp::snowflake GetUserID() const { return Valid().user_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the list of roles this user has on this guild. - */ - SQMOD_NODISCARD Array GetRoles() const - { - return Array(SqVM()).Reserve(static_cast< SQInteger >(Valid().roles.size())) - .AppendFromVector(Valid().roles); - } - /* -------------------------------------------------------------------------------------------- - * Retrieve the date and time since the user joined the guild. - */ - SQMOD_NODISCARD SQInteger GetJoinedAt() const - { - return std::chrono::time_point_cast< std::chrono::seconds >( - std::chrono::system_clock::from_time_t(Valid().joined_at) - ).time_since_epoch().count(); - } - /* -------------------------------------------------------------------------------------------- - * Retrieve the date and time since the user has boosted the guild guild. - */ - SQMOD_NODISCARD SQInteger GetPremiumSince() const - { - return std::chrono::time_point_cast< std::chrono::seconds >( - std::chrono::system_clock::from_time_t(Valid().premium_since) - ).time_since_epoch().count(); - } - /* -------------------------------------------------------------------------------------------- - * Retrieve the set of flags built from the bitmask defined by dpp::guild_member_flags. - */ - SQMOD_NODISCARD SQInteger GetFlags() const { return static_cast< SQInteger >(Valid().flags); } - /* -------------------------------------------------------------------------------------------- - * Build JSON string for the member object. - */ - SQMOD_NODISCARD std::string BuildJSON() const { return Valid().build_json(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is deafened. - */ - SQMOD_NODISCARD bool IsDeaf() const { return Valid().is_deaf(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is muted. - */ - SQMOD_NODISCARD bool IsMuted() const { return Valid().is_muted(); } - /* -------------------------------------------------------------------------------------------- - * Check wether the user is pending verification by membership screening. - */ - SQMOD_NODISCARD bool IsPending() const { return Valid().is_pending(); } -}; - -/* ------------------------------------------------------------------------------------------------ - * Represents a guild on Discord (AKA a server) -*/ -struct DpGuild -{ - using Ptr = std::unique_ptr< dpp::guild >; - /* -------------------------------------------------------------------------------------------- - * Referenced guild instance. - */ - Ptr mPtr{nullptr}; - /* -------------------------------------------------------------------------------------------- - * Wether the referenced pointer is owned. - */ - bool mOwned{false}; - /* -------------------------------------------------------------------------------------------- - * Default constructor. - */ - DpGuild() noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Explicit constructor. - */ - explicit DpGuild(Ptr::pointer ptr, bool owned = false) noexcept - : mPtr(ptr), mOwned(owned) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor. - */ - explicit DpGuild(const Ptr::element_type & o) noexcept - : DpGuild(new Ptr::element_type(o), true) - { } - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - explicit DpGuild(Ptr::element_type && o) noexcept - : DpGuild(new Ptr::element_type(std::forward< Ptr::element_type >(o)), true) - { } - /* -------------------------------------------------------------------------------------------- - * Copy constructor (disabled). - */ - DpGuild(const DpGuild & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - DpGuild(DpGuild && o) noexcept = default; - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~DpGuild() noexcept - { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - } - /* -------------------------------------------------------------------------------------------- - * Copy assignment operator (disabled). - */ - DpGuild & operator = (const DpGuild & o) = delete; - /* -------------------------------------------------------------------------------------------- - * Move assignment operator. - */ - DpGuild & operator = (DpGuild && o) noexcept - { - if (this != &o) { - // Do we own this to try delete it? - if (!mOwned && mPtr) [[maybe_unused]] auto p = mPtr.release(); - // Transfer members values - mPtr = std::move(o.mPtr); - mOwned = o.mOwned; - } - return *this; - } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle. - */ - void Validate() const { if (!mPtr) STHROWF("Invalid discord guild handle"); } - /* -------------------------------------------------------------------------------------------- - * Validate the managed handle and retrieve a const reference to it. - */ - SQMOD_NODISCARD Ptr::element_type & Valid() const { Validate(); return *mPtr; } - /* -------------------------------------------------------------------------------------------- - * Check wether a valid instance is managed. - */ - SQMOD_NODISCARD bool IsValid() const { return static_cast< bool >(mPtr); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the shard ID of the guild. - */ - SQMOD_NODISCARD SQInteger GetShardID() const { return static_cast< SQInteger >(Valid().shard_id); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the flags bitmask as defined by values within dpp::guild_flags. - */ - SQMOD_NODISCARD SQInteger GetFlags() const { return static_cast< SQInteger >(Valid().flags); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild name. - */ - SQMOD_NODISCARD const std::string & GetName() const { return Valid().name; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the server description for communities. - */ - SQMOD_NODISCARD const std::string & GetDescription() const { return Valid().description; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the vanity url code for verified or partnered servers and boost level 3. - */ - SQMOD_NODISCARD const std::string & GetVanityUrlCode() const { return Valid().vanity_url_code; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild icon hash. - */ - SQMOD_NODISCARD const dpp::utility::iconhash & GetIcon() const { return Valid().icon; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild splash hash. - */ - SQMOD_NODISCARD const dpp::utility::iconhash & GetSplash() const { return Valid().splash; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild discovery splash hash. - */ - SQMOD_NODISCARD const dpp::utility::iconhash & GetDiscoverySplash() const { return Valid().discovery_splash; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the snowflake id of guild owner. - */ - SQMOD_NODISCARD dpp::snowflake GetOwnerID() const { return Valid().owner_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the guild voice region. - */ - SQMOD_NODISCARD SQInteger GetVoiceRegion() const { return static_cast< SQInteger >(Valid().voice_region); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the snowflake ID of AFK voice channel or 0. - */ - SQMOD_NODISCARD dpp::snowflake GetAfkChannelID() const { return Valid().afk_channel_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the voice AFK timeout before moving users to AFK channel. - */ - SQMOD_NODISCARD SQInteger GetAfkTimeout() const { return static_cast< SQInteger >(Valid().afk_timeout); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the snowflake ID of widget channel, or 0. - */ - SQMOD_NODISCARD dpp::snowflake GetWidgetChannelID() const { return Valid().widget_channel_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the verification level of server. - */ - SQMOD_NODISCARD SQInteger GetVerificationLevel() const { return static_cast< SQInteger >(Valid().verification_level); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the setting for how notifications are to be delivered to users. - */ - SQMOD_NODISCARD SQInteger GetDefaultMessageNotifications() const { return static_cast< SQInteger >(Valid().default_message_notifications); } - /* -------------------------------------------------------------------------------------------- - * Check wether or not explicit content filtering is enable and what setting it is. - */ - SQMOD_NODISCARD SQInteger GetExplicitContentFilter() const { return static_cast< SQInteger >(Valid().explicit_content_filter); } - /* -------------------------------------------------------------------------------------------- - * Check wether multi factor authentication is required for moderators or not. - */ - SQMOD_NODISCARD SQInteger GetMfaLevel() const { return static_cast< SQInteger >(Valid().mfa_level); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the ID of creating application, if any, or 0. - */ - SQMOD_NODISCARD dpp::snowflake GetApplicationID() const { return Valid().application_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the ID of system channel where discord update messages are sent. - */ - SQMOD_NODISCARD dpp::snowflake GetSystemChannelID() const { return Valid().system_channel_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the ID of rules channel for communities. - */ - SQMOD_NODISCARD dpp::snowflake GetRulesChannelID() const { return Valid().rules_channel_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the approximate member count. May be sent as zero. - */ - SQMOD_NODISCARD SQInteger GetMemberCount() const { return static_cast< SQInteger >(Valid().member_count); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the server banner hash. - */ - SQMOD_NODISCARD const dpp::utility::iconhash & GetBanner() const { return Valid().banner; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the boost level. - */ - SQMOD_NODISCARD SQInteger GetPremiumTier() const { return static_cast< SQInteger >(Valid().premium_tier); } - /* -------------------------------------------------------------------------------------------- - * Retrieve the number of boosters. - */ - SQMOD_NODISCARD SQInteger GetPremiumSubscriptionCount() const { return static_cast< SQInteger >(Valid().premium_subscription_count); } - /* -------------------------------------------------------------------------------------------- - * Retrieve public updates channel ID or 0. - */ - SQMOD_NODISCARD dpp::snowflake GetPublicUpdatesChannelID() const { return Valid().public_updates_channel_id; } - /* -------------------------------------------------------------------------------------------- - * Retrieve the maximum users in a video channel, or 0. - */ - SQMOD_NODISCARD SQInteger GetMaxVideoChannelUsers() const { return static_cast< SQInteger >(Valid().max_video_channel_users); } - /* -------------------------------------------------------------------------------------------- - * Retrieve a roles defined on this server. - */ - SQMOD_NODISCARD Array GetRoles() const { return Array(SqVM()).Reserve(static_cast< SQInteger >(Valid().roles.size())).AppendFromVector(Valid().roles); } - /* -------------------------------------------------------------------------------------------- - * Retrieve a list of channels on this server. - */ - SQMOD_NODISCARD Array GetChannels() const { return Array(SqVM()).Reserve(static_cast< SQInteger >(Valid().channels.size())).AppendFromVector(Valid().channels); } - /* -------------------------------------------------------------------------------------------- - * Retrieve a list of threads on this server. - */ - SQMOD_NODISCARD Array GetThreads() const { return Array(SqVM()).Reserve(static_cast< SQInteger >(Valid().threads.size())).AppendFromVector(Valid().threads); } - /* -------------------------------------------------------------------------------------------- - * Retrieve a list of guild members. Note that when you first receive the guild create event, - * this may be empty or near empty. This depends upon your dpp::intents and the size of your bot. - * It will be filled by guild member chunk requests. - */ - SQMOD_NODISCARD Table GetMembers() const - { - Table t(SqVM(), static_cast< SQInteger >(Valid().members.size())); - // Attempt to convert the [members] associative container into a script table - const auto r = t.InsertFromMapWith(mPtr->members, [](HSQUIRRELVM vm, auto id, auto & m) -> SQRESULT { - // The [id] is a dpp::snowflake which is basically a uint64_t so let's leave that as is - sq_pushinteger(vm, static_cast< SQInteger >(id)); - // Wrap the dpp::guild_member type into a DpGuildMember instance - ClassType< DpGuildMember >::PushInstance(vm, new DpGuildMember(m)); - // The elements are now on the stack and can be inserted in the table - return SQ_OK; - }); - // Did anything fail? - if (SQ_FAILED(r)) - { - STHROWF("Unable to convert [members] container"); - } - // Return the resulted table - return t; - } - /* -------------------------------------------------------------------------------------------- - * Retrieve a list of members in voice channels in the guild. - */ - SQMOD_NODISCARD Table GetVoiceMembers() const - { - Table t(SqVM(), static_cast< SQInteger >(Valid().voice_members.size())); - // Attempt to convert the [voice_members] associative container into a script table - const auto r = t.InsertFromMapWith(mPtr->voice_members, [](HSQUIRRELVM vm, auto id, auto & m) -> SQRESULT { - // The [id] is a dpp::snowflake which is basically a uint64_t so let's leave that as is - sq_pushinteger(vm, static_cast< SQInteger >(id)); - // Wrap the dpp::guild_member type into a DpGuildMember instance - ClassType< DpVoiceState >::PushInstance(vm, new DpVoiceState(m)); - // The elements are now on the stack and can be inserted in the table - return SQ_OK; - }); - // Did anything fail? - if (SQ_FAILED(r)) - { - STHROWF("Unable to convert [voice_members] container"); - } - // Return the resulted table - return t; - } - /* -------------------------------------------------------------------------------------------- - * Retrieve a list of emojis. - */ - SQMOD_NODISCARD Array GetEmojis() const { return Array(SqVM()).Reserve(static_cast< SQInteger >(Valid().emojis.size())).AppendFromVector(Valid().emojis); } - /* -------------------------------------------------------------------------------------------- - * Build a JSON string from this object. - */ - SQMOD_NODISCARD std::string BuildJSON() const { return Valid().build_json(); } - /* -------------------------------------------------------------------------------------------- - * Build a JSON string from this object. If [with_id] is True then ID is to be included in the JSON. - */ - SQMOD_NODISCARD std::string BuildJSON_(bool with_id) const { return Valid().build_json(with_id); } - /* -------------------------------------------------------------------------------------------- - * Rehash members map. - */ - SQMOD_NODISCARD DpGuild & RehashMembers() { Valid().rehash_members(); return *this; } - /* -------------------------------------------------------------------------------------------- - * Connect to a voice channel another guild member is in. - * Returns true if the user specified is in a voice channel, false if they aren't. - */ - SQMOD_NODISCARD bool ConnectMemberVoice(SQInteger user_id) const { return Valid().connect_member_voice(user_id); } - /* -------------------------------------------------------------------------------------------- - * Is a large server (>250 users). - */ - SQMOD_NODISCARD bool IsLarge() const { return Valid().is_large(); } - /* -------------------------------------------------------------------------------------------- - * Is unavailable due to outage (most other fields will be blank or outdated). - */ - SQMOD_NODISCARD bool IsUnavailable() const { return Valid().is_unavailable(); } - /* -------------------------------------------------------------------------------------------- - * Widget is enabled for this server. - */ - SQMOD_NODISCARD bool WidgetEnabled() const { return Valid().widget_enabled(); } - /* -------------------------------------------------------------------------------------------- - * Guild has an invite splash. - */ - SQMOD_NODISCARD bool HasInviteSplash() const { return Valid().has_invite_splash(); } - /* -------------------------------------------------------------------------------------------- - * Guild has VIP regions. - */ - SQMOD_NODISCARD bool HasVipRegions() const { return Valid().has_vip_regions(); } - /* -------------------------------------------------------------------------------------------- - * Guild can have a vanity URL. - */ - SQMOD_NODISCARD bool HasVanityURL() const { return Valid().has_vanity_url(); } - /* -------------------------------------------------------------------------------------------- - * Guild is a verified server. - */ - SQMOD_NODISCARD bool IsVerified() const { return Valid().is_verified(); } - /* -------------------------------------------------------------------------------------------- - * Guild is a discord partner server. - */ - SQMOD_NODISCARD bool IsPartnered() const { return Valid().is_partnered(); } - /* -------------------------------------------------------------------------------------------- - * Guild has enabled community. - */ - SQMOD_NODISCARD bool IsCommunity() const { return Valid().is_community(); } - /* -------------------------------------------------------------------------------------------- - * Guild has enabled commerce channels. - */ - SQMOD_NODISCARD bool HasCommerce() const { return Valid().has_commerce(); } - /* -------------------------------------------------------------------------------------------- - * Guild has news channel. - */ - SQMOD_NODISCARD bool HasNews() const { return Valid().has_news(); } - /* -------------------------------------------------------------------------------------------- - * Guild is discoverable. - */ - SQMOD_NODISCARD bool IsDiscoverable() const { return Valid().is_discoverable(); } - /* -------------------------------------------------------------------------------------------- - * Guild is featureable. - */ - SQMOD_NODISCARD bool IsFeatureable() const { return Valid().is_featureable(); } - /* -------------------------------------------------------------------------------------------- - * Guild is allowed an animated icon. - */ - SQMOD_NODISCARD bool HasAnimatedIcon() const { return Valid().has_animated_icon(); } - /* -------------------------------------------------------------------------------------------- - * Guild has a banner image. - */ - SQMOD_NODISCARD bool BasBanner() const { return Valid().has_banner(); } - /* -------------------------------------------------------------------------------------------- - * Guild has enabled welcome screen. - */ - SQMOD_NODISCARD bool WelcomeScreenEnabled() const { return Valid().is_welcome_screen_enabled(); } - /* -------------------------------------------------------------------------------------------- - * Guild has enabled membership screening. - */ - SQMOD_NODISCARD bool HasMemberVerificationGate() const { return Valid().has_member_verification_gate(); } - /* -------------------------------------------------------------------------------------------- - * Guild has preview enabled. - */ - SQMOD_NODISCARD bool IsPreviewEnabled() const { return Valid().is_preview_enabled(); } - /* -------------------------------------------------------------------------------------------- - * Server icon is actually an animated gif. - */ - SQMOD_NODISCARD bool HasAnimatedIconHash() const { return Valid().has_animated_icon_hash(); } -}; - -} // Namespace:: SqMod