From 98218dfde37ce595401a0c1446d9e40418cc15d6 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 12 Mar 2024 04:15:21 -0400 Subject: initial stages stuff --- src/discord/channel.hpp | 16 --------------- src/discord/discord.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++ src/discord/discord.hpp | 17 +++++++++++++++- src/discord/objects.hpp | 4 ++++ src/discord/stage.cpp | 12 ++++++++++++ src/discord/stage.hpp | 32 ++++++++++++++++++++++++++++++ src/discord/voiceclient.cpp | 7 ++++--- src/discord/voiceclient.hpp | 23 +++++++++++++++++++--- 8 files changed, 135 insertions(+), 23 deletions(-) create mode 100644 src/discord/stage.cpp create mode 100644 src/discord/stage.hpp (limited to 'src/discord') diff --git a/src/discord/channel.hpp b/src/discord/channel.hpp index cac8b4c..ebf67b0 100644 --- a/src/discord/channel.hpp +++ b/src/discord/channel.hpp @@ -27,22 +27,6 @@ enum class ChannelType : int { GUILD_MEDIA = 16, }; -enum class StagePrivacy { - PUBLIC = 1, - GUILD_ONLY = 2, -}; - -constexpr const char *GetStagePrivacyDisplayString(StagePrivacy e) { - switch (e) { - case StagePrivacy::PUBLIC: - return "Public"; - case StagePrivacy::GUILD_ONLY: - return "Guild Only"; - default: - return "Unknown"; - } -} - // should be moved somewhere? struct ThreadMetadataData { diff --git a/src/discord/discord.cpp b/src/discord/discord.cpp index 385d6b7..e99cb5f 100644 --- a/src/discord/discord.cpp +++ b/src/discord/discord.cpp @@ -1646,6 +1646,15 @@ void DiscordClient::HandleGatewayMessage(std::string str) { case GatewayEvent::GUILD_MEMBERS_CHUNK: { HandleGatewayGuildMembersChunk(m); } break; + case GatewayEvent::STAGE_INSTANCE_CREATE: { + HandleGatewayStageInstanceCreate(m); + } break; + case GatewayEvent::STAGE_INSTANCE_UPDATE: { + HandleGatewayStageInstanceUpdate(m); + } break; + case GatewayEvent::STAGE_INSTANCE_DELETE: { + HandleGatewayStageInstanceDelete(m); + } break; #ifdef WITH_VOICE case GatewayEvent::VOICE_STATE_UPDATE: { HandleGatewayVoiceStateUpdate(m); @@ -2296,6 +2305,29 @@ void DiscordClient::HandleGatewayGuildMembersChunk(const GatewayMessage &msg) { m_store.EndTransaction(); } +void DiscordClient::HandleGatewayStageInstanceCreate(const GatewayMessage &msg) { + StageInstance data = msg.Data; + spdlog::get("discord")->debug("STAGE_INSTANCE_CREATE: {} in {}", data.ID, data.ChannelID); + m_stage_instances[data.ID] = data; + m_channel_to_stage_instance[data.ChannelID] = data.ID; + m_signal_stage_instance_create.emit(data); +} + +void DiscordClient::HandleGatewayStageInstanceUpdate(const GatewayMessage &msg) { + StageInstance data = msg.Data; + spdlog::get("discord")->debug("STAGE_INSTANCE_UPDATE: {} in {}", data.ID, data.ChannelID); + m_stage_instances[data.ID] = data; + m_signal_stage_instance_update.emit(data); +} + +void DiscordClient::HandleGatewayStageInstanceDelete(const GatewayMessage &msg) { + StageInstance data = msg.Data; + spdlog::get("discord")->debug("STAGE_INSTANCE_DELETE: {} in {}", data.ID, data.ChannelID); + m_stage_instances.erase(data.ID); + m_channel_to_stage_instance.erase(data.ChannelID); + m_signal_stage_instance_delete.emit(data); +} + #ifdef WITH_VOICE /* @@ -3001,6 +3033,9 @@ void DiscordClient::LoadEventMap() { m_event_map["VOICE_STATE_UPDATE"] = GatewayEvent::VOICE_STATE_UPDATE; m_event_map["VOICE_SERVER_UPDATE"] = GatewayEvent::VOICE_SERVER_UPDATE; m_event_map["CALL_CREATE"] = GatewayEvent::CALL_CREATE; + m_event_map["STAGE_INSTANCE_CREATE"] = GatewayEvent::STAGE_INSTANCE_CREATE; + m_event_map["STAGE_INSTANCE_UPDATE"] = GatewayEvent::STAGE_INSTANCE_UPDATE; + m_event_map["STAGE_INSTANCE_DELETE"] = GatewayEvent::STAGE_INSTANCE_DELETE; } DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() { @@ -3179,6 +3214,18 @@ DiscordClient::type_signal_guild_members_chunk DiscordClient::signal_guild_membe return m_signal_guild_members_chunk; } +DiscordClient::type_signal_stage_instance_create DiscordClient::signal_stage_instance_create() { + return m_signal_stage_instance_create; +} + +DiscordClient::type_signal_stage_instance_update DiscordClient::signal_stage_instance_update() { + return m_signal_stage_instance_update; +} + +DiscordClient::type_signal_stage_instance_delete DiscordClient::signal_stage_instance_delete() { + return m_signal_stage_instance_delete; +} + DiscordClient::type_signal_added_to_thread DiscordClient::signal_added_to_thread() { return m_signal_added_to_thread; } diff --git a/src/discord/discord.hpp b/src/discord/discord.hpp index 21eaa82..a74b5f6 100644 --- a/src/discord/discord.hpp +++ b/src/discord/discord.hpp @@ -294,12 +294,16 @@ private: void HandleGatewayMessageAck(const GatewayMessage &msg); void HandleGatewayUserGuildSettingsUpdate(const GatewayMessage &msg); void HandleGatewayGuildMembersChunk(const GatewayMessage &msg); + void HandleGatewayStageInstanceCreate(const GatewayMessage &msg); + void HandleGatewayStageInstanceUpdate(const GatewayMessage &msg); + void HandleGatewayStageInstanceDelete(const GatewayMessage &msg); void HandleGatewayReadySupplemental(const GatewayMessage &msg); void HandleGatewayReconnect(const GatewayMessage &msg); void HandleGatewayInvalidSession(const GatewayMessage &msg); #ifdef WITH_VOICE - void HandleGatewayVoiceStateUpdate(const GatewayMessage &msg); + void + HandleGatewayVoiceStateUpdate(const GatewayMessage &msg); void HandleGatewayVoiceServerUpdate(const GatewayMessage &msg); void HandleGatewayCallCreate(const GatewayMessage &msg); @@ -341,6 +345,8 @@ private: std::unordered_set m_muted_channels; std::unordered_map m_unread; std::unordered_set m_channel_muted_parent; + std::map m_stage_instances; + std::map m_channel_to_stage_instance; UserData m_user_data; UserSettings m_user_settings; @@ -441,6 +447,9 @@ public: typedef sigc::signal type_signal_thread_member_list_update; typedef sigc::signal type_signal_message_ack; typedef sigc::signal type_signal_guild_members_chunk; + typedef sigc::signal type_signal_stage_instance_create; + typedef sigc::signal type_signal_stage_instance_update; + typedef sigc::signal type_signal_stage_instance_delete; // not discord dispatch events typedef sigc::signal type_signal_added_to_thread; @@ -513,6 +522,9 @@ public: type_signal_thread_member_list_update signal_thread_member_list_update(); type_signal_message_ack signal_message_ack(); type_signal_guild_members_chunk signal_guild_members_chunk(); + type_signal_stage_instance_create signal_stage_instance_create(); + type_signal_stage_instance_update signal_stage_instance_update(); + type_signal_stage_instance_delete signal_stage_instance_delete(); type_signal_added_to_thread signal_added_to_thread(); type_signal_removed_from_thread signal_removed_from_thread(); @@ -582,6 +594,9 @@ protected: type_signal_thread_member_list_update m_signal_thread_member_list_update; type_signal_message_ack m_signal_message_ack; type_signal_guild_members_chunk m_signal_guild_members_chunk; + type_signal_stage_instance_create m_signal_stage_instance_create; + type_signal_stage_instance_update m_signal_stage_instance_update; + type_signal_stage_instance_delete m_signal_stage_instance_delete; type_signal_removed_from_thread m_signal_removed_from_thread; type_signal_added_to_thread m_signal_added_to_thread; diff --git a/src/discord/objects.hpp b/src/discord/objects.hpp index dfe99f0..67474a3 100644 --- a/src/discord/objects.hpp +++ b/src/discord/objects.hpp @@ -20,6 +20,7 @@ #include "auditlog.hpp" #include "relationship.hpp" #include "errors.hpp" +#include "stage.hpp" // most stuff below should just be objects that get processed and thrown away immediately @@ -110,6 +111,9 @@ enum class GatewayEvent : int { VOICE_STATE_UPDATE, VOICE_SERVER_UPDATE, CALL_CREATE, + STAGE_INSTANCE_CREATE, + STAGE_INSTANCE_UPDATE, + STAGE_INSTANCE_DELETE, }; enum class GatewayCloseCode : uint16_t { diff --git a/src/discord/stage.cpp b/src/discord/stage.cpp new file mode 100644 index 0000000..428e1f3 --- /dev/null +++ b/src/discord/stage.cpp @@ -0,0 +1,12 @@ +#include "stage.hpp" + +#include "json.hpp" + +void from_json(const nlohmann::json &j, StageInstance &m) { + JS_D("id", m.ID); + JS_D("guild_id", m.GuildID); + JS_D("channel_id", m.ChannelID); + JS_N("topic", m.Topic); + JS_N("privacy_level", m.PrivacyLevel); + JS_N("guild_scheduled_event_id", m.GuildScheduledEventID); +} diff --git a/src/discord/stage.hpp b/src/discord/stage.hpp new file mode 100644 index 0000000..3df4433 --- /dev/null +++ b/src/discord/stage.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include "snowflake.hpp" + +enum class StagePrivacy { + PUBLIC = 1, + GUILD_ONLY = 2, +}; + +constexpr const char *GetStagePrivacyDisplayString(StagePrivacy e) { + switch (e) { + case StagePrivacy::PUBLIC: + return "Public"; + case StagePrivacy::GUILD_ONLY: + return "Guild Only"; + default: + return "Unknown"; + } +} + +struct StageInstance { + Snowflake ID; + Snowflake GuildID; + Snowflake ChannelID; + std::string Topic; + StagePrivacy PrivacyLevel; + Snowflake GuildScheduledEventID; + + friend void from_json(const nlohmann::json &j, StageInstance &m); +}; diff --git a/src/discord/voiceclient.cpp b/src/discord/voiceclient.cpp index e4b56bd..164033f 100644 --- a/src/discord/voiceclient.cpp +++ b/src/discord/voiceclient.cpp @@ -96,11 +96,11 @@ std::vector UDPSocket::Receive() { } void UDPSocket::Stop() { - #ifdef _WIN32 +#ifdef _WIN32 closesocket(m_socket); - #else +#else close(m_socket); - #endif +#endif m_running = false; if (m_thread.joinable()) m_thread.join(); } @@ -250,6 +250,7 @@ bool DiscordVoiceClient::IsConnecting() const noexcept { } void DiscordVoiceClient::OnGatewayMessage(const std::string &str) { + m_log->trace("IN: {}", str); VoiceGatewayMessage msg = nlohmann::json::parse(str); switch (msg.Opcode) { case VoiceGatewayOp::Hello: diff --git a/src/discord/voiceclient.hpp b/src/discord/voiceclient.hpp index 0112749..aa1014c 100644 --- a/src/discord/voiceclient.hpp +++ b/src/discord/voiceclient.hpp @@ -43,6 +43,23 @@ enum class VoiceGatewayOp : int { Hello = 8, Resumed = 9, ClientDisconnect = 13, + SessionUpdate = 14, + MediaSinkWants = 15, + VoiceBackendVersion = 16, + ChannelOptionsUpdate = 17, + Flags = 18, + SpeedTest = 19, + Platform = 20, + SecureFramesPrepareProtocolTransition = 21, + SecureFramesExecuteTransition = 22, + SecureFramesReadyForTransition = 23, + SecureFramesPrepareEpoch = 24, + MlsExternalSenderPackage = 25, + MlsKeyPackage = 26, + MlsProposals = 27, + MlsCommitWelcome = 28, + MlsPrepareCommitTransition = 29, + MlsWelcome = 30, }; struct VoiceGatewayMessage { @@ -156,11 +173,11 @@ public: private: void ReadThread(); - #ifdef _WIN32 +#ifdef _WIN32 SOCKET m_socket; - #else +#else int m_socket; - #endif +#endif sockaddr_in m_server; std::atomic m_running = false; -- cgit v1.2.3