summaryrefslogtreecommitdiff
path: root/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-01-24 22:24:03 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-01-24 22:24:03 -0500
commit3923acd0dd7adef1710bfa039eb22454d9d551dd (patch)
treec81f9dd18f4bb6b0822b1fee21b34a87a4039eb1 /discord
parentcfa6607fc88b25fa74969e5407d4467ea9900444 (diff)
downloadabaddon-portaudio-3923acd0dd7adef1710bfa039eb22454d9d551dd.tar.gz
abaddon-portaudio-3923acd0dd7adef1710bfa039eb22454d9d551dd.zip
add viewing audit log
Diffstat (limited to 'discord')
-rw-r--r--discord/auditlog.cpp34
-rw-r--r--discord/auditlog.hpp111
-rw-r--r--discord/discord.cpp16
-rw-r--r--discord/discord.hpp2
-rw-r--r--discord/objects.hpp1
-rw-r--r--discord/user.cpp4
-rw-r--r--discord/user.hpp1
-rw-r--r--discord/webhook.cpp13
-rw-r--r--discord/webhook.hpp24
9 files changed, 206 insertions, 0 deletions
diff --git a/discord/auditlog.cpp b/discord/auditlog.cpp
new file mode 100644
index 0000000..5f3cde5
--- /dev/null
+++ b/discord/auditlog.cpp
@@ -0,0 +1,34 @@
+#include "auditlog.hpp"
+
+void from_json(const nlohmann::json &j, AuditLogChange &m) {
+ JS_D("key", m.Key);
+ JS_O("old_value", m.OldValue);
+ JS_O("new_value", m.NewValue);
+}
+
+void from_json(const nlohmann::json &j, AuditLogOptions &m) {
+ JS_O("delete_member_days", m.DeleteMemberDays);
+ JS_O("members_removed", m.MembersRemoved);
+ JS_O("channel_id", m.ChannelID);
+ JS_O("message_id", m.MessageID);
+ JS_O("count", m.Count);
+ JS_O("id", m.ID);
+ JS_O("type", m.Type);
+ JS_O("role_name", m.RoleName);
+}
+
+void from_json(const nlohmann::json &j, AuditLogEntry &m) {
+ JS_N("target_id", m.TargetID);
+ JS_O("changes", m.Changes);
+ JS_D("user_id", m.UserID);
+ JS_D("id", m.ID);
+ JS_D("action_type", m.Type);
+ JS_O("options", m.Options);
+ JS_O("reason", m.Reason);
+}
+
+void from_json(const nlohmann::json &j, AuditLogData &m) {
+ JS_D("audit_log_entries", m.Entries);
+ JS_D("users", m.Users);
+ JS_D("webhooks", m.Webhooks);
+}
diff --git a/discord/auditlog.hpp b/discord/auditlog.hpp
new file mode 100644
index 0000000..c6ce0cc
--- /dev/null
+++ b/discord/auditlog.hpp
@@ -0,0 +1,111 @@
+#pragma once
+#include "snowflake.hpp"
+#include "user.hpp"
+#include "json.hpp"
+#include "webhook.hpp"
+
+enum class AuditLogActionType {
+ GUILD_UPDATE = 1,
+ CHANNEL_CREATE = 10,
+ CHANNEL_UPDATE = 11,
+ CHANNEL_DELETE = 12,
+ CHANNEL_OVERWRITE_CREATE = 13,
+ CHANNEL_OVERWRITE_UPDATE = 14,
+ CHANNEL_OVERWRITE_DELETE = 15,
+ MEMBER_KICK = 20,
+ MEMBER_PRUNE = 21,
+ MEMBER_BAN_ADD = 22,
+ MEMBER_BAN_REMOVE = 23,
+ MEMBER_UPDATE = 24,
+ MEMBER_ROLE_UPDATE = 25,
+ MEMBER_MOVE = 26,
+ MEMBER_DISCONNECT = 27,
+ BOT_ADD = 28,
+ ROLE_CREATE = 30,
+ ROLE_UPDATE = 31,
+ ROLE_DELETE = 32,
+ INVITE_CREATE = 40,
+ INVITE_UPDATE = 41,
+ INVITE_DELETE = 42,
+ WEBHOOK_CREATE = 50,
+ WEBHOOK_UPDATE = 51,
+ WEBHOOK_DELETE = 52,
+ EMOJI_CREATE = 60,
+ EMOJI_UPDATE = 61,
+ EMOJI_DELETE = 62,
+ MESSAGE_DELETE = 72,
+ MESSAGE_BULK_DELETE = 73,
+ MESSAGE_PIN = 74,
+ MESSAGE_UNPIN = 75,
+ INTEGRATION_CREATE = 80,
+ INTEGRATION_UPDATE = 81,
+ INTEGRATION_DELETE = 82,
+};
+
+struct AuditLogChange {
+ std::string Key;
+ std::optional<nlohmann::json> OldValue;
+ std::optional<nlohmann::json> NewValue;
+
+ friend void from_json(const nlohmann::json &j, AuditLogChange &m);
+};
+
+struct AuditLogOptions {
+ std::optional<std::string> DeleteMemberDays; // MEMBER_PRUNE
+ std::optional<std::string> MembersRemoved; // MEMBER_PRUNE
+ std::optional<Snowflake> ChannelID; // MEMBER_MOVE, MESSAGE_PIN, MESSAGE_UNPIN, MESSAGE_DELETE
+ std::optional<Snowflake> MessageID; // MESSAGE_PIN, MESSAGE_UNPIN,
+ std::optional<std::string> Count; // MESSAGE_DELETE, MESSAGE_BULK_DELETE, MEMBER_DISCONNECT, MEMBER_MOVE
+ std::optional<Snowflake> ID; // CHANNEL_OVERWRITE_CREATE, CHANNEL_OVERWRITE_UPDATE, CHANNEL_OVERWRITE_DELETE
+ std::optional<std::string> Type; // CHANNEL_OVERWRITE_CREATE, CHANNEL_OVERWRITE_UPDATE, CHANNEL_OVERWRITE_DELETE
+ std::optional<std::string> RoleName; // CHANNEL_OVERWRITE_CREATE, CHANNEL_OVERWRITE_UPDATE, CHANNEL_OVERWRITE_DELETE
+
+ friend void from_json(const nlohmann::json &j, AuditLogOptions &m);
+};
+
+struct AuditLogEntry {
+ Snowflake ID;
+ std::string TargetID; // null
+ Snowflake UserID;
+ AuditLogActionType Type;
+ std::optional<std::string> Reason;
+ std::optional<std::vector<AuditLogChange>> Changes;
+ std::optional<AuditLogOptions> Options;
+
+ friend void from_json(const nlohmann::json &j, AuditLogEntry &m);
+
+ template<typename T>
+ std::optional<T> GetOldFromKey(const std::string &key) const;
+
+ template<typename T>
+ std::optional<T> GetNewFromKey(const std::string &key) const;
+};
+
+struct AuditLogData {
+ std::vector<AuditLogEntry> Entries;
+ std::vector<UserData> Users;
+ std::vector<WebhookData> Webhooks;
+ // std::vector<IntegrationData> Integrations;
+
+ friend void from_json(const nlohmann::json &j, AuditLogData &m);
+};
+
+template<typename T>
+inline std::optional<T> AuditLogEntry::GetOldFromKey(const std::string &key) const {
+ if (!Changes.has_value()) return std::nullopt;
+ for (const auto &change : *Changes)
+ if (change.Key == key && change.OldValue.has_value())
+ return change.OldValue->get<T>();
+
+ return std::nullopt;
+}
+
+template<typename T>
+inline std::optional<T> AuditLogEntry::GetNewFromKey(const std::string &key) const {
+ if (!Changes.has_value()) return std::nullopt;
+ for (const auto &change : *Changes)
+ if (change.Key == key && change.NewValue.has_value())
+ return change.NewValue->get<T>();
+
+ return std::nullopt;
+}
diff --git a/discord/discord.cpp b/discord/discord.cpp
index 75be116..9d1dd04 100644
--- a/discord/discord.cpp
+++ b/discord/discord.cpp
@@ -553,6 +553,22 @@ void DiscordClient::FetchGuildInvites(Snowflake guild_id, sigc::slot<void(std::v
});
}
+void DiscordClient::FetchAuditLog(Snowflake guild_id, sigc::slot<void(AuditLogData)> callback) {
+ sigc::signal<void, AuditLogData> signal;
+ signal.connect(callback);
+ m_http.MakeGET("/guilds/" + std::to_string(guild_id) + "/audit-logs", [this, callback](const http::response &response) {
+ if (!CheckCode(response)) return;
+ auto data = nlohmann::json::parse(response.text).get<AuditLogData>();
+
+ m_store.BeginTransaction();
+ for (const auto &user : data.Users)
+ m_store.SetUser(user.ID, user);
+ m_store.EndTransaction();
+
+ callback(data);
+ });
+}
+
void DiscordClient::UpdateToken(std::string token) {
if (!IsStarted()) {
m_token = token;
diff --git a/discord/discord.hpp b/discord/discord.hpp
index a6f5d99..025684a 100644
--- a/discord/discord.hpp
+++ b/discord/discord.hpp
@@ -127,6 +127,8 @@ public:
void FetchInvite(std::string code, sigc::slot<void(std::optional<InviteData>)> callback);
void FetchGuildInvites(Snowflake guild_id, sigc::slot<void(std::vector<InviteData>)> callback);
+ void FetchAuditLog(Snowflake guild_id, sigc::slot<void(AuditLogData)> callback);
+
void UpdateToken(std::string token);
void SetUserAgent(std::string agent);
diff --git a/discord/objects.hpp b/discord/objects.hpp
index 1f37ce9..575ee85 100644
--- a/discord/objects.hpp
+++ b/discord/objects.hpp
@@ -17,6 +17,7 @@
#include "activity.hpp"
#include "sticker.hpp"
#include "ban.hpp"
+#include "auditlog.hpp"
// most stuff below should just be objects that get processed and thrown away immediately
diff --git a/discord/user.cpp b/discord/user.cpp
index edaa701..443365d 100644
--- a/discord/user.cpp
+++ b/discord/user.cpp
@@ -21,6 +21,10 @@ std::string UserData::GetMention() const {
return "<@" + std::to_string(ID) + ">";
}
+std::string UserData::GetEscapedString() const {
+ return Glib::Markup::escape_text(Username) + "#" + Discriminator;
+}
+
void from_json(const nlohmann::json &j, UserData &m) {
JS_D("id", m.ID);
JS_D("username", m.Username);
diff --git a/discord/user.hpp b/discord/user.hpp
index 4672ea8..b82a07b 100644
--- a/discord/user.hpp
+++ b/discord/user.hpp
@@ -33,4 +33,5 @@ struct UserData {
std::string GetAvatarURL(std::string ext = "png", std::string size = "32") const;
Snowflake GetHoistedRole(Snowflake guild_id, bool with_color = false) const;
std::string GetMention() const;
+ std::string GetEscapedString() const;
};
diff --git a/discord/webhook.cpp b/discord/webhook.cpp
new file mode 100644
index 0000000..4e8b422
--- /dev/null
+++ b/discord/webhook.cpp
@@ -0,0 +1,13 @@
+#include "webhook.hpp"
+
+void from_json(const nlohmann::json &j, WebhookData &m) {
+ JS_D("id", m.ID);
+ JS_D("type", m.Type);
+ JS_O("guild_id", m.GuildID);
+ JS_D("channel_id", m.ChannelID);
+ JS_O("user", m.User);
+ JS_N("name", m.Name);
+ JS_N("avatar", m.Avatar);
+ JS_O("token", m.Token);
+ JS_N("application_id", m.ApplicationID);
+}
diff --git a/discord/webhook.hpp b/discord/webhook.hpp
new file mode 100644
index 0000000..f0214df
--- /dev/null
+++ b/discord/webhook.hpp
@@ -0,0 +1,24 @@
+#pragma once
+#include <optional>
+#include "json.hpp"
+#include "snowflake.hpp"
+#include "user.hpp"
+
+enum class WebhookType {
+ Incoming = 1,
+ ChannelFollower = 2,
+};
+
+struct WebhookData {
+ Snowflake ID;
+ WebhookType Type;
+ std::optional<Snowflake> GuildID;
+ Snowflake ChannelID;
+ std::optional<UserData> User;
+ std::string Name; // null
+ std::string Avatar; // null
+ std::optional<std::string> Token;
+ Snowflake ApplicationID; // null
+
+ friend void from_json(const nlohmann::json &j, WebhookData &m);
+};