cursed webhooks for discord sending
This commit is contained in:
37
index.ts
37
index.ts
@@ -1,4 +1,4 @@
|
|||||||
import { readFileSync } from "fs";
|
import { appendFileSync, readFileSync } from "fs";
|
||||||
|
|
||||||
import * as discord from "discord.js";
|
import * as discord from "discord.js";
|
||||||
import * as matrix from "matrix-js-sdk";
|
import * as matrix from "matrix-js-sdk";
|
||||||
@@ -31,21 +31,48 @@ matrix_client.startClient({ initialSyncLimit: 0 });
|
|||||||
//discord
|
//discord
|
||||||
|
|
||||||
discord_client.on("messageCreate", async (message) => {
|
discord_client.on("messageCreate", async (message) => {
|
||||||
if (!MAPPING[message.channelId] || message.author.id === discord_client.user.id) return;
|
if (!MAPPING[message.channelId] || message.author.id === discord_client.user.id || (message.webhookId && (await message.fetchWebhook()).name === "Matrix Bridge")) return;
|
||||||
await matrix_client.sendEvent(MAPPING[message.channelId], matrix.EventType.RoomMessage, {
|
const channel_id = message.channelId;
|
||||||
|
let attachments = "";
|
||||||
|
for (const [_, a] of message.attachments) {
|
||||||
|
attachments += "\n" + a.url;
|
||||||
|
}
|
||||||
|
await matrix_client.sendEvent(MAPPING[channel_id], matrix.EventType.RoomMessage, {
|
||||||
msgtype: matrix.MsgType.Text,
|
msgtype: matrix.MsgType.Text,
|
||||||
format: "org.matrix.custom.html",
|
format: "org.matrix.custom.html",
|
||||||
body: `${message.author.tag}: ${message.content}`,
|
body: `${message.author.tag}: ${message.content}`,
|
||||||
formatted_body: `<strong>${message.author.tag}:</strong> ${message.content}`,
|
formatted_body: `<strong>${message.author.tag}:</strong> ${message.content}${attachments}`,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
//matrix
|
//matrix
|
||||||
|
|
||||||
|
//authenticated media must be bypassed, see https://blog.kimiblock.top/2024/11/23/bypassing-auth-media/index.html
|
||||||
matrix_client.on(matrix.RoomEvent.Timeline, async (event, room) => {
|
matrix_client.on(matrix.RoomEvent.Timeline, async (event, room) => {
|
||||||
if (event.getType() !== "m.room.message") return;
|
if (event.getType() !== "m.room.message") return;
|
||||||
const { sender, content, room_id } = event.event;
|
const { sender, content, room_id } = event.event;
|
||||||
if (!MAPPING[room_id] || sender === process.env.MATRIX_USER) return;
|
if (!MAPPING[room_id] || sender === process.env.MATRIX_USER) return;
|
||||||
await (await discord_client.channels.fetch(MAPPING[room_id]) as discord.TextChannel).send(`**${sender}:** ${content.body}`);
|
const channel_id = MAPPING[room_id];
|
||||||
|
let webhook_id = process.env[`webhookid_${channel_id}`];
|
||||||
|
let webhook_token = process.env[`webhooktoken_${channel_id}`];
|
||||||
|
if (!webhook_id || !webhook_token) {
|
||||||
|
console.log("Creating new webhook");
|
||||||
|
const webhook = await (await discord_client.channels.fetch(MAPPING[room_id]) as discord.TextChannel).createWebhook({
|
||||||
|
name: "Matrix Bridge",
|
||||||
|
});
|
||||||
|
webhook_id = webhook.id;
|
||||||
|
process.env[`webhookid_${channel_id}`] = webhook_id;
|
||||||
|
webhook_token = webhook.token;
|
||||||
|
process.env[`webhooktoken_${channel_id}`] = webhook_token;
|
||||||
|
appendFileSync(".env", `\nwebhookid_${channel_id}=${webhook_id}\nwebhooktoken_${channel_id}=${webhook_token}`);
|
||||||
|
}
|
||||||
|
const webhook_client = new discord.WebhookClient({ id: webhook_id, token: webhook_token });
|
||||||
|
await webhook_client.send({
|
||||||
|
content: content.body,
|
||||||
|
username: sender,
|
||||||
|
avatarURL: event.sender.getAvatarUrl(matrix_client.getHomeserverUrl(), 128, 128, "crop", true, false).replace("media/v3", "client/v1/media"),
|
||||||
|
});
|
||||||
|
//
|
||||||
|
//await (await discord_client.channels.fetch(channel_id) as discord.TextChannel).send(`**${sender}:** ${content.body}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user