RegexBot/Modules-SelfHosted/EntryRole/GuildData.cs
Noikoio c1e8f6699a Moved EntryRole to self-hosted
As it's currently implemented, it may cause problems for larger guilds
if any error is encountered. Additionally, it requires that the bot keep
tabs on all users on entry which may bring unnecessary extra load on the
host.

Additionally, added some error handling.
2019-06-20 17:35:50 -07:00

81 lines
2.5 KiB
C#

using Kerobot.Common;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
namespace Kerobot.Modules.EntryRole
{
/// <summary>
/// Contains configuration data as well as per-guild timers for those awaiting role assignment.
/// </summary>
class GuildData
{
/// <summary>
/// Lock on self.
/// </summary>
public Dictionary<ulong, DateTimeOffset> WaitingList { get; }
/// <summary>
/// Role to apply.
/// </summary>
public EntityName TargetRole { get; }
/// <summary>
/// Time to wait until applying the role, in seconds.
/// </summary>
public int WaitTime { get; }
const int WaitTimeMax = 600; // 10 minutes
public GuildData(JObject conf) : this(conf, new Dictionary<ulong, DateTimeOffset>()) { }
public GuildData(JObject conf, Dictionary<ulong, DateTimeOffset> _waitingList)
{
WaitingList = _waitingList;
var cfgRole = conf["Role"]?.Value<string>();
if (string.IsNullOrWhiteSpace(cfgRole))
throw new ModuleLoadException("Role value not specified.");
try
{
TargetRole = new EntityName(cfgRole);
}
catch (ArgumentException)
{
throw new ModuleLoadException("Role config value was not properly specified to be a role.");
}
try
{
WaitTime = conf["WaitTime"].Value<int>();
}
catch (NullReferenceException)
{
throw new ModuleLoadException("WaitTime value not specified.");
}
catch (InvalidCastException)
{
throw new ModuleLoadException("WaitTime value must be a number.");
}
if (WaitTime > WaitTimeMax)
{
// don't silently correct it
throw new ModuleLoadException($"WaitTime value may not exceed {WaitTimeMax} seconds.");
}
if (WaitTime < 0)
{
throw new ModuleLoadException("WaitTime value may not be negative.");
}
}
public void WaitlistAdd(ulong userId)
{
lock (WaitingList) WaitingList.Add(userId, DateTimeOffset.UtcNow.AddSeconds(WaitTime));
}
public void WaitlistRemove(ulong userId)
{
lock (WaitingList) WaitingList.Remove(userId);
}
}
}