Added checks for non-user foreign keys in stores. Load/Saving stores' order is now based on table dependencies. Added ability to use chat message when using redemption.
This commit is contained in:
		| @@ -1,8 +1,8 @@ | ||||
| using System.Collections.Concurrent; | ||||
| using HermesSocketLibrary.db; | ||||
| using HermesSocketLibrary.Requests.Messages; | ||||
| using HermesSocketServer.Models; | ||||
| using HermesSocketServer.Store; | ||||
| using HermesSocketServer.Validators; | ||||
|  | ||||
| namespace HermesSocketServer.Services | ||||
| { | ||||
| @@ -10,15 +10,17 @@ namespace HermesSocketServer.Services | ||||
|     { | ||||
|         private readonly IStore<string, User> _users; | ||||
|         private readonly Database _database; | ||||
|         private readonly IStore<string, TTSVoice> _voices; | ||||
|         private readonly ServerConfiguration _configuration; | ||||
|         private readonly Serilog.ILogger _logger; | ||||
|         private readonly IDictionary<string, Channel> _channels; | ||||
|         private readonly object _lock; | ||||
|  | ||||
|         public ChannelManager(IStore<string, User> users, Database database, ServerConfiguration configuration, Serilog.ILogger logger) | ||||
|         public ChannelManager(IStore<string, User> users, Database database, IStore<string, TTSVoice> voices, ServerConfiguration configuration, Serilog.ILogger logger) | ||||
|         { | ||||
|             _users = users; | ||||
|             _database = database; | ||||
|             _voices = voices; | ||||
|             _configuration = configuration; | ||||
|             _logger = logger; | ||||
|             _channels = new ConcurrentDictionary<string, Channel>(); | ||||
| @@ -26,68 +28,74 @@ namespace HermesSocketServer.Services | ||||
|         } | ||||
|  | ||||
|  | ||||
|         public Task<Channel?> Add(string userId) | ||||
|         public async Task<Channel?> Add(string userId) | ||||
|         { | ||||
|             var user = _users.Get(userId); | ||||
|             if (user == null) | ||||
|                 return Task.FromResult<Channel?>(null); | ||||
|                 return null; | ||||
|  | ||||
|             lock (_lock) | ||||
|             return await Task.Run(() => | ||||
|             { | ||||
|                 if (_channels.ContainsKey(userId)) | ||||
|                     return Task.FromResult<Channel?>(null); | ||||
|  | ||||
|                 var actionTable = _configuration.Database.Tables["Action"]; | ||||
|                 var chatterTable = _configuration.Database.Tables["Chatter"]; | ||||
|                 var connectionTable = _configuration.Database.Tables["Connection"]; | ||||
|                 //var chatterGroupTable = _configuration.Database.Tables["ChatterGroup"]; | ||||
|                 var groupTable = _configuration.Database.Tables["Group"]; | ||||
|                 var groupPermissionTable = _configuration.Database.Tables["GroupPermission"]; | ||||
|                 var policyTable = _configuration.Database.Tables["Policy"]; | ||||
|                 var redemptionTable = _configuration.Database.Tables["Redemption"]; | ||||
|                 var ttsFilterTable = _configuration.Database.Tables["TtsFilter"]; | ||||
|                 var ttsVoiceStateTable = _configuration.Database.Tables["VoiceState"]; | ||||
|  | ||||
|                 var chatters = new ChatterStore(userId, chatterTable, _database, _logger); | ||||
|                 var connections = new ConnectionStore(userId, connectionTable, _database, _logger); | ||||
|                 var groups = new GroupStore(userId, groupTable, _database, _configuration, _logger); | ||||
|                 var groupPermissions = new GroupPermissionStore(userId, groupPermissionTable, _database, _logger); | ||||
|                 var policies = new PolicyStore(userId, policyTable, _database, _logger); | ||||
|                 var filters = new TTSFilterStore(userId, ttsFilterTable, _database, _logger); | ||||
|                 var actions = new ActionStore(userId, actionTable, _database, _logger); | ||||
|                 var redemptions = new RedemptionStore(userId, redemptionTable, _database, _logger); | ||||
|                 var voiceStates = new VoiceStateStore(userId, new VoiceIdValidator(), ttsVoiceStateTable, _database, _logger); | ||||
|  | ||||
|                 Task.WaitAll([ | ||||
|                     chatters.Load(), | ||||
|                     connections.Load(), | ||||
|                     groups.Load(), | ||||
|                     groupPermissions.Load(), | ||||
|                     policies.Load(), | ||||
|                     filters.Load(), | ||||
|                     actions.Load(), | ||||
|                     redemptions.Load(), | ||||
|                     voiceStates.Save(), | ||||
|                 ]); | ||||
|  | ||||
|                 var channel = new Channel() | ||||
|                 lock (_lock) | ||||
|                 { | ||||
|                     Id = userId, | ||||
|                     User = user, | ||||
|                     Chatters = chatters, | ||||
|                     Connections = connections, | ||||
|                     Groups = groups, | ||||
|                     GroupPermissions = groupPermissions, | ||||
|                     Policies = policies, | ||||
|                     Filters = filters, | ||||
|                     Actions = actions, | ||||
|                     Redemptions = redemptions, | ||||
|                     VoiceStates = voiceStates, | ||||
|                 }; | ||||
|                     if (_channels.ContainsKey(userId)) | ||||
|                         return Task.FromResult<Channel?>(null); | ||||
|  | ||||
|                 _channels.Add(userId, channel); | ||||
|                 return Task.FromResult<Channel?>(channel); | ||||
|             } | ||||
|                     var actionTable = _configuration.Database.Tables["Action"]; | ||||
|                     var chatterTable = _configuration.Database.Tables["Chatter"]; | ||||
|                     var connectionTable = _configuration.Database.Tables["Connection"]; | ||||
|                     //var chatterGroupTable = _configuration.Database.Tables["ChatterGroup"]; | ||||
|                     var groupTable = _configuration.Database.Tables["Group"]; | ||||
|                     var groupPermissionTable = _configuration.Database.Tables["GroupPermission"]; | ||||
|                     var policyTable = _configuration.Database.Tables["Policy"]; | ||||
|                     var redemptionTable = _configuration.Database.Tables["Redemption"]; | ||||
|                     var ttsFilterTable = _configuration.Database.Tables["TtsFilter"]; | ||||
|                     var ttsVoiceStateTable = _configuration.Database.Tables["VoiceState"]; | ||||
|  | ||||
|                     var chatters = new ChatterStore(userId, chatterTable, _database, _logger); | ||||
|                     var connections = new ConnectionStore(userId, connectionTable, _database, _logger); | ||||
|                     var groups = new GroupStore(userId, groupTable, _database, _configuration, _logger); | ||||
|                     var groupPermissions = new GroupPermissionStore(userId, groupPermissionTable, groups, _database, _logger); | ||||
|                     var policies = new PolicyStore(userId, policyTable, groups, _database, _logger); | ||||
|                     var filters = new TTSFilterStore(userId, ttsFilterTable, _database, _logger); | ||||
|                     var actions = new ActionStore(userId, actionTable, _database, _logger); | ||||
|                     var redemptions = new RedemptionStore(userId, redemptionTable, actions, _database, _logger); | ||||
|                     var voiceStates = new VoiceStateStore(userId, ttsVoiceStateTable, _voices, _database, _logger); | ||||
|  | ||||
|                     var channel = new Channel() | ||||
|                     { | ||||
|                         Id = userId, | ||||
|                         User = user, | ||||
|                         Chatters = chatters, | ||||
|                         Connections = connections, | ||||
|                         Groups = groups, | ||||
|                         GroupPermissions = groupPermissions, | ||||
|                         Policies = policies, | ||||
|                         Filters = filters, | ||||
|                         Actions = actions, | ||||
|                         Redemptions = redemptions, | ||||
|                         VoiceStates = voiceStates, | ||||
|                     }; | ||||
|  | ||||
|                     Task.WaitAll([ | ||||
|                         channel.Actions.Load(), | ||||
|                         channel.Chatters.Load(), | ||||
|                         channel.Connections.Load(), | ||||
|                         channel.Groups.Load(), | ||||
|                         channel.Filters.Load(), | ||||
|                         channel.VoiceStates.Load(), | ||||
|                     ]); | ||||
|  | ||||
|                     Task.WaitAll([ | ||||
|                         channel.GroupPermissions.Load(), | ||||
|                         channel.Policies.Load(), | ||||
|                         channel.Redemptions.Load(), | ||||
|                     ]); | ||||
|  | ||||
|                     _channels.Add(userId, channel); | ||||
|                     return Task.FromResult<Channel?>(channel); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         public Channel? Get(string channelId) | ||||
| @@ -121,17 +129,25 @@ namespace HermesSocketServer.Services | ||||
|             foreach (var channel in _channels.Values) | ||||
|             { | ||||
|                 _logger.Debug($"Saving channel data to database [channel id: {channel.Id}][channel name: {channel.User.Name}]"); | ||||
|                 await Task.WhenAll([ | ||||
|                 var genericTablesTask = Task.WhenAll([ | ||||
|                     channel.Chatters.Save(), | ||||
|                     channel.Connections.Save(), | ||||
|                     channel.Filters.Save(), | ||||
|                     channel.VoiceStates.Save(), | ||||
|                 ]).ConfigureAwait(false); | ||||
|  | ||||
|                 await Task.WhenAll([ | ||||
|                     channel.Actions.Save(), | ||||
|                     channel.Groups.Save(), | ||||
|                 ]).ConfigureAwait(false); | ||||
|  | ||||
|                 await Task.WhenAll([ | ||||
|                     channel.GroupPermissions.Save(), | ||||
|                     channel.Policies.Save(), | ||||
|                     channel.Filters.Save(), | ||||
|                     channel.Actions.Save(), | ||||
|                     channel.Redemptions.Save(), | ||||
|                     channel.VoiceStates.Save(), | ||||
|                 ]); | ||||
|                 ]).ConfigureAwait(false); | ||||
|  | ||||
|                 await genericTablesTask; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
| using HermesSocketLibrary.db; | ||||
| using HermesSocketLibrary.Requests.Messages; | ||||
| using HermesSocketServer.Models; | ||||
| using HermesSocketServer.Store; | ||||
| @@ -24,10 +23,10 @@ namespace HermesSocketServer.Services | ||||
|  | ||||
|         protected override async Task ExecuteAsync(CancellationToken cancellationToken) | ||||
|         { | ||||
|             _logger.Information("Loading TTS voices..."); | ||||
|             await _voices.Load(); | ||||
|             _logger.Information("Loading users..."); | ||||
|             await _users.Load(); | ||||
|             _logger.Information("Loading TTS voices..."); | ||||
|             await _voices.Load(); | ||||
|  | ||||
|             await Task.Run(async () => | ||||
|             { | ||||
| @@ -35,11 +34,10 @@ namespace HermesSocketServer.Services | ||||
|  | ||||
|                 while (true) | ||||
|                 { | ||||
|                     await Task.WhenAll([ | ||||
|                         _voices.Save(), | ||||
|                         _users.Save(), | ||||
|                         _channels.Save(), | ||||
|                     ]); | ||||
|                     await _users.Save(); | ||||
|                     await _voices.Save(); | ||||
|                     await _channels.Save(); | ||||
|  | ||||
|                     await Task.Delay(TimeSpan.FromSeconds(_configuration.Database.SaveDelayInSeconds)); | ||||
|                 } | ||||
|             }); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user