mirror of
https://github.com/celisej567/abaddon.git
synced 2026-09-27 16:16:35 +03:00
add typing indicator with optional res/typing_indicator.gif
This commit is contained in:
@@ -590,6 +590,9 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
|
||||
case GatewayEvent::CHANNEL_RECIPIENT_REMOVE: {
|
||||
HandleGatewayChannelRecipientRemove(m);
|
||||
} break;
|
||||
case GatewayEvent::TYPING_START: {
|
||||
HandleGatewayTypingStart(m);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
@@ -871,6 +874,28 @@ void DiscordClient::HandleGatewayChannelRecipientRemove(const GatewayMessage &ms
|
||||
m_store.SetChannel(cur->ID, *cur);
|
||||
}
|
||||
|
||||
void DiscordClient::HandleGatewayTypingStart(const GatewayMessage &msg) {
|
||||
TypingStartObject data = msg.Data;
|
||||
Snowflake guild_id;
|
||||
if (data.GuildID.has_value()) {
|
||||
guild_id = *data.GuildID;
|
||||
} else {
|
||||
auto chan = m_store.GetChannel(data.ChannelID);
|
||||
if (chan.has_value() && chan->GuildID.has_value())
|
||||
guild_id = *chan->GuildID;
|
||||
}
|
||||
if (guild_id.IsValid() && data.Member.has_value()) {
|
||||
auto cur = m_store.GetGuildMember(guild_id, data.UserID);
|
||||
if (!cur.has_value()) {
|
||||
AddUserToGuild(data.UserID, guild_id);
|
||||
m_store.SetGuildMember(guild_id, data.UserID, *data.Member);
|
||||
}
|
||||
if (data.Member->User.has_value())
|
||||
m_store.SetUser(data.UserID, *data.Member->User);
|
||||
}
|
||||
m_signal_typing_start.emit(data.UserID, data.ChannelID);
|
||||
}
|
||||
|
||||
void DiscordClient::HandleGatewayReconnect(const GatewayMessage &msg) {
|
||||
m_signal_disconnected.emit(true);
|
||||
inflateEnd(&m_zstream);
|
||||
@@ -1091,6 +1116,7 @@ void DiscordClient::LoadEventMap() {
|
||||
m_event_map["MESSAGE_REACTION_REMOVE"] = GatewayEvent::MESSAGE_REACTION_REMOVE;
|
||||
m_event_map["CHANNEL_RECIPIENT_ADD"] = GatewayEvent::CHANNEL_RECIPIENT_ADD;
|
||||
m_event_map["CHANNEL_RECIPIENT_REMOVE"] = GatewayEvent::CHANNEL_RECIPIENT_REMOVE;
|
||||
m_event_map["TYPING_START"] = GatewayEvent::TYPING_START;
|
||||
}
|
||||
|
||||
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
|
||||
@@ -1164,3 +1190,7 @@ DiscordClient::type_signal_reaction_add DiscordClient::signal_reaction_add() {
|
||||
DiscordClient::type_signal_reaction_remove DiscordClient::signal_reaction_remove() {
|
||||
return m_signal_reaction_remove;
|
||||
}
|
||||
|
||||
DiscordClient::type_signal_typing_start DiscordClient::signal_typing_start() {
|
||||
return m_signal_typing_start;
|
||||
}
|
||||
|
||||
@@ -146,6 +146,7 @@ private:
|
||||
void HandleGatewayMessageReactionRemove(const GatewayMessage &msg);
|
||||
void HandleGatewayChannelRecipientAdd(const GatewayMessage &msg);
|
||||
void HandleGatewayChannelRecipientRemove(const GatewayMessage &msg);
|
||||
void HandleGatewayTypingStart(const GatewayMessage &msg);
|
||||
void HandleGatewayReconnect(const GatewayMessage &msg);
|
||||
void HeartbeatThread();
|
||||
void SendIdentify();
|
||||
@@ -212,6 +213,7 @@ public:
|
||||
typedef sigc::signal<void, Snowflake> type_signal_role_delete;
|
||||
typedef sigc::signal<void, Snowflake, Glib::ustring> type_signal_reaction_add;
|
||||
typedef sigc::signal<void, Snowflake, Glib::ustring> type_signal_reaction_remove;
|
||||
typedef sigc::signal<void, Snowflake, Snowflake> type_signal_typing_start; // user id, channel id
|
||||
typedef sigc::signal<void, bool> type_signal_disconnected; // bool true if reconnecting
|
||||
typedef sigc::signal<void> type_signal_connected;
|
||||
|
||||
@@ -231,6 +233,7 @@ public:
|
||||
type_signal_role_delete signal_role_delete();
|
||||
type_signal_reaction_add signal_reaction_add();
|
||||
type_signal_reaction_remove signal_reaction_remove();
|
||||
type_signal_typing_start signal_typing_start();
|
||||
type_signal_disconnected signal_disconnected();
|
||||
type_signal_connected signal_connected();
|
||||
|
||||
@@ -251,6 +254,7 @@ protected:
|
||||
type_signal_role_delete m_signal_role_delete;
|
||||
type_signal_reaction_add m_signal_reaction_add;
|
||||
type_signal_reaction_remove m_signal_reaction_remove;
|
||||
type_signal_typing_start m_signal_typing_start;
|
||||
type_signal_disconnected m_signal_disconnected;
|
||||
type_signal_connected m_signal_connected;
|
||||
};
|
||||
|
||||
@@ -239,3 +239,11 @@ void from_json(const nlohmann::json &j, ChannelRecipientRemove &m) {
|
||||
JS_D("user", m.User);
|
||||
JS_D("channel_id", m.ChannelID);
|
||||
}
|
||||
|
||||
void from_json(const nlohmann::json &j, TypingStartObject &m) {
|
||||
JS_D("channel_id", m.ChannelID);
|
||||
JS_O("guild_id", m.GuildID);
|
||||
JS_D("user_id", m.UserID);
|
||||
JS_D("timestamp", m.Timestamp);
|
||||
JS_O("member", m.Member);
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@ enum class GatewayEvent : int {
|
||||
MESSAGE_REACTION_REMOVE,
|
||||
CHANNEL_RECIPIENT_ADD,
|
||||
CHANNEL_RECIPIENT_REMOVE,
|
||||
TYPING_START,
|
||||
};
|
||||
|
||||
struct GatewayMessage {
|
||||
@@ -334,3 +335,13 @@ struct ChannelRecipientRemove {
|
||||
|
||||
friend void from_json(const nlohmann::json &j, ChannelRecipientRemove &m);
|
||||
};
|
||||
|
||||
struct TypingStartObject {
|
||||
Snowflake ChannelID;
|
||||
std::optional<Snowflake> GuildID;
|
||||
Snowflake UserID;
|
||||
uint64_t Timestamp;
|
||||
std::optional<GuildMember> Member;
|
||||
|
||||
friend void from_json(const nlohmann::json &j, TypingStartObject &m);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user