Skip to content

Commit 4596b29

Browse files
Add User and Image versions of Dumptruck command
1 parent 6fa85ff commit 4596b29

File tree

2 files changed

+97
-4
lines changed

2 files changed

+97
-4
lines changed

src/Kattbot/CommandHandlers/Images/DumpTruckImage.cs

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/Kattbot/CommandModules/ImageModule.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,24 @@ public Task DumpTruck(CommandContext ctx, DiscordEmoji emoji)
135135
return _commandParallelQueue.Writer.WriteAsync(request).AsTask();
136136
}
137137

138+
[Command("dumptruck")]
139+
[Cooldown(maxUses: 5, resetAfter: 10, CooldownBucketType.Global)]
140+
public Task DumpTruck(CommandContext ctx, DiscordUser user)
141+
{
142+
var request = new DumpTruckUserRequest(ctx, user);
143+
144+
return _commandParallelQueue.Writer.WriteAsync(request).AsTask();
145+
}
146+
147+
[Command("dumptruck")]
148+
[Cooldown(maxUses: 5, resetAfter: 10, CooldownBucketType.Global)]
149+
public Task DumpTruck(CommandContext ctx)
150+
{
151+
var request = new DumpTruckImageRequest(ctx);
152+
153+
return _commandParallelQueue.Writer.WriteAsync(request).AsTask();
154+
}
155+
138156
[Command("gpt-image")]
139157
[Cooldown(maxUses: 5, resetAfter: 30, CooldownBucketType.Global)]
140158
public Task GptImage(CommandContext ctx, [RemainingText] string prompt)

0 commit comments

Comments
 (0)