From 93cb51a975ce457d6091dc7b0230610f3b958bef Mon Sep 17 00:00:00 2001 From: hunter <61890674+hunt-g@users.noreply.github.com> Date: Fri, 24 Mar 2023 20:54:20 -0600 Subject: [PATCH] feat(MessageEvents): Promisable send/edit listeners (#514) * promisable send/edit listeners * added self * Apply suggestions from code review Co-authored-by: Nuckyz <61953774+Nuckyz@users.noreply.github.com> * fix patches --------- Co-authored-by: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Co-authored-by: Ven --- src/api/MessageEvents.ts | 13 +++++++------ src/plugins/apiMessageEvents.ts | 14 +++++++------- src/utils/constants.ts | 4 ++++ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/api/MessageEvents.ts b/src/api/MessageEvents.ts index 1bf6b0bcb..aaf8d40b6 100644 --- a/src/api/MessageEvents.ts +++ b/src/api/MessageEvents.ts @@ -19,6 +19,7 @@ import Logger from "@utils/Logger"; import { MessageStore } from "@webpack/common"; import type { Channel, Message } from "discord-types/general"; +import type { Promisable } from "type-fest"; const MessageEventsLogger = new Logger("MessageEvents", "#e5c890"); @@ -41,16 +42,16 @@ export interface MessageExtra { stickerIds?: string[]; } -export type SendListener = (channelId: string, messageObj: MessageObject, extra: MessageExtra) => void | { cancel: boolean; }; -export type EditListener = (channelId: string, messageId: string, messageObj: MessageObject) => void; +export type SendListener = (channelId: string, messageObj: MessageObject, extra: MessageExtra) => Promisable; +export type EditListener = (channelId: string, messageId: string, messageObj: MessageObject) => Promisable; const sendListeners = new Set(); const editListeners = new Set(); -export function _handlePreSend(channelId: string, messageObj: MessageObject, extra: MessageExtra) { +export async function _handlePreSend(channelId: string, messageObj: MessageObject, extra: MessageExtra) { for (const listener of sendListeners) { try { - const result = listener(channelId, messageObj, extra); + const result = await listener(channelId, messageObj, extra); if (result && result.cancel === true) { return true; } @@ -61,10 +62,10 @@ export function _handlePreSend(channelId: string, messageObj: MessageObject, ext return false; } -export function _handlePreEdit(channelId: string, messageId: string, messageObj: MessageObject) { +export async function _handlePreEdit(channelId: string, messageId: string, messageObj: MessageObject) { for (const listener of editListeners) { try { - listener(channelId, messageId, messageObj); + await listener(channelId, messageId, messageObj); } catch (e) { MessageEventsLogger.error("MessageEditHandler: Listener encountered an unknown error\n", e); } diff --git a/src/plugins/apiMessageEvents.ts b/src/plugins/apiMessageEvents.ts index 13fbc4c34..6843200d4 100644 --- a/src/plugins/apiMessageEvents.ts +++ b/src/plugins/apiMessageEvents.ts @@ -22,22 +22,22 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "MessageEventsAPI", description: "Api required by anything using message events.", - authors: [Devs.Arjix], + authors: [Devs.Arjix, Devs.hunt], patches: [ { - find: "sendMessage:function", + find: '"MessageActionCreators"', replacement: [{ - match: /(?<=_sendMessage:function\([^)]+\)){/, - replace: "{if(Vencord.Api.MessageEvents._handlePreSend(...arguments)){return;};" + match: /_sendMessage:(function\([^)]+\)){/, + replace: "_sendMessage:async $1{if(await Vencord.Api.MessageEvents._handlePreSend(...arguments))return;" }, { - match: /(?<=\beditMessage:function\([^)]+\)){/, - replace: "{Vencord.Api.MessageEvents._handlePreEdit(...arguments);" + match: /\beditMessage:(function\([^)]+\)){/, + replace: "editMessage:async $1{await Vencord.Api.MessageEvents._handlePreEdit(...arguments);" }] }, { find: '("interactionUsernameProfile', replacement: { - match: /var \w=(\w)\.id,\w=(\w)\.id;return .{1,2}\.useCallback\(\(?function\((.{1,2})\){/, + match: /var \i=(\i)\.id,\i=(\i)\.id;return \i\.useCallback\(\(?function\((\i)\){/, replace: (m, message, channel, event) => // the message param is shadowed by the event param, so need to alias them `var _msg=${message},_chan=${channel};${m}Vencord.Api.MessageEvents._handleClick(_msg, _chan, ${event});` diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 4021c811f..bacf914eb 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -202,6 +202,10 @@ export const Devs = /* #__PURE__*/ Object.freeze({ name: "lewisakura", id: 96269247411400704n }, + hunt: { + name: "hunt-g", + id: 222800179697287168n + }, cloudburst: { name: "cloudburst", id: 892128204150685769n