private static async Task LoadGuildModerationLog(ulong guildId)
        {
            GuildModerationLog guildModerationLog = new GuildModerationLog(guildId);

            if (Directory.Exists(guildModerationLog.UserDirectory))
            {
                foreach (string filepath in Directory.EnumerateFiles(guildModerationLog.UserDirectory, "*.json"))
                {
                    LoadFileOperation load = await ResourcesModel.LoadToJSONObject(filepath);

                    if (load.Success)
                    {
                        UserModerationLog userModerationLog = new UserModerationLog(guildModerationLog);
                        if (userModerationLog.FromJSON(load.Result))
                        {
                            guildModerationLog.userLogs.Add(userModerationLog.UserId, userModerationLog);
                            if (userModerationLog.IsBanned)
                            {
                                if (userModerationLog.BannedUntil.Value < DateTimeOffset.MaxValue)
                                {
                                    AddTimeLimitedInfractionReference(userModerationLog);
                                }
                            }
                            else if (userModerationLog.IsMuted)
                            {
                                if (userModerationLog.MutedUntil.Value < DateTimeOffset.MaxValue)
                                {
                                    AddTimeLimitedInfractionReference(userModerationLog);
                                }
                            }
                        }
                    }
                }
            }
            if (Directory.Exists(guildModerationLog.ChannelDirectory))
            {
                foreach (string filepath in Directory.EnumerateFiles(guildModerationLog.ChannelDirectory, "*.json"))
                {
                    LoadFileOperation load = await ResourcesModel.LoadToJSONObject(filepath);

                    if (load.Success)
                    {
                        ChannelModerationLog channelModerationLog = new ChannelModerationLog(guildModerationLog);
                        if (channelModerationLog.FromJSON(load.Result))
                        {
                            guildModerationLog.channelLogs.Add(channelModerationLog.ChannelId, channelModerationLog);
                        }
                    }
                }
            }
            GuildLogs.Add(guildModerationLog.GuildId, guildModerationLog);
        }
        public async Task AddBan(UserModerationEntry entry, DateTimeOffset banUntil)
        {
            moderationEntries.Add(entry);
            BannedUntil = banUntil;
            MutedUntil  = null;
            if (banUntil < DateTimeOffset.MaxValue)
            {
                GuildModerationLog.AddTimeLimitedInfractionReference(this);
            }
            await Save();

            await Parent.InvokeUserModerationLogModifiedEvents(this, entry);
        }
 public static GuildModerationLog GetOrCreateGuildModerationLog(ulong guildId)
 {
     if (GuildLogs.TryGetValue(guildId, out GuildModerationLog guildModerationLog))
     {
         return(guildModerationLog);
     }
     else
     {
         guildModerationLog = new GuildModerationLog(guildId);
         GuildLogs.Add(guildId, guildModerationLog);
         return(guildModerationLog);
     }
 }
        private static async Task <string> UnbanUser(UserModerationLog userModLog)
        {
            GuildModerationLog guildLog = userModLog.Parent;
            SocketGuild        guild    = BotCore.Client.GetGuild(guildLog.GuildId);

            if (guild != null)
            {
                await userModLog.UnBan(guild);

                return(null);
            }
            else
            {
                return($"Failed to unban `{userModLog.UserId}` - Guild `{userModLog.Parent.GuildId}` not found!");
            }
        }
        private static async Task <string> UnMuteUser(UserModerationLog userModLog)
        {
            GuildModerationLog guildLog = userModLog.Parent;
            SocketGuild        guild    = BotCore.Client.GetGuild(guildLog.GuildId);

            if (guild is null)
            {
                return($"Failed to unmute `{userModLog.UserId}` - Guild `{userModLog.Parent.GuildId}` not found!");
            }
            SocketGuildUser user = guild.GetUser(userModLog.UserId);

            if (user is null)
            {
                return($"Failed to unmute `{userModLog.UserId}` - User not found!");
            }

            await userModLog.RemoveMute(user);

            return(null);
        }
        public async Task <string> RelieveInfraction()
        {
            SocketGuild guild = BotCore.Client.GetGuild(GuildId);

            if (guild != null)
            {
                SocketGuildUser user = guild.GetUser(UserId);

                GuildModerationLog guildLog = GuildModerationLog.GetOrCreateGuildModerationLog(GuildId);
                UserModerationLog  userLog  = guildLog.GetOrCreateUserModerationLog(UserId);

                if (Type == ModerationType.Banned)
                {
                    if (userLog.BannedUntil.HasValue)
                    {
                        if (userLog.BannedUntil.Value == Ends)
                        {
                            await guild.RemoveBanAsync(UserId);

                            return(null);
                        }
                    }
                    return("Banstate Invalid!");
                }

                if (Type == ModerationType.Muted)
                {
                }

                return($"Unhandled timelimited moderation type `{Type}`");
            }
            else
            {
                return($"Guild `{GuildId}` not found!");
            }
        }
 public UserModerationLog(GuildModerationLog parent, ulong userId = 0)
 {
     Parent = parent;
     UserId = userId;
 }
        public async Task AddMute(SocketGuildUser target, DateTimeOffset muteUntil, UserModerationEntry?entry = null)
        {
            // Generate UserModerationEntry

            if (!entry.HasValue)
            {
                SocketGuildUser self = target.Guild.GetUser(BotCore.Client.CurrentUser.Id);

                if (muteUntil == DateTimeOffset.MaxValue)
                {
                    entry = new UserModerationEntry(target.Guild.Id, ModerationType.Muted, DateTimeOffset.UtcNow, self, "Automatic Mute", "Duration: perma");
                }
                else
                {
                    entry = new UserModerationEntry(target.Guild.Id, ModerationType.Muted, DateTimeOffset.UtcNow, self, "Automatic Mute", "Duration: " + (muteUntil - DateTimeOffset.UtcNow).ToHumanTimeString());
                }
            }

            moderationEntries.Add(entry.Value);

            // Edit user roles

            List <SocketRole> roles = new List <SocketRole>(target.Roles.Count - 1);

            foreach (SocketRole role in target.Roles)
            {
                if (!role.IsEveryone)
                {
                    roles.Add(role);
                }
            }

            SocketRole muteRole = target.Guild.GetRole(SettingsModel.MuteRole);

            try
            {
                await target.RemoveRolesAsync(roles);

                if (muteRole != null)
                {
                    await target.AddRoleAsync(muteRole);
                }
            }
            catch (Exception e)
            {
#if DEBUG
                throw;
#endif
            }

            // Edit UserModerationLog

            MutedUntil   = muteUntil;
            rolesPreMute = new List <ulong>(roles.Select(role => role.Id));
            if (muteUntil < DateTimeOffset.MaxValue)
            {
                GuildModerationLog.AddTimeLimitedInfractionReference(this);
            }

            // Save

            await Save();

            await Parent.InvokeUserModerationLogModifiedEvents(this, entry.Value);
        }
 public ChannelModerationLog(GuildModerationLog parent, ulong channelId = 0)
 {
     Parent    = parent;
     ChannelId = channelId;
 }
 public static ChannelModerationLog GetOrCreateChannelModerationLog(ulong guildId, ulong channelId, out GuildModerationLog guildLog)
 {
     guildLog = GetOrCreateGuildModerationLog(guildId);
     return(guildLog.GetOrCreateChannelModerationLog(channelId));
 }
 public static UserModerationLog GetOrCreateUserModerationLog(ulong guildId, ulong userId, out GuildModerationLog guildLog)
 {
     guildLog = GetOrCreateGuildModerationLog(guildId);
     return(guildLog.GetOrCreateUserModerationLog(userId));
 }
 public static bool TryGetGuildModerationLog(ulong guildId, out GuildModerationLog guildModerationLog)
 {
     return(GuildLogs.TryGetValue(guildId, out guildModerationLog));
 }