summaryrefslogtreecommitdiff
path: root/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2020-10-05 21:37:07 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2020-10-05 21:37:07 -0400
commit0cdaea97dd035bcbf9d46b8a261b3eeaf4dea69c (patch)
treec340566dbccc77d2d3cb21b1290e01e5c1c0d9c4 /discord
parentcfcb0d4e662b960dcdd331a7c61dc2b9c614f930 (diff)
downloadabaddon-portaudio-0cdaea97dd035bcbf9d46b8a261b3eeaf4dea69c.tar.gz
abaddon-portaudio-0cdaea97dd035bcbf9d46b8a261b3eeaf4dea69c.zip
slap a bunch of shit everywhere until the crashing stops
Diffstat (limited to 'discord')
-rw-r--r--discord/discord.cpp16
-rw-r--r--discord/discord.hpp7
-rw-r--r--discord/http.cpp16
-rw-r--r--discord/http.hpp16
4 files changed, 44 insertions, 11 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp
index 4d43486..79f2886 100644
--- a/discord/discord.cpp
+++ b/discord/discord.cpp
@@ -5,6 +5,9 @@
DiscordClient::DiscordClient()
: m_http(DiscordAPI)
, m_decompress_buf(InflateChunkSize) {
+
+ m_msg_dispatch.connect(sigc::mem_fun(*this, &DiscordClient::MessageDispatch));
+
LoadEventMap();
}
@@ -396,7 +399,10 @@ void DiscordClient::HandleGatewayMessageRaw(std::string str) {
if (err != Z_OK) {
fprintf(stderr, "Error decompressing input buffer %d (%d/%d)\n", err, m_zstream.avail_in, m_zstream.avail_out);
} else {
- HandleGatewayMessage(std::string(m_decompress_buf.begin(), m_decompress_buf.begin() + m_zstream.total_out));
+ m_msg_mutex.lock();
+ m_msg_queue.push(std::string(m_decompress_buf.begin(), m_decompress_buf.begin() + m_zstream.total_out));
+ m_msg_dispatch.emit();
+ m_msg_mutex.unlock();
if (m_decompress_buf.size() > InflateChunkSize)
m_decompress_buf.resize(InflateChunkSize);
}
@@ -407,6 +413,14 @@ void DiscordClient::HandleGatewayMessageRaw(std::string str) {
m_compressed_buf.clear();
}
+void DiscordClient::MessageDispatch() {
+ m_msg_mutex.lock();
+ auto msg = m_msg_queue.front();
+ m_msg_queue.pop();
+ m_msg_mutex.unlock();
+ HandleGatewayMessage(msg);
+}
+
void DiscordClient::HandleGatewayMessage(std::string str) {
GatewayMessage m;
try {
diff --git a/discord/discord.hpp b/discord/discord.hpp
index 025d969..47486fb 100644
--- a/discord/discord.hpp
+++ b/discord/discord.hpp
@@ -11,6 +11,8 @@
#include <unordered_set>
#include <mutex>
#include <zlib.h>
+#include <glibmm.h>
+#include <queue>
// bruh
#ifdef GetMessage
@@ -147,6 +149,11 @@ private:
HeartbeatWaiter m_heartbeat_waiter;
std::atomic<bool> m_heartbeat_acked = true;
+ mutable std::mutex m_msg_mutex;
+ Glib::Dispatcher m_msg_dispatch;
+ std::queue<std::string> m_msg_queue;
+ void MessageDispatch();
+
// signals
public:
typedef sigc::signal<void> type_signal_gateway_ready;
diff --git a/discord/http.cpp b/discord/http.cpp
index b4a0f4b..4c9cf87 100644
--- a/discord/http.cpp
+++ b/discord/http.cpp
@@ -2,7 +2,9 @@
//#define USE_LOCAL_PROXY
HTTPClient::HTTPClient(std::string api_base)
- : m_api_base(api_base) {}
+ : m_api_base(api_base) {
+ m_dispatcher.connect(sigc::mem_fun(*this, &HTTPClient::RunCallbacks));
+}
void HTTPClient::SetAuth(std::string auth) {
m_authorization = auth;
@@ -98,10 +100,20 @@ void HTTPClient::CleanupFutures() {
}
}
+void HTTPClient::RunCallbacks() {
+ m_mutex.lock();
+ m_queue.front()();
+ m_queue.pop();
+ m_mutex.unlock();
+}
+
void HTTPClient::OnResponse(cpr::Response r, std::function<void(cpr::Response r)> cb) {
CleanupFutures();
try {
- cb(r);
+ m_mutex.lock();
+ m_queue.push([this, r, cb] { cb(r); });
+ m_dispatcher.emit();
+ m_mutex.unlock();
} catch (std::exception &e) {
fprintf(stderr, "error handling response (%s, code %d): %s\n", r.url.c_str(), r.status_code, e.what());
}
diff --git a/discord/http.hpp b/discord/http.hpp
index b8489f9..12667f7 100644
--- a/discord/http.hpp
+++ b/discord/http.hpp
@@ -5,14 +5,9 @@
#include <string>
#include <unordered_map>
#include <memory>
-
-template<typename F>
-void fire_and_forget(F &&func) {
- auto ptr = std::make_shared<std::future<void>>();
- *ptr = std::async(std::launch::async, [ptr, func]() {
- func();
- });
-}
+#include <mutex>
+#include <queue>
+#include <glibmm.h>
class HTTPClient {
public:
@@ -28,6 +23,11 @@ private:
void OnResponse(cpr::Response r, std::function<void(cpr::Response r)> cb);
void CleanupFutures();
+ mutable std::mutex m_mutex;
+ Glib::Dispatcher m_dispatcher;
+ std::queue<std::function<void()>> m_queue;
+ void RunCallbacks();
+
std::vector<std::future<void>> m_futures;
std::string m_api_base;
std::string m_authorization;