1- using System ;
21using System . Collections . Generic ;
32using System . Linq ;
43using System . Text . RegularExpressions ;
76using Octokit ;
87using TabletBot . Common ;
98using TabletBot . Discord . Embeds ;
9+ using TabletBot . Discord . Commands ;
1010
1111#nullable enable
1212
@@ -26,49 +26,55 @@ public IssueMessageWatcher(Settings settings, GitHubClient gitHubClient)
2626 private const string OWNER = "OpenTabletDriver" ;
2727 private const string NAME = "OpenTabletDriver" ;
2828
29+ private static readonly Regex IssueRefRegex = new Regex ( @" ?#([0-9]+[0-9]) ?" ) ;
30+
2931 public async Task Receive ( IMessage message )
3032 {
31- if ( message . Author . IsBot )
33+ if ( message . Author . IsBot || message is not IUserMessage userMessage )
3234 return ;
3335
34- if ( TryGetIssueRefNumbers ( message . Content , out var refs ) )
36+ var rateLimits = await _gitHubClient . Miscellaneous . GetRateLimits ( ) ;
37+ if ( rateLimits . Rate . Remaining < 2 )
38+ return ;
39+
40+ if ( GetIssueRefNumbers ( userMessage . Content ) is IList < uint > refs )
3541 {
36- uint refNum = 0 ;
37- foreach ( int issueRef in refs )
42+ using ( userMessage . Channel . EnterTypingState ( ) )
3843 {
39- if ( refNum == _settings . GitHubIssueRefLimit )
40- break ;
41-
42- var issues = await _gitHubClient . Issue . GetAllForRepository ( OWNER , NAME ) ;
43- var prs = await _gitHubClient . PullRequest . GetAllForRepository ( OWNER , NAME ) ;
44- if ( issues . FirstOrDefault ( i => i . Number == issueRef ) is Issue issue )
45- {
46- var pr = prs . FirstOrDefault ( pr => pr . Number == issue . Number ) ;
47- var embed = pr == null ? GitHubEmbeds . GetIssueEmbed ( issue ) : GitHubEmbeds . GetPullRequestEmbed ( pr ) ;
48- await message . Channel . SendMessageAsync ( embed : embed ) ;
49- }
50- refNum ++ ;
44+ await ReplyWithEmbeds ( userMessage , refs ) ;
5145 }
5246 }
5347 }
5448
5549 public Task Deleted ( Cacheable < IMessage , ulong > message , Cacheable < IMessageChannel , ulong > channel ) => Task . CompletedTask ;
5650
57- public static bool TryGetIssueRefNumbers ( string message , out IEnumerable < int > refNums )
51+ private async Task ReplyWithEmbeds ( IUserMessage message , IList < uint > refs )
5852 {
59- refNums = Array . Empty < int > ( ) ;
53+ var issues = await _gitHubClient . Issue . GetAllForRepository ( OWNER , NAME ) ;
54+ var prs = await _gitHubClient . PullRequest . GetAllForRepository ( OWNER , NAME ) ;
55+ var embeds = GetEmbedsForRefs ( issues , prs , refs ) . ToArray ( ) ;
6056
61- var matches = IssueRefRegex . Matches ( message ) ;
62- if ( matches . Count > 0 )
57+ await message . Channel . SendMessageAsync ( embeds : embeds , messageReference : message . ToReference ( ) ) ;
58+ }
59+
60+ private IEnumerable < Embed > GetEmbedsForRefs ( IReadOnlyList < Issue > issues , IReadOnlyList < PullRequest > prs , IList < uint > refs )
61+ {
62+ for ( var i = 0 ; i < refs . Count && i < _settings . GitHubIssueRefLimit ; i ++ )
6363 {
64- refNums = from match in matches
65- select int . Parse ( match . Groups [ 1 ] . Value ) ;
66- return true ;
67- }
64+ var issueRef = refs [ i ] ;
6865
69- return false ;
66+ if ( issues . FirstOrDefault ( s => s . Number == issueRef ) is Issue issue )
67+ {
68+ var pr = prs . FirstOrDefault ( pr => pr . Number == issue . Number ) ;
69+ yield return pr == null ? GitHubEmbeds . GetIssueEmbed ( issue ) : GitHubEmbeds . GetPullRequestEmbed ( pr ) ;
70+ }
71+ }
7072 }
7173
72- private static readonly Regex IssueRefRegex = new Regex ( @" ?#([0-9]+[0-9]) ?" ) ;
74+ private static IEnumerable < uint > ? GetIssueRefNumbers ( string message )
75+ {
76+ var matches = IssueRefRegex . Matches ( message ) ;
77+ return matches . Any ( ) ? matches . Select ( m => uint . Parse ( m . Groups [ 1 ] . Value ) ) . ToList ( ) : null ;
78+ }
7379 }
7480}
0 commit comments