From d749b57811fcf9961244ff6d30edb3d900f54193 Mon Sep 17 00:00:00 2001 From: Akulij Date: Sat, 31 May 2025 13:43:41 +0500 Subject: [PATCH] call js function handler if set in script_handler --- src/bot_handler.rs | 69 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/src/bot_handler.rs b/src/bot_handler.rs index 1b9e7bc..d85ddfd 100644 --- a/src/bot_handler.rs +++ b/src/bot_handler.rs @@ -1,4 +1,5 @@ -use log::info; +use log::{error, info}; +use quickjs_rusty::serde::to_js; use std::{ str::FromStr, sync::{Arc, RwLock}, @@ -66,6 +67,39 @@ async fn handle_botmessage(bot: Bot, mut db: DB, bm: BotMessage, msg: Message) - let user = update_user_tg(user, &tguser); user.update_user(&mut db).await?; + let is_propagate: bool = match bm.get_handler() { + Some(handler) => 'prop: { + let ctx = match handler.context() { + Some(ctx) => ctx, + // falling back to propagation + None => break 'prop true, + }; + let jsuser = to_js(ctx, &tguser).unwrap(); + match handler.call_args(vec![jsuser]) { + Ok(v) => { + if v.is_bool() { + v.to_bool().unwrap_or(true) + } else if v.is_int() { + v.to_int().unwrap_or(1) != 0 + } else { + // falling back to propagation + true + } + } + Err(err) => { + error!("Failed to get return of handler, err: {err}"); + // falling back to propagation + true + } + } + } + None => true, + }; + + if !is_propagate { + return Ok(()); + } + let buttons = bm .resolve_buttons(&mut db) .await? @@ -102,6 +136,39 @@ async fn handle_callback(bot: Bot, mut db: DB, bm: BotMessage, q: CallbackQuery) let user = update_user_tg(user, &tguser); user.update_user(&mut db).await?; + let is_propagate: bool = match bm.get_handler() { + Some(handler) => 'prop: { + let ctx = match handler.context() { + Some(ctx) => ctx, + // falling back to propagation + None => break 'prop true, + }; + let jsuser = to_js(ctx, &tguser).unwrap(); + match handler.call_args(vec![jsuser]) { + Ok(v) => { + if v.is_bool() { + v.to_bool().unwrap_or(true) + } else if v.is_int() { + v.to_int().unwrap_or(1) != 0 + } else { + // falling back to propagation + true + } + } + Err(err) => { + error!("Failed to get return of handler, err: {err}"); + // falling back to propagation + true + } + } + } + None => true, + }; + + if !is_propagate { + return Ok(()); + } + let buttons = bm .resolve_buttons(&mut db) .await?