diff --git a/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs b/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs index b64df312..8cfee39c 100644 --- a/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs @@ -19,41 +19,9 @@ namespace NadekoBot.Modules.Administration public class ServerGreetCommands : NadekoSubmodule { //make this to a field in the guildconfig table - private class GreetSettings - { - public int AutoDeleteGreetMessagesTimer { get; set; } - public int AutoDeleteByeMessagesTimer { get; set; } - - public ulong GreetMessageChannelId { get; set; } - public ulong ByeMessageChannelId { get; set; } - - public bool SendDmGreetMessage { get; set; } - public string DmGreetMessageText { get; set; } - - public bool SendChannelGreetMessage { get; set; } - public string ChannelGreetMessageText { get; set; } - - public bool SendChannelByeMessage { get; set; } - public string ChannelByeMessageText { get; set; } - - public static GreetSettings Create(GuildConfig g) => new GreetSettings() - { - AutoDeleteByeMessagesTimer = g.AutoDeleteByeMessagesTimer, - AutoDeleteGreetMessagesTimer = g.AutoDeleteGreetMessagesTimer, - GreetMessageChannelId = g.GreetMessageChannelId, - ByeMessageChannelId = g.ByeMessageChannelId, - SendDmGreetMessage = g.SendDmGreetMessage, - DmGreetMessageText = g.DmGreetMessageText, - SendChannelGreetMessage = g.SendChannelGreetMessage, - ChannelGreetMessageText = g.ChannelGreetMessageText, - SendChannelByeMessage = g.SendChannelByeMessage, - ChannelByeMessageText = g.ChannelByeMessageText, - }; - } private new static Logger _log { get; } - - private static ConcurrentDictionary guildConfigsCache { get; } + private static readonly GreetSettingsService greetService; static ServerGreetCommands() { @@ -61,25 +29,8 @@ namespace NadekoBot.Modules.Administration NadekoBot.Client.UserLeft += UserLeft; _log = LogManager.GetCurrentClassLogger(); - guildConfigsCache = new ConcurrentDictionary(NadekoBot.AllGuildConfigs.ToDictionary(g => g.GuildId, GreetSettings.Create)); - } - - private static GreetSettings GetOrAddSettingsForGuild(ulong guildId) - { - GreetSettings settings; - guildConfigsCache.TryGetValue(guildId, out settings); - - if (settings != null) - return settings; - - using (var uow = DbHandler.UnitOfWork()) - { - var gc = uow.GuildConfigs.For(guildId, set => set); - settings = GreetSettings.Create(gc); - } - - guildConfigsCache.TryAdd(guildId, settings); - return settings; + //todo di + greetService = NadekoBot.GreetSettingsService; } private static Task UserLeft(IGuildUser user) @@ -88,7 +39,7 @@ namespace NadekoBot.Modules.Administration { try { - var conf = GetOrAddSettingsForGuild(user.GuildId); + var conf = greetService.GetOrAddSettingsForGuild(user.GuildId); if (!conf.SendChannelByeMessage) return; var channel = (await user.Guild.GetTextChannelsAsync()).SingleOrDefault(c => c.Id == conf.ByeMessageChannelId); @@ -141,7 +92,7 @@ namespace NadekoBot.Modules.Administration { try { - var conf = GetOrAddSettingsForGuild(user.GuildId); + var conf = greetService.GetOrAddSettingsForGuild(user.GuildId); if (conf.SendChannelGreetMessage) { @@ -248,7 +199,7 @@ namespace NadekoBot.Modules.Administration conf.AutoDeleteGreetMessagesTimer = timer; var toAdd = GreetSettings.Create(conf); - guildConfigsCache.AddOrUpdate(id, toAdd, (key, old) => toAdd); + greetService.GuildConfigsCache.AddOrUpdate(id, toAdd, (key, old) => toAdd); await uow.CompleteAsync().ConfigureAwait(false); } @@ -259,7 +210,7 @@ namespace NadekoBot.Modules.Administration [RequireUserPermission(GuildPermission.ManageGuild)] public async Task Greet() { - var enabled = await ServerGreetCommands.SetGreet(Context.Guild.Id, Context.Channel.Id).ConfigureAwait(false); + var enabled = await greetService.SetGreet(Context.Guild.Id, Context.Channel.Id).ConfigureAwait(false); if (enabled) await ReplyConfirmLocalized("greet_on").ConfigureAwait(false); @@ -267,23 +218,6 @@ namespace NadekoBot.Modules.Administration await ReplyConfirmLocalized("greet_off").ConfigureAwait(false); } - private static async Task SetGreet(ulong guildId, ulong channelId, bool? value = null) - { - bool enabled; - using (var uow = DbHandler.UnitOfWork()) - { - var conf = uow.GuildConfigs.For(guildId, set => set); - enabled = conf.SendChannelGreetMessage = value ?? !conf.SendChannelGreetMessage; - conf.GreetMessageChannelId = channelId; - - var toAdd = GreetSettings.Create(conf); - guildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); - - await uow.CompleteAsync().ConfigureAwait(false); - } - return enabled; - } - [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageGuild)] @@ -300,41 +234,19 @@ namespace NadekoBot.Modules.Administration return; } - var sendGreetEnabled = ServerGreetCommands.SetGreetMessage(Context.Guild.Id, ref text); + var sendGreetEnabled = greetService.SetGreetMessage(Context.Guild.Id, ref text); await ReplyConfirmLocalized("greetmsg_new").ConfigureAwait(false); if (!sendGreetEnabled) await ReplyConfirmLocalized("greetmsg_enable", $"`{Prefix}greet`").ConfigureAwait(false); } - public static bool SetGreetMessage(ulong guildId, ref string message) - { - message = message?.SanitizeMentions(); - - if (string.IsNullOrWhiteSpace(message)) - throw new ArgumentNullException(nameof(message)); - - bool greetMsgEnabled; - using (var uow = DbHandler.UnitOfWork()) - { - var conf = uow.GuildConfigs.For(guildId, set => set); - conf.ChannelGreetMessageText = message; - greetMsgEnabled = conf.SendChannelGreetMessage; - - var toAdd = GreetSettings.Create(conf); - guildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); - - uow.Complete(); - } - return greetMsgEnabled; - } - [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageGuild)] public async Task GreetDm() { - var enabled = await ServerGreetCommands.SetGreetDm(Context.Guild.Id).ConfigureAwait(false); + var enabled = await greetService.SetGreetDm(Context.Guild.Id).ConfigureAwait(false); if (enabled) await ReplyConfirmLocalized("greetdm_on").ConfigureAwait(false); @@ -342,22 +254,6 @@ namespace NadekoBot.Modules.Administration await ReplyConfirmLocalized("greetdm_off").ConfigureAwait(false); } - private static async Task SetGreetDm(ulong guildId, bool? value = null) - { - bool enabled; - using (var uow = DbHandler.UnitOfWork()) - { - var conf = uow.GuildConfigs.For(guildId, set => set); - enabled = conf.SendDmGreetMessage = value ?? !conf.SendDmGreetMessage; - - var toAdd = GreetSettings.Create(conf); - guildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); - - await uow.CompleteAsync().ConfigureAwait(false); - } - return enabled; - } - [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageGuild)] @@ -374,41 +270,19 @@ namespace NadekoBot.Modules.Administration return; } - var sendGreetEnabled = ServerGreetCommands.SetGreetDmMessage(Context.Guild.Id, ref text); + var sendGreetEnabled = greetService.SetGreetDmMessage(Context.Guild.Id, ref text); await ReplyConfirmLocalized("greetdmmsg_new").ConfigureAwait(false); if (!sendGreetEnabled) await ReplyConfirmLocalized("greetdmmsg_enable", $"`{Prefix}greetdm`").ConfigureAwait(false); } - public static bool SetGreetDmMessage(ulong guildId, ref string message) - { - message = message?.SanitizeMentions(); - - if (string.IsNullOrWhiteSpace(message)) - throw new ArgumentNullException(nameof(message)); - - bool greetMsgEnabled; - using (var uow = DbHandler.UnitOfWork()) - { - var conf = uow.GuildConfigs.For(guildId); - conf.DmGreetMessageText = message; - greetMsgEnabled = conf.SendDmGreetMessage; - - var toAdd = GreetSettings.Create(conf); - guildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); - - uow.Complete(); - } - return greetMsgEnabled; - } - [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageGuild)] public async Task Bye() { - var enabled = await ServerGreetCommands.SetBye(Context.Guild.Id, Context.Channel.Id).ConfigureAwait(false); + var enabled = await greetService.SetBye(Context.Guild.Id, Context.Channel.Id).ConfigureAwait(false); if (enabled) await ReplyConfirmLocalized("bye_on").ConfigureAwait(false); @@ -416,23 +290,6 @@ namespace NadekoBot.Modules.Administration await ReplyConfirmLocalized("bye_off").ConfigureAwait(false); } - private static async Task SetBye(ulong guildId, ulong channelId, bool? value = null) - { - bool enabled; - using (var uow = DbHandler.UnitOfWork()) - { - var conf = uow.GuildConfigs.For(guildId, set => set); - enabled = conf.SendChannelByeMessage = value ?? !conf.SendChannelByeMessage; - conf.ByeMessageChannelId = channelId; - - var toAdd = GreetSettings.Create(conf); - guildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); - - await uow.CompleteAsync(); - } - return enabled; - } - [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageGuild)] @@ -449,41 +306,19 @@ namespace NadekoBot.Modules.Administration return; } - var sendByeEnabled = ServerGreetCommands.SetByeMessage(Context.Guild.Id, ref text); + var sendByeEnabled = greetService.SetByeMessage(Context.Guild.Id, ref text); await ReplyConfirmLocalized("byemsg_new").ConfigureAwait(false); if (!sendByeEnabled) await ReplyConfirmLocalized("byemsg_enable", $"`{Prefix}bye`").ConfigureAwait(false); } - public static bool SetByeMessage(ulong guildId, ref string message) - { - message = message?.SanitizeMentions(); - - if (string.IsNullOrWhiteSpace(message)) - throw new ArgumentNullException(nameof(message)); - - bool byeMsgEnabled; - using (var uow = DbHandler.UnitOfWork()) - { - var conf = uow.GuildConfigs.For(guildId, set => set); - conf.ChannelByeMessageText = message; - byeMsgEnabled = conf.SendChannelByeMessage; - - var toAdd = GreetSettings.Create(conf); - guildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); - - uow.Complete(); - } - return byeMsgEnabled; - } - [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageGuild)] public async Task ByeDel(int timer = 30) { - await ServerGreetCommands.SetByeDel(Context.Guild.Id, timer).ConfigureAwait(false); + await greetService.SetByeDel(Context.Guild.Id, timer).ConfigureAwait(false); if (timer > 0) await ReplyConfirmLocalized("byedel_on", timer).ConfigureAwait(false); @@ -491,23 +326,6 @@ namespace NadekoBot.Modules.Administration await ReplyConfirmLocalized("byedel_off").ConfigureAwait(false); } - private static async Task SetByeDel(ulong guildId, int timer) - { - if (timer < 0 || timer > 600) - return; - - using (var uow = DbHandler.UnitOfWork()) - { - var conf = uow.GuildConfigs.For(guildId, set => set); - conf.AutoDeleteByeMessagesTimer = timer; - - var toAdd = GreetSettings.Create(conf); - guildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); - - await uow.CompleteAsync().ConfigureAwait(false); - } - } - } } } \ No newline at end of file diff --git a/src/NadekoBot/NadekoBot.cs b/src/NadekoBot/NadekoBot.cs index 1abf6c29..52d1a69d 100644 --- a/src/NadekoBot/NadekoBot.cs +++ b/src/NadekoBot/NadekoBot.cs @@ -46,6 +46,10 @@ namespace NadekoBot public static ImmutableArray AllGuildConfigs { get; } public static BotConfig BotConfig { get; } + //services + //todo DI in the future + public static GreetSettingsService GreetSettingsService { get; private set; } + static NadekoBot() { SetupLogger(); @@ -59,6 +63,8 @@ namespace NadekoBot ErrorColor = new Color(Convert.ToUInt32(BotConfig.ErrorColor, 16)); } + GreetSettingsService = new GreetSettingsService(); + //ImageSharp.Configuration.Default.AddImageFormat(new ImageSharp.Formats.PngFormat()); //ImageSharp.Configuration.Default.AddImageFormat(new ImageSharp.Formats.JpegFormat()); } diff --git a/src/NadekoBot/Services/GreetSettingsService.cs b/src/NadekoBot/Services/GreetSettingsService.cs new file mode 100644 index 00000000..fcc2fec7 --- /dev/null +++ b/src/NadekoBot/Services/GreetSettingsService.cs @@ -0,0 +1,204 @@ +using NadekoBot.Extensions; +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services +{ + public class GreetSettingsService + { + public ConcurrentDictionary GuildConfigsCache { get; } + + public GreetSettingsService() + { + GuildConfigsCache = new ConcurrentDictionary(NadekoBot.AllGuildConfigs.ToDictionary(g => g.GuildId, GreetSettings.Create)); + } + + public GreetSettings GetOrAddSettingsForGuild(ulong guildId) + { + GreetSettings settings; + GuildConfigsCache.TryGetValue(guildId, out settings); + + if (settings != null) + return settings; + + using (var uow = DbHandler.UnitOfWork()) + { + var gc = uow.GuildConfigs.For(guildId, set => set); + settings = GreetSettings.Create(gc); + } + + GuildConfigsCache.TryAdd(guildId, settings); + return settings; + } + + public async Task SetGreet(ulong guildId, ulong channelId, bool? value = null) + { + bool enabled; + using (var uow = DbHandler.UnitOfWork()) + { + var conf = uow.GuildConfigs.For(guildId, set => set); + enabled = conf.SendChannelGreetMessage = value ?? !conf.SendChannelGreetMessage; + conf.GreetMessageChannelId = channelId; + + var toAdd = GreetSettings.Create(conf); + GuildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); + + await uow.CompleteAsync().ConfigureAwait(false); + } + return enabled; + } + + public bool SetGreetMessage(ulong guildId, ref string message) + { + message = message?.SanitizeMentions(); + + if (string.IsNullOrWhiteSpace(message)) + throw new ArgumentNullException(nameof(message)); + + bool greetMsgEnabled; + using (var uow = DbHandler.UnitOfWork()) + { + var conf = uow.GuildConfigs.For(guildId, set => set); + conf.ChannelGreetMessageText = message; + greetMsgEnabled = conf.SendChannelGreetMessage; + + var toAdd = GreetSettings.Create(conf); + GuildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); + + uow.Complete(); + } + return greetMsgEnabled; + } + + public async Task SetGreetDm(ulong guildId, bool? value = null) + { + bool enabled; + using (var uow = DbHandler.UnitOfWork()) + { + var conf = uow.GuildConfigs.For(guildId, set => set); + enabled = conf.SendDmGreetMessage = value ?? !conf.SendDmGreetMessage; + + var toAdd = GreetSettings.Create(conf); + GuildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); + + await uow.CompleteAsync().ConfigureAwait(false); + } + return enabled; + } + + public bool SetGreetDmMessage(ulong guildId, ref string message) + { + message = message?.SanitizeMentions(); + + if (string.IsNullOrWhiteSpace(message)) + throw new ArgumentNullException(nameof(message)); + + bool greetMsgEnabled; + using (var uow = DbHandler.UnitOfWork()) + { + var conf = uow.GuildConfigs.For(guildId); + conf.DmGreetMessageText = message; + greetMsgEnabled = conf.SendDmGreetMessage; + + var toAdd = GreetSettings.Create(conf); + GuildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); + + uow.Complete(); + } + return greetMsgEnabled; + } + + public async Task SetBye(ulong guildId, ulong channelId, bool? value = null) + { + bool enabled; + using (var uow = DbHandler.UnitOfWork()) + { + var conf = uow.GuildConfigs.For(guildId, set => set); + enabled = conf.SendChannelByeMessage = value ?? !conf.SendChannelByeMessage; + conf.ByeMessageChannelId = channelId; + + var toAdd = GreetSettings.Create(conf); + GuildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); + + await uow.CompleteAsync(); + } + return enabled; + } + + public bool SetByeMessage(ulong guildId, ref string message) + { + message = message?.SanitizeMentions(); + + if (string.IsNullOrWhiteSpace(message)) + throw new ArgumentNullException(nameof(message)); + + bool byeMsgEnabled; + using (var uow = DbHandler.UnitOfWork()) + { + var conf = uow.GuildConfigs.For(guildId, set => set); + conf.ChannelByeMessageText = message; + byeMsgEnabled = conf.SendChannelByeMessage; + + var toAdd = GreetSettings.Create(conf); + GuildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); + + uow.Complete(); + } + return byeMsgEnabled; + } + + public async Task SetByeDel(ulong guildId, int timer) + { + if (timer < 0 || timer > 600) + return; + + using (var uow = DbHandler.UnitOfWork()) + { + var conf = uow.GuildConfigs.For(guildId, set => set); + conf.AutoDeleteByeMessagesTimer = timer; + + var toAdd = GreetSettings.Create(conf); + GuildConfigsCache.AddOrUpdate(guildId, toAdd, (key, old) => toAdd); + + await uow.CompleteAsync().ConfigureAwait(false); + } + } + } + + public class GreetSettings + { + public int AutoDeleteGreetMessagesTimer { get; set; } + public int AutoDeleteByeMessagesTimer { get; set; } + + public ulong GreetMessageChannelId { get; set; } + public ulong ByeMessageChannelId { get; set; } + + public bool SendDmGreetMessage { get; set; } + public string DmGreetMessageText { get; set; } + + public bool SendChannelGreetMessage { get; set; } + public string ChannelGreetMessageText { get; set; } + + public bool SendChannelByeMessage { get; set; } + public string ChannelByeMessageText { get; set; } + + public static GreetSettings Create(GuildConfig g) => new GreetSettings() + { + AutoDeleteByeMessagesTimer = g.AutoDeleteByeMessagesTimer, + AutoDeleteGreetMessagesTimer = g.AutoDeleteGreetMessagesTimer, + GreetMessageChannelId = g.GreetMessageChannelId, + ByeMessageChannelId = g.ByeMessageChannelId, + SendDmGreetMessage = g.SendDmGreetMessage, + DmGreetMessageText = g.DmGreetMessageText, + SendChannelGreetMessage = g.SendChannelGreetMessage, + ChannelGreetMessageText = g.ChannelGreetMessageText, + SendChannelByeMessage = g.SendChannelByeMessage, + ChannelByeMessageText = g.ChannelByeMessageText, + }; + } +}