Add support for moderator list in GuildStateService
Completely forgot.
This commit is contained in:
parent
4de1e25230
commit
77b6aa891b
4 changed files with 47 additions and 7 deletions
|
@ -1,4 +1,5 @@
|
|||
using Discord.WebSocket;
|
||||
using Kerobot.Common;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
|
@ -134,6 +135,15 @@ namespace Kerobot
|
|||
if (result == null) return new BanKickResult(null, false, true);
|
||||
return await KickAsync(guild, source, result.UserID, reason, dmMsg);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the list of moderators defined in the current guild configuration.
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// An <see cref="EntityList"/> with corresponding moderator configuration data.
|
||||
/// In case none exists, an empty list will be returned.
|
||||
/// </returns>
|
||||
protected EntityList GetModerators(ulong guild) => Kerobot.GetModerators(guild);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Discord.WebSocket;
|
||||
using Kerobot.Common;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
|
@ -14,13 +15,14 @@ namespace Kerobot.Services.GuildState
|
|||
class GuildStateService : Service
|
||||
{
|
||||
private readonly object _storageLock = new object();
|
||||
private readonly Dictionary<ulong, Dictionary<Type, StateInfo>> _storage;
|
||||
private readonly Dictionary<ulong, EntityList> _moderators;
|
||||
private readonly Dictionary<ulong, Dictionary<Type, StateInfo>> _states;
|
||||
|
||||
const string GuildLogSource = "Configuration loader";
|
||||
|
||||
public GuildStateService(Kerobot kb) : base(kb)
|
||||
{
|
||||
_storage = new Dictionary<ulong, Dictionary<Type, StateInfo>>();
|
||||
_states = new Dictionary<ulong, Dictionary<Type, StateInfo>>();
|
||||
CreateDatabaseTablesAsync().Wait();
|
||||
|
||||
kb.DiscordClient.GuildAvailable += DiscordClient_GuildAvailable;
|
||||
|
@ -39,7 +41,7 @@ namespace Kerobot.Services.GuildState
|
|||
private Task DiscordClient_LeftGuild(SocketGuild arg)
|
||||
{
|
||||
// TODO what is GuildUnavailable? Should we listen for that too?
|
||||
lock (_storageLock) _storage.Remove(arg.Id);
|
||||
lock (_storageLock) _states.Remove(arg.Id);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
|
@ -62,6 +64,7 @@ namespace Kerobot.Services.GuildState
|
|||
}
|
||||
}
|
||||
|
||||
#region Data output
|
||||
/// <summary>
|
||||
/// See <see cref="ModuleBase.GetGuildState{T}(ulong)"/>.
|
||||
/// </summary>
|
||||
|
@ -69,7 +72,7 @@ namespace Kerobot.Services.GuildState
|
|||
{
|
||||
lock (_storageLock)
|
||||
{
|
||||
if (_storage.TryGetValue(guildId, out var tl))
|
||||
if (_states.TryGetValue(guildId, out var tl))
|
||||
{
|
||||
if (tl.TryGetValue(t, out var val))
|
||||
{
|
||||
|
@ -81,6 +84,19 @@ namespace Kerobot.Services.GuildState
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// See <see cref="ModuleBase.GetModerators(ulong)"/>.
|
||||
/// </summary>
|
||||
public EntityList RetrieveGuildModerators(ulong guildId)
|
||||
{
|
||||
lock (_storageLock)
|
||||
{
|
||||
if (_moderators.TryGetValue(guildId, out var mods)) return mods;
|
||||
else return new EntityList();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Guild-specific configuration begins processing here.
|
||||
/// Configuration is loaded from database, and appropriate sections dispatched to their
|
||||
|
@ -120,6 +136,10 @@ namespace Kerobot.Services.GuildState
|
|||
|
||||
// TODO Guild-specific service options? If implemented, this is where to load them.
|
||||
|
||||
// Load moderator list
|
||||
var mods = new EntityList(guildConf["Moderators"], true);
|
||||
|
||||
// Create guild state objects for all existing modules
|
||||
var newStates = new Dictionary<Type, StateInfo>();
|
||||
foreach (var mod in Kerobot.Modules)
|
||||
{
|
||||
|
@ -152,7 +172,11 @@ namespace Kerobot.Services.GuildState
|
|||
return false;
|
||||
}
|
||||
}
|
||||
lock (_storageLock) _storage[guildId] = newStates;
|
||||
lock (_storageLock)
|
||||
{
|
||||
_moderators[guildId] = mods;
|
||||
_states[guildId] = newStates;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using Kerobot.Services.GuildState;
|
||||
using Kerobot.Common;
|
||||
using Kerobot.Services.GuildState;
|
||||
using System;
|
||||
|
||||
namespace Kerobot
|
||||
|
@ -12,5 +13,10 @@ namespace Kerobot
|
|||
/// </summary>
|
||||
internal T GetGuildState<T>(ulong guild, Type type)
|
||||
=> _svcGuildState.RetrieveGuildStateObject<T>(guild, type);
|
||||
|
||||
/// <summary>
|
||||
/// See <see cref="ModuleBase.GetModerators(ulong)"/>.
|
||||
/// </summary>
|
||||
internal EntityList GetModerators(ulong guild) => _svcGuildState.RetrieveGuildModerators(guild);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ using System;
|
|||
namespace Kerobot.Services.GuildState
|
||||
{
|
||||
/// <summary>
|
||||
/// Contains the guild state object and other useful metadata in regards to it.
|
||||
/// Contains a guild state object and other useful metadata in regards to it.
|
||||
/// </summary>
|
||||
class StateInfo : IDisposable
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue