@@ -23,11 +23,30 @@ public DumpTruckEmoteRequest(CommandContext ctx, DiscordEmoji emoji)
2323 }
2424
2525 public DiscordEmoji Emoji { get ; set ; }
26+ }
27+
28+ public class DumpTruckUserRequest : CommandRequest
29+ {
30+ public DumpTruckUserRequest ( CommandContext ctx , DiscordUser user )
31+ : base ( ctx )
32+ {
33+ User = user ;
34+ }
2635
27- public string ? Speed { get ; set ; }
36+ public DiscordUser User { get ; set ; }
37+ }
38+
39+ public class DumpTruckImageRequest : CommandRequest
40+ {
41+ public DumpTruckImageRequest ( CommandContext ctx )
42+ : base ( ctx )
43+ {
44+ }
2845}
2946
30- public class DumpTruckImageHandlers : IRequestHandler < DumpTruckEmoteRequest >
47+ public class DumpTruckImageHandlers : IRequestHandler < DumpTruckEmoteRequest > ,
48+ IRequestHandler < DumpTruckUserRequest > ,
49+ IRequestHandler < DumpTruckImageRequest >
3150{
3251 private readonly DiscordResolver _discordResolver ;
3352 private readonly ImageService _imageService ;
@@ -61,6 +80,62 @@ public async Task Handle(DumpTruckEmoteRequest request, CancellationToken cancel
6180 await ctx . RespondAsync ( responseBuilder ) ;
6281 }
6382
83+ public async Task Handle ( DumpTruckUserRequest request , CancellationToken cancellationToken )
84+ {
85+ CommandContext ctx = request . Ctx ;
86+ DiscordUser user = request . User ;
87+ DiscordGuild guild = ctx . Guild ;
88+
89+ DiscordMember userAsMember = await _discordResolver . ResolveGuildMember ( guild , user . Id ) ??
90+ throw new Exception ( "Invalid user" ) ;
91+
92+ string imageUrl = userAsMember . GuildAvatarUrl
93+ ?? userAsMember . AvatarUrl
94+ ?? throw new Exception ( "Couldn't load user avatar" ) ;
95+
96+ ImageStreamResult imageStreamResult = await DumpTruckImage (
97+ imageUrl ,
98+ ImageEffects . CropToCircle ) ;
99+
100+ using MemoryStream imageStream = imageStreamResult . MemoryStream ;
101+ string fileExtension = imageStreamResult . FileExtension ;
102+
103+ string imageFilename = userAsMember . DisplayName . ToSafeFilename ( fileExtension ) ;
104+
105+ var responseBuilder = new DiscordMessageBuilder ( ) ;
106+
107+ responseBuilder . AddFile ( imageFilename , imageStreamResult . MemoryStream ) ;
108+
109+ await ctx . RespondAsync ( responseBuilder ) ;
110+ }
111+
112+ public async Task Handle ( DumpTruckImageRequest request , CancellationToken cancellationToken )
113+ {
114+ CommandContext ctx = request . Ctx ;
115+ DiscordMessage message = ctx . Message ;
116+
117+ string ? imageUrl = await message . GetImageUrlFromMessage ( ) ;
118+
119+ if ( imageUrl == null )
120+ {
121+ await ctx . RespondAsync ( "I didn't find any images." ) ;
122+ return ;
123+ }
124+
125+ ImageStreamResult imageStreamResult = await DumpTruckImage ( imageUrl ) ;
126+
127+ using MemoryStream imageStream = imageStreamResult . MemoryStream ;
128+ string fileExtension = imageStreamResult . FileExtension ;
129+
130+ var imageFilename = $ "{ Guid . NewGuid ( ) } .{ fileExtension } ";
131+
132+ var responseBuilder = new DiscordMessageBuilder ( ) ;
133+
134+ responseBuilder . AddFile ( imageFilename , imageStreamResult . MemoryStream ) ;
135+
136+ await ctx . RespondAsync ( responseBuilder ) ;
137+ }
138+
64139 private async Task < ImageStreamResult > DumpTruckImage (
65140 string imageUrl ,
66141 ImageTransformDelegate < Rgba32 > ? preTransform = null )
@@ -77,9 +152,9 @@ private async Task<ImageStreamResult> DumpTruckImage(
77152 string dumpTruckMaskFile = Path . Combine ( "Resources" , "dumptruck_v1_mask.png" ) ;
78153 using Image < Rgba32 > dumpTruckMaskImage = Image . Load < Rgba32 > ( dumpTruckMaskFile ) ;
79154
80- Image petImage = ImageEffects . FillMaskWithTiledImage ( dumpTruckImage , dumpTruckMaskImage , inputImage ) ;
155+ Image resultImage = ImageEffects . FillMaskWithTiledImage ( dumpTruckImage , dumpTruckMaskImage , inputImage ) ;
81156
82- ImageStreamResult outputImageStream = await ImageService . GetImageStream ( petImage ) ;
157+ ImageStreamResult outputImageStream = await ImageService . GetImageStream ( resultImage ) ;
83158
84159 return outputImageStream ;
85160 }
0 commit comments