Skip to content

Commit 02393ca

Browse files
authored
Merge pull request #115 from Gerrit0/master
fix: Add trash can in addMessageOwnership
2 parents a4c9050 + 082a59d commit 02393ca

File tree

3 files changed

+32
-14
lines changed

3 files changed

+32
-14
lines changed

Diff for: src/modules/playground.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@ import {
1212
findCodeblockFromChannel,
1313
PLAYGROUND_REGEX,
1414
} from '../util/findCodeblockFromChannel';
15+
import { LimitedSizeMap } from '../util/limitedSizeMap';
1516
import { addMessageOwnership, sendWithMessageOwnership } from '../util/send';
1617

1718
export class PlaygroundModule extends Module {
1819
constructor(client: CookiecordClient) {
1920
super(client);
2021
}
2122

22-
private editedLongLink = new Map<string, Message>();
23+
private editedLongLink = new LimitedSizeMap<string, Message>(1000);
2324

2425
@command({
2526
aliases: ['pg', 'playg'],
@@ -67,9 +68,10 @@ export class PlaygroundModule extends Module {
6768
{ embed },
6869
);
6970
this.editedLongLink.set(msg.id, botMsg);
70-
addMessageOwnership(botMsg, msg.author);
71+
await addMessageOwnership(botMsg, msg.author);
7172
}
7273
}
74+
7375
@listener({ event: 'messageUpdate' })
7476
async onLongFix(_oldMsg: Message, msg: Message) {
7577
if (msg.partial) await msg.fetch();

Diff for: src/util/limitedSizeMap.ts

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* A FIFO style limited size map, used to prevent memory from growing unboundedly when tracking messages.
3+
*/
4+
export class LimitedSizeMap<K, V> extends Map<K, V> implements Map<K, V> {
5+
private _maxSize: number;
6+
7+
constructor(maxSize: number) {
8+
super();
9+
this._maxSize = maxSize;
10+
}
11+
12+
set(key: K, val: V) {
13+
super.set(key, val);
14+
15+
if (this.size > this._maxSize) {
16+
// Keys returns an iterable in insertion order, so this removes the oldest entry from the map.
17+
this.delete(this.keys().next().value);
18+
}
19+
20+
return this;
21+
}
22+
}

Diff for: src/util/send.ts

+6-12
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { Message, MessageEmbed, User } from 'discord.js';
2+
import { LimitedSizeMap } from './limitedSizeMap';
23

3-
const MAX_TRACKED_MESSAGES = 1000;
4-
5-
const messageToUserId = new Map<string, string>();
4+
const messageToUserId = new LimitedSizeMap<string, string>(1000);
65

76
export const DELETE_EMOJI = '🗑️';
87

@@ -11,18 +10,13 @@ export async function sendWithMessageOwnership(
1110
toSend: string | { embed: MessageEmbed },
1211
) {
1312
const sent = await message.channel.send(toSend);
14-
await sent.react(DELETE_EMOJI);
15-
16-
addMessageOwnership(sent, message.author);
13+
await addMessageOwnership(sent, message.author);
1714
}
1815

19-
export function addMessageOwnership(message: Message, user: User) {
16+
export async function addMessageOwnership(message: Message, user: User) {
17+
await message.react(DELETE_EMOJI);
18+
2019
messageToUserId.set(message.id, user.id);
21-
// Without this memory grows unboundedly... very slowly, but better to avoid the issue.
22-
if (messageToUserId.size > MAX_TRACKED_MESSAGES) {
23-
// Keys returns an iterable in insertion order, so we remove the oldest message from the map.
24-
messageToUserId.delete(messageToUserId.keys().next().value);
25-
}
2620
}
2721

2822
export function ownsBotMessage(message: Message, userId: string) {

0 commit comments

Comments
 (0)