Exemple #1
0
        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));
            }
        }
Exemple #2
0
        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());
            }
        }
Exemple #3
0
        /// <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());
            }
        }
Exemple #4
0
        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());
        }
Exemple #5
0
        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.");
            }
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        /// <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);
        }
Exemple #8
0
 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);
 }
Exemple #9
0
        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);
            }
        }
Exemple #10
0
        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("✅"));
                }
            }
        }
Exemple #11
0
 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);
 }
Exemple #12
0
        /// <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("✅"));
                }
            }
        }