From 41d80af128cc74e538a2f5d2474ca49febc52c35 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 25 Dec 2021 02:37:31 -0500 Subject: mark more channels as unread properly --- src/discord/snowflake.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/discord/snowflake.cpp') diff --git a/src/discord/snowflake.cpp b/src/discord/snowflake.cpp index cea9153..32f9f4f 100644 --- a/src/discord/snowflake.cpp +++ b/src/discord/snowflake.cpp @@ -1,7 +1,8 @@ #include "snowflake.hpp" +#include "util.hpp" +#include #include #include -#include constexpr static uint64_t DiscordEpochSeconds = 1420070400; @@ -14,13 +15,13 @@ Snowflake::Snowflake(uint64_t n) : m_num(n) {} Snowflake::Snowflake(const std::string &str) { - if (str.size()) + if (!str.empty()) m_num = std::stoull(str); else m_num = Invalid; } Snowflake::Snowflake(const Glib::ustring &str) { - if (str.size()) + if (!str.empty()) m_num = std::strtoull(str.c_str(), nullptr, 10); else m_num = Invalid; @@ -38,6 +39,14 @@ Snowflake Snowflake::FromNow() { return snowflake; } +Snowflake Snowflake::FromISO8601(std::string_view ts) { + int yr, mon, day, hr, min, sec, tzhr, tzmin; + float milli; + std::sscanf(ts.data(), "%d-%d-%dT%d:%d:%d%f+%d:%d", + &yr, &mon, &day, &hr, &min, &sec, &milli, &tzhr, &tzmin); + return SecondsInterval * (util::TimeToEpoch(yr, mon, day, hr, min, sec) - DiscordEpochSeconds) + static_cast(milli * static_cast(SecondsInterval)); +} + bool Snowflake::IsValid() const { return m_num != Invalid; } -- cgit v1.2.3 From d6da646d879a1b7f0ea2d09db2b266e3b6d0f3fa Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Wed, 29 Dec 2021 22:15:04 -0500 Subject: validate iso8601 when parsing to snowflake --- src/discord/discord.cpp | 6 +++--- src/discord/snowflake.cpp | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) (limited to 'src/discord/snowflake.cpp') diff --git a/src/discord/discord.cpp b/src/discord/discord.cpp index 8c5ec93..7b0db38 100644 --- a/src/discord/discord.cpp +++ b/src/discord/discord.cpp @@ -1923,7 +1923,7 @@ void DiscordClient::HandleGatewayUserGuildSettingsUpdate(const GatewayMessage &m if (override.Muted) { if (override.MuteConfig.EndTime.has_value()) { const auto end = Snowflake::FromISO8601(*override.MuteConfig.EndTime); - if (end > now) + if (end.IsValid() && end > now) now_muted_channels.insert(override.ChannelID); } else { now_muted_channels.insert(override.ChannelID); @@ -2325,7 +2325,7 @@ void DiscordClient::HandleReadyGuildSettings(const ReadyEventData &data) { if (entry.Muted) { if (entry.MuteConfig.EndTime.has_value()) { const auto end = Snowflake::FromISO8601(*entry.MuteConfig.EndTime); - if (end > now) + if (end.IsValid() && end > now) m_muted_guilds.insert(entry.GuildID); } else { m_muted_guilds.insert(entry.GuildID); @@ -2335,7 +2335,7 @@ void DiscordClient::HandleReadyGuildSettings(const ReadyEventData &data) { if (override.Muted) { if (override.MuteConfig.EndTime.has_value()) { const auto end = Snowflake::FromISO8601(*override.MuteConfig.EndTime); - if (end > now) + if (end.IsValid() && end > now) m_muted_channels.insert(override.ChannelID); } else { m_muted_channels.insert(override.ChannelID); diff --git a/src/discord/snowflake.cpp b/src/discord/snowflake.cpp index 32f9f4f..8f470a7 100644 --- a/src/discord/snowflake.cpp +++ b/src/discord/snowflake.cpp @@ -42,9 +42,11 @@ Snowflake Snowflake::FromNow() { Snowflake Snowflake::FromISO8601(std::string_view ts) { int yr, mon, day, hr, min, sec, tzhr, tzmin; float milli; - std::sscanf(ts.data(), "%d-%d-%dT%d:%d:%d%f+%d:%d", - &yr, &mon, &day, &hr, &min, &sec, &milli, &tzhr, &tzmin); - return SecondsInterval * (util::TimeToEpoch(yr, mon, day, hr, min, sec) - DiscordEpochSeconds) + static_cast(milli * static_cast(SecondsInterval)); + if (std::sscanf(ts.data(), "%d-%d-%dT%d:%d:%d%f+%d:%d", + &yr, &mon, &day, &hr, &min, &sec, &milli, &tzhr, &tzmin) != 9) return Snowflake::Invalid; + const auto epoch = util::TimeToEpoch(yr, mon, day, hr, min, sec); + if (epoch < DiscordEpochSeconds) return Snowflake::Invalid; + return SecondsInterval * (epoch - DiscordEpochSeconds) + static_cast(milli * static_cast(SecondsInterval)); } bool Snowflake::IsValid() const { -- cgit v1.2.3