diff --git a/Feature/DBCache/DBCache.cs b/Feature/DBCache/EntityCache.cs similarity index 68% rename from Feature/DBCache/DBCache.cs rename to Feature/DBCache/EntityCache.cs index b882f98..03e6c59 100644 --- a/Feature/DBCache/DBCache.cs +++ b/Feature/DBCache/EntityCache.cs @@ -8,16 +8,16 @@ using System.Threading.Tasks; namespace Noikoio.RegexBot.Feature.DBCache { /// - /// Caches information regarding all incoming messages and all known guilds, channels, and users. + /// Caches information regarding all known guilds, channels, and users. /// The function of this feature should be transparent to the user, and thus no configuration is needed. /// - class DBCache : BotFeature + class EntityCache : BotFeature { private readonly DatabaseConfig _db; - public override string Name => "Database cache"; + public override string Name => nameof(EntityCache); - public DBCache(DiscordSocketClient client) : base(client) + public EntityCache(DiscordSocketClient client) : base(client) { _db = RegexBot.Config.Database; @@ -25,8 +25,6 @@ namespace Noikoio.RegexBot.Feature.DBCache client.GuildUpdated += Client_GuildUpdated; client.GuildMemberUpdated += Client_GuildMemberUpdated; // it may not be necessary to handle JoinedGuild, as GuildAvailable still provides info - client.MessageReceived += Client_MessageReceived; - //client.MessageUpdated += Client_MessageUpdated; } public override Task ProcessConfiguration(JToken configSection) => Task.FromResult(null); @@ -35,7 +33,6 @@ namespace Noikoio.RegexBot.Feature.DBCache // Guild _and_ guild member information has become available private async Task Client_GuildAvailable(SocketGuild arg) { - if (!_db.Enabled) return; await CreateCacheTables(arg.Id); @@ -47,7 +44,7 @@ namespace Noikoio.RegexBot.Feature.DBCache private async Task Client_GuildUpdated(SocketGuild arg1, SocketGuild arg2) { if (!_db.Enabled) return; - throw new NotImplementedException(); + await Task.Run(() => UpdateGuild(arg2)); } // Guild member information has changed @@ -56,28 +53,11 @@ namespace Noikoio.RegexBot.Feature.DBCache if (!_db.Enabled) return; await Task.Run(() => UpdateGuildMember(arg2)); } - - // A new message has been created - private async Task Client_MessageReceived(SocketMessage arg) - { - if (!_db.Enabled) return; - throw new NotImplementedException(); - } - - - //private Task Client_MessageUpdated(Discord.Cacheable arg1, SocketMessage arg2, ISocketMessageChannel arg3) - /* - * Edited messages seem to retain their ID. This is a problem. - * The point of this message cache was to have another feature be able to relay - * both the previous and current message at once. - * For now: Do nothing on updated messages. - */ #endregion #region Table setup const string TableGuild = "cache_guild"; const string TableUser = "cache_users"; - const string TableMessage = "cache_messages"; private async Task CreateCacheTables(ulong gid) { @@ -93,7 +73,7 @@ namespace Noikoio.RegexBot.Feature.DBCache using (var db = await _db.OpenConnectionAsync(gid)) { - Task c1, c2, c3; + Task c1, c2; // Uh... didn't think this through. For now this is a table that'll only ever have one column. // Got to rethink this in particular. @@ -120,24 +100,12 @@ namespace Noikoio.RegexBot.Feature.DBCache c2 = c.ExecuteNonQueryAsync(); } - using (var c = db.CreateCommand()) - { - c.CommandText = "CREATE TABLE IF NOT EXISTS " + TableMessage + "(" - + "snowflake bigint primary key, " - + "cache_date timestamptz not null, " - + "author bigint not null" - + ")"; - c3 = c.ExecuteNonQueryAsync(); - } - await c1; await c2; - await c3; } } #endregion - - #region Guild and user cache updates + private async Task UpdateGuild(SocketGuild g) { throw new NotImplementedException(); @@ -154,18 +122,5 @@ namespace Noikoio.RegexBot.Feature.DBCache var ml = new SocketGuildUser[] { user }; return UpdateGuildMember(gid, ml); } - #endregion - - #region Message cache - private async Task CacheMessage(SocketMessage msg) - { - throw new NotImplementedException(); - } - - private async Task UpdateMessage(SocketMessage msg) - { - throw new NotImplementedException(); - } - #endregion } } diff --git a/Feature/DBCache/MessageCache.cs b/Feature/DBCache/MessageCache.cs new file mode 100644 index 0000000..f2c4b9a --- /dev/null +++ b/Feature/DBCache/MessageCache.cs @@ -0,0 +1,90 @@ +using Discord.WebSocket; +using Newtonsoft.Json.Linq; +using Noikoio.RegexBot.ConfigItem; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Noikoio.RegexBot.Feature.DBCaches +{ + /// + /// Caches information regarding all incoming messages. + /// The function of this feature should be transparent to the user, and thus no configuration is needed. + /// + class MessageCache : BotFeature + { + private readonly DatabaseConfig _db; + + public override string Name => nameof(MessageCache); + + #region Table setup + const string TableGuild = "cache_guild"; + const string TableUser = "cache_users"; + const string TableMessage = "cache_messages"; + + public MessageCache(DiscordSocketClient client) : base(client) + { + _db = RegexBot.Config.Database; + + client.MessageReceived += Client_MessageReceived; + //client.MessageUpdated += Client_MessageUpdated; + } + + public override Task ProcessConfiguration(JToken configSection) => Task.FromResult(null); + + #region Event handling + // A new message has been created + private async Task Client_MessageReceived(SocketMessage arg) + { + if (!_db.Enabled) return; + throw new NotImplementedException(); + } + + //private Task Client_MessageUpdated(Discord.Cacheable arg1, SocketMessage arg2, ISocketMessageChannel arg3) + /* + * Edited messages seem to retain their ID. This is a problem. + * The point of this message cache was to have another feature be able to relay + * both the previous and current message at once. + * For now: Do nothing on updated messages. + */ + #endregion + + private async Task CreateCacheTables(ulong gid) + { + /* Note: + * We save information per guild in their own schemas named "g_NUM", where NUM is the Guild ID. + * + * The creation of these schemas is handled within here, but we're possibly facing a short delay + * in the event that other events that we're listening for come in without a schema having been + * created yet in which to put them in. + * Got to figure that out. + */ + await _db.CreateGuildSchemaAsync(gid); + + using (var db = await _db.OpenConnectionAsync(gid)) + { + using (var c = db.CreateCommand()) + { + c.CommandText = "CREATE TABLE IF NOT EXISTS " + TableMessage + "(" + + "snowflake bigint primary key, " + + "cache_date timestamptz not null, " + + "author bigint not null" + + ")"; + await c.ExecuteNonQueryAsync(); + } + } + } + #endregion + + private async Task CacheMessage(SocketMessage msg) + { + throw new NotImplementedException(); + } + + private async Task UpdateMessage(SocketMessage msg) + { + throw new NotImplementedException(); + } + } +} diff --git a/RegexBot.cs b/RegexBot.cs index c68d0e2..25f5fd7 100644 --- a/RegexBot.cs +++ b/RegexBot.cs @@ -48,7 +48,8 @@ namespace Noikoio.RegexBot new Feature.AutoMod.AutoMod(_client), new Feature.ModTools.ModTools(_client), new Feature.AutoRespond.AutoRespond(_client), - new Feature.DBCache.DBCache(_client) + new Feature.DBCache.EntityCache(_client), + new Feature.DBCache.MessageCache(_client) }; var dlog = Logger.GetLogger("Discord.Net"); _client.Log += async (arg) =>