// @ts-check const Ty = require("../types") const assert = require("assert") const passthrough = require("../passthrough") const { discord, sync, db } = passthrough /** @type {import("./mreq")} */ const mreq = sync.require("./mreq") /** @type {import("./file")} */ const file = sync.require("./file") /** @type {import("./txnid")} */ const makeTxnId = sync.require("./txnid") /** * @param {string} p endpoint to access * @param {string} [mxid] optional: user to act as, for the ?user_id parameter * @returns {string} the new endpoint */ function path(p, mxid) { if (!mxid) return p const u = new URL(p, "http://localhost") u.searchParams.set("user_id", mxid) return u.pathname + "?" + u.searchParams.toString() } /** * @param {string} username * @returns {Promise} */ function register(username) { console.log(`[api] register: ${username}`) return mreq.mreq("POST", "/client/v3/register", { type: "m.login.application_service", username }) } /** * @returns {Promise} room ID */ async function createRoom(content) { console.log(`[api] create room:`, content) /** @type {Ty.R.RoomCreated} */ const root = await mreq.mreq("POST", "/client/v3/createRoom", content) return root.room_id } /** * @returns {Promise} room ID */ async function joinRoom(roomIDOrAlias, mxid) { /** @type {Ty.R.RoomJoined} */ const root = await mreq.mreq("POST", path(`/client/v3/join/${roomIDOrAlias}`, mxid)) return root.room_id } async function inviteToRoom(roomID, mxidToInvite, mxid) { await mreq.mreq("POST", path(`/client/v3/rooms/${roomID}/invite`, mxid), { user_id: mxidToInvite }) } async function leaveRoom(roomID, mxid) { await mreq.mreq("POST", path(`/client/v3/rooms/${roomID}/leave`, mxid), {}) } /** * @param {string} roomID * @returns {Promise} */ function getAllState(roomID) { return mreq.mreq("GET", `/client/v3/rooms/${roomID}/state`) } /** * @param {string} roomID * @param {string} type * @param {string} stateKey * @param {string} [mxid] * @returns {Promise} event ID */ async function sendState(roomID, type, stateKey, content, mxid) { console.log(`[api] state: ${roomID}: ${type}/${stateKey}`) assert.ok(type) assert.ok(typeof stateKey === "string") /** @type {Ty.R.EventSent} */ const root = await mreq.mreq("PUT", path(`/client/v3/rooms/${roomID}/state/${type}/${stateKey}`, mxid), content) return root.event_id } async function sendEvent(roomID, type, content, mxid) { console.log(`[api] event to ${roomID} as ${mxid || "default sim"}`) /** @type {Ty.R.EventSent} */ const root = await mreq.mreq("PUT", path(`/client/v3/rooms/${roomID}/send/${type}/${makeTxnId.makeTxnId()}`, mxid), content) return root.event_id } async function profileSetDisplayname(mxid, displayname) { await mreq.mreq("PUT", path(`/client/v3/profile/${mxid}/displayname`, mxid), { displayname }) } async function profileSetAvatarUrl(mxid, avatar_url) { await mreq.mreq("PUT", path(`/client/v3/profile/${mxid}/avatar_url`, mxid), { avatar_url }) } module.exports.path = path module.exports.register = register module.exports.createRoom = createRoom module.exports.joinRoom = joinRoom module.exports.inviteToRoom = inviteToRoom module.exports.leaveRoom = leaveRoom module.exports.getAllState = getAllState module.exports.sendState = sendState module.exports.sendEvent = sendEvent module.exports.profileSetDisplayname = profileSetDisplayname module.exports.profileSetAvatarUrl = profileSetAvatarUrl