From 34021d7d04de91e504ea24a21a9ccbfbd62dc9a5 Mon Sep 17 00:00:00 2001 From: ITOH Date: Mon, 17 May 2021 21:13:33 +0200 Subject: [PATCH 1/2] first add this --- src/util/collection.ts | 45 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/util/collection.ts b/src/util/collection.ts index 23b2933ea..4689208bd 100644 --- a/src/util/collection.ts +++ b/src/util/collection.ts @@ -1,5 +1,38 @@ export class Collection extends Map { maxSize?: number; + private sweeper?: CollectionSweeper & { intervalId?: number }; + + constructor( + entries?: (readonly (readonly [K, V])[] | null) | Map, + options?: CollectionOptions, + ) { + super(entries ?? []); + + this.maxSize = options?.maxSize; + if (!options?.sweeper) return; + + this.startSweeper(options.sweeper); + } + + startSweeper(options: CollectionSweeper): number { + if (this.sweeper?.intervalId) clearInterval(this.sweeper.intervalId); + + this.sweeper = options; + this.sweeper.intervalId = setInterval(() => { + this.map(async (value, key) => { + if (!(await this.sweeper?.filter(value, key))) return; + + this.delete(key); + return key; + }); + }, options.interval); + + return this.sweeper.intervalId!; + } + + stopSweeper(): void { + return clearInterval(this.sweeper?.intervalId); + } set(key: K, value: V) { // When this collection is maxSizeed make sure we can add first @@ -87,3 +120,15 @@ export class Collection extends Map { return accumulator; } } + +interface CollectionOptions { + sweeper?: CollectionSweeper; + maxSize?: number; +} + +interface CollectionSweeper { + /** The filter to determine whether an element should be deleted or not */ + filter: ((value: V, key: K) => boolean | Promise); + /** The interval in which the sweeper should run */ + interval: number; +} From a949e1339863e681e0ad936ee9cd9f8c05611200 Mon Sep 17 00:00:00 2001 From: itohatweb Date: Mon, 17 May 2021 19:13:56 +0000 Subject: [PATCH 2/2] Commit from GitHub Actions (Lint) --- src/plugins/proxyEvents.ts | 14 ++-- src/types/discordeno/eventHandlers.ts | 96 ++++++++++++++++++++++----- tests/ws/start_bot.ts | 4 +- 3 files changed, 89 insertions(+), 25 deletions(-) diff --git a/src/plugins/proxyEvents.ts b/src/plugins/proxyEvents.ts index 5af8bb67e..2acb859e2 100644 --- a/src/plugins/proxyEvents.ts +++ b/src/plugins/proxyEvents.ts @@ -3,9 +3,13 @@ import type { EventHandlers } from "../types/discordeno/eventHandlers.ts"; import type { EventEmitter } from "https://deno.land/std@0.96.0/node/events.ts"; export function proxyEvent(emitter: EventEmitter) { - replaceEventHandlers(new Proxy(eventHandlers, { - get(target, prop: keyof EventHandlers) { - return target[prop] !== undefined ? target[prop] : ((...args: unknown[]) => emitter.emit(prop, ...args)); - }, - })); + replaceEventHandlers( + new Proxy(eventHandlers, { + get(target, prop: keyof EventHandlers) { + return target[prop] !== undefined + ? target[prop] + : ((...args: unknown[]) => emitter.emit(prop, ...args)); + }, + }), + ); } diff --git a/src/types/discordeno/eventHandlers.ts b/src/types/discordeno/eventHandlers.ts index a460928db..77a4076ca 100644 --- a/src/types/discordeno/eventHandlers.ts +++ b/src/types/discordeno/eventHandlers.ts @@ -22,7 +22,7 @@ import { PresenceUpdate, TypingStart, User, - VoiceState + VoiceState, } from "../mod.ts"; import { VoiceServerUpdate } from "../voice/voice_server_update.ts"; import { DebugArg } from "./debug_arg.ts"; @@ -44,14 +44,22 @@ export type EventHandlersDefinitions = { /** Sent when a channel relevant to the current user is deleted. */ channelDelete: [channel: DiscordenoChannel]; /** Sent when a message pin is updated */ - channelPinsUpdate: [channel: DiscordenoChannel, guild?: DiscordenoGuild, lastPinTimestamp?: string | null]; + channelPinsUpdate: [ + channel: DiscordenoChannel, + guild?: DiscordenoGuild, + lastPinTimestamp?: string | null, + ]; debug: [args: string | DebugArg, data?: string]; /** Sent before every event. Discordeno awaits the execution of this event before main event gets sent. */ dispatchRequirements: [data: DiscordGatewayPayload, shardId: number]; /** Sent when a user is banned from a guild. */ guildBanAdd: [guild: DiscordenoGuild, user: User, member?: DiscordenoMember]; /** Sent when a user is unbanned from a guild. */ - guildBanRemove: [guild: DiscordenoGuild, user: User, member?: DiscordenoMember]; + guildBanRemove: [ + guild: DiscordenoGuild, + user: User, + member?: DiscordenoMember, + ]; /** * This event can be sent in three different scenarios: * 1. When a user is initially connecting, to lazily load and backfill information for all unavailable guilds sent in the `READY` event. Guilds that are unavailable due to an outage will send a `GUILD_DELETE` event. @@ -74,27 +82,53 @@ export type EventHandlersDefinitions = { /** Sent when a guild becomes or was already unavailable due to an outage, or when the user leaves or is removed from a guild. If the `unavailable` field is not set, the user was removed from the guild. */ guildDelete: [guild: DiscordenoGuild]; /** Sent when a guild's emojis have been updated. */ - guildEmojisUpdate: [guild: DiscordenoGuild, emojis: Collection, oldEmojis: Collection]; + guildEmojisUpdate: [ + guild: DiscordenoGuild, + emojis: Collection, + oldEmojis: Collection, + ]; /** Sent when a new user joins a guild. */ guildMemberAdd: [guild: DiscordenoGuild, member: DiscordenoMember]; /** Sent when a user is removed from a guild (leave/kick/ban). */ - guildMemberRemove: [guild: DiscordenoGuild, user: User, member?: DiscordenoMember]; + guildMemberRemove: [ + guild: DiscordenoGuild, + user: User, + member?: DiscordenoMember, + ]; /** Sent when a guild member is updated. This will also fire when the user object of a guild member changes. */ - guildMemberUpdate: [guild: DiscordenoGuild, member: DiscordenoMember, oldMember?: DiscordenoMember]; + guildMemberUpdate: [ + guild: DiscordenoGuild, + member: DiscordenoMember, + oldMember?: DiscordenoMember, + ]; /** Sent when a user uses a Slash Command. */ - interactionCreate: [data: Omit, member?: DiscordenoMember]; + interactionCreate: [ + data: Omit, + member?: DiscordenoMember, + ]; /** Sent when a user uses a Slash Command in a guild. */ - interactionGuildCreate: [data: Omit, member: DiscordenoMember]; + interactionGuildCreate: [ + data: Omit, + member: DiscordenoMember, + ]; /** Sent when a user uses a Slash Command in a dm. */ interactionDMCreate: [data: Omit]; /** Sent when a message is created. */ messageCreate: [message: DiscordenoMessage]; /** Sent when a message is deleted. */ - messageDelete: [partial: { id: string; channel: DiscordenoChannel }, message?: DiscordenoMessage]; + messageDelete: [ + partial: { id: string; channel: DiscordenoChannel }, + message?: DiscordenoMessage, + ]; /** Sent when a message is updated. */ messageUpdate: [message: DiscordenoMessage, oldMessage: DiscordenoMessage]; /** Sent when a user updates its nickname */ - nicknameUpdate: [guild: DiscordenoGuild, member: DiscordenoMember, nickname: string, oldNickname?: string]; + nicknameUpdate: [ + guild: DiscordenoGuild, + member: DiscordenoMember, + nickname: string, + oldNickname?: string, + ]; /** A user's presence is their current state on a guild. This event is sent when a user's presence or info, such as name or avatar, is updated. */ presenceUpdate: [presence: PresenceUpdate, oldPresence?: PresenceUpdate]; /** Sent before every event execution. Discordeno will not await its execution. */ @@ -106,16 +140,32 @@ export type EventHandlersDefinitions = { /** Sent when a user removes a reaction from a message. */ reactionRemove: [data: MessageReactionRemove, message?: DiscordenoMessage]; /** Sent when a user explicitly removes all reactions from a message. */ - reactionRemoveAll: [payload: MessageReactionRemoveAll, message?: DiscordenoMessage]; + reactionRemoveAll: [ + payload: MessageReactionRemoveAll, + message?: DiscordenoMessage, + ]; /** Sent when a bot removes all instances of a given emoji from the reactions of a message. */ - reactionRemoveEmoji: [emoji: Partial, messageId: bigint, channelId: bigint, guildId?: bigint]; + reactionRemoveEmoji: [ + emoji: Partial, + messageId: bigint, + channelId: bigint, + guildId?: bigint, + ]; /** Sent when a guild role is created. */ roleCreate: [guild: DiscordenoGuild, role: DiscordenoRole]; /** Sent when a guild role is deleted. */ roleDelete: [guild: DiscordenoGuild, role: DiscordenoRole]; /** Sent when a guild role is updated. */ - roleUpdate: [guild: DiscordenoGuild, role: DiscordenoRole, old: DiscordenoRole]; - roleGained: [guild: DiscordenoGuild, member: DiscordenoMember, roleId: bigint]; + roleUpdate: [ + guild: DiscordenoGuild, + role: DiscordenoRole, + old: DiscordenoRole, + ]; + roleGained: [ + guild: DiscordenoGuild, + member: DiscordenoMember, + roleId: bigint, + ]; roleLost: [guild: DiscordenoGuild, member: DiscordenoMember, roleId: bigint]; shardReady: [shardId: number]; /** Sent when a shard failed to load. */ @@ -125,7 +175,11 @@ export type EventHandlersDefinitions = { /** Sent when a thread is updated */ threadUpdate: [cahnnel: DiscordenoChannel, oldChannel: DiscordenoChannel]; /** Sent when the bot gains access to threads */ - threadListSync: [channels: Collection, members: ThreadMember[], guildId: bigint]; + threadListSync: [ + channels: Collection, + members: ThreadMember[], + guildId: bigint, + ]; /** Sent when the current users thread member is updated */ threadMemberUpdate: [threadMember: ThreadMember]; /** Sent when anyone is added to or removed from a thread */ @@ -139,7 +193,11 @@ export type EventHandlersDefinitions = { /** Sent when a user leaves a voice channel. Does not get sent when user switches the voice channel */ voiceChannelLeave: [member: DiscordenoMember, channelId: bigint]; /** Sent when a user switches the voice channel */ - voiceChannelSwitch: [member: DiscordenoMember, channelId: bigint, oldChannelId: bigint]; + voiceChannelSwitch: [ + member: DiscordenoMember, + channelId: bigint, + oldChannelId: bigint, + ]; /** Sent when a voice server is updated with information for making the bot connect to a voice channel. */ voiceServerUpdate: [payload: VoiceServerUpdate, guild: DiscordenoGuild]; /** Sent when someone joins/leaves/moves voice channels. */ @@ -158,8 +216,10 @@ export type EventHandlersDefinitions = { inviteCreate: [data: InviteCreate]; /** Sent when an invite is deleted. */ inviteDelete: [data: InviteDelete]; -} +}; export type EventHandlers = { - [E in keyof EventHandlersDefinitions]?: (...args: EventHandlersDefinitions[E]) => unknown; + [E in keyof EventHandlersDefinitions]?: ( + ...args: EventHandlersDefinitions[E] + ) => unknown; }; diff --git a/tests/ws/start_bot.ts b/tests/ws/start_bot.ts index 43f59b136..b87994140 100644 --- a/tests/ws/start_bot.ts +++ b/tests/ws/start_bot.ts @@ -3,7 +3,7 @@ import { cache } from "../../src/cache.ts"; import { deleteGuild } from "../../src/helpers/guilds/delete_guild.ts"; import { delay } from "../../src/util/utils.ts"; import { ws } from "../../src/ws/ws.ts"; -import { assertExists, assertEquals } from "../deps.ts"; +import { assertEquals, assertExists } from "../deps.ts"; // Set necessary settings // Disables the logger which logs everything @@ -38,7 +38,7 @@ Deno.test({ await startBot({ token, eventHandlers: { - ready: () => didReady = true + ready: () => didReady = true, }, intents: [ "GuildMessages",