Skip to content

Commit

Permalink
keys => scan
Browse files Browse the repository at this point in the history
  • Loading branch information
Larsundso committed Feb 8, 2025
1 parent dc32dee commit 8e4298d
Show file tree
Hide file tree
Showing 27 changed files with 93 additions and 82 deletions.
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/automod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,9 @@ export default class AutomodCache extends Cache<APIAutoModerationRule> {
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIAutoModerationRule) {
Expand Down
5 changes: 5 additions & 0 deletions src/BaseClient/Bot/Cache/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import type {
APIWebhook,
} from 'discord-api-types/v10';
import type Redis from 'ioredis';
import scanKeys from '../../UtilModules/scanKeys.js';
import type { RAutomod } from './automod';
import type { RBan } from './ban';
import type { RChannel, RChannelTypes } from './channel';
Expand Down Expand Up @@ -155,6 +156,10 @@ export default abstract class Cache<
return `${this.prefix}${id ? `:${id}` : '*'}`;
}

static async scanKeys(pattern: string): Promise<string[]> {
return scanKeys(pattern);
}

abstract set(...args: [T, string, string, string]): Promise<boolean>;
abstract get(...args: string[]): Promise<null | DeriveRFromAPI<T, K>>;
abstract del(...args: string[]): Promise<number>;
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/channel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,9 @@ export default class ChannelCache extends Cache<
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIGuildChannel<RChannelTypes>) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/commandPermission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,9 @@ export default class CommandPermissionCache extends Cache<APIApplicationCommandP
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIApplicationCommandPermission, guildId: string) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/emoji.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,9 @@ export default class EmojiCache extends Cache<APIEmoji> {
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIEmoji, guildId: string) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,9 @@ export default class EventCache extends Cache<APIGuildScheduledEvent> {
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIGuildScheduledEvent) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/guildCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,9 @@ export default class GuildCommandCache extends Cache<
return this.redis.get(`${this.key()}:${gId}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

// eslint-disable-next-line class-methods-use-this
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/integration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,9 @@ export default class IntegrationCache extends Cache<
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIGuildIntegration, guildId: string) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/invite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,9 @@ export default class InviteCache extends Cache<APIInvite> {
return this.redis.get(`${this.key()}:${code}`).then((data) => this.stringToData(data));
}

del(code: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${code}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(code: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${code}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIInvite) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,9 @@ export default class MessageCache extends Cache<APIMessage> {
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIMessage, guildId: string) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/reaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,9 @@ export default class ReactionCache extends Cache<APIReaction> {
return this.redis.get(`${this.key()}:${mId}:${eId}`).then((data) => this.stringToData(data));
}

del(mId: string, eId: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${mId}:${eId}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(mId: string, eId: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${mId}:${eId}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIReaction, guildId: string, channelId: string, messageId: string) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/role.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,9 @@ export default class RoleCache extends Cache<APIRole> {
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIRole, guildId: string) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/soundboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,9 @@ export default class SoundboardCache extends Cache<APISoundboardSound> {
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APISoundboardSound) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/stage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,9 @@ export default class StageCache extends Cache<APIStageInstance> {
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIStageInstance) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/sticker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,9 @@ export default class StickerCache extends Cache<APISticker> {
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APISticker) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/thread.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,9 @@ export default class ThreadCache extends Cache<
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: Omit<APIThreadChannel, 'position'>) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/threadMember.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,9 @@ export default class ThreadMemberCache extends Cache<APIThreadMember> {
return this.redis.get(`${this.key()}:${tId}:${id}`).then((data) => this.stringToData(data));
}

del(tId: string, id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${tId}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(tId: string, id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${tId}${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIThreadMember, guildId: string) {
Expand Down
7 changes: 3 additions & 4 deletions src/BaseClient/Bot/Cache/webhook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,9 @@ export default class WebhookCache extends Cache<
return this.redis.get(`${this.key()}:${id}`).then((data) => this.stringToData(data));
}

del(id: string): Promise<number> {
return this.redis
.keys(`${this.key()}:${id}`)
.then((keys) => (keys.length ? this.redis.del(keys) : 0));
async del(id: string): Promise<number> {
const keys = await Cache.scanKeys(`${this.key()}:${id}`);
return keys.length ? this.redis.del(keys) : 0;
}

apiToR(data: APIWebhook) {
Expand Down
1 change: 0 additions & 1 deletion src/BaseClient/Bot/Redis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ const subscriber = new Redis({ host: 'redis', db });
export default redis;

export const prefix = `${process.env.mainId}:cache`;
await redis.keys(`${prefix}:*`).then((r) => (r.length ? redis.del(r) : 0));
await redis.config('SET', 'notify-keyspace-events', 'Ex');
await subscriber.subscribe(`__keyevent@${db}__:expired`);

Expand Down
3 changes: 3 additions & 0 deletions src/BaseClient/Bot/Util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ import getScheduled from '../UtilModules/getScheduled.js';
import delScheduled from '../UtilModules/delScheduled.js';
import setRatelimit from '../UtilModules/setRatelimit.js';
import getRatelimit from '../UtilModules/getRatelimit.js';
import scanKeys from '../UtilModules/scanKeys.js';

const logFiles = {
ratelimits: fs.createWriteStream(
Expand Down Expand Up @@ -212,6 +213,7 @@ interface Util {
delScheduled: typeof delScheduled;
setRatelimit: typeof setRatelimit;
getRatelimit: typeof getRatelimit;
scanKeys: typeof scanKeys;
}

const util: Util = {
Expand Down Expand Up @@ -316,6 +318,7 @@ const util: Util = {
delScheduled,
setRatelimit,
getRatelimit,
scanKeys,
};

export default util;
3 changes: 2 additions & 1 deletion src/BaseClient/UtilModules/delScheduled.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import Redis from '../Bot/Redis.js';
import { prefix } from './getScheduled.js';
import scanKeys from './scanKeys.js';

export default async (key: string) => {
const keys = await Redis.keys(`${prefix}:${key}`);
const keys = await scanKeys(`${prefix}:${key}`);
if (!keys.length) return;

const allKeys = [...keys, ...keys.map((k) => k.replace('scheduled', 'scheduled-data'))];
Expand Down
15 changes: 15 additions & 0 deletions src/BaseClient/UtilModules/scanKeys.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import redis from '../Bot/Redis.js';

export default async (pattern: string) => {
const keys: string[] = [];
let cursor = '0';

do {
// eslint-disable-next-line no-await-in-loop
const [nextCursor, scanKeys] = await redis.scan(cursor, 'MATCH', pattern, 'COUNT', '100');
cursor = nextCursor;
keys.push(...scanKeys);
} while (cursor !== '0');

return keys;
};
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import type { Message } from 'discord.js';
import redis from '../../../../BaseClient/Bot/Redis.js';
import { prefix } from '../../../../BaseClient/UtilModules/getScheduled.js';

export default async (msg: Message) => {
Expand All @@ -14,7 +13,9 @@ export default async (msg: Message) => {

if (!msg.mentions.roles.size) return;

if ((await redis.keys(`${prefix}:votePunish:${msg.guildId}:*:${msg.channelId}`)).length) {
if (
(await msg.client.util.scanKeys(`${prefix}:votePunish:${msg.guildId}:*:${msg.channelId}`)).length
) {
return;
}

Expand Down
3 changes: 2 additions & 1 deletion src/Events/BotEvents/raw/Cache/Channel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@ import {
type GatewayChannelUpdateDispatchData,
} from 'discord.js';
import RedisClient, { cache as redis } from '../../../../BaseClient/Bot/Redis.js';
import scanKeys from '../../../../BaseClient/UtilModules/scanKeys.js';

export default {
[GatewayDispatchEvents.ChannelCreate]: (data: GatewayChannelCreateDispatchData) =>
redis.channels.set(data),

[GatewayDispatchEvents.ChannelDelete]: (data: GatewayChannelDeleteDispatchData) => {
redis.channels.del(data.id);
RedisClient.keys(`${redis.messages.key}:${data.guild_id}:${data.id}:*`).then((keys) =>
scanKeys(`${redis.messages.key()}:${data.guild_id}:${data.id}:*`).then((keys) =>
keys.length ? RedisClient.del(keys) : 0,
);
},
Expand Down
9 changes: 5 additions & 4 deletions src/Events/BotEvents/raw/Cache/Guilds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import RedisClient, {
cache as redis,
prefix as redisKey,
} from '../../../../BaseClient/Bot/Redis.js';
import scanKeys from '../../../../BaseClient/UtilModules/scanKeys.js';

export default {
[GatewayDispatchEvents.GuildAuditLogEntryCreate]: (
Expand Down Expand Up @@ -64,13 +65,13 @@ export default {
},

[GatewayDispatchEvents.GuildDelete]: (data: GatewayGuildDeleteDispatchData) =>
RedisClient.keys(`${redisKey}:${data.id}:*`).then((r) => (r.length ? RedisClient.del(r) : 0)),
scanKeys(`${redisKey}:${data.id}:*`).then((r) => (r.length ? RedisClient.del(r) : 0)),

[GatewayDispatchEvents.GuildUpdate]: (data: GatewayGuildUpdateDispatchData) =>
redis.guilds.set(data),

[GatewayDispatchEvents.GuildEmojisUpdate]: async (data: GatewayGuildEmojisUpdateDispatchData) => {
await RedisClient.keys(`${redis.emojis.key()}:${data.guild_id}:*`).then((r) =>
await scanKeys(`${redis.emojis.key()}:${data.guild_id}:*`).then((r) =>
r.length ? RedisClient.del(r) : 0,
);

Expand Down Expand Up @@ -177,7 +178,7 @@ export default {
[GatewayDispatchEvents.GuildSoundboardSoundsUpdate]: async (
data: GatewayGuildSoundboardSoundsUpdateDispatchData,
) => {
await RedisClient.keys(`${redis.soundboards.key()}:${data.guild_id}:*`).then((r) =>
await scanKeys(`${redis.soundboards.key()}:${data.guild_id}:*`).then((r) =>
r.length ? RedisClient.del(r) : 0,
);

Expand All @@ -189,7 +190,7 @@ export default {
[GatewayDispatchEvents.GuildStickersUpdate]: async (
data: GatewayGuildStickersUpdateDispatchData,
) => {
await RedisClient.keys(`${redis.stickers.key()}:${data.guild_id}:*`).then((r) =>
await scanKeys(`${redis.stickers.key()}:${data.guild_id}:*`).then((r) =>
r.length ? RedisClient.del(r) : 0,
);

Expand Down
Loading

0 comments on commit 8e4298d

Please sign in to comment.