manage emojis

This commit is contained in:
ouwou
2021-03-17 23:55:41 -04:00
parent 65943b4bd7
commit 60404783bd
15 changed files with 565 additions and 8 deletions

View File

@@ -616,6 +616,21 @@ void DiscordClient::ModifyRolePosition(Snowflake guild_id, Snowflake role_id, in
});
}
void DiscordClient::ModifyEmojiName(Snowflake guild_id, Snowflake emoji_id, const Glib::ustring &name, sigc::slot<void(bool success)> callback) {
ModifyGuildEmojiObject obj;
obj.Name = name;
m_http.MakePATCH("/guilds/" + std::to_string(guild_id) + "/emojis/" + std::to_string(emoji_id), nlohmann::json(obj).dump(), [this, callback](const http::response_type &response) {
callback(CheckCode(response));
});
}
void DiscordClient::DeleteEmoji(Snowflake guild_id, Snowflake emoji_id, sigc::slot<void(bool success)> callback) {
m_http.MakeDELETE("/guilds/" + std::to_string(guild_id) + "/emojis/" + std::to_string(emoji_id), [this, callback](const http::response_type &response) {
callback(CheckCode(response, 204));
});
}
bool DiscordClient::CanModifyRole(Snowflake guild_id, Snowflake role_id, Snowflake user_id) const {
const auto guild = *GetGuild(guild_id);
if (guild.OwnerID == user_id) return true;
@@ -687,6 +702,18 @@ void DiscordClient::FetchAuditLog(Snowflake guild_id, sigc::slot<void(AuditLogDa
});
}
void DiscordClient::FetchGuildEmojis(Snowflake guild_id, sigc::slot<void(std::vector<EmojiData>)> callback) {
m_http.MakeGET("/guilds/" + std::to_string(guild_id) + "/emojis", [this, callback](const http::response_type &response) {
if (!CheckCode(response)) return;
auto emojis = nlohmann::json::parse(response.text).get<std::vector<EmojiData>>();
m_store.BeginTransaction();
for (const auto &emoji : emojis)
m_store.SetEmoji(emoji.ID, emoji);
m_store.EndTransaction();
callback(std::move(emojis));
});
}
void DiscordClient::FetchUserProfile(Snowflake user_id, sigc::slot<void(UserProfileData)> callback) {
m_http.MakeGET("/users/" + std::to_string(user_id) + "/profile", [this, callback](const http::response_type &response) {
if (!CheckCode(response)) return;
@@ -919,6 +946,9 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
case GatewayEvent::READY_SUPPLEMENTAL: {
HandleGatewayReadySupplemental(m);
} break;
case GatewayEvent::GUILD_EMOJIS_UPDATE: {
HandleGatewayGuildEmojisUpdate(m);
} break;
}
} break;
default:
@@ -1317,6 +1347,20 @@ void DiscordClient::HandleGatewayUserNoteUpdate(const GatewayMessage &msg) {
m_signal_note_update.emit(data.ID, data.Note);
}
void DiscordClient::HandleGatewayGuildEmojisUpdate(const GatewayMessage &msg) {
// like the real client, the emoji data sent in this message is ignored
// we just use it as a signal to re-request all emojis
GuildEmojisUpdateObject data = msg.Data;
const auto cb = [this, id = data.GuildID](const std::vector<EmojiData> &emojis) {
m_store.BeginTransaction();
for (const auto &emoji : emojis)
m_store.SetEmoji(emoji.ID, emoji);
m_store.EndTransaction();
m_signal_guild_emojis_update.emit(id, emojis);
};
FetchGuildEmojis(data.GuildID, cb);
}
void DiscordClient::HandleGatewayReadySupplemental(const GatewayMessage &msg) {
ReadySupplementalData data = msg.Data;
for (const auto &p : data.MergedPresences.Friends) {
@@ -1637,6 +1681,7 @@ void DiscordClient::LoadEventMap() {
m_event_map["INVITE_DELETE"] = GatewayEvent::INVITE_DELETE;
m_event_map["USER_NOTE_UPDATE"] = GatewayEvent::USER_NOTE_UPDATE;
m_event_map["READY_SUPPLEMENTAL"] = GatewayEvent::READY_SUPPLEMENTAL;
m_event_map["GUILD_EMOJIS_UPDATE"] = GatewayEvent::GUILD_EMOJIS_UPDATE;
}
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
@@ -1742,3 +1787,7 @@ DiscordClient::type_signal_presence_update DiscordClient::signal_presence_update
DiscordClient::type_signal_note_update DiscordClient::signal_note_update() {
return m_signal_note_update;
}
DiscordClient::type_signal_guild_emojis_update DiscordClient::signal_guild_emojis_update() {
return m_signal_guild_emojis_update;
}

View File

@@ -129,6 +129,8 @@ public:
void ModifyRoleColor(Snowflake guild_id, Snowflake role_id, uint32_t color, sigc::slot<void(bool success)> callback);
void ModifyRoleColor(Snowflake guild_id, Snowflake role_id, Gdk::RGBA color, sigc::slot<void(bool success)> callback);
void ModifyRolePosition(Snowflake guild_id, Snowflake role_id, int position, sigc::slot<void(bool success)> callback);
void ModifyEmojiName(Snowflake guild_id, Snowflake emoji_id, const Glib::ustring &name, sigc::slot<void(bool success)> callback);
void DeleteEmoji(Snowflake guild_id, Snowflake emoji_id, sigc::slot<void(bool success)> callback);
bool CanModifyRole(Snowflake guild_id, Snowflake role_id) const;
bool CanModifyRole(Snowflake guild_id, Snowflake role_id, Snowflake user_id) const;
@@ -153,6 +155,8 @@ public:
void FetchAuditLog(Snowflake guild_id, sigc::slot<void(AuditLogData)> callback);
void FetchGuildEmojis(Snowflake guild_id, sigc::slot<void(std::vector<EmojiData>)> callback);
void FetchUserProfile(Snowflake user_id, sigc::slot<void(UserProfileData)> callback);
void FetchUserNote(Snowflake user_id, sigc::slot<void(std::string note)> callback);
void SetUserNote(Snowflake user_id, std::string note);
@@ -204,6 +208,7 @@ private:
void HandleGatewayInviteCreate(const GatewayMessage &msg);
void HandleGatewayInviteDelete(const GatewayMessage &msg);
void HandleGatewayUserNoteUpdate(const GatewayMessage &msg);
void HandleGatewayGuildEmojisUpdate(const GatewayMessage &msg);
void HandleGatewayReadySupplemental(const GatewayMessage &msg);
void HandleGatewayReconnect(const GatewayMessage &msg);
void HandleGatewayInvalidSession(const GatewayMessage &msg);
@@ -289,7 +294,8 @@ public:
typedef sigc::signal<void, InviteDeleteObject> type_signal_invite_delete;
typedef sigc::signal<void, Snowflake, PresenceStatus> type_signal_presence_update;
typedef sigc::signal<void, Snowflake, std::string> type_signal_note_update;
typedef sigc::signal<void, bool, GatewayCloseCode> type_signal_disconnected; // bool true if reconnecting
typedef sigc::signal<void, Snowflake, std::vector<EmojiData>> type_signal_guild_emojis_update; // guild id
typedef sigc::signal<void, bool, GatewayCloseCode> type_signal_disconnected; // bool true if reconnecting
typedef sigc::signal<void> type_signal_connected;
type_signal_gateway_ready signal_gateway_ready();
@@ -316,6 +322,7 @@ public:
type_signal_invite_delete signal_invite_delete(); // safe to assume guild id is set
type_signal_presence_update signal_presence_update();
type_signal_note_update signal_note_update();
type_signal_guild_emojis_update signal_guild_emojis_update();
type_signal_disconnected signal_disconnected();
type_signal_connected signal_connected();
@@ -344,6 +351,7 @@ protected:
type_signal_invite_delete m_signal_invite_delete;
type_signal_presence_update m_signal_presence_update;
type_signal_note_update m_signal_note_update;
type_signal_guild_emojis_update m_signal_guild_emojis_update;
type_signal_disconnected m_signal_disconnected;
type_signal_connected m_signal_connected;
};

View File

@@ -28,10 +28,24 @@ void to_json(nlohmann::json &j, const EmojiData &m) {
JS_IF("available", m.IsAvailable);
}
std::string EmojiData::GetURL() const {
return "https://cdn.discordapp.com/emojis/" + std::to_string(ID) + ".png";
std::string EmojiData::GetURL(const char *ext, const char *size) const {
if (size != nullptr)
return "https://cdn.discordapp.com/emojis/" + std::to_string(ID) + "." + ext + "?size=" + size;
else
return "https://cdn.discordapp.com/emojis/" + std::to_string(ID) + "." + ext;
}
std::string EmojiData::URLFromID(std::string emoji_id, std::string ext) {
return "https://cdn.discordapp.com/emojis/" + emoji_id + "." + ext;
std::string EmojiData::URLFromID(const std::string &emoji_id, const char *ext, const char *size) {
if (size != nullptr)
return "https://cdn.discordapp.com/emojis/" + emoji_id + "." + ext + "?size=" + size;
else
return "https://cdn.discordapp.com/emojis/" + emoji_id + "." + ext;
}
std::string EmojiData::URLFromID(Snowflake emoji_id, const char *ext, const char *size) {
return URLFromID(std::to_string(emoji_id), ext, size);
}
std::string EmojiData::URLFromID(const Glib::ustring &emoji_id, const char *ext, const char *size) {
return URLFromID(emoji_id.raw(), ext, size);
}

View File

@@ -18,6 +18,8 @@ struct EmojiData {
friend void from_json(const nlohmann::json &j, EmojiData &m);
friend void to_json(nlohmann::json &j, const EmojiData &m);
std::string GetURL() const;
static std::string URLFromID(std::string emoji_id, std::string ext = "png");
std::string GetURL(const char *ext = "png", const char *size = nullptr) const;
static std::string URLFromID(const std::string &emoji_id, const char *ext = "png", const char *size = nullptr);
static std::string URLFromID(Snowflake emoji_id, const char *ext = "png", const char *size = nullptr);
static std::string URLFromID(const Glib::ustring &emoji_id, const char *ext = "png", const char *size = nullptr);
};

View File

@@ -386,3 +386,11 @@ void to_json(nlohmann::json &j, const ModifyGuildRolePositionsObject::PositionPa
void to_json(nlohmann::json &j, const ModifyGuildRolePositionsObject &m) {
j = m.Positions;
}
void from_json(const nlohmann::json &j, GuildEmojisUpdateObject &m) {
JS_D("guild_id", m.GuildID);
}
void to_json(nlohmann::json &j, const ModifyGuildEmojiObject &m) {
JS_IF("name", m.Name);
}

View File

@@ -64,6 +64,7 @@ enum class GatewayEvent : int {
INVITE_DELETE,
USER_NOTE_UPDATE,
READY_SUPPLEMENTAL,
GUILD_EMOJIS_UPDATE,
};
enum class GatewayCloseCode : uint16_t {
@@ -539,3 +540,18 @@ struct ModifyGuildRolePositionsObject {
friend void to_json(nlohmann::json &j, const ModifyGuildRolePositionsObject &m);
};
struct GuildEmojisUpdateObject {
Snowflake GuildID;
// std::vector<EmojiData> Emojis;
// GuildHashes, undocumented
friend void from_json(const nlohmann::json &j, GuildEmojisUpdateObject &m);
};
struct ModifyGuildEmojiObject {
std::optional<std::string> Name;
// std::optional<std::vector<Snowflake>> Roles;
friend void to_json(nlohmann::json &j, const ModifyGuildEmojiObject &m);
};