add typing indicator with optional res/typing_indicator.gif

This commit is contained in:
ouwou
2021-01-11 18:27:46 -05:00
parent def598941a
commit e8cbb9d3d1
10 changed files with 232 additions and 18 deletions

View File

@@ -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;
}

View File

@@ -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;
};

View File

@@ -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);
}

View File

@@ -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);
};