public async Task LogForDisablingAction(ISocketMessageChannel channel, string note, DateTime until) { var bot = Global.Bot; var guild = bot.GetGuild(Global.ServerID); var closedthread = CloseThreadInDb(channel); SocketGuildUser userObj = guild.GetUser(closedthread.UserId); List <ThreadMessage> messagesToLog; using (var db = new Database()) { messagesToLog = db.ThreadMessages.Where(ch => ch.ChannelId == closedthread.ChannelId).ToList(); } var modMailLogChannel = guild.GetTextChannel(Global.Channels["modmaillog"]); await LogDisablingHeader(closedthread, messagesToLog.Count(), note, modMailLogChannel, userObj, until); await LogModMailThreadMessagesToModmailLog(closedthread, note, messagesToLog, modMailLogChannel); await(channel as SocketTextChannel).DeleteAsync(); if (userObj != null) { await userObj.SendMessageAsync(embed : ModMailEmbedHandler.GetDisablingEmbed(until)); } }
public async Task CloseThread(SocketMessage message, ISocketMessageChannel channel, SocketUser moderatorUser, string note) { var closedthread = CloseThreadInDb(channel); var bot = Global.Bot; var guild = bot.GetGuild(Global.ServerID); SocketGuildUser userObj = guild.GetUser(closedthread.UserId); List <ThreadMessage> messagesToLog; using (var db = new Database()) { messagesToLog = db.ThreadMessages.Where(ch => ch.ChannelId == closedthread.ChannelId).ToList(); } var modMailLogChannel = guild.GetTextChannel(Global.Channels["modmaillog"]); await LogClosingHeader(closedthread, messagesToLog.Count(), note, modMailLogChannel, userObj); await LogModMailThreadMessagesToModmailLog(closedthread, note, messagesToLog, modMailLogChannel); await(channel as SocketTextChannel).DeleteAsync(); // only send the user a dm, in case the user initiated, if we use contact it should not happen if (userObj != null && messagesToLog.Count() > 0) { await userObj.SendMessageAsync(embed : ModMailEmbedHandler.GetClosingEmbed()); } }
/// <summary> /// Calls the methods for closing the thread in the db and logging the modmail thread. /// Also sends a message to the user, in case there were interactions /// </summary> /// <param name="channel">The <see cref"Discord.WebSocket.ISocketMessageChannel"/> object of the channel which is getting closed</param> /// <param name="note">The optional note which is used when closing the thread</param> /// <returns>Task</returns> public async Task CloseThread(ISocketMessageChannel channel, string note) { var closedThread = CloseThreadInDb(channel); int messagesToLogCount = await DeleteChannelAndLogThread(closedThread, channel, note); var bot = Global.Bot; var guild = bot.GetGuild(Global.ServerID); SocketGuildUser userObj = guild.GetUser(closedThread.UserId); // only send the user a dm, in case the user initiated, if we use contact it should not happen if (userObj != null && messagesToLogCount > 0) { await userObj.SendMessageAsync(embed : ModMailEmbedHandler.GetClosingEmbed()); } }
public async Task <RuntimeResult> ContactUser(IGuildUser user) { if (CommandHandler.FeatureFlagDisabled(FeatureFlag.MODMAIL)) { return(CustomResult.FromIgnored()); } var existing = ModMailManager.GetOpenModmailForUser(user); if (existing != null) { await Context.Channel.SendMessageAsync(embed : ModMailEmbedHandler.GetThreadAlreadyExistsEmbed(existing)); } else { await ModMailManager.ContactUser(user, Context.Channel, true); } return(CustomResult.FromSuccess()); }
public async Task CreateModeratorReply(SocketMessage message, ISocketMessageChannel channel, SocketUser moderatorUser, string clearMessage, bool anonymous) { var bot = Global.Bot; var guild = bot.GetGuild(Global.ServerID); var userObj = Global.ModMailThreads.Where(th => th.ChannelId == channel.Id).DefaultIfEmpty(null).First(); UpdateModThreadUpdatedField(channel.Id, "MOD_REPLIED"); var threadUser = guild.GetUser(userObj.UserId); if (threadUser != null) { var replyEmbed = ModMailEmbedHandler.GetModeratorReplyEmbed(clearMessage, "Moderator replied", message, anonymous ? null : moderatorUser); await AnswerUserAndLogEmbed(threadUser, channel, replyEmbed, message, anonymous); } else { await channel.SendMessageAsync("User left the server. The bot message will not reach."); } }
public async Task ContactUser(IGuildUser user, ISocketMessageChannel channel) { using (var db = new Database()){ var exists = db.ModMailThreads.Where(th => th.UserId == user.Id && th.State != "CLOSED"); if (exists.Count() > 0) { await channel.SendMessageAsync(embed : ModMailEmbedHandler.GetThreadAlreadyExistsEmbed(exists.First())); return; } var existingUser = db.Users.Where(us => us.UserId == user.Id).FirstOrDefault(); if (existingUser == null) { var newUser = new User(); newUser.UserId = user.Id; newUser.ModMailMuted = false; db.Users.Add(newUser); } else { existingUser.ModMailMuted = false; } db.SaveChanges(); } var createdChannel = await CreateModMailThread(user); ModMailThread createdModMailThread; using (var db = new Database()){ createdModMailThread = db.ModMailThreads.Where(th => th.ChannelId == createdChannel.Id).First(); } var embedContainingLink = ModMailEmbedHandler.GetThreadHasBeendCreatedEmbed(createdModMailThread); await channel.SendMessageAsync(embed : embedContainingLink); }
/// <summary> /// Creates a modmail thread with the given user and responds in the given thread with a link to the newly created channel. /// </summary> /// <param name="user">The <see cref="Discord.IUser"> to create the channel for</param> /// <param name="channel">The <see cref="Discord.ISocketMessageChannel"> in which the response should be posted to</param> /// <returns>The <see cref="Discord.Rest.RestChannel"> newly created channel</returns> public static async Task <RestTextChannel> ContactUser(IUser user, ISocketMessageChannel channel, bool createNote) { using (var db = new Database()) { var existingUser = db.Users.AsQueryable().Where(us => us.Id == user.Id).FirstOrDefault(); if (existingUser == null) { var newUser = new UserBuilder(user.Id).Build(); db.Users.Add(newUser); } else { existingUser.ModMailMuted = false; } db.SaveChanges(); } var createdChannel = await CreateModMailThread(user); ModMailThread createdModMailThread; using (var db = new Database()) { createdModMailThread = db.ModMailThreads.AsQueryable().Where(th => th.ChannelId == createdChannel.Id).First(); } await createdChannel.SendMessageAsync(embed : ModMailEmbedHandler.GetUserInfoHeader(createdModMailThread)); if (createNote) { var embedContainingLink = ModMailEmbedHandler.GetThreadHasBeendCreatedEmbed(createdModMailThread); await channel.SendMessageAsync(embed : embedContainingLink); } // we need to return the channel, because we *directly* need the channel after wards, and loading the channel by id again // resulted in null return(createdChannel); }
private async Task LogDisablingHeader(ModMailThread modMailThread, int messageCount, string note, SocketTextChannel modMailLogChannel, SocketUser modmailUser, DateTime until) { var closingEmbed = ModMailEmbedHandler.GetMutingSummaryEmbed(modMailThread, messageCount, modmailUser, note, until); await modMailLogChannel.SendMessageAsync(embed : closingEmbed); }
public async Task CreateModmailThread(SocketMessage message) { var userFromCache = Global.ModMailThreads.Where(th => th.UserId == message.Author.Id).FirstOrDefault(); if (userFromCache != null && userFromCache.ThreadUser.ModMailMuted && userFromCache.ThreadUser.ModMailMutedUntil > DateTime.Now) { if (!userFromCache.ThreadUser.ModMailMutedReminded) { await message.Channel.SendMessageAsync($"You are unable to contact modmail until {userFromCache.ThreadUser.ModMailMutedUntil:dd.MM.yyyy HH:mm} {TimeZoneInfo.Local}."); using (var db = new Database()) { db.Users.Where(us => us.UserId == message.Author.Id).First().ModMailMutedReminded = true; db.SaveChanges(); } Global.ReloadModmailThreads(); } return; } using (var db = new Database()) { var user = db.Users.Where(us => us.UserId == message.Author.Id).FirstOrDefault(); if (user == null) { var newUser = new User(); newUser.UserId = message.Author.Id; newUser.ModMailMuted = false; db.Users.Add(newUser); db.SaveChanges(); } } int pastThreads = 0; using (var db = new Database()) { pastThreads = db.ModMailThreads.Where(ch => ch.UserId == message.Author.Id).Count(); } // when I tried to load the channel via getTextChannel, I got null in return, my only guess is that the channel // did not get peristent completely, so it did not find it // if we return the directly returned channel it worked var channel = await CreateModMailThread(message.Author); var guild = Global.Bot.GetGuild(Global.ServerID); await channel.SendMessageAsync(embed : ModMailEmbedHandler.GetUserInformation(pastThreads, message.Author)); var channelMessage = await channel.SendMessageAsync(embed : ModMailEmbedHandler.GetReplyEmbed(message, "Initial message from user")); AddModMailMessage(channel.Id, channelMessage, null, message.Author.Id); await message.Author.SendMessageAsync(embed : ModMailEmbedHandler.GetInitialUserReply(message)); ModMailThread modmailThread; using (var db = new Database()) { modmailThread = db.ModMailThreads.Where(th => th.ChannelId == channel.Id).First(); } var modQueue = guild.GetTextChannel(Global.Channels["modqueue"]); var staffRole = guild.GetRole(Global.Roles["staff"]); await staffRole.ModifyAsync(x => x.Mentionable = true); try { await modQueue.SendMessageAsync(staffRole.Mention, embed : ModMailEmbedHandler.GetModqueueNotificationEmbed(message.Author, modmailThread)); } finally { await staffRole.ModifyAsync(x => x.Mentionable = false); } }
public async Task HandleModMailUserReply(SocketMessage message) { var bot = Global.Bot; var guild = bot.GetGuild(Global.ServerID); ModMailThread modMailThread; using (var db = new Database()) { modMailThread = db.ModMailThreads .Include(sub => sub.Subscriber) .Where(th => th.UserId == message.Author.Id && th.State != "CLOSED") .FirstOrDefault(); } if (modMailThread != null) { UpdateModThreadUpdatedField(modMailThread.ChannelId, "USER_REPLIED"); var mentions = new StringBuilder(""); foreach (var subscriber in modMailThread.Subscriber) { var subscriberUser = guild.GetUser(subscriber.UserId); if (subscriberUser != null) { mentions.Append(subscriberUser.Mention); } } var msg = await guild.GetTextChannel(modMailThread.ChannelId).SendMessageAsync(mentions.ToString(), embed: ModMailEmbedHandler.GetReplyEmbed(message)); AddModMailMessage(modMailThread.ChannelId, msg, null, message.Author.Id); var userMsg = await message.Channel.GetMessageAsync(message.Id); if (userMsg is RestUserMessage) { var currentMessageInUserDmChannel = userMsg as RestUserMessage; await currentMessageInUserDmChannel.AddReactionAsync(new Emoji("✅")); } else if (userMsg is SocketUserMessage) { var currentMessageInUserDmChannel = userMsg as SocketUserMessage; await currentMessageInUserDmChannel.AddReactionAsync(new Emoji("✅")); } } }
private async Task LogClosingHeader(ModMailThread modMailThread, int messageCount, string note, SocketTextChannel modMailLogChannel, SocketUser modmailUser, Boolean silent) { var closingEmbed = ModMailEmbedHandler.GetClosingSummaryEmbed(modMailThread, messageCount, modmailUser, note, silent); await modMailLogChannel.SendMessageAsync(embed : closingEmbed); }
/// <summary> /// Handles the user reply: updates the state in the db, posts the message to the modmail thread and mentions subscribers /// </summary> /// <param name="message">The <see chref="Discord.WebSocket.SocketMessage"> message object coming from the user</param> /// <returns></returns> public async Task HandleModMailUserReply(SocketMessage message) { var bot = Global.Bot; var guild = bot.GetGuild(Global.ServerID); var modMailThread = ModMailManager.GetOpenModmailForUser(message.Author); if (modMailThread != null) { UpdateModThreadUpdatedField(modMailThread.ChannelId, "USER_REPLIED"); var mentions = new StringBuilder(""); foreach (var subscriber in modMailThread.Subscriber) { var subscriberUser = guild.GetUser(subscriber.UserId); if (subscriberUser != null) { mentions.Append(subscriberUser.Mention); } } var channel = guild.GetTextChannel(modMailThread.ChannelId); if (channel != null) { var msg = await channel.SendMessageAsync(mentions.ToString(), embed : ModMailEmbedHandler.GetReplyEmbed(message)); AddModMailMessage(modMailThread.ChannelId, msg, null, message.Author.Id); } var userMsg = await message.Channel.GetMessageAsync(message.Id); if (userMsg is RestUserMessage) { var currentMessageInUserDmChannel = userMsg as RestUserMessage; await currentMessageInUserDmChannel.AddReactionAsync(new Emoji("✅")); } else if (userMsg is SocketUserMessage) { var currentMessageInUserDmChannel = userMsg as SocketUserMessage; await currentMessageInUserDmChannel.AddReactionAsync(new Emoji("✅")); } } }