X-Git-Url: http://git.hcoop.net/clinton/bobotpp.git/blobdiff_plain/439869bf80bc560dbecfd16ce058da0932e26030..d56bdd224e7ce1b366c6546003d9e1c951c24ae1:/source/Interp.C diff --git a/source/Interp.C b/source/Interp.C index f4de9ee..1107f57 100644 --- a/source/Interp.C +++ b/source/Interp.C @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #ifdef HAVE_CONFIG_H #include "config.h" @@ -29,7 +29,10 @@ #include +// static class member initial definitions Bot * Interp::bot = 0; +SCM Interp::bot_module = 0; + #ifdef MULTITHREAD pthread_mutex_t Interp::mutex = PTHREAD_MUTEX_INITIALIZER; #endif @@ -39,17 +42,77 @@ typedef SCM (*SCMFunc)(); SCM scm_apply_wrapper(void *data) { +#ifdef MULTITHREAD + // pthread_mutex_lock (&Interp::mutex); +#endif + wrapper_data * wd = static_cast (data); scm_apply(wd->func, wd->args, SCM_EOL); + +#ifdef MULTITHREAD + // pthread_mutex_unlock (&Interp::mutex); +#endif + return SCM_BOOL_T; } -#define bot_new_procedure(a, b, c, d, e) scm_c_define_gsubr (a, c, d, e, b) +static SCM +lazy_handler(void *data, SCM tag, SCM throw_args) +{ + SCM log_port = Interp::bot->botInterp->ScriptLog(); + SCM eport = scm_set_current_error_port(log_port); + + scm_handle_by_message_noexit((void *)"bobot++", tag, throw_args); + scm_force_output(log_port); + scm_set_current_error_port(eport); + scm_ithrow(tag, throw_args, 1); + return SCM_UNSPECIFIED; /* never returns */ +} + +SCM +empty_handler(void *data, SCM tag, SCM args) +{ + return SCM_UNSPECIFIED; +} + + +SCM +lazy_apply_wrapper(void *data) +{ + return scm_internal_lazy_catch(SCM_BOOL_T, + (scm_t_catch_body) scm_apply_wrapper, data, + (scm_t_catch_handler) lazy_handler, 0); +} + + +static SCM +lazy_eval_file(char *filename) +{ + return scm_internal_lazy_catch(SCM_BOOL_T, + (scm_t_catch_body) scm_c_primitive_load, filename, + (scm_t_catch_handler) lazy_handler, 0); +} + +static SCM +lazy_eval_string(char *str) +{ + return scm_internal_lazy_catch(SCM_BOOL_T, + (scm_t_catch_body) scm_c_eval_string, str, + (scm_t_catch_handler) lazy_handler, 0); +} + + + +#define bot_new_procedure(a, b, c, d, e) scm_c_define_gsubr (a, c, d, e, b); scm_c_export (a, 0) +#define scm_c_define_gsubr(a, b, c, d, e) scm_c_define_gsubr (a, b, c, d, e); scm_c_export (a, 0) +#define scm_c_define(a, b) scm_c_define (a, b); scm_c_export (a, 0) void -Interp::Startup() +interp_init_helper (void* unused) { -// scm_primitive_load_path(scm_makfrom0str("ice-9/boot-9.scm")); + scm_c_use_module ("guile-user"); + // Hooks + scm_c_define ("bot:exit-hook", scm_make_hook (scm_long2num (0))); // Symbols // bot:user-* @@ -58,6 +121,17 @@ Interp::Startup() scm_c_define ("bot:user-trusted", scm_long2num (User::TRUSTED_USER)); scm_c_define ("bot:user-friend", scm_long2num (User::FRIEND)); scm_c_define ("bot:user-master", scm_long2num (User::MASTER)); + + // protection + scm_c_define ("bot:protection/none", scm_long2num (User::NO_PROT)); + scm_c_define ("bot:protection/no-ban", scm_long2num (User::NO_BAN)); + scm_c_define ("bot:protection/no-kick", scm_long2num (User::NO_KICK)); + scm_c_define ("bot:protection/no-deop", scm_long2num (User::NO_DEOP)); + + // auto-op + scm_c_define ("bot:aop/yes", scm_long2num (true)); + scm_c_define ("bot:aop/no", scm_long2num (false)); + // sys-dir scm_c_define ("bot:sys-scripts-dir", scm_makfrom0str (String(PREFIX) + @@ -77,14 +151,22 @@ Interp::Startup() scm_c_define ("hooks/part", scm_long2num(Hook::LEAVE)); scm_c_define ("hooks/mode", scm_long2num(Hook::MODE)); scm_c_define ("hooks/message", scm_long2num(Hook::MESSAGE)); - // scm_c_define ("hooks/names", scm_long2num(Hook::NAMES)); scm_c_define ("hooks/notice", scm_long2num(Hook::NOTICE)); scm_c_define ("hooks/public", scm_long2num(Hook::PUBLIC)); scm_c_define ("hooks/public-notice", scm_long2num(Hook::PUBLIC_NOTICE)); scm_c_define ("hooks/raw", scm_long2num(Hook::RAW)); scm_c_define ("hooks/timer", scm_long2num(Hook::TIMER)); scm_c_define ("hooks/topic", scm_long2num(Hook::TOPIC)); - + // send hooks + scm_c_define ("hooks/send/public", scm_long2num (Hook::SEND_PUBLIC)); + scm_c_define ("hooks/send/message", scm_long2num (Hook::SEND_MESSAGE)); + scm_c_define ("hooks/send/action", scm_long2num (Hook::SEND_ACTION)); + scm_c_define ("hooks/send/ctcp", scm_long2num (Hook::SEND_CTCP)); + // dcc hooks + scm_c_define ("hooks/dcc/chat-begin", + scm_long2num (Hook::DCC_CHAT_BEGIN)); + scm_c_define ("hooks/dcc/chat-message", + scm_long2num (Hook::DCC_CHAT_MESSAGE)); // procedures bot_new_procedure ("bot:action", (SCMFunc)ScriptCommands::Action, 2, 0, 0); @@ -95,6 +177,9 @@ Interp::Startup() scm_c_define_gsubr ("bot:addshit", 3, 2, 0, (SCMFunc)ScriptCommands::AddShit); bot_new_procedure ("bot:ban", (SCMFunc)ScriptCommands::Action, 2, 0, 0); + bot_new_procedure ("bot:change-command-level", + (SCMFunc)ScriptCommands::ChangeCommandLevel, + 2, 0, 0); bot_new_procedure ("bot:cycle", (SCMFunc)ScriptCommands::Action, 1, 0, 0); bot_new_procedure ("bot:deban", (SCMFunc)ScriptCommands::Deban, 2, 0, 0); bot_new_procedure ("bot:delserver", (SCMFunc)ScriptCommands::DelServer, @@ -116,12 +201,18 @@ Interp::Startup() bot_new_procedure ("bot:nextserver", (SCMFunc)ScriptCommands::NextServer, 0, 0, 0); bot_new_procedure ("bot:nick", (SCMFunc)ScriptCommands::Nick, 1, 0, 0); + + scm_c_define_gsubr ("bot:notice", 2, 0, 0, + (SCMFunc)ScriptCommands::sendNotice); + bot_new_procedure ("bot:op", (SCMFunc)ScriptCommands::Op, 2, 0, 0); bot_new_procedure ("bot:part", (SCMFunc)ScriptCommands::Part, 1, 0, 0); bot_new_procedure ("bot:reconnect", (SCMFunc)ScriptCommands::Reconnect, 0, 0, 0); bot_new_procedure ("bot:say", (SCMFunc)ScriptCommands::Say, 2, 0, 0); bot_new_procedure ("bot:server", (SCMFunc)ScriptCommands::Server, 1, 0, 0); + scm_c_define_gsubr ("bot:setfloodrate", 1, 0, 0, + (SCMFunc)ScriptCommands::SetFloodRate); bot_new_procedure ("bot:setversion", (SCMFunc)ScriptCommands::SetVersion, 1, 0, 0); bot_new_procedure ("bot:tban", (SCMFunc)ScriptCommands::TBan, 3, 0, 0); @@ -146,22 +237,57 @@ Interp::Startup() bot_new_procedure ("bot:delcommand", (SCMFunc)ScriptCommands::delCommand, 1, 0, 0); bot_new_procedure ("bot:addhook", (SCMFunc)ScriptCommands::AddHook, - 3, 2, 0); + 3, 3, 0); bot_new_procedure ("bot:addtimer", (SCMFunc)ScriptCommands::AddTimer, 2, 0, 0); bot_new_procedure ("bot:deltimer", (SCMFunc)ScriptCommands::DelTimer, 1, 0, 0); + + scm_c_define_gsubr ("bot:dcc-chat-send", 2, 0, 0, + (SCMFunc)ScriptCommands::sendDCCChatMessage); + + // "Low Level" Message functuions + scm_c_define_gsubr ("bot:send-ctcp", 3, 0, 0, + (SCMFunc)ScriptCommands::sendCTCP); + scm_c_define_gsubr ("bot:send-ctcp-reply", 3, 0, 0, + (SCMFunc)ScriptCommands::sendCTCPReply); +} + +#undef bot_new_procedure +#undef scm_c_define_gsubr +#undef scm_c_define + + +SCM +interp_post_startup_helper (void *bot_module) +{ + SCM module = static_cast (bot_module); + scm_c_define ("the-bot-module", module); + scm_c_export ("the-bot-module", 0); + // load bobot-utils scm_primitive_load (scm_makfrom0str (String(PREFIX) + "/share/bobotpp/scripts/bobot-utils.scm")); + return SCM_UNSPECIFIED; +} +void +Interp::Startup() +{ + bot_module = scm_c_define_module ("the-bot-module", + interp_init_helper, 0); + scm_c_call_with_current_module (bot_module, + interp_post_startup_helper, + bot_module); } void Interp::Shutdown() -{ } +{ + scm_c_run_hook (gh_lookup ("bot:exit-hook"), SCM_EOL); +} void Interp::Execute(Bot *b, String command) @@ -170,14 +296,19 @@ Interp::Execute(Bot *b, String command) // We get the lock pthread_mutex_lock(&mutex); #endif + bot = b; - gh_eval_str_with_catch(command, ErrorHandler); + scm_internal_catch(SCM_BOOL_T, + (scm_t_catch_body) lazy_eval_string, (void *) static_cast (command), + (scm_t_catch_handler) empty_handler, 0); + #ifdef MULTITHREAD // We release the lock pthread_mutex_unlock(&mutex); #endif } + void Interp::LoadScript(Bot *b, String filename) { @@ -186,18 +317,13 @@ Interp::LoadScript(Bot *b, String filename) pthread_mutex_lock(&mutex); #endif bot = b; - gh_eval_file_with_catch(filename, ErrorHandler); + scm_internal_catch(SCM_BOOL_T, + (scm_t_catch_body) lazy_eval_file, (void *)static_cast(filename), + (scm_t_catch_handler) empty_handler, 0); #ifdef MULTITHREAD // We release the lock pthread_mutex_unlock(&mutex); #endif } -SCM -Interp::ErrorHandler(void *data, SCM tag, SCM throw_args) -{ - bot->botInterp->ScriptLog(throw_args); - return SCM_BOOL_F; -} - #endif