Skip to content

Commit 0ed5f41

Browse files
committed
cache and log message stickers
1 parent 289d1bc commit 0ed5f41

File tree

8 files changed

+319
-6
lines changed

8 files changed

+319
-6
lines changed

Commands/DebugCmds.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public async Task LogPrint(TextCommandContext ctx)
2424

2525
using (var dbContext = new CliptokDbContext())
2626
{
27-
var records = (await dbContext.Messages.Include(m => m.User).OrderByDescending(m => m.Id).Take(100).ToListAsync());
27+
var records = (await dbContext.Messages.Include(m => m.User).Include(m => m.Sticker).Include(m => m.User.BulkMessageLogs).OrderByDescending(m => m.Id).Take(100).ToListAsync());
2828
var json = JsonConvert.SerializeObject(records, Formatting.Indented);
2929
await ctx.RespondAsync(new DiscordMessageBuilder()
3030
.WithContent($"100 most recent message logs:\n{await StringHelpers.CodeOrHasteBinAsync(json, "json", plain: true)}"));

Database.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class CliptokDbContext : DbContext
1212
public DbSet<Models.CachedDiscordMessage> Messages { get; set; }
1313
public DbSet<Models.CachedDiscordUser> Users { get; set; }
1414
public DbSet<Models.BulkMessageLogStore> BulkMessageLogStore { get; set; }
15+
public DbSet<Models.CachedDiscordSticker> Stickers { get; set; }
1516

1617
public CliptokDbContext()
1718
{

Events/MessageEvent.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public static async Task MessageDeleted(DiscordClient client, MessageDeletedEven
8686
{
8787
using (var dbContext = new CliptokDbContext())
8888
{
89-
var cachedMessage = await dbContext.Messages.Include(m => m.User).FirstOrDefaultAsync(m => m.Id == e.Message.Id);
89+
var cachedMessage = await dbContext.Messages.Include(m => m.User).Include(m => m.Sticker).FirstOrDefaultAsync(m => m.Id == e.Message.Id);
9090

9191
// we store bot messages but don't log them right now
9292
if (cachedMessage is not null && !cachedMessage.User.IsBot)
@@ -125,7 +125,7 @@ public static async Task MessagesBulkDeleted(DiscordClient client, MessagesBulkD
125125

126126
using (var dbContext = new CliptokDbContext())
127127
{
128-
var cachedMessages = dbContext.Messages.Include(m => m.User).Where(m => messageIds.Contains(m.Id));
128+
var cachedMessages = dbContext.Messages.Include(m => m.User).Include(m => m.Sticker).Where(m => messageIds.Contains(m.Id));
129129
var cachedUsers = dbContext.Users.Where(u => cachedMessages.Select(m => m.User.Id).Contains(u.Id)).ToList();
130130
var (dumpMessage, pasteUrl) = await LogChannelHelper.CreateDumpMessageAsync($"{Program.cfgjson.Emoji.Deleted} {e.Messages.Count} messages were deleted from {e.Channel.Mention}, {cachedMessages.ToList().Count} were logged:", cachedMessages.ToList(), e.Channel);
131131
var logMsg = await LogChannelHelper.LogMessageAsync("messages", dumpMessage);
@@ -213,26 +213,50 @@ static async Task DeleteAndWarnAsync(MockDiscordMessage message, string reason,
213213
IsBot = message.Author.IsBot
214214
};
215215
await ctx.Users.AddAsync(cachedMessage.User);
216-
await ctx.SaveChangesAsync();
217216
}
218217
else
219218
{
220219
cachedMessage.User = existingUser;
221220
}
222221

222+
if (message.Stickers.Count != 0)
223+
{
224+
var existingSticker = await ctx.Stickers.FirstOrDefaultAsync(s => s.Id == message.Stickers[0].Id);
225+
226+
if (existingSticker is null)
227+
{
228+
cachedMessage.Sticker = new Models.CachedDiscordSticker
229+
{
230+
Id = message.Stickers[0].Id,
231+
Url = message.Stickers[0].StickerUrl,
232+
Name = message.Stickers[0].Name
233+
};
234+
await ctx.Stickers.AddAsync(cachedMessage.Sticker);
235+
}
236+
else
237+
{
238+
cachedMessage.Sticker = existingSticker;
239+
}
240+
}
241+
242+
await ctx.SaveChangesAsync();
223243
return cachedMessage;
224244
}
225245

226246
public static async Task UpdateMessageAsync(Models.CachedDiscordMessage cachedMessage, CliptokDbContext ctx)
227247
{
228248
ctx.Users.Attach(cachedMessage.User);
249+
if (cachedMessage.Sticker is not null)
250+
ctx.Stickers.Attach(cachedMessage.Sticker);
229251
ctx.Messages.Update(cachedMessage);
230252
await ctx.SaveChangesAsync();
231253
}
232254

233255
public static async Task AddMessageToCacheAsync(Models.CachedDiscordMessage cachedMessage, CliptokDbContext ctx)
234256
{
235257
ctx.Attach(cachedMessage.User);
258+
if (cachedMessage.Sticker is not null)
259+
ctx.Stickers.Attach(cachedMessage.Sticker);
236260
await ctx.AddAsync(cachedMessage);
237261
await ctx.SaveChangesAsync();
238262
}
@@ -254,7 +278,7 @@ public static async Task MessageHandlerAsync(DiscordClient client, MockDiscordMe
254278
{
255279
using (var dbContext = new CliptokDbContext())
256280
{
257-
var cachedMessage = dbContext.Messages.Include(m => m.User).FirstOrDefault(m => m.Id == message.Id);
281+
var cachedMessage = dbContext.Messages.Include(m => m.User).Include(m => m.Sticker).FirstOrDefault(m => m.Id == message.Id);
258282
if (cachedMessage is not null && (cachedMessage.Content != message.Content || cachedMessage.AttachmentURLs.Count != message.Attachments.Count))
259283
{
260284
var newMessage = await CacheMessageAsync(message, dbContext);

Helpers/DiscordHelpers.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,11 @@ public static async Task<string> CompileMessagesAsync(List<Models.CachedDiscordM
135135
output.AppendLine($"{attachment}");
136136
}
137137
}
138+
139+
if (message.Sticker is not null)
140+
{
141+
output.AppendLine($"[Sticker: {message.Sticker.Name}] ({message.Sticker.Url})");
142+
}
138143
}
139144

140145
return output.ToString();
@@ -299,8 +304,10 @@ public static async Task<DiscordMessageBuilder> GenerateMessageRelay(Models.Cach
299304

300305
oldContent += String.Join("\n", oldMessage.AttachmentURLs.ToArray());
301306
}
302-
embed.AddField("Old content", await StringHelpers.CodeOrHasteBinAsync(oldContent, noCode: true, messageWrapper: true, charLimit: 1024));
303307

308+
if (oldMessage.Sticker is not null)
309+
oldContent += $"\n[{oldMessage.Sticker.Name}]({oldMessage.Sticker.Url})";
310+
embed.AddField("Old content", await StringHelpers.CodeOrHasteBinAsync(oldContent, noCode: true, messageWrapper: true, charLimit: 1024));
304311
}
305312
}
306313
if (message.Content is null || message.Content == "")
@@ -316,6 +323,9 @@ public static async Task<DiscordMessageBuilder> GenerateMessageRelay(Models.Cach
316323
content += String.Join("\n", message.AttachmentURLs.ToArray());
317324
}
318325

326+
if (oldMessage.Sticker is not null)
327+
content += $"\n[{message.Sticker.Name}]({message.Sticker.Url})";
328+
319329
embed.AddField("New content", await StringHelpers.CodeOrHasteBinAsync(content, noCode: true, messageWrapper: true, charLimit: 1024));
320330
}
321331
embed.Color = DiscordColor.Yellow;
@@ -327,6 +337,13 @@ public static async Task<DiscordMessageBuilder> GenerateMessageRelay(Models.Cach
327337
embed.WithDescription("`[ No content ]`");
328338
else
329339
embed.WithDescription(message.Content);
340+
341+
if (message.Sticker is not null)
342+
{
343+
string fieldValue = $"[{message.Sticker.Name}]({message.Sticker.Url})";
344+
embed.AddField($"Sticker", fieldValue);
345+
embed.WithImageUrl(message.Sticker.Url.Replace("cdn.discordapp.com", "media.discordapp.net") + "?size=160");
346+
}
330347
}
331348
else
332349
{

Migrations/20250709000839_messagestickers.Designer.cs

Lines changed: 171 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using Microsoft.EntityFrameworkCore.Migrations;
2+
3+
#nullable disable
4+
5+
namespace Cliptok.Migrations
6+
{
7+
/// <inheritdoc />
8+
public partial class messagestickers : Migration
9+
{
10+
/// <inheritdoc />
11+
protected override void Up(MigrationBuilder migrationBuilder)
12+
{
13+
migrationBuilder.AddColumn<decimal>(
14+
name: "StickerId",
15+
table: "Messages",
16+
type: "numeric(20,0)",
17+
nullable: true);
18+
19+
migrationBuilder.CreateTable(
20+
name: "Stickers",
21+
columns: table => new
22+
{
23+
Id = table.Column<decimal>(type: "numeric(20,0)", nullable: false),
24+
Url = table.Column<string>(type: "text", nullable: true),
25+
Name = table.Column<string>(type: "text", nullable: true)
26+
},
27+
constraints: table =>
28+
{
29+
table.PrimaryKey("PK_Stickers", x => x.Id);
30+
});
31+
32+
migrationBuilder.CreateIndex(
33+
name: "IX_Messages_StickerId",
34+
table: "Messages",
35+
column: "StickerId");
36+
37+
migrationBuilder.AddForeignKey(
38+
name: "FK_Messages_Stickers_StickerId",
39+
table: "Messages",
40+
column: "StickerId",
41+
principalTable: "Stickers",
42+
principalColumn: "Id");
43+
}
44+
45+
/// <inheritdoc />
46+
protected override void Down(MigrationBuilder migrationBuilder)
47+
{
48+
migrationBuilder.DropForeignKey(
49+
name: "FK_Messages_Stickers_StickerId",
50+
table: "Messages");
51+
52+
migrationBuilder.DropTable(
53+
name: "Stickers");
54+
55+
migrationBuilder.DropIndex(
56+
name: "IX_Messages_StickerId",
57+
table: "Messages");
58+
59+
migrationBuilder.DropColumn(
60+
name: "StickerId",
61+
table: "Messages");
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)