mic-bot/bot/normal_mode/init.ts
2024-10-25 19:35:12 +02:00

80 lines
3.0 KiB
TypeScript

import { ChatMember } from "https://deno.land/x/grammy_types/manage.ts";
import { Bot } from "https://deno.land/x/grammy/mod.ts";
import { Kysely } from 'npm:kysely';
import { Ctx } from "../ctx.ts";
import { Database } from "../../repo/exports.ts";
import { CompiledConfig } from "../../cfg/config.ts";
import { checkUser, checkUserOnNewChatMember, onMemberLeftChat, checkUserOnStart } from "./user_managment.ts";
import { checkCaptchaSolution, initUserCaptcha } from "./captcha.ts";
interface ChatMemberUpdateStatus {
joined: boolean,
left: boolean,
kicked: boolean,
restricted: boolean,
roleChanged: boolean
}
function getChatMemberUpdateStatus(oldMember: ChatMember, newMember: ChatMember): ChatMemberUpdateStatus {
return {
joined: oldMember.status === "left" &&
newMember.status !== "left" && newMember.status !== "kicked",
left: oldMember.status !== "left" && newMember.status === "left",
kicked: newMember.status === "kicked",
restricted: oldMember.status !== "restricted" && newMember.status === "restricted",
roleChanged: oldMember.status !== newMember.status &&
(newMember.status !== "left" && newMember.status !== "kicked")
};
}
export const init = (bot: Bot<Ctx>, db: Kysely<Database>, cfg: CompiledConfig) => {
console.log(`initializing normal mode`)
const { botCfg } = cfg
bot.on('message', async (ctx, next) => {
if (ctx.from?.is_bot) return
console.log(`Chat ID: ${ctx.msg.chat.id} From: ${ctx.from.id} Message: ${ctx.msg.text}`)
await next()
})
bot.on('message:text', async (ctx, next) => {
if (ctx.chat.id === botCfg.chat_id) {
await checkUser(ctx, db, botCfg, true)
} else if (ctx.message.chat.type == "private" && ctx.session.captcha_data) {
await checkCaptchaSolution(ctx, db, botCfg)
} else {
await next()
}
})
bot.command('start', async ctx => {
const userInfo = await checkUserOnStart(ctx, db)
if (userInfo.isBlocked || userInfo.isTimeout) return
// TODO: if (userInfo.isNewUser) { /* Some hello message? */ }
await initUserCaptcha(ctx, db, userInfo, botCfg)
})
bot.on('chat_member', async (ctx, next) => {
if (ctx.from.is_bot) return
if (ctx.chat.id !== botCfg.chat_id) return
const { old_chat_member, new_chat_member } = ctx.chatMember
const chatMemberUpdateStatus = getChatMemberUpdateStatus(old_chat_member, new_chat_member)
if (chatMemberUpdateStatus.joined) {
console.log(`New Chat member ${ctx.chatMember.from.id}:'+
'${ctx.from.first_name} ${ctx.from.last_name}`)
await checkUserOnNewChatMember(ctx, db, botCfg)
// TODO:
// const userInfo = await checkUserOnNewChatMember(ctx, db, botCfg)
//if (userInfo.isNewUser) { /* Some hello message? */ }
} else if (chatMemberUpdateStatus.left) {
console.log(`Chat member left ${ctx.chatMember.from.id}:'+
'${ctx.from.first_name} ${ctx.from.last_name}`)
await onMemberLeftChat(ctx, db)
// TODO: /* POBEG S DURKI! */
}
await next()
})
}