From 35d37cb82796224a62854e398f062514bc7bb309 Mon Sep 17 00:00:00 2001 From: Noikoio Date: Tue, 24 Apr 2018 14:29:19 -0700 Subject: [PATCH] Added first_seen column to user entity cache --- EntityCache/CacheUser.cs | 22 ++++++++++++++-------- EntityCache/SqlHelper.cs | 10 ++++------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/EntityCache/CacheUser.cs b/EntityCache/CacheUser.cs index 5277ab7..bdfd46c 100644 --- a/EntityCache/CacheUser.cs +++ b/EntityCache/CacheUser.cs @@ -16,7 +16,8 @@ namespace Noikoio.RegexBot.EntityCache { readonly ulong _userId; readonly ulong _guildId; - readonly DateTime _cacheDate; + readonly DateTimeOffset _cacheDate; + readonly DateTimeOffset _firstSeen; readonly string _username; readonly string _discriminator; readonly string _nickname; @@ -33,7 +34,11 @@ namespace Noikoio.RegexBot.EntityCache /// /// Timestamp value for when this cache item was last updated, in universal time. /// - public DateTime CacheDate => _cacheDate; + public DateTimeOffset CacheDate => _cacheDate; + /// + /// Timestamp value for when this user was first seen by the bot, in universal time. + /// + public DateTimeOffset FirstSeenDate => _firstSeen; /// /// Display name, including discriminator. Shows the nickname, if available. @@ -72,7 +77,7 @@ namespace Noikoio.RegexBot.EntityCache } // Double-check SqlHelper if making changes to this constant - const string QueryColumns = "user_id, guild_id, cache_date, username, discriminator, nickname, avatar_url"; + const string QueryColumns = "user_id, guild_id, first_seen, cache_date, username, discriminator, nickname, avatar_url"; private CacheUser(DbDataReader r) { // Double-check ordinals if making changes to QueryColumns @@ -82,11 +87,12 @@ namespace Noikoio.RegexBot.EntityCache _userId = (ulong)r.GetInt64(0); _guildId = (ulong)r.GetInt64(1); } - _cacheDate = r.GetDateTime(2).ToUniversalTime(); - _username = r.GetString(3); - _discriminator = r.GetString(4); - _nickname = r.IsDBNull(5) ? null : r.GetString(5); - _avatarUrl = r.IsDBNull(6) ? null : r.GetString(6); + _firstSeen = r.GetDateTime(2).ToUniversalTime(); + _cacheDate = r.GetDateTime(3).ToUniversalTime(); + _username = r.GetString(4); + _discriminator = r.GetString(5); + _nickname = r.IsDBNull(6) ? null : r.GetString(6); + _avatarUrl = r.IsDBNull(7) ? null : r.GetString(7); } public override string ToString() => DisplayName; diff --git a/EntityCache/SqlHelper.cs b/EntityCache/SqlHelper.cs index 4917a29..b3a3167 100644 --- a/EntityCache/SqlHelper.cs +++ b/EntityCache/SqlHelper.cs @@ -64,6 +64,7 @@ namespace Noikoio.RegexBot.EntityCache c.CommandText = "CREATE TABLE IF NOT EXISTS " + TableUser + " (" + "user_id bigint not null, " + $"guild_id bigint not null references {TableGuild}, " + + "first_seen timestamptz not null default now()," + "cache_date timestamptz not null, " + "username text not null, " + "discriminator text not null, " @@ -98,12 +99,11 @@ namespace Noikoio.RegexBot.EntityCache using (var c = db.CreateCommand()) { c.CommandText = "INSERT INTO " + TableGuild + " (guild_id, cache_date, current_name) " - + "VALUES (@GuildId, @Date, @CurrentName) " + + "VALUES (@GuildId, now(), @CurrentName) " + "ON CONFLICT (guild_id) DO UPDATE SET " + "current_name = EXCLUDED.current_name, cache_date = EXCLUDED.cache_date"; c.Parameters.Add("@GuildId", NpgsqlDbType.Bigint).Value = g.Id; c.Parameters.Add("@CurrentName", NpgsqlDbType.Text).Value = g.Name; - c.Parameters.Add("@Date", NpgsqlDbType.TimestampTZ).Value = DateTime.Now; c.Prepare(); await c.ExecuteNonQueryAsync(); } @@ -122,7 +122,7 @@ namespace Noikoio.RegexBot.EntityCache { c.CommandText = "INSERT INTO " + TableUser + " (user_id, guild_id, cache_date, username, discriminator, nickname, avatar_url)" - + " VALUES (@Uid, @Gid, @Date, @Uname, @Disc, @Nname, @Url) " + + " VALUES (@Uid, @Gid, now(), @Uname, @Disc, @Nname, @Url) " + "ON CONFLICT (user_id, guild_id) DO UPDATE SET " + "cache_date = EXCLUDED.cache_date, username = EXCLUDED.username, " + "discriminator = EXCLUDED.discriminator, " // I've seen someone's discriminator change this one time... @@ -130,7 +130,6 @@ namespace Noikoio.RegexBot.EntityCache var uid = c.Parameters.Add("@Uid", NpgsqlDbType.Bigint); var gid = c.Parameters.Add("@Gid", NpgsqlDbType.Bigint); - c.Parameters.Add("@Date", NpgsqlDbType.TimestampTZ).Value = DateTime.Now; var uname = c.Parameters.Add("@Uname", NpgsqlDbType.Text); var disc = c.Parameters.Add("@Disc", NpgsqlDbType.Text); var nname = c.Parameters.Add("@Nname", NpgsqlDbType.Text); @@ -168,13 +167,12 @@ namespace Noikoio.RegexBot.EntityCache { c.CommandText = "INSERT INTO " + TableTextChannel + " (channel_id, guild_id, cache_date, channel_name)" - + " VALUES (@Cid, @Gid, @Date, @Name) " + + " VALUES (@Cid, @Gid, now(), @Name) " + "ON CONFLICT (channel_id, guild_id) DO UPDATE SET " + "cache_date = EXCLUDED.cache_date, channel_name = EXCLUDED.channel_name"; var cid = c.Parameters.Add("@Cid", NpgsqlDbType.Bigint); var gid = c.Parameters.Add("@Gid", NpgsqlDbType.Bigint); - c.Parameters.Add("@Date", NpgsqlDbType.TimestampTZ).Value = DateTime.Now; var cname = c.Parameters.Add("@Name", NpgsqlDbType.Text); c.Prepare();