94 lines
3.3 KiB
JavaScript
94 lines
3.3 KiB
JavaScript
import { MatrixClient, SimpleFsStorageProvider, AutojoinRoomsMixin, ProfileCache } from "@vector-im/matrix-bot-sdk";
|
|
import markdownit from 'markdown-it';
|
|
import { homeserver_url, access_token, deepl_key } from "./conf.js";
|
|
import { emoji2lang, lang2emoji } from "./const.js";
|
|
|
|
|
|
var storage = new SimpleFsStorageProvider("storage.json");
|
|
var client = new MatrixClient(homeserver_url, access_token, storage);
|
|
AutojoinRoomsMixin.setupOnClient(client);
|
|
|
|
var pc = new ProfileCache(1000, 1000*60*10, client);
|
|
var md = markdownit();
|
|
|
|
|
|
client.on("room.event", async (roomId, event) => {
|
|
if (event.type != "m.reaction") return;
|
|
var reaction = event.content["m.relates_to"]?.key;
|
|
var target_event_id = event.content["m.relates_to"]?.event_id;
|
|
if (!reaction || !target_event_id) return;
|
|
console.debug(reaction, reaction in emoji2lang);
|
|
|
|
var target_lang = emoji2lang[reaction];
|
|
if (!target_lang) return;
|
|
|
|
try {
|
|
var target_event = await client.getEvent(roomId, target_event_id);
|
|
var target_message_text = target_event.content.body;
|
|
if (!target_message_text) return;
|
|
|
|
var deepl_res = await fetch("https://api-free.deepl.com/v2/translate", {
|
|
method: "POST",
|
|
headers: {
|
|
Authorization: `DeepL-Auth-Key ${deepl_key}`,
|
|
"Content-Type": "application/json"
|
|
},
|
|
body: JSON.stringify({
|
|
text: [target_message_text],
|
|
target_lang
|
|
})
|
|
});
|
|
if (!deepl_res.ok) throw new Error(`DeepL API responded HTTP ${deepl_res.status}: ${await deepl_res.text()}`);
|
|
var {text, detected_source_language} = (await deepl_res.json()).translations[0];
|
|
|
|
var {displayName} = await pc.getUserProfile(event.sender, roomId);
|
|
var pig = `${displayName}:`;
|
|
var sl_e = detected_source_language ? `${lang2emoji[detected_source_language]}` : '';
|
|
var tl_e = lang2emoji[target_lang] ? `${lang2emoji[target_lang]}` : '';
|
|
var from = detected_source_language ? `from ${sl_e}\`${detected_source_language}\` ` : '';
|
|
var body = `${pig} **Translated ${from}to ${tl_e}\`${target_lang}\`:**\n\n${text}`;
|
|
var markdown = md.render(body);
|
|
|
|
await client.sendEvent(roomId, "m.room.message", {
|
|
"msgtype": "m.notice",
|
|
"m.mentions": {"user_ids": [event.sender]},
|
|
"m.relates_to": {
|
|
rel_type: target_event.content["m.relates_to"]?.rel_type,
|
|
event_id: target_event.content["m.relates_to"]?.event_id,
|
|
is_falling_back: target_event.content["m.relates_to"]?.is_falling_back,
|
|
"m.in_reply_to": {
|
|
event_id: target_event.eventId
|
|
}
|
|
},
|
|
body,
|
|
format: "org.matrix.custom.html",
|
|
formatted_body: markdown.replace(pig, `<a href="https://matrix.to/#/${event.sender}">${displayName}</a>:`),
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error(error.message);
|
|
await client.sendEvent(roomId, "m.room.message", {
|
|
"msgtype": "m.notice",
|
|
"m.mentions": {"user_ids": [event.sender]},
|
|
body: `An ewor occur!!! ${error.message}`,
|
|
}).catch(console.error);
|
|
}
|
|
});
|
|
|
|
client.on("room.message", async (roomId, event) => {
|
|
var myUserId = await client.getUserId();
|
|
if (event.content.body.includes(myUserId) && event.content["m.mentions"]?.user_ids?.includes(myUserId)) {
|
|
client.sendMessage(roomId, {
|
|
msgtype: "m.notice",
|
|
body: `React to any message with one of the following emojis to get a translation: ${Object.keys(emoji2lang).join(' ')}`,
|
|
"m.relates_to": {
|
|
"m.in_reply_to": {
|
|
event_id: event.event_id
|
|
}
|
|
}
|
|
}).catch(console.error);
|
|
}
|
|
});
|
|
|
|
await client.start();
|
|
console.log("client started"); |