summaryrefslogtreecommitdiff
path: root/protocols/Discord
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Discord')
-rw-r--r--protocols/Discord/src/stdafx.cxx4
-rw-r--r--protocols/Discord/src/stdafx.h2
-rw-r--r--protocols/Discord/src/voice_client.cpp63
3 files changed, 68 insertions, 1 deletions
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);
+
}