refactor!: rewrite bot core; add AI (Ollama, Gemini), DB, new commands

This commit is contained in:
2026-01-12 15:32:50 +03:00
parent 9d74ad9861
commit df9471a7e4
137 changed files with 11341 additions and 2025 deletions
+42
View File
@@ -0,0 +1,42 @@
/* eslint-disable no-unused-vars */
import {CallbackQuery, InlineKeyboardButton} from "typescript-telegram-bot-api";
import {Requirements} from "./requirements";
import {bot} from "../index";
export abstract class CallbackCommand {
abstract text: string;
abstract data: string;
requirements?: Requirements = null;
abstract execute(query: CallbackQuery): Promise<void>;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
afterExecute(query: CallbackQuery): Promise<void> {
return Promise.resolve();
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
protected getOptions(query: CallbackQuery): AnswerCallbackQueryOptions {
return {callback_query_id: query.id};
}
async answerCallbackQuery(query: CallbackQuery): Promise<void> {
bot.answerCallbackQuery(this.getOptions(query)).catch(console.error);
}
asButton(): InlineKeyboardButton {
return {
text: this.text,
callback_data: this.data
};
}
}
export interface AnswerCallbackQueryOptions {
callback_query_id: string;
text?: string;
show_alert?: boolean;
url?: string;
cache_time?: number;
}
+15
View File
@@ -0,0 +1,15 @@
import {Message} from "typescript-telegram-bot-api";
import {Requirements} from "./requirements";
export abstract class ChatCommand {
abstract regexp: RegExp;
requirements?: Requirements = null;
title?: string;
description?: string;
abstract execute(
msg: Message,
match?: RegExpExecArray
): Promise<void>;
}
+9
View File
@@ -0,0 +1,9 @@
export abstract class Dao<I> {
abstract getAll(): Promise<I[]>;
abstract getById(params: never): Promise<I | null>
abstract getByIds(params: never): Promise<I[]>
abstract insert(items: never[]): Promise<true>
}
+7
View File
@@ -0,0 +1,7 @@
export enum Requirement {
BOT_CREATOR,
BOT_ADMIN,
BOT_CHAT_ADMIN,
CHAT,
REPLY
}
+33
View File
@@ -0,0 +1,33 @@
import {Requirement} from "./requirement";
export class Requirements {
requirements: Requirement[] = [];
private constructor(requirements?: Requirement[]) {
this.requirements = requirements;
}
static Build(...requirements: Requirement[]): Requirements {
return new Requirements(requirements);
}
isRequiresBotCreator(): boolean {
return this.requirements.includes(Requirement.BOT_CREATOR);
}
isRequiresBotAdmin(): boolean {
return this.requirements.includes(Requirement.BOT_ADMIN);
}
isRequiresBotChatAdmin(): boolean {
return this.requirements.includes(Requirement.BOT_CHAT_ADMIN);
}
isRequiresChat(): boolean {
return this.requirements.includes(Requirement.CHAT);
}
isRequiresReply(): boolean {
return this.requirements.includes(Requirement.REPLY);
}
}