diff --git a/package.json b/package.json index 599ba48..146b882 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aslobot-matrix", - "version": "0.7.0", + "version": "0.6.0", "description": "", "license": "ISC", "author": "", diff --git a/src/config.preset.json b/src/config.preset.json index 66ea18d..899e234 100644 --- a/src/config.preset.json +++ b/src/config.preset.json @@ -14,12 +14,7 @@ "gain": 5, "startingRequirement": 50, "multiplier": 1.25, - "timeout": 300000 - }, - "money": { - "gain": 2, - "startingValue": 10, - "timeout": 3600000 + "timeout": 60000 }, "ai": { "api": { diff --git a/src/helpers.ts b/src/helpers.ts index c396e7b..3a4bfd4 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -4,31 +4,14 @@ import { type IUser, type TRole } from "./store/types.js"; import type { ILevel } from "./types.js"; const getUserById = (userId: string): IUser => { - const user = state.users.find((user) => user.id === userId); - if (!user) { - return { + return ( + state.users.find((user) => user.id === userId) ?? { id: ":", role: "NONE", experience: 0, - money: 0, - aiCost: 0, lastMessageTimestamp: 0, - lastExperienceGainTimestamp: 0, - lastMoneyGainTimestamp: 0, - }; - } - - if (!user.experience) { - user.experience = 0; - } - if (!user.money) { - user.money = 0; - } - if (!user.aiCost) { - user.aiCost = 0; - } - - return user; + } + ); }; const checkRoles = (roles: TRole[], userId: string) => { diff --git a/src/modules/ai/ai.ts b/src/modules/ai/ai.ts index 8668f49..dae808d 100644 --- a/src/modules/ai/ai.ts +++ b/src/modules/ai/ai.ts @@ -3,9 +3,6 @@ import type { ICallbackStore } from "../types.js"; import { config } from "../../config.js"; import { getTextGemini, getImageGemini } from "../../services/ai/ai.js"; import { alts } from "./alts.js"; -import type { IAdminInstructions } from "./types.js"; -import { getUserById } from "../../helpers.js"; -import { prices } from "./prices.js"; let client: MatrixClient; @@ -18,58 +15,40 @@ const registerModuleAI = ( callbackStore.messageCallbacks.push({ startConditions: [`${config.app.triggerPrefix}ai `], callbackFunc: onAI, - allowedRoles: ["USER", "MODERATOR", "ADMIN"], }); callbackStore.messageCallbacks.push({ - startConditions: [`${config.app.triggerPrefix}img `], + startConditions: [ + ...alts.map((alt) => `${alt.key} when`), + ...alts.map((alt) => `${alt.key} ked`), + `!img`, + ], callbackFunc: onImageGen, - allowedRoles: ["USER", "MODERATOR", "ADMIN"], }); }; -const onAI = async (text: string, roomId: string, sender: string) => { - const user = getUserById(sender); - +const onAI = async (text: string, roomId: string) => { if (text.trim().length < 5) { return; } - let textMod = text.replace("!ai", "").trim().toLowerCase(); - let instructions = { - prefferedLanguages: ["english", "slovak"], - adminText: "Be concise, try to keep text as short as possible", - alts: alts, - } as IAdminInstructions; - - textMod = `Admin Instructions:\n${instructions}\nPrompt:\n${textMod}`; - - const responseAI = await getTextGemini(textMod); - - user.aiCost += responseAI.tokens * prices.text; - - client.sendTextMessage(roomId, responseAI.text); + const responseAI = await getTextGemini(text.replace("!ai ", "")); + client.sendTextMessage(roomId, responseAI); }; -const onImageGen = async (text: string, roomId: string, sender: string) => { - const user = getUserById(sender); - +const onImageGen = async (text: string, roomId: string) => { let textMod = text.replace("!img", "").trim().toLowerCase(); alts.forEach((alt) => { - alt.keys.forEach((key) => { - textMod = textMod.replaceAll(key, alt.alt); - }); + textMod = textMod.replaceAll(alt.key, alt.alt); }); - const responseAI = await getImageGemini(textMod); - - user.aiCost += responseAI.tokens * prices.image; - if (!responseAI.image || responseAI.image.length < 10) { + const buffer = await getImageGemini(textMod); + if (!buffer || buffer.length < 10) { return; } const imageName = `photo-img-gen.png`; - const uploadResult = await client.uploadContent(responseAI.image, { + const uploadResult = await client.uploadContent(buffer, { type: "image/png", name: imageName, }); @@ -80,7 +59,7 @@ const onImageGen = async (text: string, roomId: string, sender: string) => { url: uploadResult.content_uri, info: { mimetype: "image/png", - size: responseAI.image.length, + size: buffer.length, }, }); }; diff --git a/src/modules/ai/alts.ts b/src/modules/ai/alts.ts index f7b8ead..00689ad 100644 --- a/src/modules/ai/alts.ts +++ b/src/modules/ai/alts.ts @@ -2,73 +2,164 @@ import type { IAIAlt } from "./types.js"; const alts: IAIAlt[] = [ { - keys: [ - "satek", - "sateg", - "sadeg", - "coty", - "satko", - "sadko", - "vlado", - "vladko", - "vladimir", - "macak", - "macag", - ], + key: "satek", alt: "black cat", }, { - keys: ["macica", "macico"], + key: "sateg", + alt: "black cat", + }, + { + key: "sadeg", + alt: "black cat", + }, + { + key: "satko", + alt: "black cat", + }, + { + key: "sadko", + alt: "black cat", + }, + { + key: "vlado", + alt: "black cat", + }, + { + key: "vladko", + alt: "black cat", + }, + { + key: "vladimir", + alt: "black cat", + }, + { + key: "macag", + alt: "black cat", + }, + { + key: "vladko", + alt: "black cat", + }, + { + key: "macica", alt: "white cat", }, { - keys: ["gabor", "gaber", "martin", "marting"], + key: "macico", + alt: "white cat", + }, + { + key: "gabor", alt: "hedgehog", }, { - keys: [ - "madys", - "mandak", - "mandag", - "mando", - "mandik", - "madik", - "madeg", - "madek", - ], + key: "martin", + alt: "hedgehog", + }, + { + key: "madys", alt: "beaver", }, { - keys: ["janys", "jano", "janeg", "janek", "aslanek", "aslan", "aslo"], + key: "mandak", + alt: "beaver", + }, + { + key: "mando", + alt: "beaver", + }, + { + key: "mandik", + alt: "beaver", + }, + { + key: "madik", + alt: "beaver", + }, + { + key: "madeg", + alt: "beaver", + }, + { + key: "janys", alt: "lion", }, { - keys: ["marek", "mareg", "macek", "maceg", "rod"], + key: "jano", + alt: "lion", + }, + { + key: "janeg", + alt: "lion", + }, + { + key: "aslan", + alt: "lion", + }, + { + key: "aslo", + alt: "lion", + }, + { + key: "marek", alt: "purple snake", }, { - keys: ["lara", "kostur", "kosturik"], + key: "mareg", + alt: "purple snake", + }, + { + key: "maceg", + alt: "purple snake", + }, + { + key: "rod", + alt: "purple snake", + }, + { + key: "lara", alt: "ginger dog", }, { - keys: ["tato"], - alt: "green troll", + key: "kostur", + alt: "ginger dog", }, { - keys: ["mama", "monika", "monik"], - alt: "god's peasant", + key: "kosturik", + alt: "ginger dog", }, { - keys: ["puk", "pucik", "pucig"], - alt: "fat rat", + key: "tato", + alt: "troll", }, { - keys: ["becky", "beky", "beki"], - alt: "35 year old pink haired giantess", + key: "mama", + alt: "angel", }, { - keys: ["veronika", "veronik", "wewe", "wonka"], - alt: "lgbt princess with curly hair", + key: "monik", + alt: "angel", + }, + { + key: "puk", + alt: "rat", + }, + { + key: "becky", + alt: "giantess", + }, + { + key: "beky", + alt: "giantess", + }, + { + key: "beki", + alt: "giantess", + }, + { + key: "veronik", + alt: "lgbt princess", }, ]; diff --git a/src/modules/ai/prices.ts b/src/modules/ai/prices.ts deleted file mode 100644 index e323018..0000000 --- a/src/modules/ai/prices.ts +++ /dev/null @@ -1,6 +0,0 @@ -const prices = { - text: 0.000002, - image: 0.00003, -}; - -export { prices }; diff --git a/src/modules/ai/types.ts b/src/modules/ai/types.ts index 7f57e3b..c7b0c35 100644 --- a/src/modules/ai/types.ts +++ b/src/modules/ai/types.ts @@ -1,12 +1,6 @@ interface IAIAlt { - keys: string[]; + key: string; alt: string; } -interface IAdminInstructions { - prefferedLanguages: string[]; - adminText: string; - alts: IAIAlt[]; -} - -export { type IAIAlt, type IAdminInstructions }; +export { type IAIAlt }; diff --git a/src/modules/base/base.ts b/src/modules/base/base.ts index 8c682b8..59d8664 100644 --- a/src/modules/base/base.ts +++ b/src/modules/base/base.ts @@ -61,21 +61,17 @@ const onHelp = (_text: string, roomId: string) => { client.sendHtmlMessage( roomId, "", - `

Role: Any

+ `

Role: User

-

Role: User

-

Role: Moderator

@@ -89,7 +85,7 @@ const onHelp = (_text: string, roomId: string) => {
  • !setrole {user} {role} - Set role for a user
  • !shutdown - Shutdown bot
  • -

    AsloBot version ${packageConfig.version}

    `, +

    AsloBot version ${packageConfig.version}

    `, ); }; diff --git a/src/modules/global.ts b/src/modules/global.ts index 97e5f94..5922c84 100644 --- a/src/modules/global.ts +++ b/src/modules/global.ts @@ -18,28 +18,15 @@ const onAnyMessage = ( id: sender, role: "USER", experience: 0, - money: 10, - aiCost: 0, lastMessageTimestamp: date, - lastExperienceGainTimestamp: date, - lastMoneyGainTimestamp: date, }); return onAnyMessage(client, _text, roomId, sender); } const levelBefore = getLevel(user.experience); - if ( - date > - user.lastExperienceGainTimestamp + config.app.experience.timeout - ) { + if (date > user.lastMessageTimestamp + config.app.experience.timeout) { user.experience += config.app.experience.gain; - user.lastExperienceGainTimestamp = date; - } - - if (date > user.lastMoneyGainTimestamp + config.app.money.timeout) { - user.money += config.app.money.gain; - user.lastMoneyGainTimestamp = date; } user.lastMessageTimestamp = date; diff --git a/src/modules/user/user.ts b/src/modules/user/user.ts index a644b2c..c0197a2 100644 --- a/src/modules/user/user.ts +++ b/src/modules/user/user.ts @@ -13,31 +13,24 @@ const registerModuleUser = ( client = matrixClient; callbackStore.messageCallbacks.push({ - startConditions: [`${config.app.triggerPrefix}me`], - callbackFunc: onMe, + startConditions: [`${config.app.triggerPrefix}level`], + callbackFunc: onLevel, }); callbackStore.messageCallbacks.push({ startConditions: [`${config.app.triggerPrefix}leaderboard`], callbackFunc: onLeaderboard, }); - callbackStore.messageCallbacks.push({ - startConditions: [`${config.app.triggerPrefix}aileaderboard`], - callbackFunc: onAILeaderboard, - }); }; -const onMe = (_text: string, roomId: string, sender: string) => { - const user = getUserById(sender); - const level = getLevel(user.experience); +const onLevel = (_text: string, roomId: string, sender: string) => { + const level = getLevel(getUserById(sender).experience); client.sendHtmlMessage( roomId, "", - `

    Your Role: ${user.role}


    -

    Your Money: ${user.money}


    -

    Your AI Cost: ${user.aiCost}$


    -

    Your Level: ${level.level}


    - Next level progress: ${level.experienceInLevel}/${level.expToNextLevel}xp`, + `

    Your Level: ${level.level}

    +
    + Next level progress: ${level.experienceInLevel}/${level.expToNextLevel}xp`, ); }; @@ -65,28 +58,4 @@ const onLeaderboard = (_text: string, roomId: string) => { ); }; -const onAILeaderboard = (_text: string, roomId: string) => { - const mapUsersToLeaderboard = (user: IUser): string => { - const cost = user.aiCost; - const userName = getUserName(user); - const userNameMod = - userName.charAt(0).toUpperCase() + userName.slice(1); - - return `
  • ${userNameMod}: cost ${cost}
  • `; - }; - - const users = state.users.sort( - (userA, userB) => userB.aiCost - userA.aiCost, - ); - - client.sendHtmlMessage( - roomId, - "", - `

    AI Cost Leaderboard

    - `, - ); -}; - export { registerModuleUser }; diff --git a/src/services/ai/ai.ts b/src/services/ai/ai.ts index 80961b7..ef5ad34 100644 --- a/src/services/ai/ai.ts +++ b/src/services/ai/ai.ts @@ -1,24 +1,22 @@ import { GoogleGenAI } from "@google/genai"; import { config } from "../../config.js"; -import type { AIResponseImage, AIResponseText } from "./types.js"; const googleAI = new GoogleGenAI({ apiKey: config.app.ai.api.key, }); -const getTextGemini = async (input: string): Promise => { +const getTextGemini = async (input: string): Promise => { const response = await googleAI.models.generateContent({ model: "gemini-3-flash-preview", contents: input, }); - return { - text: response.text ?? "AI Error", - tokens: response.usageMetadata?.totalTokenCount ?? 0, - }; + return response.text ?? "AI Error"; }; -const getImageGemini = async (input: string): Promise => { +const getImageGemini = async ( + input: string, +): Promise | undefined> => { const response = await googleAI.models.generateContent({ model: "gemini-2.5-flash-image", contents: input, @@ -40,10 +38,7 @@ const getImageGemini = async (input: string): Promise => { } }); - return { - image: buffer, - tokens: response.usageMetadata?.totalTokenCount ?? 0, - }; + return buffer; }; export { getTextGemini, getImageGemini }; diff --git a/src/services/ai/index.ts b/src/services/ai/index.ts index ceedc5b..ab762f7 100644 --- a/src/services/ai/index.ts +++ b/src/services/ai/index.ts @@ -1,2 +1 @@ export * from "./ai.js"; -export * from "./types.js"; diff --git a/src/services/ai/types.ts b/src/services/ai/types.ts deleted file mode 100644 index a7cd3db..0000000 --- a/src/services/ai/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -interface AIResponseText { - text: string; - tokens: number; -} - -interface AIResponseImage { - image: Buffer | undefined; - tokens: number; -} - -export { type AIResponseText, type AIResponseImage }; diff --git a/src/store/types.ts b/src/store/types.ts index 3c07f19..5731e70 100644 --- a/src/store/types.ts +++ b/src/store/types.ts @@ -6,11 +6,7 @@ interface IUser { id: string; role: TRole; experience: number; - money: number; - aiCost: number; lastMessageTimestamp: number; - lastExperienceGainTimestamp: number; - lastMoneyGainTimestamp: number; } type TRole = "NONE" | "USER" | "MODERATOR" | "ADMIN";