From af9f9ad803fab8e293e7d783f6e84fae6c5f21cb Mon Sep 17 00:00:00 2001
From: ouwou <26526779+ouwou@users.noreply.github.com>
Date: Wed, 26 Jun 2024 04:26:32 -0400
Subject: request to speak button
---
src/windows/voice/voicewindow.cpp | 22 ++++++++++++++++++++--
src/windows/voice/voicewindow.hpp | 6 ++++++
2 files changed, 26 insertions(+), 2 deletions(-)
(limited to 'src/windows')
diff --git a/src/windows/voice/voicewindow.cpp b/src/windows/voice/voicewindow.cpp
index 7607a0f..bfea175 100644
--- a/src/windows/voice/voicewindow.cpp
+++ b/src/windows/voice/voicewindow.cpp
@@ -1,3 +1,4 @@
+#include "util.hpp"
#ifdef WITH_VOICE
// clang-format off
@@ -20,6 +21,7 @@ VoiceWindow::VoiceWindow(Snowflake channel_id)
, m_deafen("Deafen")
, m_noise_suppression("Suppress Noise")
, m_mix_mono("Mix Mono")
+ , m_request_to_speak("Request to Speak")
, m_disconnect("Disconnect")
, m_channel_id(channel_id)
, m_menu_view("View")
@@ -39,6 +41,7 @@ VoiceWindow::VoiceWindow(Snowflake channel_id)
discord.signal_voice_user_disconnect().connect(sigc::mem_fun(*this, &VoiceWindow::OnUserDisconnect));
discord.signal_voice_user_connect().connect(sigc::mem_fun(*this, &VoiceWindow::OnUserConnect));
discord.signal_voice_speaker_state_changed().connect(sigc::mem_fun(*this, &VoiceWindow::OnSpeakerStateChanged));
+ discord.signal_voice_state_set().connect(sigc::mem_fun(*this, &VoiceWindow::OnVoiceStateUpdate));
if (const auto self_state = discord.GetVoiceState(discord.GetUserData().ID); self_state.has_value()) {
m_mute.set_active(util::FlagSet(self_state->second.Flags, VoiceStateFlags::SelfMute));
@@ -210,6 +213,12 @@ VoiceWindow::VoiceWindow(Snowflake channel_id)
},
*this));
+ m_request_to_speak.signal_clicked().connect([this]() {
+ auto &discord = Abaddon::Get().GetDiscordClient();
+ const bool requested = discord.HasUserRequestedToSpeak(discord.GetUserData().ID);
+ Abaddon::Get().GetDiscordClient().RequestToSpeak(m_channel_id, !requested, NOOP_CALLBACK);
+ });
+
m_TMP_speakers_label.set_markup("Speakers");
m_listing.pack_start(m_TMP_speakers_label, false, true);
m_listing.pack_start(m_speakers_list, false, true);
@@ -221,10 +230,13 @@ VoiceWindow::VoiceWindow(Snowflake channel_id)
m_controls.add(m_deafen);
m_controls.add(m_noise_suppression);
m_controls.add(m_mix_mono);
- m_controls.pack_end(m_disconnect, false, true);
+ m_buttons.set_halign(Gtk::ALIGN_CENTER);
+ m_buttons.pack_start(m_request_to_speak, false, true);
+ m_buttons.pack_start(m_disconnect, false, true);
m_main.pack_start(m_menu_bar, false, true);
m_main.pack_start(m_TMP_stagelabel, false, true);
m_main.pack_start(m_controls, false, true);
+ m_main.pack_start(m_buttons, false, true);
m_main.pack_start(m_vad_value, false, true);
m_main.pack_start(*Gtk::make_managed("Input Settings"), false, true);
m_main.pack_start(*sliders_container, false, true);
@@ -232,7 +244,7 @@ VoiceWindow::VoiceWindow(Snowflake channel_id)
m_main.pack_start(*combos_container, false, true, 2);
add(m_main);
show_all_children();
-
+
Glib::signal_timeout().connect(sigc::mem_fun(*this, &VoiceWindow::UpdateVoiceMeters), 40);
}
@@ -349,6 +361,12 @@ void VoiceWindow::OnSpeakerStateChanged(Snowflake channel_id, Snowflake user_id,
}
}
+void VoiceWindow::OnVoiceStateUpdate(Snowflake user_id, Snowflake channel_id, VoiceStateFlags flags) {
+ auto &discord = Abaddon::Get().GetDiscordClient();
+ m_has_requested_to_speak = discord.HasUserRequestedToSpeak(discord.GetUserData().ID);
+ m_request_to_speak.set_label(m_has_requested_to_speak ? "Cancel Request" : "Request to Speak");
+}
+
VoiceWindow::type_signal_mute VoiceWindow::signal_mute() {
return m_signal_mute;
}
diff --git a/src/windows/voice/voicewindow.hpp b/src/windows/voice/voicewindow.hpp
index 0df9fa8..7803f85 100644
--- a/src/windows/voice/voicewindow.hpp
+++ b/src/windows/voice/voicewindow.hpp
@@ -1,4 +1,5 @@
#pragma once
+#include "discord/voicestate.hpp"
#ifdef WITH_VOICE
// clang-format off
@@ -29,6 +30,7 @@ private:
void OnUserConnect(Snowflake user_id, Snowflake to_channel_id);
void OnUserDisconnect(Snowflake user_id, Snowflake from_channel_id);
void OnSpeakerStateChanged(Snowflake channel_id, Snowflake user_id, bool is_speaker);
+ void OnVoiceStateUpdate(Snowflake user_id, Snowflake channel_id, VoiceStateFlags flags);
void OnMuteChanged();
void OnDeafenChanged();
@@ -61,7 +63,11 @@ private:
Gtk::CheckButton m_noise_suppression;
Gtk::CheckButton m_mix_mono;
+ Gtk::HBox m_buttons;
Gtk::Button m_disconnect;
+ Gtk::Button m_request_to_speak;
+
+ bool m_has_requested_to_speak = false;
Gtk::ComboBoxText m_vad_combo;
Gtk::ComboBox m_playback_combo;
--
cgit v1.2.3