import * as sdk from "matrix-js-sdk"; import fetch from "node-fetch"; import process from "process"; import fs from "fs"; import "dotenv/config"; import { JsonDB, Config } from "node-json-db"; import { TimetableClient } from "./timetable.js"; const authPassword = process.env.AUTH_PASSWORD; const db = new JsonDB(new Config("data/data", true, true, "/")); const timetable = new TimetableClient( process.env.TIMETABLE_ENDPOINT, process.env.TIMETABLE_TOKEN ); await db.push("/rooms", {}, false); // Login const userId = process.env.MATRIX_USER; const client = sdk.createClient({ baseUrl: process.env.MATRIX_URL, accessToken: process.env.MATRIX_TOKEN, userId: userId, fetchFn: fetch, }); const displayName = process.env.MATRIX_DISPLAYNAME || "Timetable V2"; (async () => { const profileInfo = await client.getProfileInfo(userId); if (profileInfo.displayname != displayName) { await client.setProfileInfo("displayname", { displayname: displayName, }); const file = fs.readFileSync("./images/profile-picture.png"); const content = await client.uploadContent(file, { name: "profile-picture.png", type: "image/png", }); await client.setProfileInfo("avatar_url", { avatar_url: content.content_uri, }); } })(); client.once("sync", function (state) { if (state === "PREPARED") { console.log("sync finished"); } }); // Auto-join invited rooms client.on("RoomMember.membership", function (_, member) { if (member.membership === "invite" && member.userId === userId) { client .joinRoom(member.roomId) .then(function () { console.log("Auto-joined %s", member.roomId); }) .catch(() => { client.leave(member.roomId); }); } }); function formatUpdateMessage(update) { let message = ""; if (update.type == "addition") message += "🆕"; else if (update.type == "deletion") message += "🗑"; else if (update.type == "change") message += "✏"; if (update.type == "addition" || update.type == "deletion") { message += " "; if (update.change.type == "cancellation") message += "🚫"; else message += "📑"; } message += ` ${update.lesson}th Lesson