summaryrefslogtreecommitdiff
path: root/src/discord
diff options
context:
space:
mode:
Diffstat (limited to 'src/discord')
-rw-r--r--src/discord/channel.hpp16
-rw-r--r--src/discord/discord.cpp47
-rw-r--r--src/discord/discord.hpp17
-rw-r--r--src/discord/objects.hpp4
-rw-r--r--src/discord/stage.cpp12
-rw-r--r--src/discord/stage.hpp32
-rw-r--r--src/discord/voiceclient.cpp7
-rw-r--r--src/discord/voiceclient.hpp23
8 files changed, 135 insertions, 23 deletions
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<Snowflake> m_muted_channels;
std::unordered_map<Snowflake, int> m_unread;
std::unordered_set<Snowflake> m_channel_muted_parent;
+ std::map<Snowflake, StageInstance> m_stage_instances;
+ std::map<Snowflake, Snowflake> m_channel_to_stage_instance;
UserData m_user_data;
UserSettings m_user_settings;
@@ -441,6 +447,9 @@ public:
typedef sigc::signal<void, ThreadMemberListUpdateData> type_signal_thread_member_list_update;
typedef sigc::signal<void, MessageAckData> type_signal_message_ack;
typedef sigc::signal<void, GuildMembersChunkData> type_signal_guild_members_chunk;
+ typedef sigc::signal<void, StageInstance> type_signal_stage_instance_create;
+ typedef sigc::signal<void, StageInstance> type_signal_stage_instance_update;
+ typedef sigc::signal<void, StageInstance> type_signal_stage_instance_delete;
// not discord dispatch events
typedef sigc::signal<void, Snowflake> 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 <nlohmann/json.hpp>
+
+#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<uint8_t> 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<bool> m_running = false;