2023-08-17 13:22:14 +00:00
// @ts-check
const passthrough = require ( "../../passthrough" )
2024-01-11 02:56:42 +00:00
const { sync , db , select , from } = passthrough
2023-08-17 13:22:14 +00:00
/** @type {import("../../matrix/api")} */
const api = sync . require ( "../../matrix/api" )
/ * *
* @ param { import ( "discord-api-types/v10" ) . GatewayMessageDeleteDispatchData } data
* /
async function deleteMessage ( data ) {
2023-10-05 23:31:10 +00:00
const roomID = select ( "channel_room" , "room_id" , { channel _id : data . channel _id } ) . pluck ( ) . get ( )
2023-08-17 13:22:14 +00:00
if ( ! roomID ) return
2023-10-05 23:31:10 +00:00
const eventsToRedact = select ( "event_message" , "event_id" , { message _id : data . id } ) . pluck ( ) . all ( )
2024-01-10 02:48:13 +00:00
db . prepare ( "DELETE FROM message_channel WHERE message_id = ?" ) . run ( data . id )
db . prepare ( "DELETE FROM event_message WHERE message_id = ?" ) . run ( data . id )
2023-08-17 13:22:14 +00:00
for ( const eventID of eventsToRedact ) {
2023-09-06 00:31:38 +00:00
// Unfortunately, we can't specify a sender to do the redaction as, unless we find out that info via the audit logs
2023-08-17 13:22:14 +00:00
await api . redactEvent ( roomID , eventID )
}
}
2024-01-11 02:56:42 +00:00
/ * *
* @ param { import ( "discord-api-types/v10" ) . GatewayMessageDeleteBulkDispatchData } data
* /
async function deleteMessageBulk ( data ) {
const roomID = select ( "channel_room" , "room_id" , { channel _id : data . channel _id } ) . pluck ( ) . get ( )
if ( ! roomID ) return
const sids = JSON . stringify ( data . ids )
const eventsToRedact = from ( "event_message" ) . pluck ( "event_id" ) . and ( "WHERE message_id IN (SELECT value FROM json_each(?)" ) . all ( sids )
db . prepare ( "DELETE FROM message_channel WHERE message_id IN (SELECT value FROM json_each(?)" ) . run ( sids )
db . prepare ( "DELETE FROM event_message WHERE message_id IN (SELECT value FROM json_each(?)" ) . run ( sids )
for ( const eventID of eventsToRedact ) {
// Awaiting will make it go slower, but since this could be a long-running operation either way, we want to leave rate limit capacity for other operations
await api . redactEvent ( roomID , eventID )
}
}
2023-08-17 13:22:14 +00:00
module . exports . deleteMessage = deleteMessage
2024-01-11 02:56:42 +00:00
module . exports . deleteMessageBulk = deleteMessageBulk