summaryrefslogtreecommitdiff
path: root/src/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2022-10-10 00:27:47 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2022-10-10 00:27:47 -0400
commit78a5b9599c900c5da56da0a15835f425e455b510 (patch)
tree304c37e30b885c5d00eba73a109f417253eb2001 /src/discord
parent5588c46d14cab51596921bc456aadc315dab012f (diff)
downloadabaddon-portaudio-78a5b9599c900c5da56da0a15835f425e455b510.tar.gz
abaddon-portaudio-78a5b9599c900c5da56da0a15835f425e455b510.zip
remove user from list on disconnect
Diffstat (limited to 'src/discord')
-rw-r--r--src/discord/discord.cpp19
-rw-r--r--src/discord/discord.hpp4
2 files changed, 23 insertions, 0 deletions
diff --git a/src/discord/discord.cpp b/src/discord/discord.cpp
index c62cd2a..91ba1e3 100644
--- a/src/discord/discord.cpp
+++ b/src/discord/discord.cpp
@@ -1208,6 +1208,13 @@ std::optional<uint32_t> DiscordClient::GetSSRCOfUser(Snowflake id) const {
return m_voice.GetSSRCOfUser(id);
}
+std::optional<Snowflake> DiscordClient::GetVoiceState(Snowflake user_id) const {
+ if (const auto it = m_voice_state_user_channel.find(user_id); it != m_voice_state_user_channel.end()) {
+ return it->second;
+ }
+ return std::nullopt;
+}
+
void DiscordClient::SetVoiceMuted(bool is_mute) {
m_mute_requested = is_mute;
SendVoiceStateUpdate();
@@ -2164,9 +2171,17 @@ void DiscordClient::HandleGatewayVoiceStateUpdate(const GatewayMessage &msg) {
m_voice.SetSessionID(data.SessionID);
}
if (data.ChannelID.has_value()) {
+ const auto old_state = GetVoiceState(data.UserID);
SetVoiceState(data.UserID, *data.ChannelID);
+ if (old_state.has_value() && *old_state != *data.ChannelID) {
+ m_signal_voice_user_disconnect.emit(data.UserID, *old_state);
+ }
} else {
+ const auto old_state = GetVoiceState(data.UserID);
ClearVoiceState(data.UserID);
+ if (old_state.has_value()) {
+ m_signal_voice_user_disconnect.emit(data.UserID, *old_state);
+ }
}
}
@@ -2952,4 +2967,8 @@ DiscordClient::type_signal_voice_disconnected DiscordClient::signal_voice_discon
DiscordClient::type_signal_voice_speaking DiscordClient::signal_voice_speaking() {
return m_signal_voice_speaking;
}
+
+DiscordClient::type_signal_voice_user_disconnect DiscordClient::signal_voice_user_disconnect() {
+ return m_signal_voice_user_disconnect;
+}
#endif
diff --git a/src/discord/discord.hpp b/src/discord/discord.hpp
index a3a2ba7..d0f5be0 100644
--- a/src/discord/discord.hpp
+++ b/src/discord/discord.hpp
@@ -187,6 +187,7 @@ public:
[[nodiscard]] Snowflake GetVoiceChannelID() const noexcept;
[[nodiscard]] std::unordered_set<Snowflake> GetUsersInVoiceChannel(Snowflake channel_id);
[[nodiscard]] std::optional<uint32_t> GetSSRCOfUser(Snowflake id) const;
+ [[nodiscard]] std::optional<Snowflake> GetVoiceState(Snowflake user_id) const;
void SetVoiceMuted(bool is_mute);
void SetVoiceDeafened(bool is_deaf);
@@ -435,6 +436,7 @@ public:
using type_signal_voice_connected = sigc::signal<void()>;
using type_signal_voice_disconnected = sigc::signal<void()>;
using type_signal_voice_speaking = sigc::signal<void(VoiceSpeakingData)>;
+ using type_signal_voice_user_disconnect = sigc::signal<void(Snowflake, Snowflake)>;
#endif
type_signal_gateway_ready signal_gateway_ready();
@@ -495,6 +497,7 @@ public:
type_signal_voice_connected signal_voice_connected();
type_signal_voice_disconnected signal_voice_disconnected();
type_signal_voice_speaking signal_voice_speaking();
+ type_signal_voice_user_disconnect signal_voice_user_disconnect();
#endif
protected:
@@ -556,5 +559,6 @@ protected:
type_signal_voice_connected m_signal_voice_connected;
type_signal_voice_disconnected m_signal_voice_disconnected;
type_signal_voice_speaking m_signal_voice_speaking;
+ type_signal_voice_user_disconnect m_signal_voice_user_disconnect;
#endif
};