29 lines
No EOL
663 B
TypeScript
29 lines
No EOL
663 B
TypeScript
type LockableInteraction = {
|
|
user: { id: string };
|
|
customId: string;
|
|
deferUpdate(): Promise<any>;
|
|
};
|
|
|
|
const _processing = new Set<string>();
|
|
|
|
export async function withInteractionLock<T>(
|
|
interaction: LockableInteraction,
|
|
fn: () => Promise<T>
|
|
): Promise<T | null> {
|
|
const key = `${interaction.user.id}:${interaction.customId}`;
|
|
if (_processing.has(key)) {
|
|
return null;
|
|
}
|
|
_processing.add(key);
|
|
await interaction.deferUpdate();
|
|
try {
|
|
return await fn();
|
|
} finally {
|
|
_processing.delete(key);
|
|
}
|
|
}
|
|
|
|
export const InteractionLock = {
|
|
with: withInteractionLock,
|
|
clear: () => _processing.clear(), // useful for testing
|
|
}; |