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
+105
View File
@@ -0,0 +1,105 @@
import {StoredUser} from "../model/stored-user";
import {Dao} from "../base/dao";
import {DatabaseManager} from "./database-manager";
import {UserInsert, usersTable} from "./schema";
import {eq} from "drizzle-orm";
import {inArray} from "drizzle-orm/sql/expressions/conditions";
import {User} from "typescript-telegram-bot-api";
import {boolToInt, buildExcludedSet} from "../util/utils";
export class UserDao extends Dao<StoredUser> {
private tag: string = "UserDao";
override async getAll(): Promise<StoredUser[]> {
const then = Date.now();
const users = await DatabaseManager.db.select().from(usersTable);
const now = Date.now();
const diff = now - then;
console.log(`${this.tag}: getAll()`, `took ${diff}ms; size: ${users.length}`);
return this.mapFrom(users);
}
override async getById(params: { id: number }): Promise<StoredUser | null> {
const then = Date.now();
const users =
await DatabaseManager.db.select()
.from(usersTable)
.where(
eq(usersTable.id, params.id)
);
const now = Date.now();
const diff = now - then;
console.log(`${this.tag}: getById(${params.id})`, `took ${diff}ms; size: ${users.length}`);
const u = users[0];
if (!u) return null;
return this.mapFrom([u])[0];
}
override async getByIds(params: { ids: number[] }): Promise<StoredUser[]> {
const then = Date.now();
const users =
await DatabaseManager.db.select()
.from(usersTable)
.where(
inArray(usersTable.id, params.ids)
);
const now = Date.now();
const diff = now - then;
console.log(`${this.tag}: getByIds(${params.ids})`, `took ${diff}ms; size: ${users.length}`);
return this.mapFrom(users);
}
override async insert(values: UserInsert[] | UserInsert): Promise<true> {
const rows = Array.isArray(values) ? values : [values];
const then = Date.now();
const r = await DatabaseManager.db
.insert(usersTable)
.values(rows)
.onConflictDoUpdate({
target: usersTable.id,
set: buildExcludedSet(usersTable, ["id"])
});
const now = Date.now();
const diff = now - then;
console.log(`${this.tag}: insert(size: ${rows.length})`, `took ${diff}ms; inserted: ${r.rowsAffected}`);
return true;
}
mapTo(users: User[]): UserInsert[] {
return users.map(u => {
return {
id: u.id,
isBot: boolToInt(u.is_bot),
firstName: u.first_name,
lastName: u.last_name,
userName: u.username,
isPremium: boolToInt(u.is_premium)
};
});
}
mapFrom(users: UserInsert[]): StoredUser[] {
return users.map(u => {
return {
id: u.id,
isBot: u.isBot === 1,
firstName: u.firstName,
lastName: u.lastName,
userName: u.userName,
isPremium: u.isPremium === 1
};
});
}
}