UNPKG

koishi-plugin-adapter-matrix

Version:

Matrix Adapter for koishi

127 lines 4.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.dispatchSession = exports.adaptSession = exports.adaptMessage = exports.adaptAuthor = void 0; const satori_1 = require("@satorijs/satori"); function adaptAuthor(bot, event) { return { userId: event.sender, username: event.sender, isBot: !!bot.ctx.bots.find(bot => bot.userId === event.sender), }; } exports.adaptAuthor = adaptAuthor; async function adaptMessage(bot, event, result = {}) { result.subtype = 'group'; result.messageId = event.event_id; result.channelId = event.room_id; result.userId = event.sender; result.timestamp = event.origin_server_ts; result.author = adaptAuthor(bot, event); const content = event.content; const reply = content['m.relates_to']?.['m.in_reply_to']; let { body } = content; if (reply) { result.quote = await bot.getMessage(event.room_id, reply.event_id); body = body.substring(content.body.indexOf('\n\n') + 2); } switch (content.msgtype) { case 'm.text': case 'm.emote': { result.content = body; break; } case 'm.image': case 'm.file': case 'm.audio': case 'm.video': { const url = bot.internal.getAssetUrl(content.url); const type = content.msgtype.substring(2); result.content = (0, satori_1.segment)(type === 'audio' ? 'record' : type, { url }).toString(); break; } default: return null; } // result.content is not a setter if result is a Universal.Message result.elements ?? (result.elements = satori_1.segment.parse(result.content)); return result; } exports.adaptMessage = adaptMessage; async function adaptSession(bot, event) { const session = bot.session(); if (event.type === 'm.room.message') { const content = event.content; const newContent = content['m.new_content']; if (newContent) { session.type = 'message-update'; content.body = newContent.body; content.msgtype = newContent.msgtype; } else { session.type = 'message'; } if (!await adaptMessage(bot, event, session)) return null; return session; } session.userId = event.sender; session.guildId = event.room_id; session.channelId = event.room_id; session.messageId = event.event_id; session.timestamp = event.origin_server_ts; session.author = adaptAuthor(bot, event); switch (event.type) { case 'm.room.redaction': session.type = 'message-delete'; session.messageId = event.redacts; break; case 'm.room.member': { bot.syncRooms(); const memberEvent = event.content; session.targetId = memberEvent.state_key; session.operatorId = event.sender; session.messageId = event.event_id; if (memberEvent.reason) { session.content = memberEvent.reason; } switch (memberEvent.membership) { case 'join': session.type = 'guild-member-added'; break; case 'leave': session.type = 'guild-member-deleted'; break; case 'ban': session.type = 'guild-member'; session.subtype = 'ban'; break; case 'invite': if (event.state_key === bot.userId) { session.type = 'guild-request'; // Use room_id instead messageId because handleGuildRequest Only passes messageId. // We need room_id and messageId to call getMessage and get the room_id. // So I decided to pass room_id directly. session.messageId = event.room_id; break; } default: session.type = event.type; } break; } default: session.type = event.type; } return session; } exports.adaptSession = adaptSession; async function dispatchSession(bot, event) { const session = await adaptSession(bot, event); if (!session) return; (0, satori_1.defineProperty)(session, 'matrix', Object.create(bot.internal)); Object.assign(session.matrix, event); bot.dispatch(session); } exports.dispatchSession = dispatchSession; //# sourceMappingURL=utils.js.map