From 2c82b5388e21bb6b47805f44f604b5de1d1e5f33 Mon Sep 17 00:00:00 2001
From: George Hazan <george.hazan@gmail.com>
Date: Fri, 7 Jun 2024 17:05:32 +0300
Subject: Discord: opus.dll is added

---
 protocols/Discord/src/stdafx.cxx       |  4 ++-
 protocols/Discord/src/stdafx.h         |  2 ++
 protocols/Discord/src/voice_client.cpp | 63 ++++++++++++++++++++++++++++++++++
 3 files changed, 68 insertions(+), 1 deletion(-)

(limited to 'protocols/Discord')

diff --git a/protocols/Discord/src/stdafx.cxx b/protocols/Discord/src/stdafx.cxx
index 52b06cb953..18d309a1f6 100644
--- a/protocols/Discord/src/stdafx.cxx
+++ b/protocols/Discord/src/stdafx.cxx
@@ -15,4 +15,6 @@ You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#include "stdafx.h"
\ No newline at end of file
+#include "stdafx.h"
+
+#pragma comment(lib, "opus.lib")
diff --git a/protocols/Discord/src/stdafx.h b/protocols/Discord/src/stdafx.h
index 95990b7dd2..6e11d96455 100644
--- a/protocols/Discord/src/stdafx.h
+++ b/protocols/Discord/src/stdafx.h
@@ -17,6 +17,7 @@
 #include <time.h>
 
 #include <map>
+#include <memory>
 #include <vector>
 
 #include "resource.h"
@@ -52,6 +53,7 @@
 
 #include "../../libs/zlib/src/zlib.h"
 #include "../../libs/libsodium/src/include/sodium.h"
+#include "opus/opus.h"
 
 extern IconItem g_iconList[];
 
diff --git a/protocols/Discord/src/voice_client.cpp b/protocols/Discord/src/voice_client.cpp
index e20f6c95a9..e849ef0660 100644
--- a/protocols/Discord/src/voice_client.cpp
+++ b/protocols/Discord/src/voice_client.cpp
@@ -17,6 +17,40 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include "stdafx.h"
 
+struct CDiscordVoiceClient
+{
+	CDiscordVoiceCall *m_config;
+
+	OpusEncoder *m_encoder;
+	OpusRepacketizer *m_repacketizer;
+
+	bool m_terminating = false;
+
+	CDiscordVoiceClient(CDiscordVoiceCall *pCall);
+	~CDiscordVoiceClient();
+};
+
+CDiscordVoiceClient::CDiscordVoiceClient(CDiscordVoiceCall *pCall) :
+	m_config(pCall)
+{
+	int iError = 0;
+	m_encoder = opus_encoder_create(48000, 2, OPUS_APPLICATION_VOIP, &iError);
+
+	m_repacketizer = opus_repacketizer_create();
+}
+
+CDiscordVoiceClient::~CDiscordVoiceClient()
+{
+	if (m_encoder)
+		opus_encoder_destroy(m_encoder);
+
+	if (m_repacketizer)
+		opus_repacketizer_destroy(m_repacketizer);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Module entry point
+
 void CDiscordProto::VoiceClientThread(void *param)
 {
 	auto *pCall = (CDiscordVoiceCall *)param;
@@ -24,4 +58,33 @@ void CDiscordProto::VoiceClientThread(void *param)
 
 	int nLoops = 0;
 	time_t lastLoopTime = time(0);
+
+	CDiscordVoiceClient vc(pCall);
+	do {
+		time_t currTime = time(0);
+		if (currTime - lastLoopTime > 3)
+			nLoops = 0;
+		
+		nLoops++;
+		if (nLoops > 5) {
+			debugLogA("Too many connection attempts, breaking websocket");
+			break;
+		}
+
+		lastLoopTime = currTime;
+		if (!vc.m_terminating) {
+			MHttpHeaders hdrs;
+			hdrs.AddHeader("Origin", "https://discord.com");
+
+			NLHR_PTR pReply(WebSocket_Connect(m_hGatewayNetlibUser, pCall->szEndpoint + "/?encoding=json&v=8", &hdrs));
+			if (pReply == nullptr) {
+				debugLogA("Gateway connection failed, exiting");
+				return;
+			}
+
+			SleepEx(5000, TRUE);
+		}
+
+	} while (!vc.m_terminating);
+
 }
-- 
cgit v1.2.3