From ced287e492d970f2dcb151a008916df093f4d79d Mon Sep 17 00:00:00 2001 From: runebaas Date: Tue, 21 May 2019 20:50:50 +0200 Subject: [PATCH] Allow a server admin to specify a channel for the welcome message --- Geekbot.net/Commands/Admin/Admin.cs | 25 +++++++++++++- .../Database/Models/GuildSettingsModel.cs | 6 ++-- Geekbot.net/Handlers.cs | 33 +++++++++++++++---- 3 files changed, 55 insertions(+), 9 deletions(-) diff --git a/Geekbot.net/Commands/Admin/Admin.cs b/Geekbot.net/Commands/Admin/Admin.cs index e2e1f86..15b4df1 100644 --- a/Geekbot.net/Commands/Admin/Admin.cs +++ b/Geekbot.net/Commands/Admin/Admin.cs @@ -46,6 +46,29 @@ namespace Geekbot.net.Commands.Admin await ReplyAsync($"Welcome message has been changed\r\nHere is an example of how it would look:\r\n{formatedMessage}"); } + [Command("welcomechannel", RunMode = RunMode.Async)] + [Summary("Set a channel for the welcome messages (by default it uses the top most channel)")] + public async Task SelectWelcomeChannel([Summary("#Channel")] ISocketMessageChannel channel) + { + try + { + var m = await channel.SendMessageAsync("..."); + + var guild = await GetGuildSettings(Context.Guild.Id); + guild.WelcomeChannel = channel.Id.AsLong(); + _database.GuildSettings.Update(guild); + await _database.SaveChangesAsync(); + + await m.DeleteAsync(); + + await ReplyAsync("Successfully saved the welcome channel"); + } + catch (Exception e) + { + await _errorHandler.HandleCommandException(e, Context, "That channel doesn't seem to exist or i don't have write permissions"); + } + } + [Command("modchannel", RunMode = RunMode.Async)] [Summary("Set a channel for moderation purposes")] public async Task SelectModChannel([Summary("#Channel")] ISocketMessageChannel channel) @@ -67,7 +90,7 @@ namespace Geekbot.net.Commands.Admin } catch (Exception e) { - await _errorHandler.HandleCommandException(e, Context, "That channel doesn't seem to be valid"); + await _errorHandler.HandleCommandException(e, Context, "That channel doesn't seem to exist or i don't have write permissions"); } } diff --git a/Geekbot.net/Database/Models/GuildSettingsModel.cs b/Geekbot.net/Database/Models/GuildSettingsModel.cs index 6bc98b1..ebb6dc4 100644 --- a/Geekbot.net/Database/Models/GuildSettingsModel.cs +++ b/Geekbot.net/Database/Models/GuildSettingsModel.cs @@ -6,7 +6,7 @@ namespace Geekbot.net.Database.Models { [Key] public int Id { get; set; } - + [Required] public long GuildId { get; set; } @@ -15,9 +15,11 @@ namespace Geekbot.net.Database.Models public bool Hui { get; set; } = false; public long ModChannel { get; set; } = 0; - + public string WelcomeMessage { get; set; } + public long WelcomeChannel { get; set; } + public bool ShowDelete { get; set; } = false; public bool ShowLeave { get; set; } = false; diff --git a/Geekbot.net/Handlers.cs b/Geekbot.net/Handlers.cs index 6dd53d0..a254c14 100644 --- a/Geekbot.net/Handlers.cs +++ b/Geekbot.net/Handlers.cs @@ -4,6 +4,7 @@ using System.Text; using System.Threading.Tasks; using Discord; using Discord.Commands; +using Discord.Rest; using Discord.WebSocket; using Geekbot.net.Database; using Geekbot.net.Database.Models; @@ -143,18 +144,38 @@ namespace Geekbot.net { try { + var userRepoUpdate = _userRepository.Update(user); + _logger.Information(LogSource.Geekbot, $"{user.Username} ({user.Id}) joined {user.Guild.Name} ({user.Guild.Id})"); + if (!user.IsBot) { - var message = _database.GuildSettings.FirstOrDefault(guild => guild.GuildId.Equals(user.Guild.Id.AsLong()))?.WelcomeMessage; - if (!string.IsNullOrEmpty(message)) + var guildSettings = _database.GuildSettings.FirstOrDefault(guild => guild.GuildId == user.Guild.Id.AsLong()); + var message = guildSettings?.WelcomeMessage; + if (string.IsNullOrEmpty(message)) return; + message = message.Replace("$user", user.Mention); + + var fallbackSender = new Func>(() => user.Guild.DefaultChannel.SendMessageAsync(message)); + if (guildSettings.WelcomeChannel != 0) { - message = message.Replace("$user", user.Mention); - await user.Guild.DefaultChannel.SendMessageAsync(message); + try + { + var target = await _client.GetChannelAsync(guildSettings.WelcomeChannel.AsUlong()); + var channel = target as ISocketMessageChannel; + await channel.SendMessageAsync(message); + } + catch (Exception e) + { + _logger.Error(LogSource.Geekbot, "Failed to send welcome message to user defined welcome channel", e); + await fallbackSender(); + } + } + else + { + await fallbackSender(); } } - await _userRepository.Update(user); - _logger.Information(LogSource.Geekbot, $"{user.Username} ({user.Id}) joined {user.Guild.Name} ({user.Guild.Id})"); + await userRepoUpdate; } catch (Exception e) {