summaryrefslogtreecommitdiff
path: root/src/discord/snowflake.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/discord/snowflake.cpp')
-rw-r--r--src/discord/snowflake.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/discord/snowflake.cpp b/src/discord/snowflake.cpp
index 6909a15..efa327d 100644
--- a/src/discord/snowflake.cpp
+++ b/src/discord/snowflake.cpp
@@ -1,7 +1,8 @@
#include "snowflake.hpp"
+#include "util.hpp"
+#include <chrono>
#include <ctime>
#include <iomanip>
-#include <chrono>
#include <glibmm.h>
constexpr static uint64_t DiscordEpochSeconds = 1420070400;
@@ -15,13 +16,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;
@@ -39,6 +40,16 @@ Snowflake Snowflake::FromNow() {
return snowflake;
}
+Snowflake Snowflake::FromISO8601(std::string_view ts) {
+ int yr, mon, day, hr, min, sec, tzhr, tzmin;
+ float milli;
+ 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<uint64_t>(milli * static_cast<float>(SecondsInterval));
+}
+
bool Snowflake::IsValid() const {
return m_num != Invalid;
}