1+ using System ;
2+ using System . IO ;
3+ using System . Text ;
4+ using System . Text . RegularExpressions ;
5+ using System . Threading . Tasks ;
6+ using Discord ;
7+ using Octokit ;
8+ using TabletBot . Discord . Commands ;
9+
10+ namespace TabletBot . Discord . Watchers . GitHub
11+ {
12+ public class CodeMessageWatcher : IMessageWatcher
13+ {
14+ private readonly GitHubClient _client ;
15+
16+ public CodeMessageWatcher ( GitHubClient client )
17+ {
18+ _client = client ;
19+ }
20+
21+ private static readonly Regex CodeRefRegex = new Regex (
22+ @"https:\/\/github.com\/(?<Owner>.+?)\/(?<Repo>.+?)\/blob\/(?<GitRef>.+?)\/(?<Path>.+?)#L(?<StartLine>.+?)(?:-L(?<EndLine>.+?))?($| |>)" ,
23+ RegexOptions . Compiled
24+ ) ;
25+
26+ public async Task Receive ( IMessage message )
27+ {
28+ var match = CodeRefRegex . Match ( message . Content ) ;
29+ if ( message is IUserMessage userMessage && match . Success )
30+ {
31+ using ( message . Channel . EnterTypingState ( ) )
32+ {
33+ var owner = match . Groups [ "Owner" ] . Value ;
34+ var repo = match . Groups [ "Repo" ] . Value ;
35+ var gitRef = match . Groups [ "GitRef" ] . Value ;
36+ var path = match . Groups [ "Path" ] . Value ;
37+ var startLine = int . Parse ( match . Groups [ "StartLine" ] . Value ) - 1 ;
38+ var endLine = match . Groups [ "EndLine" ] . Success ? int . Parse ( match . Groups [ "EndLine" ] . Value ) : startLine + 1 ;
39+
40+ var url = $ "https://raw.githubusercontent.com/{ owner } /{ repo } /{ gitRef } /{ path } ";
41+ var rawContent = await _client . Connection . GetHtml ( new Uri ( url ) ) ;
42+
43+ var fileContent = rawContent . Body . Split ( Environment . NewLine ) ;
44+ var lines = fileContent [ startLine ..endLine ] ;
45+
46+ var extension = Path . GetExtension ( path ) . Replace ( "." , string . Empty ) ;
47+
48+ var sb = new StringBuilder ( ) ;
49+ sb . AppendLine ( Formatting . CodeString ( path ) ) ;
50+ sb . AppendCodeBlock ( lines , extension ) ;
51+
52+ await message . Channel . SendMessageAsync ( sb . ToString ( ) , messageReference : userMessage . ToReference ( ) ) ;
53+ }
54+ }
55+ }
56+
57+ public Task Deleted ( Cacheable < IMessage , ulong > message , Cacheable < IMessageChannel , ulong > channel ) =>
58+ Task . CompletedTask ;
59+ }
60+ }
0 commit comments