111 lines
2.8 KiB
TypeScript
111 lines
2.8 KiB
TypeScript
import {
|
|
MatrixClient,
|
|
MatrixEvent,
|
|
RoomEvent,
|
|
type IContent,
|
|
} from "matrix-js-sdk";
|
|
import type { ICallback, ICallbackStore } from "./types.js";
|
|
import { registerModuleBase } from "./base/base.js";
|
|
import { registerModuleAdmin } from "./admin/admin.js";
|
|
import { registerModuleUser } from "./user/user.js";
|
|
import { registerModuleAI } from "./ai/ai.js";
|
|
import { checkRoles, getUserById } from "../helpers.js";
|
|
import { onAnyMessage, onMissingRole } from "./global.js";
|
|
import { config } from "../config.js";
|
|
|
|
const callbacks: ICallbackStore = {
|
|
messageCallbacks: [],
|
|
};
|
|
|
|
const checkMessageCallback = (
|
|
client: MatrixClient,
|
|
text: string,
|
|
callback: ICallback,
|
|
roomId: string,
|
|
sender: string,
|
|
) => {
|
|
if (callback.allowedRooms && !callback.allowedRooms.includes(roomId)) {
|
|
return false;
|
|
}
|
|
|
|
if (
|
|
callback.startConditions &&
|
|
!callback.startConditions.some((condition) =>
|
|
text.toLowerCase().startsWith(condition),
|
|
)
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
if (
|
|
callback.includesConditions &&
|
|
!callback.includesConditions.some((condition) =>
|
|
text.toLowerCase().includes(condition),
|
|
)
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
if (callback.allowedRoles && !checkRoles(callback.allowedRoles, sender)) {
|
|
onMissingRole(client, getUserById(sender).role, roomId);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
const registerModules = (client: MatrixClient) => {
|
|
const startupTime = Date.now();
|
|
|
|
client.on(RoomEvent.Timeline, (event: MatrixEvent) => {
|
|
const ts = event.getTs();
|
|
if (ts < startupTime) {
|
|
return;
|
|
}
|
|
|
|
if (event.getType() !== "m.room.message") {
|
|
return;
|
|
}
|
|
|
|
const content = event.getContent<IContent>();
|
|
const body = content?.body;
|
|
if (!body || !client) {
|
|
return;
|
|
}
|
|
|
|
const roomId = event.getRoomId();
|
|
const sender = event.getSender();
|
|
if (!roomId || !sender) {
|
|
return;
|
|
}
|
|
|
|
if (sender === config.userId) {
|
|
return;
|
|
}
|
|
|
|
console.log(`Message from ${sender} in ${roomId}: ${body}`);
|
|
|
|
onAnyMessage(client, body.toString(), roomId, sender);
|
|
|
|
callbacks.messageCallbacks.forEach((callback) => {
|
|
if (
|
|
checkMessageCallback(
|
|
client,
|
|
body.toString(),
|
|
callback,
|
|
roomId,
|
|
sender,
|
|
)
|
|
) {
|
|
callback.callbackFunc(body.toString(), roomId, sender);
|
|
}
|
|
});
|
|
});
|
|
|
|
registerModuleBase(client, callbacks);
|
|
registerModuleAdmin(client, callbacks);
|
|
registerModuleUser(client, callbacks);
|
|
registerModuleAI(client, callbacks);
|
|
};
|
|
|
|
export { registerModules };
|