2023-05-08 05:22:20 +00:00
// @ts-check
2023-07-04 05:19:17 +00:00
const Ty = require ( "../types" )
2023-05-08 11:37:51 +00:00
const assert = require ( "assert" )
2023-05-08 05:22:20 +00:00
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" )
2023-05-08 12:58:46 +00:00
/** @type {import("./txnid")} */
const makeTxnId = sync . require ( "./txnid" )
2023-05-08 20:03:57 +00:00
/ * *
* @ 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 ) {
2023-05-08 12:58:46 +00:00
if ( ! mxid ) return p
const u = new URL ( p , "http://localhost" )
u . searchParams . set ( "user_id" , mxid )
return u . pathname + "?" + u . searchParams . toString ( )
}
2023-05-08 05:22:20 +00:00
/ * *
2023-05-08 11:37:51 +00:00
* @ param { string } username
2023-07-04 05:19:17 +00:00
* @ returns { Promise < Ty . R . Registered > }
2023-05-08 05:22:20 +00:00
* /
function register ( username ) {
2023-05-09 03:29:46 +00:00
console . log ( ` [api] register: ${ username } ` )
2023-05-08 05:22:20 +00:00
return mreq . mreq ( "POST" , "/client/v3/register" , {
type : "m.login.application_service" ,
username
} )
}
2023-05-08 11:37:51 +00:00
/ * *
2023-05-08 12:58:46 +00:00
* @ returns { Promise < string > } room ID
2023-05-08 11:37:51 +00:00
* /
2023-05-08 12:58:46 +00:00
async function createRoom ( content ) {
2023-05-09 03:29:46 +00:00
console . log ( ` [api] create room: ` , content )
2023-07-04 05:19:17 +00:00
/** @type {Ty.R.RoomCreated} */
2023-05-08 12:58:46 +00:00
const root = await mreq . mreq ( "POST" , "/client/v3/createRoom" , content )
return root . room _id
}
/ * *
* @ returns { Promise < string > } room ID
* /
async function joinRoom ( roomIDOrAlias , mxid ) {
2023-07-04 05:19:17 +00:00
/** @type {Ty.R.RoomJoined} */
2023-05-08 12:58:46 +00:00
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
} )
2023-05-08 11:37:51 +00:00
}
2023-07-01 13:41:31 +00:00
async function leaveRoom ( roomID , mxid ) {
await mreq . mreq ( "POST" , path ( ` /client/v3/rooms/ ${ roomID } /leave ` , mxid ) , { } )
}
2023-07-11 04:51:30 +00:00
/ * *
* @ param { string } roomID
* @ param { string } eventID
* @ template T
* /
async function getEvent ( roomID , eventID ) {
/** @type {Ty.Event.Outer<T>} */
const root = await mreq . mreq ( "GET" , ` /client/v3/rooms/ ${ roomID } /event/ ${ eventID } ` )
return root
}
2023-05-08 11:37:51 +00:00
/ * *
* @ param { string } roomID
2023-07-04 05:19:17 +00:00
* @ returns { Promise < Ty . Event . BaseStateEvent [ ] > }
2023-05-08 11:37:51 +00:00
* /
function getAllState ( roomID ) {
return mreq . mreq ( "GET" , ` /client/v3/rooms/ ${ roomID } /state ` )
}
2023-07-11 04:51:30 +00:00
/ * *
* "Any of the AS's users must be in the room. This API is primarily for Application Services and should be faster to respond than /members as it can be implemented more efficiently on the server."
* @ param { string } roomID
* @ returns { Promise < { joined : { [ mxid : string ] : Ty . R . RoomMember } } > }
* /
function getJoinedMembers ( roomID ) {
return mreq . mreq ( "GET" , ` /client/v3/rooms/ ${ roomID } /joined_members ` )
}
2023-05-08 11:37:51 +00:00
/ * *
* @ param { string } roomID
* @ param { string } type
* @ param { string } stateKey
2023-05-08 20:03:57 +00:00
* @ param { string } [ mxid ]
2023-05-08 12:58:46 +00:00
* @ returns { Promise < string > } event ID
2023-05-08 11:37:51 +00:00
* /
2023-05-08 12:58:46 +00:00
async function sendState ( roomID , type , stateKey , content , mxid ) {
2023-05-09 03:29:46 +00:00
console . log ( ` [api] state: ${ roomID } : ${ type } / ${ stateKey } ` )
2023-05-08 11:37:51 +00:00
assert . ok ( type )
2023-06-28 11:38:58 +00:00
assert . ok ( typeof stateKey === "string" )
2023-07-04 05:19:17 +00:00
/** @type {Ty.R.EventSent} */
2023-05-08 12:58:46 +00:00
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 ) {
2023-05-09 03:29:46 +00:00
console . log ( ` [api] event to ${ roomID } as ${ mxid || "default sim" } ` )
2023-07-04 05:19:17 +00:00
/** @type {Ty.R.EventSent} */
2023-05-08 12:58:46 +00:00
const root = await mreq . mreq ( "PUT" , path ( ` /client/v3/rooms/ ${ roomID } /send/ ${ type } / ${ makeTxnId . makeTxnId ( ) } ` , mxid ) , content )
return root . event _id
2023-05-08 11:37:51 +00:00
}
2023-05-10 11:17:37 +00:00
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
} )
}
2023-05-08 12:58:46 +00:00
module . exports . path = path
2023-05-08 11:37:51 +00:00
module . exports . register = register
module . exports . createRoom = createRoom
2023-05-08 12:58:46 +00:00
module . exports . joinRoom = joinRoom
module . exports . inviteToRoom = inviteToRoom
2023-07-01 13:41:31 +00:00
module . exports . leaveRoom = leaveRoom
2023-07-11 04:51:30 +00:00
module . exports . getEvent = getEvent
2023-05-08 11:37:51 +00:00
module . exports . getAllState = getAllState
2023-07-11 04:51:30 +00:00
module . exports . getJoinedMembers = getJoinedMembers
2023-05-08 11:37:51 +00:00
module . exports . sendState = sendState
2023-05-08 12:58:46 +00:00
module . exports . sendEvent = sendEvent
2023-05-10 11:17:37 +00:00
module . exports . profileSetDisplayname = profileSetDisplayname
module . exports . profileSetAvatarUrl = profileSetAvatarUrl