void dogechat_js_unload (struct t_plugin_script *script) { int *rc; char *filename; void *interpreter; if ((dogechat_js_plugin->debug >= 2) || !js_quiet) { dogechat_printf (NULL, dogechat_gettext ("%s: unloading script \"%s\""), JS_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)dogechat_js_exec (script, DOGECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (js_current_script == script) { js_current_script = (js_current_script->prev_script) ? js_current_script->prev_script : js_current_script->next_script; } plugin_script_remove (dogechat_js_plugin, &js_scripts, &last_js_script, script); if (interpreter) delete((DogechatJsV8 *)interpreter); (void) dogechat_hook_signal_send ("javascript_script_unloaded", DOGECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void script_action_remove (const char *name, int quiet) { struct t_script_repo *ptr_script; char str_signal[256], *filename; int length; ptr_script = script_repo_search_by_name_ext (name); if (!ptr_script) { if (!quiet) { dogechat_printf (NULL, _("%s: script \"%s\" not found"), SCRIPT_PLUGIN_NAME, name); } return; } /* check that script is installed */ if (!(ptr_script->status & SCRIPT_STATUS_INSTALLED)) { if (!quiet) { dogechat_printf (NULL, _("%s: script \"%s\" is not installed"), SCRIPT_PLUGIN_NAME, name); } return; } /* check that script is not held */ if (ptr_script->status & SCRIPT_STATUS_HELD) { if (!quiet) { dogechat_printf (NULL, _("%s: script \"%s\" is held"), SCRIPT_PLUGIN_NAME, name); } return; } /* check that plugin for this language is loaded */ if (!script_plugin_loaded[ptr_script->language]) { dogechat_printf (NULL, _("%s: script \"%s\" can not be removed " "because plugin \"%s\" is not loaded"), SCRIPT_PLUGIN_NAME, ptr_script->name_with_extension, script_language[ptr_script->language]); return; } /* ask plugin to remove script */ length = 3 + strlen (ptr_script->name_with_extension) + 1; filename = malloc (length); if (filename) { snprintf (filename, length, "%s%s", (quiet && dogechat_config_boolean (script_config_look_quiet_actions)) ? "-q " : "", ptr_script->name_with_extension); snprintf (str_signal, sizeof (str_signal), "%s_script_remove", script_language[ptr_script->language]); (void) dogechat_hook_signal_send (str_signal, DOGECHAT_HOOK_SIGNAL_STRING, filename); free (filename); } }
int script_action_install_process_cb (void *data, const char *command, int return_code, const char *out, const char *err) { char *pos, *filename, *filename2, str_signal[256]; int quiet, length; struct t_script_repo *ptr_script; /* make C compiler happy */ (void) out; quiet = (data) ? 1 : 0; if (return_code >= 0) { pos = strrchr (command, '/'); if (err && err[0]) { dogechat_printf (NULL, _("%s%s: error downloading script \"%s\": %s"), dogechat_prefix ("error"), SCRIPT_PLUGIN_NAME, (pos) ? pos + 1 : "?", err); return DOGECHAT_RC_OK; } if (pos) { ptr_script = script_repo_search_by_name_ext (pos + 1); if (ptr_script) { filename = script_config_get_script_download_filename (ptr_script, NULL); if (filename) { length = 16 + strlen (filename) + 1; filename2 = malloc (length); if (filename2) { snprintf (filename2, length, "%s%s%s", (quiet && dogechat_config_boolean (script_config_look_quiet_actions)) ? "-q " : "", (dogechat_config_boolean (script_config_scripts_autoload)) ? "-a " : "", filename); snprintf (str_signal, sizeof (str_signal), "%s_script_install", script_language[ptr_script->language]); (void) dogechat_hook_signal_send (str_signal, DOGECHAT_HOOK_SIGNAL_STRING, filename2); free (filename2); } free (filename); } /* schedule install of next script */ dogechat_hook_timer (10, 0, 1, &script_action_installnext_timer_cb, (quiet) ? (void *)1 : (void *)0); } } } return DOGECHAT_RC_OK; }
void script_action_autoload (const char *name, int quiet, int autoload) { struct t_script_repo *ptr_script; char str_signal[256], *filename; int length; ptr_script = script_repo_search_by_name_ext (name); if (!ptr_script) { if (!quiet) { dogechat_printf (NULL, _("%s: script \"%s\" not found"), SCRIPT_PLUGIN_NAME, name); } return; } /* check that script is installed */ if (!(ptr_script->status & SCRIPT_STATUS_INSTALLED)) { if (!quiet) { dogechat_printf (NULL, _("%s: script \"%s\" is not installed"), SCRIPT_PLUGIN_NAME, name); } return; } /* toggle autoload if value is -1 */ if (autoload < 0) autoload = (ptr_script->status & SCRIPT_STATUS_AUTOLOADED) ? 0 : 1; /* ask plugin to autoload (or not) script */ length = 16 + strlen (ptr_script->name_with_extension) + 1; filename = malloc (length); if (filename) { snprintf (filename, length, "%s%s%s", (quiet && dogechat_config_boolean (script_config_look_quiet_actions)) ? "-q " : "", (autoload) ? "-a " : "", ptr_script->name_with_extension); snprintf (str_signal, sizeof (str_signal), "%s_script_autoload", script_language[ptr_script->language]); (void) dogechat_hook_signal_send (str_signal, DOGECHAT_HOOK_SIGNAL_STRING, filename); free (filename); } if (!quiet) { dogechat_printf (NULL, (autoload) ? _("%s: autoload enabled for script \"%s\"") : _("%s: autoload disabled for script \"%s\""), SCRIPT_PLUGIN_NAME, name); } script_repo_update_status (ptr_script); }
int dogechat_js_load (const char *filename) { char *source; source = dogechat_file_get_content (filename); if (!source) { dogechat_printf (NULL, dogechat_gettext ("%s%s: script \"%s\" not found"), dogechat_prefix ("error"), JS_PLUGIN_NAME, filename); return 0; } if ((dogechat_js_plugin->debug >= 2) || !js_quiet) { dogechat_printf (NULL, dogechat_gettext ("%s: loading script \"%s\""), JS_PLUGIN_NAME, filename); } js_current_script = NULL; js_registered_script = NULL; js_current_interpreter = new DogechatJsV8(); if (!js_current_interpreter) { dogechat_printf (NULL, dogechat_gettext ("%s%s: unable to create new " "sub-interpreter"), dogechat_prefix ("error"), JS_PLUGIN_NAME); free (source); return 0; } /* load libs */ js_current_interpreter->loadLibs(); js_current_script_filename = filename; if (!js_current_interpreter->load(source)) { dogechat_printf (NULL, dogechat_gettext ("%s%s: unable to load file \"%s\""), dogechat_prefix ("error"), JS_PLUGIN_NAME); delete js_current_interpreter; free (source); /* if script was registered, remove it from list */ if (js_current_script) { plugin_script_remove (dogechat_js_plugin, &js_scripts, &last_js_script, js_current_script); js_current_script = NULL; } return 0; } free (source); if (!js_current_interpreter->execScript()) { dogechat_printf (NULL, dogechat_gettext ("%s%s: unable to execute file " "\"%s\""), dogechat_prefix ("error"), JS_PLUGIN_NAME, filename); delete js_current_interpreter; /* if script was registered, remove it from list */ if (js_current_script) { plugin_script_remove (dogechat_js_plugin, &js_scripts, &last_js_script, js_current_script); js_current_script = NULL; } return 0; } if (!js_registered_script) { dogechat_printf (NULL, dogechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), dogechat_prefix ("error"), JS_PLUGIN_NAME, filename); delete js_current_interpreter; return 0; } js_current_script = js_registered_script; /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (dogechat_js_plugin, js_scripts, js_current_script, &dogechat_js_api_buffer_input_data_cb, &dogechat_js_api_buffer_close_cb); dogechat_hook_signal_send ("javascript_script_loaded", DOGECHAT_HOOK_SIGNAL_STRING, js_current_script->filename); return 1; }