diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2005-05-01 18:53:23 +0000 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2005-05-01 18:53:23 +0000 |
commit | eda55fbdb41a695dc4a5d511f2ccf20a3a99470f (patch) | |
tree | 55fccde93927cbd089e3845797f9e913d91654ce /src/plugins | |
parent | dca4064502ebdc9d2d9fbdaa31c1b4a717ca96ae (diff) | |
download | weechat-eda55fbdb41a695dc4a5d511f2ccf20a3a99470f.zip |
Added Python plugin support
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/Makefile.am | 8 | ||||
-rw-r--r-- | src/plugins/plugins.c | 30 | ||||
-rw-r--r-- | src/plugins/python/Makefile.am | 23 | ||||
-rw-r--r-- | src/plugins/python/wee-python.c | 713 | ||||
-rw-r--r-- | src/plugins/python/wee-python.h | 34 |
5 files changed, 802 insertions, 6 deletions
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 823b41475..b52375faf 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -21,16 +21,16 @@ if PLUGIN_PERL perl_dir = perl endif -# if PLUGIN_PYTHON -# python_dir = python -# endif +if PLUGIN_PYTHON +python_dir = python +endif # if PLUGIN_RUBY # ruby_dir = ruby # endif # SUBDIRS = $(perl_dir) $(python_dir) $(ruby_dir) -SUBDIRS = $(perl_dir) +SUBDIRS = $(perl_dir) $(python_dir) noinst_LIBRARIES = lib_weechat_plugins.a diff --git a/src/plugins/plugins.c b/src/plugins/plugins.c index e9f25354d..85a3d5033 100644 --- a/src/plugins/plugins.c +++ b/src/plugins/plugins.c @@ -39,6 +39,10 @@ #include "perl/wee-perl.h" #endif +#ifdef PLUGIN_PYTHON +#include "python/wee-python.h" +#endif + char *plugin_name[3] = { "Perl", "Python", "Ruby" }; @@ -115,6 +119,11 @@ plugin_init () wee_perl_init(); plugin_auto_load (PLUGIN_TYPE_PERL, "perl/autoload"); #endif + + #ifdef PLUGIN_PYTHON + wee_python_init(); + plugin_auto_load (PLUGIN_TYPE_PYTHON, "python/autoload"); + #endif } /* @@ -133,7 +142,9 @@ plugin_load (int plugin_type, char *filename) #endif break; case PLUGIN_TYPE_PYTHON: - /* TODO: load Python script */ + #ifdef PLUGIN_PYTHON + wee_python_load (filename); + #endif break; case PLUGIN_TYPE_RUBY: /* TODO: load Ruby script */ @@ -292,6 +303,10 @@ plugin_event_msg (char *irc_command, char *arguments, char *server) if (ptr_plugin_handler->plugin_type == PLUGIN_TYPE_PERL) wee_perl_exec (ptr_plugin_handler->function_name, arguments, server); #endif + #ifdef PLUGIN_PYTHON + if (ptr_plugin_handler->plugin_type == PLUGIN_TYPE_PYTHON) + wee_python_exec (ptr_plugin_handler->function_name, arguments, server); + #endif } } #else @@ -321,6 +336,10 @@ plugin_exec_command (char *user_command, char *arguments, char *server) if (ptr_plugin_handler->plugin_type == PLUGIN_TYPE_PERL) wee_perl_exec (ptr_plugin_handler->function_name, arguments, server); #endif + #ifdef PLUGIN_PYTHON + if (ptr_plugin_handler->plugin_type == PLUGIN_TYPE_PYTHON) + wee_python_exec (ptr_plugin_handler->function_name, arguments, server); + #endif /* command executed */ return 1; @@ -358,7 +377,10 @@ plugin_unload (int plugin_type, char *scriptname) #endif break; case PLUGIN_TYPE_PYTHON: - /* TODO: unload Python scripts */ + #ifdef PLUGIN_PYTHON + wee_python_end (); + wee_python_init (); + #endif break; case PLUGIN_TYPE_RUBY: /* TODO: unload Ruby scripts */ @@ -383,4 +405,8 @@ plugin_end () #ifdef PLUGIN_PERL wee_perl_end(); #endif + + #ifdef PLUGIN_PYTHON + wee_python_end(); + #endif } diff --git a/src/plugins/python/Makefile.am b/src/plugins/python/Makefile.am new file mode 100644 index 000000000..1828903a7 --- /dev/null +++ b/src/plugins/python/Makefile.am @@ -0,0 +1,23 @@ +# Copyright (c) 2003-2005 FlashCode <flashcode@flashtux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# 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 +# + +INCLUDES = -DLOCALEDIR=\"$(datadir)/locale\" $(PYTHON_CFLAGS) + +noinst_LIBRARIES = lib_weechat_python.a + +lib_weechat_python_a_SOURCES = wee-python.h \ + wee-python.c diff --git a/src/plugins/python/wee-python.c b/src/plugins/python/wee-python.c new file mode 100644 index 000000000..6c4e48b42 --- /dev/null +++ b/src/plugins/python/wee-python.c @@ -0,0 +1,713 @@ +/* + * Copyright (c) 2003-2005 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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 + */ + +/* wee-python.c: Python plugin support for WeeChat */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <Python.h> +#include <stdlib.h> +#include <string.h> +#undef _ +#include "../../common/weechat.h" +#include "../plugins.h" +#include "wee-python.h" +#include "../../common/command.h" +#include "../../irc/irc.h" +#include "../../gui/gui.h" + + +t_plugin_script *python_scripts = NULL; +t_plugin_script *last_python_script = NULL; + + +/* + * weechat.register(nom, version, fonction, description): + * startup function for all WeeChat Python scripts + */ + +static PyObject * +wee_python_register (PyObject *self, PyObject *args) +{ + char *name, *version, *shutdown_func, *description; + t_plugin_script *ptr_python_script, *python_script_found, *new_python_script; + + /* make gcc happy */ + (void) self; + + if (!PyArg_ParseTuple (args, "ssss", &name, &version, &shutdown_func, &description)) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: wrong parameters for 'print_with_channel' Python function\n")); + return NULL; + } + + python_script_found = NULL; + for (ptr_python_script = python_scripts; ptr_python_script; + ptr_python_script = ptr_python_script->next_script) + { + if (strcasecmp (ptr_python_script->name, name) == 0) + { + python_script_found = ptr_python_script; + break; + } + } + + if (python_script_found) + { + /* error: another scripts already exists with this name! */ + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: unable to register Python script \"%s\" (another script " + "already exists with this name)\n"), + name); + } + else + { + /* registering script */ + new_python_script = (t_plugin_script *)malloc (sizeof (t_plugin_script)); + if (new_python_script) + { + new_python_script->name = strdup (name); + new_python_script->version = strdup (version); + new_python_script->shutdown_func = strdup (shutdown_func); + new_python_script->description = strdup (description); + + /* add new script to list */ + new_python_script->prev_script = last_python_script; + new_python_script->next_script = NULL; + if (python_scripts) + last_python_script->next_script = new_python_script; + else + python_scripts = new_python_script; + last_python_script = new_python_script; + + wee_log_printf (_("registered Python script: \"%s\", version %s (%s)\n"), + name, version, description); + } + else + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("%s unable to load Python script \"%s\" (not enough memory)\n"), + WEECHAT_ERROR, name); + } + } + + Py_INCREF (Py_None); + return Py_None; +} + +/* + * weechat.print(message): print message to current buffer + */ + +static PyObject * +wee_python_print (PyObject *self, PyObject *args) +{ + char *message; + + /* make gcc happy */ + (void) self; + + if (!PyArg_ParseTuple (args, "s", &message)) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: wrong parameters for 'print' Python function\n")); + return NULL; + } + + irc_display_prefix (gui_current_window->buffer, PREFIX_PLUGIN); + gui_printf (gui_current_window->buffer, "%s\n", message); + + Py_INCREF (Py_None); + return Py_None; +} + +/* + * weechat.print_with_channel(message, channel, server=None): + * print message to a specific channel/server + * (server is optional) + */ + +static PyObject * +wee_python_print_with_channel (PyObject *self, PyObject *args) +{ + char *message, *channel, *server = NULL; + int ret = 0; + t_gui_buffer *ptr_buffer; + t_irc_server *ptr_server; + t_irc_channel *ptr_channel; + + /* make gcc happy */ + (void) self; + + if (!PyArg_ParseTuple (args, "ss|s", &message, &channel, &server)) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: wrong parameters for 'print_with_channel' Python function\n")); + return NULL; + } + + ptr_buffer = NULL; + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + if (!server || (strcasecmp (ptr_server->name, server)) == 0) + { + for (ptr_channel = ptr_server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + if (strcasecmp (ptr_channel->name, channel) == 0) + { + ptr_buffer = ptr_channel->buffer; + break; + } + } + } + if (ptr_buffer) + break; + } + + /* buffer found => display message & return 1 ~= True */ + if (ptr_buffer) + { + irc_display_prefix (ptr_buffer, PREFIX_PLUGIN); + gui_printf (ptr_buffer, "%s", message); + ret = 1; + } + + return Py_BuildValue ("i", ret); +} + +/* + * weechat.print_infobar(delay, message): print message to infobar + */ + +static PyObject * +wee_python_print_infobar (PyObject *self, PyObject *args) +{ + int delay; + char *message; + + /* make gcc happy */ + (void) self; + + if (!PyArg_ParseTuple (args, "is", &delay, &message)) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: wrong parameters for 'print_infobar' Python function\n")); + return NULL; + } + + gui_infobar_printf (delay, COLOR_WIN_INFOBAR, message); + + Py_INCREF (Py_None); + return Py_None; +} + +/* + * weechat.command(command, server=None): send command to server + */ + +static PyObject * +wee_python_command (PyObject *self, PyObject *args) +{ + char *server = NULL, *command, *command2; + t_irc_server *ptr_server; + + /* make gcc happy */ + (void) self; + + if (!PyArg_ParseTuple (args, "s|s", &command, &server)) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: wrong parameters for 'command' Python function\n")); + return NULL; + } + + if (server == NULL) + { + ptr_server = SERVER(gui_current_window->buffer); + } + else + { + for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) + { + if (strcasecmp (ptr_server->name, server) == 0) + break; + } + if (!ptr_server) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: server not found for 'command' Python function\n")); + } + } + + if (ptr_server) + { + command2 = (char *) malloc (strlen (command) + 8); + strcpy (command2, command); + if (!strstr (command2, "\r\n")) + strcat (command2, "\r\n"); + server_sendf (ptr_server, command2); + free (command2); + } + + Py_INCREF (Py_None); + return Py_None; +} + +/* + * weechat.add_message_handler(message, function): + * add handler for messages + */ + +static PyObject * +wee_python_add_message_handler (PyObject *self, PyObject *args) +{ + char *message, *function; + + /* make gcc happy */ + (void) self; + + if (!PyArg_ParseTuple (args, "ss", &message, &function)) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: wrong parameters for 'add_message_handler' Python function\n")); + return NULL; + } + + plugin_handler_add (&plugin_msg_handlers, &last_plugin_msg_handler, + PLUGIN_TYPE_PYTHON, message, function); + + Py_INCREF (Py_None); + return Py_None; +} + +/* + * weechat.add_command_handler(name, function): + * define/redefines commands + */ + +static PyObject * +wee_python_add_command_handler(PyObject *self, PyObject *args) +{ + char *name, *function; + t_plugin_handler *ptr_plugin_handler; + + /* make gcc happy */ + (void) self; + + if (!PyArg_ParseTuple (args, "ss", &name, &function)) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: wrong parameters for 'add_command_handler' Python function\n")); + return NULL; + } + + if (!weelist_search (index_commands, name)) + weelist_add (&index_commands, &last_index_command, name); + + ptr_plugin_handler = plugin_handler_search (plugin_cmd_handlers, name); + if (ptr_plugin_handler) + { + free (ptr_plugin_handler->function_name); + ptr_plugin_handler->function_name = strdup (function); + } + else + plugin_handler_add (&plugin_cmd_handlers, &last_plugin_cmd_handler, + PLUGIN_TYPE_PYTHON, name, function); + + Py_INCREF (Py_None); + return Py_None; +} + +/* + * weechat.get_info(info, server=None): + * get various infos + */ + +static PyObject * +wee_python_get_info (PyObject *self, PyObject *args) +{ + char *arg, *info = NULL, *server = NULL; + t_irc_server *ptr_server; + + /* make gcc happy */ + (void) self; + + if (!PyArg_ParseTuple (args, "s|s", &arg, &server)) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: wrong parameters for 'get_info' Python function\n")); + return NULL; + } + + if (server == NULL) + { + ptr_server = SERVER(gui_current_window->buffer); + } + else + { + for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) + { + if (strcasecmp (ptr_server->name, server) == 0) + break; + } + if (!ptr_server) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: server not found for 'get_info' Python function\n")); + } + } + + if (ptr_server && arg) + { + if ( (strcasecmp (arg, "0") == 0) || (strcasecmp (arg, "version") == 0) ) + { + info = PACKAGE_STRING; + } + else if ( (strcasecmp (arg, "1") == 0) || (strcasecmp (arg, "nick") == 0) ) + { + if (ptr_server->nick) + info = ptr_server->nick; + } + else if ( (strcasecmp (arg, "2") == 0) || (strcasecmp (arg, "channel") == 0) ) + { + if (BUFFER_IS_CHANNEL (gui_current_window->buffer)) + info = CHANNEL (gui_current_window->buffer)->name; + } + else if ( (strcasecmp (arg, "3") == 0) || (strcasecmp (arg, "server") == 0) ) + { + if (ptr_server->name) + info = ptr_server->name; + } + else if ( (strcasecmp (arg, "4") == 0) || (strcasecmp (arg, "weechatdir") == 0) ) + { + info = weechat_home; + } + else if ( (strcasecmp (arg, "5") == 0) || (strcasecmp (arg, "away") == 0) ) + { + return Py_BuildValue ("i", SERVER(gui_current_window->buffer)->is_away); + } + + if (info) + return Py_BuildValue ("s", info); + else + return Py_BuildValue ("s", ""); + } + + return Py_BuildValue ("i", 1); +} + +/* + * initialize subroutines + */ + +static +PyMethodDef weechat_funcs[] = { + {"register", wee_python_register, METH_VARARGS, ""}, + {"prnt", wee_python_print, METH_VARARGS, ""}, + {"print_with_channel", wee_python_print_with_channel, METH_VARARGS, ""}, + {"print_infobar", wee_python_print_infobar, METH_VARARGS, ""}, + {"command", wee_python_command, METH_VARARGS, ""}, + {"add_message_handler", wee_python_add_message_handler, METH_VARARGS, ""}, + {"add_command_handler", wee_python_add_command_handler, METH_VARARGS, ""}, + {"get_info", wee_python_get_info, METH_VARARGS, ""}, + {NULL, NULL, 0, NULL} +}; + +/* + * wee_python_init: initialize Python interface for WeeChat + */ + +void +wee_python_init () +{ + + Py_Initialize (); + if (Py_IsInitialized () == 0) + { + irc_display_prefix (NULL, PREFIX_PLUGIN); + gui_printf (NULL, _("Python error: error while launching Python interpreter\n")); + } + else + { + Py_InitModule ("weechat", weechat_funcs); + irc_display_prefix (NULL, PREFIX_PLUGIN); + gui_printf (NULL, _("Loading Python module \"weechat\"\n")); + } +} + +/* + * wee_python_search: search a (loaded) Python script by name + */ + +t_plugin_script * +wee_python_search (char *name) +{ + t_plugin_script *ptr_python_script; + + for (ptr_python_script = python_scripts; ptr_python_script; + ptr_python_script = ptr_python_script->next_script) + { + if (strcmp (ptr_python_script->name, name) == 0) + return ptr_python_script; + } + + /* script not found */ + return NULL; +} + +/* + * wee_python_exec: execute a Python script + */ + +int +wee_python_exec (char *function, char *server, char *arguments) +{ + int len, return_code, i, j, alen; + char *srv, *args, *runstring; + + return_code = 1; + + if (arguments == NULL) + { + alen = 0; + args = strdup (""); + } + else + { + alen = (int) strlen (arguments); + args = (char *) malloc ( 2 * alen * sizeof (*args)); + } + + if (!args) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: unable to run function \"%s\"in Python script (not enough memory)\n"), + function); + return 0; + } + + // copy arguments in args to escape double quotes + j = 0; + for (i=0; i < alen; ++i) + { + if (arguments[i] == '"' || arguments[i] == '\\') + { + args[j] = '\\'; + ++j; + } + args[j] = arguments[i]; + ++j; + } + args[j] = 0; + + if (server == NULL) + srv = strdup (""); + else + srv = strdup (server); + + if (!srv) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: unable to run function \"%s\"in Python script (not enough memory)\n"), + function); + free (args); + return 0; + } + + len = (int) strlen (function); + len += (int) strlen ("(\"\",\"\")"); + len += (int) strlen (srv); + len += (int) strlen (args); + len += 1; + + runstring = (char *) malloc ( len * sizeof (*runstring)); + + if (runstring) + { + sprintf (runstring, "%s(\"%s\",\"%s\")", function, srv, args); + + if (PyRun_SimpleString (runstring) != 0) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: error while running function \"%s\"\n"), function); + return_code = 0; + } + free (runstring); + } + else + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: unable to run function \"%s\"in Python script (not enough memory)\n"), + function); + return_code = 0; + } + + free (args); + free (srv); + + return return_code; +} + +/* + * wee_python_load: load a Python script + */ + +int +wee_python_load (char *filename) +{ + FILE *fp; + + /* execute Python script */ + wee_log_printf (_("loading Python script \"%s\"\n"), filename); + irc_display_prefix (NULL, PREFIX_PLUGIN); + gui_printf (NULL, _("Loading Python script \"%s\"\n"), filename); + + if ((fp = fopen (filename, "r")) == NULL) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: error while opening file \"%s\"\n"), filename); + return 1; + } + + if (PyRun_SimpleFile (fp, filename) != 0) + { + irc_display_prefix (NULL, PREFIX_ERROR); + gui_printf (NULL, + _("Python error: error while parsing file \"%s\"\n"), filename); + return 1; + } + + fclose (fp); + return 0; +} + +/* + * wee_python_script_free: free a Python script + */ + +void +wee_python_script_free (t_plugin_script *ptr_python_script) +{ + t_plugin_script *new_python_scripts; + + /* remove script from list */ + if (last_python_script == ptr_python_script) + last_python_script = ptr_python_script->prev_script; + if (ptr_python_script->prev_script) + { + (ptr_python_script->prev_script)->next_script = ptr_python_script->next_script; + new_python_scripts = python_scripts; + } + else + new_python_scripts = ptr_python_script->next_script; + + if (ptr_python_script->next_script) + (ptr_python_script->next_script)->prev_script = ptr_python_script->prev_script; + + /* free data */ + if (ptr_python_script->name) + free (ptr_python_script->name); + if (ptr_python_script->version) + free (ptr_python_script->version); + if (ptr_python_script->shutdown_func) + free (ptr_python_script->shutdown_func); + if (ptr_python_script->description) + free (ptr_python_script->description); + free (ptr_python_script); + python_scripts = new_python_scripts; +} + +/* + * wee_python_unload: unload a Python script + */ + +void +wee_python_unload (t_plugin_script *ptr_python_script) +{ + if (ptr_python_script) + { + wee_log_printf (_("unloading Python script \"%s\"\n"), + ptr_python_script->name); + + /* call shutdown callback function */ + if (ptr_python_script->shutdown_func[0]) + wee_python_exec (ptr_python_script->shutdown_func, "", ""); + wee_python_script_free (ptr_python_script); + } +} + +/* + * wee_python_unload_all: unload all Python scripts + */ + +void +wee_python_unload_all () +{ + wee_log_printf (_("unloading all Python scripts...\n")); + while (python_scripts) + wee_python_unload (python_scripts); +} + +/* + * wee_python_end: shutdown Python interface + */ + +void +wee_python_end () +{ + /* unload all scripts */ + wee_python_unload_all (); + + /* free all handlers */ + plugin_handler_free_all_type (&plugin_msg_handlers, + &last_plugin_msg_handler, + PLUGIN_TYPE_PYTHON); + plugin_handler_free_all_type (&plugin_cmd_handlers, + &last_plugin_cmd_handler, + PLUGIN_TYPE_PYTHON); + + Py_Finalize (); + if (Py_IsInitialized () != 0) { + irc_display_prefix (NULL, PREFIX_PLUGIN); + gui_printf (NULL, _("Python error: error while freeing Python interpreter\n")); + } +} diff --git a/src/plugins/python/wee-python.h b/src/plugins/python/wee-python.h new file mode 100644 index 000000000..f805c4d63 --- /dev/null +++ b/src/plugins/python/wee-python.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2003-2005 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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 + */ + + +#ifndef __WEECHAT_PYTHON_H +#define __WEECHAT_PYTHON_H 1 + +#include "../plugins.h" + +extern void wee_python_init (); +extern t_plugin_script *wee_python_search (char *); +extern int wee_python_exec (char *, char *, char *); +extern int wee_python_load (char *); +extern void wee_python_unload (t_plugin_script *); +extern void wee_python_unload_all (); +extern void wee_python_end (); + +#endif /* wee-python.h */ |