AutoMod/bridge/src/discord/events.ts
2022-04-07 10:55:50 +02:00

102 lines
3.8 KiB
TypeScript

import { BRIDGED_MESSAGES, BRIDGE_CONFIG, logger } from "..";
import { client } from "./client";
import { client as revoltClient } from "../revolt/client";
import { ChannelPermission } from "@janderedev/revolt.js";
import axios from 'axios';
import { ulid } from "ulid";
import GenericEmbed from "../types/GenericEmbed";
client.on('messageCreate', async message => {
try {
if (!message.content) return;
logger.debug(`[M] Discord: ${message.content}`);
const [ bridgeCfg, bridgedReply ] = await Promise.all([
BRIDGE_CONFIG.findOne({ discord: message.channelId }),
(message.reference?.messageId
? BRIDGED_MESSAGES.findOne({ "discord.messageId": message.reference.messageId })
: undefined
),
]);
if (message.webhookId && bridgeCfg?.discordWebhook?.id == message.webhookId) {
return logger.debug(`Discord: Message has already been bridged; ignoring`);
}
if (!bridgeCfg?.revolt) return logger.debug(`Discord: No Revolt channel associated`);
const channel = revoltClient.channels.get(bridgeCfg.revolt);
if (!channel) return logger.debug(`Discord: Cannot find associated channel`);
if (!(channel.permission & ChannelPermission.SendMessage)) {
return logger.debug(`Discord: Lacking SendMessage permission; refusing to send`);
}
if (!(channel.permission & ChannelPermission.Masquerade)) {
return logger.debug(`Discord: Lacking Masquerade permission; refusing to send`);
}
// Setting a known nonce allows us to ignore bridged
// messages while still letting other AutoMod messages pass.
const nonce = ulid();
await BRIDGED_MESSAGES.update(
{ "discord.messageId": message.id },
{
$setOnInsert: {
origin: 'discord',
discord: {
messageId: message.id,
},
},
$set: {
'revolt.nonce': nonce,
}
},
{ upsert: true }
);
const sendBridgeMessage = async (reply?: string) => {
await axios.post(
`${revoltClient.apiURL}/channels/${channel._id}/messages`,
{
content: message.content,
//attachments: [],
//embeds: [],
nonce: nonce,
replies: reply ? [ { id: reply, mention: !!message.mentions.repliedUser } ] : undefined,
masquerade: {
name: message.author.username,
avatar: message.author.displayAvatarURL({ size: 128 }),
},
embeds: message.embeds.length
? message.embeds.map(e => new GenericEmbed(e).toRevolt())
: undefined,
},
{
headers: {
'x-bot-token': process.env['REVOLT_TOKEN']!
}
}
)
.then(async res => {
await BRIDGED_MESSAGES.update(
{ "discord.messageId": message.id },
{
$set: { "revolt.messageId": res.data._id },
}
);
})
.catch(async e => {
console.error(`Failed to send message`, e.response.data);
if (reply) {
console.info('Reytring without reply');
await sendBridgeMessage(undefined);
}
});
}
await sendBridgeMessage(bridgedReply?.revolt?.messageId);
} catch(e) {
console.error(e);
}
});