void irc_notify_send_signal (struct t_irc_notify *notify, const char *type, const char *away_message) { char signal[128], *data; int length; snprintf (signal, sizeof (signal), "irc_notify_%s", type); length = strlen (notify->server->name) + 1 + strlen (notify->nick) + 1 + ((away_message) ? strlen (away_message) : 0) + 1; data = malloc (length); if (data) { snprintf (data, length, "%s,%s%s%s", notify->server->name, notify->nick, (away_message && away_message[0]) ? "," : "", (away_message && away_message[0]) ? away_message : ""); } (void) weechat_hook_signal_send (signal, WEECHAT_HOOK_SIGNAL_STRING, data); if (data) free (data); }
void weechat_perl_unload (struct t_plugin_script *script) { int *rc; void *interpreter; char *filename; if ((weechat_perl_plugin->debug >= 2) || !perl_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), PERL_PLUGIN_NAME, script->name); } #ifdef MULTIPLICITY PERL_SET_CONTEXT (script->interpreter); #endif /* MULTIPLICITY */ if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_perl_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (perl_current_script == script) { perl_current_script = (perl_current_script->prev_script) ? perl_current_script->prev_script : perl_current_script->next_script; } plugin_script_remove (weechat_perl_plugin, &perl_scripts, &last_perl_script, script); #ifdef MULTIPLICITY if (interpreter) { perl_destruct (interpreter); perl_free (interpreter); } if (perl_current_script) { PERL_SET_CONTEXT (perl_current_script->interpreter); } #else if (interpreter) free (interpreter); #endif /* MULTIPLICITY */ (void) weechat_hook_signal_send ("perl_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void irc_notify_free (struct t_irc_server *server, struct t_irc_notify *notify, int remove_monitor) { if (!server || !notify) return; (void) weechat_hook_signal_send ("irc_notify_removing", WEECHAT_HOOK_SIGNAL_POINTER, notify); /* free data */ if (notify->nick) { if ((server->monitor > 0) && remove_monitor && (server->is_connected) && !irc_signal_upgrade_received) { /* remove one monitored nick */ irc_server_sendf (notify->server, IRC_SERVER_SEND_OUTQ_PRIO_LOW, NULL, "MONITOR - %s", notify->nick); } free (notify->nick); } if (notify->away_message) free (notify->away_message); /* remove notify from list */ if (notify->prev_notify) (notify->prev_notify)->next_notify = notify->next_notify; if (notify->next_notify) (notify->next_notify)->prev_notify = notify->prev_notify; if (server->notify_list == notify) server->notify_list = notify->next_notify; if (server->last_notify == notify) server->last_notify = notify->prev_notify; free (notify); if (server->notify_count > 0) server->notify_count--; (void) weechat_hook_signal_send ("irc_notify_removed", WEECHAT_HOOK_SIGNAL_STRING, NULL); }
int weechat_guile_load (const char *filename) { char *filename2, *ptr_base_name, *base_name; SCM module; if ((weechat_guile_plugin->debug >= 2) || !guile_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), GUILE_PLUGIN_NAME, filename); } guile_current_script = NULL; guile_registered_script = NULL; guile_current_script_filename = filename; filename2 = strdup (filename); if (!filename2) return 0; ptr_base_name = basename (filename2); base_name = strdup (ptr_base_name); module = scm_c_define_module (base_name, &weechat_guile_module_init_script, filename2); free (filename2); if (!guile_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), GUILE_PLUGIN_NAME, filename); return 0; } weechat_guile_catch (scm_gc_protect_object, (void *)module); guile_current_script = guile_registered_script; /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_guile_plugin, guile_scripts, guile_current_script, &weechat_guile_api_buffer_input_data_cb, &weechat_guile_api_buffer_close_cb); (void) weechat_hook_signal_send ("guile_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, guile_current_script->filename); return 1; }
void irc_ignore_free (struct t_irc_ignore *ignore) { struct t_irc_ignore *ptr_ignore; (void) weechat_hook_signal_send ("irc_ignore_removing", WEECHAT_HOOK_SIGNAL_POINTER, ignore); /* decrement number for all ignore after this one */ for (ptr_ignore = ignore->next_ignore; ptr_ignore; ptr_ignore = ptr_ignore->next_ignore) { ptr_ignore->number--; } /* free data */ if (ignore->mask) free (ignore->mask); if (ignore->regex_mask) { regfree (ignore->regex_mask); free (ignore->regex_mask); } if (ignore->server) free (ignore->server); if (ignore->channel) free (ignore->channel); /* remove ignore from list */ if (ignore->prev_ignore) (ignore->prev_ignore)->next_ignore = ignore->next_ignore; if (ignore->next_ignore) (ignore->next_ignore)->prev_ignore = ignore->prev_ignore; if (irc_ignore_list == ignore) irc_ignore_list = ignore->next_ignore; if (last_irc_ignore == ignore) last_irc_ignore = ignore->prev_ignore; free (ignore); (void) weechat_hook_signal_send ("irc_ignore_removed", WEECHAT_HOOK_SIGNAL_STRING, NULL); }
void weechat_python_unload (struct t_plugin_script *script) { int *rc; void *interpreter; char *filename; if ((weechat_python_plugin->debug >= 2) || !python_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), PYTHON_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *) weechat_python_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (python_current_script == script) { python_current_script = (python_current_script->prev_script) ? python_current_script->prev_script : python_current_script->next_script; } plugin_script_remove (weechat_python_plugin, &python_scripts, &last_python_script, script); if (interpreter) { PyThreadState_Swap (interpreter); Py_EndInterpreter (interpreter); } if (python_current_script) PyThreadState_Swap (python_current_script->interpreter); (void) weechat_hook_signal_send ("python_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_lua_unload (struct t_plugin_script *script) { int *rc; void *interpreter; char *filename; if ((weechat_lua_plugin->debug >= 2) || !lua_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), LUA_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_lua_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (lua_current_script == script) lua_current_script = (lua_current_script->prev_script) ? lua_current_script->prev_script : lua_current_script->next_script; plugin_script_remove (weechat_lua_plugin, &lua_scripts, &last_lua_script, script); if (interpreter) lua_close (interpreter); if (lua_current_script) lua_current_interpreter = lua_current_script->interpreter; (void) weechat_hook_signal_send ("lua_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_guile_unload (struct t_plugin_script *script) { int *rc; void *interpreter; char *filename; if ((weechat_guile_plugin->debug >= 2) || !guile_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), GUILE_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_guile_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (guile_current_script == script) guile_current_script = (guile_current_script->prev_script) ? guile_current_script->prev_script : guile_current_script->next_script; plugin_script_remove (weechat_guile_plugin, &guile_scripts, &last_guile_script, script); if (interpreter) weechat_guile_catch (scm_gc_unprotect_object, interpreter); if (guile_current_script) scm_set_current_module ((SCM)(guile_current_script->interpreter)); (void) weechat_hook_signal_send ("guile_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_ruby_unload (struct t_plugin_script *script) { int *rc; void *interpreter; char *filename; if ((weechat_ruby_plugin->debug >= 2) || !ruby_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), RUBY_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_ruby_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, 0, NULL); if (rc) free (rc); } filename = strdup (script->filename); interpreter = script->interpreter; if (ruby_current_script == script) ruby_current_script = (ruby_current_script->prev_script) ? ruby_current_script->prev_script : ruby_current_script->next_script; plugin_script_remove (weechat_ruby_plugin, &ruby_scripts, &last_ruby_script, script); if (interpreter) rb_gc_unregister_address (interpreter); (void) weechat_hook_signal_send ("ruby_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
void weechat_js_unload (struct t_plugin_script *script) { int *rc; char *filename; void *interpreter; if ((weechat_js_plugin->debug >= 2) || !js_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), JS_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_js_exec (script, WEECHAT_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 (weechat_js_plugin, &js_scripts, &last_js_script, script); if (interpreter) delete((WeechatJsV8 *)interpreter); (void) weechat_hook_signal_send ("javascript_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
/** * Enable or disable logging for a WeeChat buffer. */ int twc_set_buffer_logging(struct t_gui_buffer *buffer, bool logging) { if (!buffer) return WEECHAT_RC_ERROR; char const *signal; if (logging) { weechat_buffer_set(buffer, "localvar_del_no_log", ""); signal = "logger_start"; } else { weechat_buffer_set(buffer, "localvar_set_no_log", "1"); signal = "logger_stop"; } return weechat_hook_signal_send(signal, WEECHAT_HOOK_SIGNAL_POINTER, buffer); }
void weechat_tcl_unload (struct t_plugin_script *script) { Tcl_Interp* interp; int *rc; char *filename; if ((weechat_tcl_plugin->debug >= 2) || !tcl_quiet) { weechat_printf (NULL, weechat_gettext ("%s: unloading script \"%s\""), TCL_PLUGIN_NAME, script->name); } if (script->shutdown_func && script->shutdown_func[0]) { rc = (int *)weechat_tcl_exec (script, WEECHAT_SCRIPT_EXEC_INT, script->shutdown_func, NULL, NULL); if (rc) free (rc); } filename = strdup (script->filename); interp = (Tcl_Interp*)script->interpreter; if (tcl_current_script == script) tcl_current_script = (tcl_current_script->prev_script) ? tcl_current_script->prev_script : tcl_current_script->next_script; plugin_script_remove (weechat_tcl_plugin, &tcl_scripts, &last_tcl_script, script); Tcl_DeleteInterp(interp); weechat_hook_signal_send ("tcl_script_unloaded", WEECHAT_HOOK_SIGNAL_STRING, filename); if (filename) free (filename); }
int weechat_lua_load (const char *filename) { FILE *fp; char *weechat_lua_code = { "weechat_outputs = {\n" " write = function (self, str)\n" " weechat.print(\"\", \"lua: stdout/stderr: \" .. str)\n" " end\n" "}\n" "io.stdout = weechat_outputs\n" "io.stderr = weechat_outputs\n" }; if ((fp = fopen (filename, "r")) == NULL) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), LUA_PLUGIN_NAME, filename); return 0; } if ((weechat_lua_plugin->debug >= 2) || !lua_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), LUA_PLUGIN_NAME, filename); } lua_current_script = NULL; lua_registered_script = NULL; lua_current_interpreter = luaL_newstate(); if (lua_current_interpreter == NULL) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "sub-interpreter"), weechat_prefix ("error"), LUA_PLUGIN_NAME); fclose (fp); return 0; } #ifdef LUA_VERSION_NUM /* LUA_VERSION_NUM is defined only in lua >= 5.1.0 */ luaL_openlibs (lua_current_interpreter); #else luaopen_base (lua_current_interpreter); luaopen_string (lua_current_interpreter); luaopen_table (lua_current_interpreter); luaopen_math (lua_current_interpreter); luaopen_io (lua_current_interpreter); luaopen_debug (lua_current_interpreter); #endif weechat_lua_register_lib (lua_current_interpreter, "weechat", weechat_lua_api_funcs); #ifdef LUA_VERSION_NUM if (luaL_dostring (lua_current_interpreter, weechat_lua_code) != 0) #else if (lua_dostring (lua_current_interpreter, weechat_lua_code) != 0) #endif { weechat_printf (NULL, weechat_gettext ("%s%s: unable to redirect stdout " "and stderr"), weechat_prefix ("error"), LUA_PLUGIN_NAME); } lua_current_script_filename = filename; if (luaL_loadfile (lua_current_interpreter, filename) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to load file \"%s\""), weechat_prefix ("error"), LUA_PLUGIN_NAME, filename); weechat_printf (NULL, weechat_gettext ("%s%s: error: %s"), weechat_prefix ("error"), LUA_PLUGIN_NAME, lua_tostring (lua_current_interpreter, -1)); lua_close (lua_current_interpreter); fclose (fp); return 0; } if (lua_pcall (lua_current_interpreter, 0, 0, 0) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to execute file " "\"%s\""), weechat_prefix ("error"), LUA_PLUGIN_NAME, filename); weechat_printf (NULL, weechat_gettext ("%s%s: error: %s"), weechat_prefix ("error"), LUA_PLUGIN_NAME, lua_tostring (lua_current_interpreter, -1)); lua_close (lua_current_interpreter); fclose (fp); /* if script was registered, remove it from list */ if (lua_current_script) { plugin_script_remove (weechat_lua_plugin, &lua_scripts, &last_lua_script, lua_current_script); } return 0; } fclose (fp); if (!lua_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), LUA_PLUGIN_NAME, filename); lua_close (lua_current_interpreter); return 0; } lua_current_script = lua_registered_script; lua_current_script->interpreter = (lua_State *) lua_current_interpreter; /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_lua_plugin, lua_scripts, lua_current_script, &weechat_lua_api_buffer_input_data_cb, &weechat_lua_api_buffer_close_cb); weechat_hook_signal_send ("lua_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, lua_current_script->filename); return 1; }
int weechat_python_load (const char *filename) { char *argv[] = { "__weechat_plugin__" , NULL }; #if PY_MAJOR_VERSION >= 3 wchar_t *wargv[] = { NULL, NULL }; #endif FILE *fp; PyObject *weechat_outputs, *python_path, *path; const char *weechat_home; char *str_home; int len; if ((fp = fopen (filename, "r")) == NULL) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), PYTHON_PLUGIN_NAME, filename); return 0; } if ((weechat_python_plugin->debug >= 2) || !python_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), PYTHON_PLUGIN_NAME, filename); } python_current_script = NULL; python_registered_script = NULL; /* PyEval_AcquireLock (); */ python_current_interpreter = Py_NewInterpreter (); #if PY_MAJOR_VERSION >= 3 /* python >= 3.x */ len = mbstowcs (NULL, argv[0], 0) + 1; wargv[0] = malloc ((len + 1) * sizeof (wargv[0][0])); if (wargv[0]) { if (mbstowcs (wargv[0], argv[0], len) == (size_t)(-1)) { free (wargv[0]); wargv[0] = NULL; } PySys_SetArgv(1, wargv); if (wargv[0]) free (wargv[0]); } #else /* python <= 2.x */ PySys_SetArgv(1, argv); #endif if (!python_current_interpreter) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "sub-interpreter"), weechat_prefix ("error"), PYTHON_PLUGIN_NAME); fclose (fp); /* PyEval_ReleaseLock (); */ return 0; } PyThreadState_Swap (python_current_interpreter); /* adding $weechat_dir/python in $PYTHONPATH */ python_path = PySys_GetObject ("path"); weechat_home = weechat_info_get ("weechat_dir", ""); if (weechat_home) { len = strlen (weechat_home) + 1 + strlen (PYTHON_PLUGIN_NAME) + 1; str_home = malloc (len); if (str_home) { snprintf (str_home, len, "%s/python", weechat_home); #if PY_MAJOR_VERSION >= 3 /* python >= 3.x */ path = PyUnicode_FromString(str_home); #else /* python <= 2.x */ path = PyBytes_FromString (str_home); #endif if (path != NULL) { PyList_Insert (python_path, 0, path); Py_DECREF (path); } free (str_home); } } #if PY_MAJOR_VERSION >= 3 /* python >= 3.x */ weechat_outputs = PyModule_Create (&moduleDefOutputs); #else /* python <= 2.x */ weechat_outputs = Py_InitModule("weechatOutputs", weechat_python_output_funcs); #endif if (!weechat_outputs) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to redirect stdout and " "stderr"), weechat_prefix ("error"), PYTHON_PLUGIN_NAME); } else { if (PySys_SetObject("stdout", weechat_outputs) == -1) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to redirect stdout"), weechat_prefix ("error"), PYTHON_PLUGIN_NAME); } if (PySys_SetObject("stderr", weechat_outputs) == -1) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to redirect stderr"), weechat_prefix ("error"), PYTHON_PLUGIN_NAME); } } python_current_script_filename = filename; if (PyRun_SimpleFile (fp, filename) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to parse file \"%s\""), weechat_prefix ("error"), PYTHON_PLUGIN_NAME, filename); fclose (fp); if (PyErr_Occurred ()) PyErr_Print (); /* if script was registered, remove it from list */ if (python_current_script != NULL) { plugin_script_remove (weechat_python_plugin, &python_scripts, &last_python_script, python_current_script); } Py_EndInterpreter (python_current_interpreter); /* PyEval_ReleaseLock (); */ return 0; } if (PyErr_Occurred ()) PyErr_Print (); fclose (fp); if (!python_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), PYTHON_PLUGIN_NAME, filename); if (PyErr_Occurred ()) PyErr_Print (); Py_EndInterpreter (python_current_interpreter); /* PyEval_ReleaseLock (); */ return 0; } python_current_script = python_registered_script; /* PyEval_ReleaseThread (python_current_script->interpreter); */ /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_python_plugin, python_scripts, python_current_script, &weechat_python_api_buffer_input_data_cb, &weechat_python_api_buffer_close_cb); (void) weechat_hook_signal_send ("python_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, python_current_script->filename); return 1; }
struct t_plugin_script * weechat_tcl_load (const char *filename, const char *code) { int i; Tcl_Interp *interp; struct stat buf; /* make C compiler happy */ /* TODO: implement load of code in TCL */ (void) code; if (stat (filename, &buf) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), TCL_PLUGIN_NAME, filename); return NULL; } if ((weechat_tcl_plugin->debug >= 2) || !tcl_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), TCL_PLUGIN_NAME, filename); } tcl_current_script = NULL; tcl_registered_script = NULL; if (!(interp = Tcl_CreateInterp ())) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "interpreter"), weechat_prefix ("error"), TCL_PLUGIN_NAME); return NULL; } tcl_current_script_filename = filename; weechat_tcl_api_init (interp); if (Tcl_EvalFile (interp, filename) != TCL_OK) { weechat_printf (NULL, weechat_gettext ("%s%s: error occurred while " "parsing file \"%s\": %s"), weechat_prefix ("error"), TCL_PLUGIN_NAME, filename, Tcl_GetStringFromObj (Tcl_GetObjResult (interp), &i)); /* if script was registered, remove it from list */ if (tcl_current_script) { plugin_script_remove (weechat_tcl_plugin, &tcl_scripts, &last_tcl_script, tcl_current_script); tcl_current_script = NULL; } return NULL; } if (!tcl_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), TCL_PLUGIN_NAME, filename); Tcl_DeleteInterp (interp); return NULL; } tcl_current_script = tcl_registered_script; /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_tcl_plugin, tcl_scripts, tcl_current_script, &weechat_tcl_api_buffer_input_data_cb, &weechat_tcl_api_buffer_close_cb); (void) weechat_hook_signal_send ("tcl_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, tcl_current_script->filename); return tcl_current_script; }
int weechat_perl_load (const char *filename) { struct t_plugin_script temp_script; struct stat buf; char *perl_code; int length; #ifndef MULTIPLICITY char pkgname[64]; #endif /* MULTIPLICITY */ temp_script.filename = NULL; temp_script.interpreter = NULL; temp_script.name = NULL; temp_script.author = NULL; temp_script.version = NULL; temp_script.license = NULL; temp_script.description = NULL; temp_script.shutdown_func = NULL; temp_script.charset = NULL; if (stat (filename, &buf) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), PERL_PLUGIN_NAME, filename); return 0; } if ((weechat_perl_plugin->debug >= 2) || !perl_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), PERL_PLUGIN_NAME, filename); } perl_current_script = NULL; perl_current_script_filename = filename; perl_registered_script = NULL; #ifdef MULTIPLICITY perl_current_interpreter = perl_alloc(); if (!perl_current_interpreter) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "sub-interpreter"), weechat_prefix ("error"), PERL_PLUGIN_NAME); return 0; } PERL_SET_CONTEXT (perl_current_interpreter); perl_construct (perl_current_interpreter); temp_script.interpreter = (PerlInterpreter *) perl_current_interpreter; perl_parse (perl_current_interpreter, weechat_perl_api_init, perl_args_count, perl_args, NULL); length = strlen (perl_weechat_code) - 2 + strlen (filename) + 1; perl_code = malloc (length); if (!perl_code) return 0; snprintf (perl_code, length, perl_weechat_code, filename); #else snprintf (pkgname, sizeof (pkgname), "%s%d", PKG_NAME_PREFIX, perl_num); perl_num++; length = strlen (perl_weechat_code) - 4 + strlen (pkgname) + strlen (filename) + 1; perl_code = malloc (length); if (!perl_code) return 0; snprintf (perl_code, length, perl_weechat_code, pkgname, filename); #endif /* MULTIPLICITY */ eval_pv (perl_code, TRUE); free (perl_code); if (SvTRUE (ERRSV)) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to parse file " "\"%s\""), weechat_prefix ("error"), PERL_PLUGIN_NAME, filename); weechat_printf (NULL, weechat_gettext ("%s%s: error: %s"), weechat_prefix ("error"), PERL_PLUGIN_NAME, SvPV_nolen(ERRSV)); #ifdef MULTIPLICITY perl_destruct (perl_current_interpreter); perl_free (perl_current_interpreter); #endif /* MULTIPLICITY */ if (perl_current_script && (perl_current_script != &temp_script)) { plugin_script_remove (weechat_perl_plugin, &perl_scripts, &last_perl_script, perl_current_script); perl_current_script = NULL; } return 0; } if (!perl_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), PERL_PLUGIN_NAME, filename); #ifdef MULTIPLICITY perl_destruct (perl_current_interpreter); perl_free (perl_current_interpreter); #endif /* MULTIPLICITY */ return 0; } perl_current_script = perl_registered_script; #ifndef MULTIPLICITY perl_current_script->interpreter = strdup (pkgname); #endif /* MULTIPLICITY */ /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_perl_plugin, perl_scripts, perl_current_script, &weechat_perl_api_buffer_input_data_cb, &weechat_perl_api_buffer_close_cb); (void) weechat_hook_signal_send ("perl_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, perl_current_script->filename); return 1; }
struct t_plugin_script * weechat_js_load (const char *filename, const char *code) { char *source; /* make C compiler happy */ /* TODO: implement load of code in Javascript */ (void) code; source = weechat_file_get_content (filename); if (!source) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), JS_PLUGIN_NAME, filename); return NULL; } if ((weechat_js_plugin->debug >= 2) || !js_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), JS_PLUGIN_NAME, filename); } js_current_script = NULL; js_registered_script = NULL; js_current_interpreter = new WeechatJsV8(); if (!js_current_interpreter) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "sub-interpreter"), weechat_prefix ("error"), JS_PLUGIN_NAME); free (source); return NULL; } /* load libs */ js_current_interpreter->loadLibs(); js_current_script_filename = filename; if (!js_current_interpreter->load(source)) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to load file \"%s\""), weechat_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 (weechat_js_plugin, &js_scripts, &last_js_script, js_current_script); js_current_script = NULL; } return NULL; } free (source); if (!js_current_interpreter->execScript()) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to execute file " "\"%s\""), weechat_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 (weechat_js_plugin, &js_scripts, &last_js_script, js_current_script); js_current_script = NULL; } return NULL; } if (!js_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), JS_PLUGIN_NAME, filename); delete js_current_interpreter; return NULL; } 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 (weechat_js_plugin, js_scripts, js_current_script, &weechat_js_api_buffer_input_data_cb, &weechat_js_api_buffer_close_cb); weechat_hook_signal_send ("javascript_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, js_current_script->filename); return js_current_script; }
char * weechat_aspell_modifier_cb (void *data, const char *modifier, const char *modifier_data, const char *string) { long unsigned int value; struct t_gui_buffer *buffer; struct t_aspell_speller_buffer *ptr_speller_buffer; char *result, *ptr_string, *pos_space, *ptr_end, *ptr_end_valid, save_end; char *word_for_suggestions, *old_suggestions, *suggestions; char *word_and_suggestions; const char *color_normal, *color_error, *ptr_suggestions; int utf8_char_int, char_size; int length, index_result, length_word, word_ok; int length_color_normal, length_color_error, rc; int input_pos, current_pos, word_start_pos, word_end_pos, word_end_pos_valid; /* make C compiler happy */ (void) data; (void) modifier; if (!aspell_enabled) return NULL; if (!string) return NULL; rc = sscanf (modifier_data, "%lx", &value); if ((rc == EOF) || (rc == 0)) return NULL; buffer = (struct t_gui_buffer *)value; /* check text during search only if option is enabled */ if (weechat_buffer_get_integer (buffer, "text_search") && !weechat_config_boolean (weechat_aspell_config_check_during_search)) return NULL; /* get structure with speller info for buffer */ ptr_speller_buffer = weechat_hashtable_get (weechat_aspell_speller_buffer, buffer); if (!ptr_speller_buffer) { ptr_speller_buffer = weechat_aspell_speller_buffer_new (buffer); if (!ptr_speller_buffer) return NULL; } if (!ptr_speller_buffer->spellers) return NULL; /* * for performance: return last string built if input string is the * same (and cursor position is the same, if suggestions are enabled) */ input_pos = weechat_buffer_get_integer (buffer, "input_pos"); if (ptr_speller_buffer->modifier_string && (strcmp (string, ptr_speller_buffer->modifier_string) == 0) && ((weechat_config_integer (weechat_aspell_config_check_suggestions) < 0) || (input_pos == ptr_speller_buffer->input_pos))) { return (ptr_speller_buffer->modifier_result) ? strdup (ptr_speller_buffer->modifier_result) : NULL; } /* free last modifier string and result */ if (ptr_speller_buffer->modifier_string) { free (ptr_speller_buffer->modifier_string); ptr_speller_buffer->modifier_string = NULL; } if (ptr_speller_buffer->modifier_result) { free (ptr_speller_buffer->modifier_result); ptr_speller_buffer->modifier_result = NULL; } word_for_suggestions = NULL; /* save last modifier string received */ ptr_speller_buffer->modifier_string = strdup (string); ptr_speller_buffer->input_pos = input_pos; color_normal = weechat_color ("bar_fg"); length_color_normal = strlen (color_normal); color_error = weechat_color (weechat_config_string (weechat_aspell_config_color_misspelled)); length_color_error = strlen (color_error); length = strlen (string); result = malloc (length + (length * length_color_error) + 1); if (result) { result[0] = '\0'; ptr_string = ptr_speller_buffer->modifier_string; index_result = 0; /* check if string is a command */ if (!weechat_string_input_for_buffer (ptr_string)) { char_size = weechat_utf8_char_size (ptr_string); ptr_string += char_size; pos_space = ptr_string; while (pos_space && pos_space[0] && (pos_space[0] != ' ')) { pos_space = weechat_utf8_next_char (pos_space); } if (!pos_space || !pos_space[0]) { free (result); return NULL; } pos_space[0] = '\0'; /* exit if command is not authorized for spell checking */ if (!weechat_aspell_command_authorized (ptr_string)) { free (result); return NULL; } memcpy (result + index_result, ptr_speller_buffer->modifier_string, char_size); index_result += char_size; strcpy (result + index_result, ptr_string); index_result += strlen (ptr_string); pos_space[0] = ' '; ptr_string = pos_space; } current_pos = 0; while (ptr_string[0]) { /* find start of word: it must start with an alphanumeric char */ utf8_char_int = weechat_utf8_char_int (ptr_string); while ((!iswalnum (utf8_char_int)) || iswspace (utf8_char_int)) { char_size = weechat_utf8_char_size (ptr_string); memcpy (result + index_result, ptr_string, char_size); index_result += char_size; ptr_string += char_size; current_pos++; if (!ptr_string[0]) break; utf8_char_int = weechat_utf8_char_int (ptr_string); } if (!ptr_string[0]) break; word_start_pos = current_pos; word_end_pos = current_pos; word_end_pos_valid = current_pos; /* find end of word: ' and - allowed in word, but not at the end */ ptr_end_valid = ptr_string; ptr_end = weechat_utf8_next_char (ptr_string); utf8_char_int = weechat_utf8_char_int (ptr_end); while (iswalnum (utf8_char_int) || (utf8_char_int == '\'') || (utf8_char_int == '-')) { word_end_pos++; if (iswalnum (utf8_char_int)) { /* pointer to last alphanumeric char in the word */ ptr_end_valid = ptr_end; word_end_pos_valid = word_end_pos; } ptr_end = weechat_utf8_next_char (ptr_end); if (!ptr_end[0]) break; utf8_char_int = weechat_utf8_char_int (ptr_end); } ptr_end = weechat_utf8_next_char (ptr_end_valid); word_end_pos = word_end_pos_valid; word_ok = 0; if (weechat_aspell_string_is_url (ptr_string)) { /* * word is an URL, then it is OK, and search for next space * (will be end of word) */ word_ok = 1; if (ptr_end[0]) { utf8_char_int = weechat_utf8_char_int (ptr_end); while (!iswspace (utf8_char_int)) { ptr_end = weechat_utf8_next_char (ptr_end); if (!ptr_end[0]) break; utf8_char_int = weechat_utf8_char_int (ptr_end); } } } save_end = ptr_end[0]; ptr_end[0] = '\0'; length_word = ptr_end - ptr_string; if (!word_ok) { if ((save_end != '\0') || (weechat_config_integer (weechat_aspell_config_check_real_time))) { word_ok = weechat_aspell_check_word (buffer, ptr_speller_buffer, ptr_string); if (!word_ok && (input_pos >= word_start_pos)) { /* * if word is misspelled and that cursor is after * the beginning of this word, save the word (we will * look for suggestions after this loop) */ if (word_for_suggestions) free (word_for_suggestions); word_for_suggestions = strdup (ptr_string); } } else word_ok = 1; } /* add error color */ if (!word_ok) { strcpy (result + index_result, color_error); index_result += length_color_error; } /* add word */ strcpy (result + index_result, ptr_string); index_result += length_word; /* add normal color (after misspelled word) */ if (!word_ok) { strcpy (result + index_result, color_normal); index_result += length_color_normal; } if (save_end == '\0') break; ptr_end[0] = save_end; ptr_string = ptr_end; current_pos = word_end_pos + 1; } result[index_result] = '\0'; } /* save old suggestions in buffer */ ptr_suggestions = weechat_buffer_get_string (buffer, "localvar_aspell_suggest"); old_suggestions = (ptr_suggestions) ? strdup (ptr_suggestions) : NULL; /* if there is a misspelled word, get suggestions and set them in buffer */ if (word_for_suggestions) { suggestions = weechat_aspell_get_suggestions (ptr_speller_buffer, word_for_suggestions); if (suggestions) { length = strlen (word_for_suggestions) + 1 /* ":" */ + strlen (suggestions) + 1; word_and_suggestions = malloc (length); if (word_and_suggestions) { snprintf (word_and_suggestions, length, "%s:%s", word_for_suggestions, suggestions); weechat_buffer_set (buffer, "localvar_set_aspell_suggest", word_and_suggestions); free (word_and_suggestions); } else { weechat_buffer_set (buffer, "localvar_del_aspell_suggest", ""); } free (suggestions); } else { weechat_buffer_set (buffer, "localvar_del_aspell_suggest", ""); } free (word_for_suggestions); } else { weechat_buffer_set (buffer, "localvar_del_aspell_suggest", ""); } /* * if suggestions have changed, update the bar item * and send signal "aspell_suggest" */ ptr_suggestions = weechat_buffer_get_string (buffer, "localvar_aspell_suggest"); if ((old_suggestions && !ptr_suggestions) || (!old_suggestions && ptr_suggestions) || (old_suggestions && ptr_suggestions && (strcmp (old_suggestions, ptr_suggestions) != 0))) { weechat_bar_item_update ("aspell_suggest"); weechat_hook_signal_send ("aspell_suggest", WEECHAT_HOOK_SIGNAL_POINTER, buffer); } if (old_suggestions) free (old_suggestions); if (!result) return NULL; ptr_speller_buffer->modifier_result = strdup (result); return result; }
void irc_ctcp_recv_dcc (struct t_irc_server *server, const char *nick, const char *arguments, char *message) { char *dcc_args, *pos, *pos_file, *pos_addr, *pos_port, *pos_size; char *pos_start_resume, *filename; struct t_infolist *infolist; struct t_infolist_item *item; char charset_modifier[256]; if (!arguments || !arguments[0]) return; if (strncmp (arguments, "SEND ", 5) == 0) { arguments += 5; while (arguments[0] == ' ') { arguments++; } dcc_args = strdup (arguments); if (!dcc_args) { weechat_printf (server->buffer, _("%s%s: not enough memory for \"%s\" " "command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); return; } /* DCC filename */ pos_file = dcc_args; while (pos_file[0] == ' ') { pos_file++; } /* look for file size */ pos_size = strrchr (pos_file, ' '); if (!pos_size) { weechat_printf (server->buffer, _("%s%s: cannot parse \"%s\" command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); free (dcc_args); return; } pos = pos_size; pos_size++; while (pos[0] == ' ') { pos--; } pos[1] = '\0'; /* look for DCC port */ pos_port = strrchr (pos_file, ' '); if (!pos_port) { weechat_printf (server->buffer, _("%s%s: cannot parse \"%s\" command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); free (dcc_args); return; } pos = pos_port; pos_port++; while (pos[0] == ' ') { pos--; } pos[1] = '\0'; /* look for DCC IP address */ pos_addr = strrchr (pos_file, ' '); if (!pos_addr) { weechat_printf (server->buffer, _("%s%s: cannot parse \"%s\" command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); free (dcc_args); return; } pos = pos_addr; pos_addr++; while (pos[0] == ' ') { pos--; } pos[1] = '\0'; /* remove double quotes around filename */ filename = irc_ctcp_dcc_filename_without_quotes (pos_file); /* add DCC file via xfer plugin */ infolist = weechat_infolist_new (); if (infolist) { item = weechat_infolist_new_item (infolist); if (item) { weechat_infolist_new_var_string (item, "plugin_name", weechat_plugin->name); weechat_infolist_new_var_string (item, "plugin_id", server->name); weechat_infolist_new_var_string (item, "type", "file_recv"); weechat_infolist_new_var_string (item, "protocol", "dcc"); weechat_infolist_new_var_string (item, "remote_nick", nick); weechat_infolist_new_var_string (item, "local_nick", server->nick); weechat_infolist_new_var_string (item, "filename", (filename) ? filename : pos_file); weechat_infolist_new_var_string (item, "size", pos_size); weechat_infolist_new_var_string (item, "proxy", IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_PROXY)); weechat_infolist_new_var_string (item, "address", pos_addr); weechat_infolist_new_var_integer (item, "port", atoi (pos_port)); weechat_hook_signal_send ("xfer_add", WEECHAT_HOOK_SIGNAL_POINTER, infolist); } weechat_infolist_free (infolist); } weechat_hook_signal_send ("irc_dcc", WEECHAT_HOOK_SIGNAL_STRING, message); if (filename) free (filename); free (dcc_args); } else if (strncmp (arguments, "RESUME ", 7) == 0) { arguments += 7; while (arguments[0] == ' ') { arguments++; } dcc_args = strdup (arguments); if (!dcc_args) { weechat_printf (server->buffer, _("%s%s: not enough memory for \"%s\" " "command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); return; } /* DCC filename */ pos_file = dcc_args; while (pos_file[0] == ' ') { pos_file++; } /* look for resume start position */ pos_start_resume = strrchr (pos_file, ' '); if (!pos_start_resume) { weechat_printf (server->buffer, _("%s%s: cannot parse \"%s\" command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); free (dcc_args); return; } pos = pos_start_resume; pos_start_resume++; while (pos[0] == ' ') { pos--; } pos[1] = '\0'; /* look for DCC port */ pos_port = strrchr (pos_file, ' '); if (!pos_port) { weechat_printf (server->buffer, _("%s%s: cannot parse \"%s\" command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); free (dcc_args); return; } pos = pos_port; pos_port++; while (pos[0] == ' ') { pos--; } pos[1] = '\0'; /* remove double quotes around filename */ filename = irc_ctcp_dcc_filename_without_quotes (pos_file); /* accept resume via xfer plugin */ infolist = weechat_infolist_new (); if (infolist) { item = weechat_infolist_new_item (infolist); if (item) { weechat_infolist_new_var_string (item, "plugin_name", weechat_plugin->name); weechat_infolist_new_var_string (item, "plugin_id", server->name); weechat_infolist_new_var_string (item, "type", "file_recv"); weechat_infolist_new_var_string (item, "filename", (filename) ? filename : pos_file); weechat_infolist_new_var_integer (item, "port", atoi (pos_port)); weechat_infolist_new_var_string (item, "start_resume", pos_start_resume); weechat_hook_signal_send ("xfer_accept_resume", WEECHAT_HOOK_SIGNAL_POINTER, infolist); } weechat_infolist_free (infolist); } weechat_hook_signal_send ("irc_dcc", WEECHAT_HOOK_SIGNAL_STRING, message); if (filename) free (filename); free (dcc_args); } else if (strncmp (arguments, "ACCEPT ", 7) == 0) { arguments += 7; while (arguments[0] == ' ') { arguments++; } dcc_args = strdup (arguments); if (!dcc_args) { weechat_printf (server->buffer, _("%s%s: not enough memory for \"%s\" " "command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); return; } /* DCC filename */ pos_file = dcc_args; while (pos_file[0] == ' ') { pos_file++; } /* look for resume start position */ pos_start_resume = strrchr (pos_file, ' '); if (!pos_start_resume) { weechat_printf (server->buffer, _("%s%s: cannot parse \"%s\" command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); free (dcc_args); return; } pos = pos_start_resume; pos_start_resume++; while (pos[0] == ' ') { pos--; } pos[1] = '\0'; /* look for DCC port */ pos_port = strrchr (pos_file, ' '); if (!pos_port) { weechat_printf (server->buffer, _("%s%s: cannot parse \"%s\" command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); free (dcc_args); return; } pos = pos_port; pos_port++; while (pos[0] == ' ') { pos--; } pos[1] = '\0'; /* remove double quotes around filename */ filename = irc_ctcp_dcc_filename_without_quotes (pos_file); /* resume file via xfer plugin */ infolist = weechat_infolist_new (); if (infolist) { item = weechat_infolist_new_item (infolist); if (item) { weechat_infolist_new_var_string (item, "plugin_name", weechat_plugin->name); weechat_infolist_new_var_string (item, "plugin_id", server->name); weechat_infolist_new_var_string (item, "type", "file_recv"); weechat_infolist_new_var_string (item, "filename", (filename) ? filename : pos_file); weechat_infolist_new_var_integer (item, "port", atoi (pos_port)); weechat_infolist_new_var_string (item, "start_resume", pos_start_resume); weechat_hook_signal_send ("xfer_start_resume", WEECHAT_HOOK_SIGNAL_POINTER, infolist); } weechat_infolist_free (infolist); } weechat_hook_signal_send ("irc_dcc", WEECHAT_HOOK_SIGNAL_STRING, message); if (filename) free (filename); free (dcc_args); } else if (strncmp (arguments, "CHAT ", 5) == 0) { arguments += 5; while (arguments[0] == ' ') { arguments++; } dcc_args = strdup (arguments); if (!dcc_args) { weechat_printf (server->buffer, _("%s%s: not enough memory for \"%s\" " "command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); return; } /* CHAT type */ pos_file = dcc_args; while (pos_file[0] == ' ') { pos_file++; } /* DCC IP address */ pos_addr = strchr (pos_file, ' '); if (!pos_addr) { weechat_printf (server->buffer, _("%s%s: cannot parse \"%s\" command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); free (dcc_args); return; } pos_addr[0] = '\0'; pos_addr++; while (pos_addr[0] == ' ') { pos_addr++; } /* look for DCC port */ pos_port = strchr (pos_addr, ' '); if (!pos_port) { weechat_printf (server->buffer, _("%s%s: cannot parse \"%s\" command"), weechat_prefix ("error"), IRC_PLUGIN_NAME, "privmsg"); free (dcc_args); return; } pos_port[0] = '\0'; pos_port++; while (pos_port[0] == ' ') { pos_port++; } if (weechat_strcasecmp (pos_file, "chat") != 0) { weechat_printf (server->buffer, _("%s%s: unknown DCC CHAT type " "received from %s%s%s: \"%s\""), weechat_prefix ("error"), IRC_PLUGIN_NAME, IRC_COLOR_CHAT_NICK, nick, IRC_COLOR_RESET, pos_file); free (dcc_args); return; } /* add DCC chat via xfer plugin */ infolist = weechat_infolist_new (); if (infolist) { item = weechat_infolist_new_item (infolist); if (item) { weechat_infolist_new_var_string (item, "plugin_name", weechat_plugin->name); weechat_infolist_new_var_string (item, "plugin_id", server->name); weechat_infolist_new_var_string (item, "type", "chat_recv"); weechat_infolist_new_var_string (item, "remote_nick", nick); weechat_infolist_new_var_string (item, "local_nick", server->nick); snprintf (charset_modifier, sizeof (charset_modifier), "irc.%s.%s", server->name, nick); weechat_infolist_new_var_string (item, "charset_modifier", charset_modifier); weechat_infolist_new_var_string (item, "proxy", IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_PROXY)); weechat_infolist_new_var_string (item, "address", pos_addr); weechat_infolist_new_var_integer (item, "port", atoi (pos_port)); weechat_hook_signal_send ("xfer_add", WEECHAT_HOOK_SIGNAL_POINTER, infolist); } weechat_infolist_free (infolist); } weechat_hook_signal_send ("irc_dcc", WEECHAT_HOOK_SIGNAL_STRING, message); free (dcc_args); } }
void irc_ctcp_recv (struct t_irc_server *server, const char *command, struct t_irc_channel *channel, const char *address, const char *nick, const char *remote_nick, char *arguments, char *message) { char *pos_end, *pos_space, *pos_args; const char *reply; char *decoded_reply; struct t_irc_channel *ptr_channel; struct t_irc_nick *ptr_nick; int nick_is_me; while (arguments && arguments[0]) { pos_end = strrchr (arguments + 1, '\01'); if (pos_end) pos_end[0] = '\0'; pos_args = NULL; pos_space = strchr (arguments + 1, ' '); if (pos_space) { pos_space[0] = '\0'; pos_args = pos_space + 1; while (pos_args[0] == ' ') { pos_args++; } } /* CTCP ACTION */ if (strcmp (arguments + 1, "ACTION") == 0) { nick_is_me = (irc_server_strcasecmp (server, server->nick, nick) == 0); if (channel) { ptr_nick = irc_nick_search (server, channel, nick); irc_channel_nick_speaking_add (channel, nick, (pos_args) ? weechat_string_has_highlight (pos_args, server->nick) : 0); irc_channel_nick_speaking_time_remove_old (channel); irc_channel_nick_speaking_time_add (server, channel, nick, time (NULL)); weechat_printf_tags (channel->buffer, irc_protocol_tags (command, (nick_is_me) ? "irc_action,notify_none,no_highlight" : "irc_action,notify_message", nick), "%s%s%s%s%s%s", weechat_prefix ("action"), (ptr_nick) ? ptr_nick->color : ((nick) ? irc_nick_find_color (nick) : IRC_COLOR_CHAT_NICK), nick, (pos_args) ? IRC_COLOR_RESET : "", (pos_args) ? " " : "", (pos_args) ? pos_args : ""); } else { ptr_channel = irc_channel_search (server, remote_nick); if (!ptr_channel) { ptr_channel = irc_channel_new (server, IRC_CHANNEL_TYPE_PRIVATE, remote_nick, 0, 0); if (!ptr_channel) { weechat_printf (server->buffer, _("%s%s: cannot create new " "private buffer \"%s\""), weechat_prefix ("error"), IRC_PLUGIN_NAME, remote_nick); } } if (ptr_channel) { if (!ptr_channel->topic) irc_channel_set_topic (ptr_channel, address); weechat_printf_tags (ptr_channel->buffer, irc_protocol_tags (command, (nick_is_me) ? "irc_action,notify_none,no_highlight" : "irc_action,notify_private", nick), "%s%s%s%s%s%s", weechat_prefix ("action"), (nick_is_me) ? IRC_COLOR_CHAT_NICK_SELF : irc_nick_color_for_pv (ptr_channel, nick), nick, (pos_args) ? IRC_COLOR_RESET : "", (pos_args) ? " " : "", (pos_args) ? pos_args : ""); weechat_hook_signal_send ("irc_pv", WEECHAT_HOOK_SIGNAL_STRING, message); } } } /* CTCP PING */ else if (strcmp (arguments + 1, "PING") == 0) { reply = irc_ctcp_get_reply (server, arguments + 1); irc_ctcp_display_request (server, command, channel, nick, arguments + 1, pos_args, reply); if (!reply || reply[0]) { irc_ctcp_reply_to_nick (server, command, channel, nick, arguments + 1, pos_args); } } /* CTCP DCC */ else if (strcmp (arguments + 1, "DCC") == 0) { irc_ctcp_recv_dcc (server, nick, pos_args, message); } /* other CTCP */ else { reply = irc_ctcp_get_reply (server, arguments + 1); if (reply) { irc_ctcp_display_request (server, command, channel, nick, arguments + 1, pos_args, reply); if (reply[0]) { decoded_reply = irc_ctcp_replace_variables (server, reply); if (decoded_reply) { irc_ctcp_reply_to_nick (server, command, channel, nick, arguments + 1, decoded_reply); free (decoded_reply); } } } else { if (weechat_config_boolean (irc_config_look_display_ctcp_unknown)) { weechat_printf_tags (irc_msgbuffer_get_target_buffer (server, nick, NULL, "ctcp", (channel) ? channel->buffer : NULL), irc_protocol_tags (command, "irc_ctcp", NULL), _("%sUnknown CTCP requested by %s%s%s: " "%s%s%s%s%s"), weechat_prefix ("network"), IRC_COLOR_CHAT_NICK, nick, IRC_COLOR_RESET, IRC_COLOR_CHAT_CHANNEL, arguments + 1, (pos_args) ? IRC_COLOR_RESET : "", (pos_args) ? " " : "", (pos_args) ? pos_args : ""); } } } weechat_hook_signal_send ("irc_ctcp", WEECHAT_HOOK_SIGNAL_STRING, message); if (pos_space) pos_space[0] = ' '; if (pos_end) pos_end[0] = '\01'; arguments = (pos_end) ? pos_end + 1 : NULL; } }
int weechat_tcl_load (const char *filename) { int i; Tcl_Interp *interp; struct stat buf; if (stat (filename, &buf) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), TCL_PLUGIN_NAME, filename); return 0; } if ((weechat_tcl_plugin->debug >= 2) || !tcl_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), TCL_PLUGIN_NAME, filename); } tcl_current_script = NULL; tcl_registered_script = NULL; if (!(interp = Tcl_CreateInterp ())) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to create new " "interpreter"), weechat_prefix ("error"), TCL_PLUGIN_NAME); return 0; } tcl_current_script_filename = filename; weechat_tcl_api_init (interp); if (Tcl_EvalFile (interp, filename) != TCL_OK) { weechat_printf (NULL, weechat_gettext ("%s%s: error occurred while " "parsing file \"%s\": %s"), weechat_prefix ("error"), TCL_PLUGIN_NAME, filename, Tcl_GetStringFromObj (Tcl_GetObjResult (interp), &i)); /* this OK, maybe "register" was called, so not return */ /* return 0; */ } if (!tcl_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), TCL_PLUGIN_NAME, filename); Tcl_DeleteInterp (interp); return 0; } tcl_current_script = tcl_registered_script; /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_tcl_plugin, tcl_scripts, tcl_current_script, &weechat_tcl_api_buffer_input_data_cb, &weechat_tcl_api_buffer_close_cb); weechat_hook_signal_send ("tcl_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, tcl_current_script->filename); return 1; }
int weechat_ruby_load (const char *filename) { char modname[64]; VALUE ruby_retcode, err, argv[1]; int ruby_error; struct stat buf; if (stat (filename, &buf) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); return 0; } if ((weechat_ruby_plugin->debug >= 2) || !ruby_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), RUBY_PLUGIN_NAME, filename); } ruby_current_script = NULL; ruby_registered_script = NULL; snprintf (modname, sizeof(modname), "%s%d", MOD_NAME_PREFIX, ruby_num); ruby_num++; ruby_current_module = rb_define_module (modname); ruby_current_script_filename = filename; argv[0] = rb_str_new2 (filename); ruby_retcode = rb_protect_funcall (ruby_current_module, rb_intern ("load_eval_file"), &ruby_error, 1, argv); if (ruby_retcode == Qnil) { err = rb_gv_get("$!"); weechat_ruby_print_exception(err); return 0; } if (NUM2INT(ruby_retcode) != 0) { switch (NUM2INT(ruby_retcode)) { case 1: weechat_printf (NULL, weechat_gettext ("%s%s: unable to read file " "\"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; case 2: weechat_printf (NULL, weechat_gettext ("%s%s: error while loading " "file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; case 3: weechat_printf (NULL, weechat_gettext ("%s%s: function " "\"weechat_init\" is missing " "in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; } if (NUM2INT(ruby_retcode) == 2) { weechat_ruby_print_exception (rb_iv_get (ruby_current_module, "@load_eval_file_error")); } return 0; } (void) rb_protect_funcall (ruby_current_module, rb_intern ("weechat_init"), &ruby_error, 0, NULL); if (ruby_error) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to eval function " "\"weechat_init\" in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); err = rb_gv_get("$!"); weechat_ruby_print_exception(err); if (ruby_current_script != NULL) { plugin_script_remove (weechat_ruby_plugin, &ruby_scripts, &last_ruby_script, ruby_current_script); } return 0; } if (!ruby_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); return 0; } ruby_current_script = ruby_registered_script; rb_gc_register_address (ruby_current_script->interpreter); /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_ruby_plugin, ruby_scripts, ruby_current_script, &weechat_ruby_api_buffer_input_data_cb, &weechat_ruby_api_buffer_close_cb); (void) weechat_hook_signal_send ("ruby_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, ruby_current_script->filename); return 1; }