Add ai functionality

This commit is contained in:
Aslan 2025-12-26 04:33:47 +01:00
parent da66cf9001
commit dd4da06753
19 changed files with 1118 additions and 52 deletions

140
src/modules/ai/ai.ts Normal file
View file

@ -0,0 +1,140 @@
import { MatrixClient, MsgType } from "matrix-js-sdk";
import type { ICallbackStore } from "../types.js";
import { config } from "../../config.js";
import { getImageNanoBanana, getTextGemini } from "../../services/ai/ai.js";
import type { IAnimal } from "./types.js";
let client: MatrixClient;
const registerModuleAI = (
matrixClient: MatrixClient,
callbackStore: ICallbackStore,
) => {
client = matrixClient;
callbackStore.messageCallbacks.push({
startConditions: [`${config.app.triggerPrefix}ai `],
callbackFunc: onAI,
});
callbackStore.messageCallbacks.push({
startConditions: [
`satek when `,
`satek ked `,
`gabor when `,
`gabor ked `,
`martin when `,
`martin ked `,
`madys when `,
`madys ked `,
`mandak when `,
`mandak ked `,
`mando when `,
`mando ked `,
`mandik when `,
`mandik ked `,
`madik when `,
`madik ked `,
`janys when `,
`janys ked `,
`jano when `,
`jano ked `,
],
callbackFunc: onImageGen,
});
};
const getAnimal = (name: string): IAnimal | undefined => {
const animals: IAnimal[] = [
{
name: "satek",
animal: "black cat",
},
{
name: "gabor",
animal: "hedgehog",
},
{
name: "martin",
animal: "hedgehog",
},
{
name: "madys",
animal: "beaver",
},
{
name: "mandak",
animal: "beaver",
},
{
name: "mando",
animal: "beaver",
},
{
name: "mandik",
animal: "beaver",
},
{
name: "madik",
animal: "beaver",
},
{
name: "janys",
animal: "lion",
},
{
name: "jano",
animal: "lion",
},
];
const foundAnimals = animals
.map((animal) => {
if (name.includes(animal.name)) {
return animal;
}
})
.filter((animal) => animal);
return foundAnimals.at(0);
};
const onAI = async (text: string, roomId: string) => {
if (text.trim().length < 5) {
return;
}
const responseAI = await getTextGemini(text.replace("!ai ", ""));
client.sendTextMessage(roomId, responseAI);
};
const onImageGen = async (text: string, roomId: string) => {
const animal = getAnimal(text.trim().split(/\s+/)[0] ?? "");
if (!animal) {
return;
}
const textMod = text.replace(animal.name, animal.animal);
const buffer = await getImageNanoBanana(textMod.trim());
if (!buffer || buffer.length < 10) {
return;
}
const imageName = `photo-${animal.name}.png`;
const uploadResult = await client.uploadContent(buffer, {
type: "image/png",
name: imageName,
});
await client.sendMessage(roomId, {
msgtype: MsgType.Image,
body: imageName,
url: uploadResult.content_uri,
info: {
mimetype: "image/png",
size: buffer.length,
},
});
};
export { getAnimal, registerModuleAI, onImageGen };