Skip to content

Commit c412cd7

Browse files
authored
feat(Message): add messageEditHistoryMaxSize to limit stored msg edits (#4867)
1 parent 4a6fb9a commit c412cd7

File tree

5 files changed

+23
-5
lines changed

5 files changed

+23
-5
lines changed

src/client/Client.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,13 @@ class Client extends BaseClient {
432432
if (typeof options.messageSweepInterval !== 'number' || isNaN(options.messageSweepInterval)) {
433433
throw new TypeError('CLIENT_INVALID_OPTION', 'messageSweepInterval', 'a number');
434434
}
435+
if (
436+
typeof options.messageEditHistoryMaxSize !== 'number' ||
437+
isNaN(options.messageEditHistoryMaxSize) ||
438+
options.messageEditHistoryMaxSize < -1
439+
) {
440+
throw new TypeError('CLIENT_INVALID_OPTION', 'messageEditHistoryMaxSize', 'a number greater than or equal to -1');
441+
}
435442
if (typeof options.fetchAllMembers !== 'boolean') {
436443
throw new TypeError('CLIENT_INVALID_OPTION', 'fetchAllMembers', 'a boolean');
437444
}

src/client/actions/MessageUpdate.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ class MessageUpdateAction extends Action {
99
const { id, channel_id, guild_id, author, timestamp, type } = data;
1010
const message = this.getMessage({ id, channel_id, guild_id, author, timestamp, type }, channel);
1111
if (message) {
12-
message.patch(data);
12+
const old = message.patch(data);
1313
return {
14-
old: message._edits[0],
14+
old,
1515
updated: message,
1616
};
1717
}

src/structures/Message.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,13 +235,18 @@ class Message extends Base {
235235
}
236236

237237
/**
238-
* Updates the message.
238+
* Updates the message and returns the old message.
239239
* @param {Object} data Raw Discord message update data
240+
* @returns {Message}
240241
* @private
241242
*/
242243
patch(data) {
243244
const clone = this._clone();
244-
this._edits.unshift(clone);
245+
const { messageEditHistoryMaxSize } = this.client.options;
246+
if (messageEditHistoryMaxSize !== 0) {
247+
const editsLimit = messageEditHistoryMaxSize === -1 ? Infinity : messageEditHistoryMaxSize;
248+
if (this._edits.unshift(clone) > editsLimit) this._edits.pop();
249+
}
245250

246251
if ('edited_timestamp' in data) this.editedTimestamp = new Date(data.edited_timestamp).getTime();
247252
if ('content' in data) this.content = data.content;
@@ -268,6 +273,8 @@ class Message extends Base {
268273
);
269274

270275
this.flags = new MessageFlags('flags' in data ? data.flags : 0).freeze();
276+
277+
return clone;
271278
}
272279

273280
/**

src/util/Constants.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ const browser = (exports.browser = typeof window !== 'undefined');
1919
* sweepable (in seconds, 0 for forever)
2020
* @property {number} [messageSweepInterval=0] How frequently to remove messages from the cache that are older than
2121
* the message cache lifetime (in seconds, 0 for never)
22+
* @property {number} [messageEditHistoryMaxSize=-1] Maximum number of previous versions to hold for an edited message
23+
* (-1 or Infinity for unlimited - don't do this without sweeping, otherwise memory usage may climb indefinitely.)
2224
* @property {boolean} [fetchAllMembers=false] Whether to cache all guild members and users upon startup, as well as
2325
* upon joining a guild (should be avoided whenever possible)
2426
* @property {DisableMentionType} [disableMentions='none'] Default value for {@link MessageOptions#disableMentions}
@@ -43,6 +45,7 @@ exports.DefaultOptions = {
4345
messageCacheMaxSize: 200,
4446
messageCacheLifetime: 0,
4547
messageSweepInterval: 0,
48+
messageEditHistoryMaxSize: -1,
4649
fetchAllMembers: false,
4750
disableMentions: 'none',
4851
partials: [],

typings/index.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -978,7 +978,7 @@ declare module 'discord.js' {
978978
export class Message extends Base {
979979
constructor(client: Client, data: object, channel: TextChannel | DMChannel | NewsChannel);
980980
private _edits: Message[];
981-
private patch(data: object): void;
981+
private patch(data: object): Message;
982982

983983
public activity: MessageActivity | null;
984984
public application: ClientApplication | null;
@@ -2317,6 +2317,7 @@ declare module 'discord.js' {
23172317
messageCacheMaxSize?: number;
23182318
messageCacheLifetime?: number;
23192319
messageSweepInterval?: number;
2320+
messageEditHistoryMaxSize?: number;
23202321
fetchAllMembers?: boolean;
23212322
disableMentions?: 'none' | 'all' | 'everyone';
23222323
allowedMentions?: MessageMentionOptions;

0 commit comments

Comments
 (0)