77using System . Collections . Generic ;
88using System . Linq ;
99using System . Text ;
10+ using System . Text . RegularExpressions ;
1011using System . Threading . Tasks ;
1112
1213namespace Platform . Bot . Triggers
@@ -18,78 +19,83 @@ internal class LastCommitActivityTrigger : ITrigger<TContext>
1819
1920 public LastCommitActivityTrigger ( GitHubStorage storage ) => _githubStorage = storage ;
2021
21- public bool Condition ( TContext issue ) => "last 3 months commit activity" == issue . Title . ToLower ( ) ;
22+ public async Task < bool > Condition ( TContext issue )
23+ {
24+ return "last 3 months commit activity" == issue . Title . ToLower ( ) ;
25+ }
2226
23- public void Action ( TContext issue )
27+ public async Task Action ( TContext issue )
2428 {
2529 var organizationName = issue . Repository . Owner . Login ;
26- var allMembers = _githubStorage . GetOrganizationMembers ( organizationName ) ;
27- var usersAndRepositoriesTheyCommited = new ConcurrentDictionary < User , HashSet < Repository > > ( ) ;
28- allMembers . All ( user =>
29- {
30- usersAndRepositoriesTheyCommited . TryAdd ( user , new HashSet < Repository > ( ) ) ;
31- return true ;
32- } ) ;
33- var allRepositories = _githubStorage . GetAllRepositories ( organizationName ) . Result ;
34- var allTasks = new Queue < Task > ( ) ;
35- foreach ( var repository in allRepositories )
30+
31+ var allMembers = await _githubStorage . GetAllOrganizationMembers ( organizationName ) ;
32+ var allRepositories = await _githubStorage . GetAllRepositories ( organizationName ) ;
33+ if ( ! allRepositories . Any ( ) )
3634 {
37- var repositoryCommitsTask = _githubStorage . GetCommits ( repository . Id , new CommitRequest { Since = DateTime . Now . AddMonths ( - 3 ) } ) ;
38- repositoryCommitsTask . ContinueWith ( task =>
35+ return ;
36+ }
37+
38+ var commitsPerUserInLast3Months = await allRepositories
39+ . Where ( repository => _githubStorage . Client . Repository . Branch . GetAll ( repository . Id ) . Result . Any ( ) )
40+ . Select ( repository => _githubStorage . GetCommits ( repository . Id , new CommitRequest { Since = DateTime . Now . AddMonths ( - 3 ) } ) . Result )
41+ . SelectMany ( x => x )
42+ . Where ( commit => allMembers . Find ( user => user . Id == commit . Author . Id ) != null )
43+ . Aggregate ( Task . FromResult ( new Dictionary < User , List < GitHubCommit > > ( ) ) , async ( dictionaryTask , commit ) =>
3944 {
40- task . Result . All ( commit =>
45+ var dictionary = await dictionaryTask ;
46+ var member = allMembers . Find ( user => user . Id == commit . Author . Id ) ! ;
47+ if ( dictionary . ContainsKey ( member ) )
4148 {
42- allMembers . All ( user =>
43- {
44- if ( commit . Author ? . Id == user . Id )
45- {
46- usersAndRepositoriesTheyCommited [ user ] . Add ( repository ) ;
47- }
48- return true ;
49- } ) ;
50- return true ;
51- } ) ;
49+ dictionary [ member ] . Add ( commit ) ;
50+ }
51+ else
52+ {
53+ dictionary . Add ( member , new List < GitHubCommit > { commit } ) ;
54+ }
55+ return dictionary ;
5256 } ) ;
53- allTasks . Enqueue ( repositoryCommitsTask ) ;
54- }
55- Task . WaitAll ( allTasks . ToArray ( ) ) ;
56- var activeUsersAndRepositoriesTheyCommited = usersAndRepositoriesTheyCommited . Where ( userAndRepositoriesCommited => userAndRepositoriesCommited . Value . Count > 0 ) . ToDictionary ( pair => pair . Key , pair => pair . Value ) ;
5757 StringBuilder messageSb = new ( ) ;
58- AddTldrMessageToSb ( activeUsersAndRepositoriesTheyCommited , messageSb ) ;
59- AddUsersAndRepositoriesTheyCommitedToSb ( activeUsersAndRepositoriesTheyCommited , messageSb ) ;
58+ var tldrMessage = GetTldrMessage ( commitsPerUserInLast3Months . Select ( pair => pair . Key ) . ToList ( ) ) ;
59+ messageSb . Append ( tldrMessage ) ;
60+ messageSb . AppendLine ( "---" ) ;
61+ var detailedMessage = await GetDetailedMessage ( commitsPerUserInLast3Months ) ;
62+ messageSb . Append ( detailedMessage ) ;
6063 var message = messageSb . ToString ( ) ;
61- var comment = _githubStorage . CreateIssueComment ( issue . Repository . Id , issue . Number , message ) ;
62- comment . Wait ( ) ;
64+ await _githubStorage . CreateIssueComment ( issue . Repository . Id , issue . Number , message ) ;
6365 Console . WriteLine ( $ "Issue { issue . Title } is processed: { issue . Url } ") ;
64- _githubStorage . CloseIssue ( issue ) ;
66+ await _githubStorage . Client . Issue . Update ( issue . Repository . Owner . Login , issue . Repository . Name , issue . Number , new IssueUpdate ( ) { State = ItemState . Closed } ) ;
6567 }
6668
67- private void AddTldrMessageToSb ( IDictionary < User , HashSet < Repository > > usersAndRepositoriesCommited , StringBuilder sb )
69+ private string GetTldrMessage ( List < User > users )
6870 {
69- sb . AppendLine ( "## TLDR:" ) ;
70- usersAndRepositoriesCommited . Keys . All ( user =>
71+ StringBuilder stringBuilder = new StringBuilder ( ) ;
72+ stringBuilder . AppendLine ( "# TLDR:" ) ;
73+ users . All ( user =>
7174 {
72- sb . AppendLine ( $ "[{ user . Login } ]({ user . Url } )") ;
75+ stringBuilder . AppendLine ( $ "- [{ user . Login } ]({ user . Url } )") ;
7376 return true ;
7477 } ) ;
75- sb . AppendLine ( ) ;
76- sb . AppendLine ( "---" ) ;
77- sb . AppendLine ( ) ;
78+ return stringBuilder . ToString ( ) ;
7879 }
7980
80- private void AddUsersAndRepositoriesTheyCommitedToSb ( IDictionary < User , HashSet < Repository > > usersAndRepositoriesCommited , StringBuilder sb )
81+ private async Task < string > GetDetailedMessage ( IDictionary < User , List < GitHubCommit > > commitsPerUser )
8182 {
82- foreach ( var userAndCommitedRepositories in usersAndRepositoriesCommited )
83+ StringBuilder stringBuilder = new StringBuilder ( ) ;
84+ foreach ( var userAndCommitedRepositories in commitsPerUser )
8385 {
8486 var user = userAndCommitedRepositories . Key ;
85- var repositoriesUserCommited = userAndCommitedRepositories . Value ;
86- sb . AppendLine ( $ "**[{ user . Login } ]({ user . Url } )**") ;
87- repositoriesUserCommited . All ( repository => {
88- sb . AppendLine ( $ "- [{ repository . Name } ]({ repository . Url } )") ;
89- return true ;
90- } ) ;
91- sb . AppendLine ( "---" ) ;
87+ var commits = userAndCommitedRepositories . Value ;
88+ stringBuilder . AppendLine ( $ "## [{ user . Login } ]({ user . Url } )") ;
89+ commits
90+ . ForEach ( commit =>
91+ {
92+ Regex regex = new Regex ( @"\n*" ) ;
93+ var commitMessage = commit . Commit . Message ;
94+ var commitMesasgeWithoutNewLines = regex . Replace ( commitMessage , " " ) ;
95+ stringBuilder . AppendLine ( $ "- [{ commitMesasgeWithoutNewLines } ]({ commit . Url } )") ;
96+ } ) ;
9297 }
98+ return stringBuilder . ToString ( ) ;
9399 }
94100 }
95101}
0 commit comments