Пример #1
0
                public bool CheckUserRatelimit(ulong id, ulong guildId, SocketGuildUser optUser)
                {
                    HashSet <ulong> ignoreUsers;
                    HashSet <ulong> ignoreRoles;

                    if ((IgnoredUsers.TryGetValue(guildId, out ignoreUsers) && ignoreUsers.Contains(id)) ||
                        (optUser != null && IgnoredRoles.TryGetValue(guildId, out ignoreRoles) && optUser.RoleIds.Any(x => ignoreRoles.Contains(x))))
                    {
                        return(false);
                    }

                    var usr = Users.GetOrAdd(id, (key) => new RatelimitedUser()
                    {
                        UserId = id
                    });

                    if (usr.MessageCount >= MaxMessages)
                    {
                        return(true);
                    }
                    usr.MessageCount++;
                    var _ = Task.Run(async() =>
                    {
                        try
                        {
                            await Task.Delay(PerSeconds * 1000, cancelSource.Token);
                        }
                        catch (OperationCanceledException) { }
                        usr.MessageCount--;
                    });

                    return(false);
                }
Пример #2
0
        public void ConvertIgnoredUsers()
        {
            if (IgnoredUsers.Any())
            {
                IgnoredUsers_Detailed = new List <IgnoredUser>();
                foreach (var user in IgnoredUsers)
                {
                    IgnoredUsers_Detailed.Add(new IgnoredUser
                    {
                        UserName = user
                    });
                }
            }

            IgnoredUsers = null;
            Save("/config/config.json");
        }
Пример #3
0
        private async Task <SummaryViewModel> GenerateSummary()
        {
            List <Project> projects = await ListProjectsAsync().OnAnyThread();

            Logger.Info($"Retrieved {projects.Count} projects");

            if (ProjectFilter.Any() || IgnoredProjects.Any())
            {
                if (ProjectFilter.Any())
                {
                    projects.RemoveAll(project => !ProjectFilter.Contains(project.Key));
                }
                projects.RemoveAll(project => IgnoredProjects.Contains(project.Key));
                Logger.Info($"Filtered ignored projects, {projects.Count} remaining");
            }

            List <User> users = await ListUsersAsync().OnAnyThread();

            Logger.Info($"Retrieved {users.Count} users");

            if (UserFilter.Any() || IgnoredUsers.Any())
            {
                if (UserFilter.Any())
                {
                    users.RemoveAll(user => !UserFilter.Contains(user.Key !));
                }
                users.RemoveAll(user => IgnoredUsers.Contains(user.Key));
                Logger.Info($"Filtered ignored users, {users.Count} remaining");
            }

            if (!projects.Any() || !users.Any())
            {
                Logger.Warn("Nothing to do");
                return(new SummaryViewModel());
            }

            Dictionary <string, UserViewModel> userDetails = new Dictionary <string, UserViewModel>();

            foreach (User user in users)
            {
                userDetails.Add(user.Key, new UserViewModel(user)
                {
                    OverdueIssues = await GetOverdueIssuesForUserAsync(user.Key).OnAnyThread()
                });
            }

            Dictionary <string, HashSet <User> > projectUserMappings = new Dictionary <string, HashSet <User> >(); // User => project

            foreach (Project project in projects)
            {
                foreach (User user in await GetUsersForProjectAsync(project.Key, users).OnAnyThread())
                {
                    projectUserMappings.GetOrCreate(project.Key, () => new HashSet <User>()).Add(user);
                }
            }

            foreach (Project project in new List <Project>(projects))
            {
                if (!projectUserMappings.ContainsKey(project.Key) || projectUserMappings[project.Key].Count == 0)
                {
                    Logger.Warn($"Ignoring project: {project.Key}, project has no users");
                    projects.Remove(project);
                }
            }

            Dictionary <string, ProjectViewModel> projectDetails = new Dictionary <string, ProjectViewModel>();

            foreach (Project project in projects)
            {
                projectDetails.Add(project.Key, new ProjectViewModel(project));
            }

            foreach (Issue issue in await GetUnassignedIssuesForProjectAsync(projects).OnAnyThread())
            {
                foreach (User user in projectUserMappings[issue.Project])
                {
                    userDetails[user.Key].UnassignedIssues.Add(issue);
                }

                projectDetails[issue.Project].UnassignedIssues.Add(issue);
            }

            userDetails.RemoveIf(entry => !entry.Value.OverdueIssues.Any() && !entry.Value.UnassignedIssues.Any());
            projectDetails.RemoveIf(entry => !entry.Value.UnassignedIssues.Any());

            return(new SummaryViewModel()
            {
                Users = userDetails.Values.ToList(),
                Projects = projectDetails.Values.ToList()
            });
        }
Пример #4
0
        public async Task ProcessAsync()
        {
            Require.NonNullNonEmpty(SonarUrl, "SonarUrl");
            Require.NonNullNonEmpty(Token, "Token");
            Require.NonNullNonEmpty(SmtpServer, "SmtpServer");
            Require.NonNullNonEmpty(SmtpSenderAddress, "SmtpServerAddress");
            if (SmtpUsername != null && SmtpPassword != null)
            {
                Require.NonNullNonEmpty(SmtpUsername, "SmtpUsername");
                Require.NonNullNonEmpty(SmtpPassword, "SmtpPassword");
            }

            Logger.Info($"Sonar URL: {SonarUrl}");
            Logger.Info($"Max Issue Date: {MaxCreationDate}");
            Logger.Info($"Project filter: {ProjectFilter.ToPrettyString()}, ignored projects: {IgnoredProjects.ToPrettyString()}");
            Logger.Info($"User filter: {UserFilter.ToPrettyString()}, ignored users: {IgnoredUsers.ToPrettyString()}");
            Logger.Info($"SMTP server: {SmtpServer} ({(SmtpSslEnabled ? "SSL enabled" : "SSL disabled")})");
            Logger.Info($"SMTP sender address: {SmtpSenderAddress}");
            Logger.Info($"SMTP authentication: {(SmtpUsername != null && SmtpPassword != null ? $"Yes (username: {SmtpUsername})" : "None")}");
            Logger.Info($"Recipient filter: {RecipientFilter.ToPrettyString()}, ignored recipients: {IgnoredRecipients.ToPrettyString()}");
            Logger.Info($"Summary recipients: {SummaryRecipients.ToPrettyString()}");

            SummaryViewModel summary = await GenerateSummary().OnAnyThread();

            Logger.Info($"Processing complete, {summary.NumberOfOverdueIssues} issues overdue, {summary.NumberOfUnassignedIssues} issues unassigned, {summary.Users.Count} users to notify, {summary.Projects.Count} projects to notify");

            RazorLightEngine razor = new RazorLightEngineBuilder()
                                     .UseEmbeddedResourcesProject(typeof(Startup)) // exception without this (or another project type)
                                     .UseMemoryCachingProvider()
                                     .Build();

            SmtpClient smtpClient = new SmtpClient(SmtpServer !);

            smtpClient.EnableSsl = SmtpSslEnabled;
            if (SmtpUsername != null && SmtpPassword != null)
            {
                smtpClient.Credentials = new NetworkCredential(SmtpUsername, SmtpPassword);
            }

            await NotifyUser(summary, razor, smtpClient).OnAnyThread();
            await NotifySummary(summary, razor, smtpClient).OnAnyThread();
        }