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, `${displayName}:`), }); } 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");