X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/0702100202764a191b0de763e701acd92055dffd..37e08c82c2958b3b96ada2bf76a9578f1dbbb2b3:/src/mod-python.c diff --git a/src/mod-python.c b/src/mod-python.c index e95ec4c..b35db07 100644 --- a/src/mod-python.c +++ b/src/mod-python.c @@ -46,7 +46,33 @@ * - modpython.py calls for everything you can reg_ a handler for in x3 * - Some kind of system for getting needed binds bound automagicaly to make it easier * to run peoples' scripts and mod-python in general. + * - Create a (python side) command registry that plugins register into + * - In modcmd.c check that list first, before the usual (c based) command search + * - If python version returns 0, go on with the built-in search, otherwise just quit (allows plugins to override) + * - OR + * - Mechanism for python plugins to register themselves like x3 plugins? (*module.____) ?? + * - Then, same problem as other x3 modules, pain to set up commands 1st time etc, maybe solve that for all modules? * - An interface to reading/writing data to x3.db. Maybe generic, or attached to account or channel reg records? + + * basic startup for now: + * configure --enable-modules=python + * Make install will copy modpython.py and plugins/ directory to start out with hangman example/test + * + * x3.conf: in the "moduleS" section add: + * "python" { + * "scripts_dir" "/home/you/x3rundirectory"; + * "main_module" "modpython"; + * }; + + * /msg o3 bind o3 py\ run *python.run + * /msg o3 bind o3 py\ reload *python.reload + * /msg o3 bind o3 py\ command *python.command + + * example script bindings (for now) + * /msg o3 bind x3 hangman *modcmd.joiner + * /msg o3 bind x3 hangman\ start *python.command hangman start + * /msg o3 bind x3 hangman\ end *python.command hangman end + * /msg o3 bind x3 hangman\ guess *python.command hangman guess $1 */ static const struct message_entry msgtab[] = { @@ -1226,6 +1252,28 @@ static PyObject* emb_log_register_type(UNUSED_ARG(PyObject *self), PyObject* arg return Py_BuildValue("O", PyCObject_FromVoidPtr(log, NULL)); } +PyDoc_STRVAR(emb_module_register__doc__, "registers a module"); +PyObject* emb_module_register(UNUSED_ARG(PyObject* self), PyObject* args) { + PyObject* pylog; + char const *name, *helpfile; + struct log_type* log; + struct module* mod; + + if (!PyArg_ParseTuple(args, "sOs", &name, &pylog, &helpfile)) + return NULL; + + log = PyCObject_AsVoidPtr(pylog); + + mod = module_register(name, log, helpfile, NULL); + + if (mod == NULL) { + PyErr_SetString(PyExc_Exception, "unable to register module"); + return NULL; + } + + return Py_BuildValue("O", PyCObject_FromVoidPtr(mod, NULL)); +} + static PyMethodDef EmbMethods[] = { /* Communication methods */ {"dump", emb_dump, METH_VARARGS, emb_dump__doc__}, @@ -1259,6 +1307,8 @@ static PyMethodDef EmbMethods[] = { /* module registration methods */ {"log_register_type", emb_log_register_type, METH_VARARGS, emb_log_register_type__doc__}, + {"module_register", emb_module_register, METH_VARARGS, + emb_module_register__doc__}, /* Information gathering methods */ {"get_user", emb_get_user, METH_VARARGS, emb_get_user__doc__}, @@ -1838,6 +1888,7 @@ int python_load() { free(env); } + log_module(PY_LOG, LOG_DEBUG, "Starting Python Init from python_load"); Py_Initialize(); Py_InitModule("_svc", EmbMethods); pName = PyString_FromString(modpython_conf.main_module); @@ -1856,6 +1907,7 @@ int python_load() { else { /* error handler class not found */ log_module(PY_LOG, LOG_WARNING, "Failed to create handler object"); + exit(1); return 0; } } @@ -1863,6 +1915,7 @@ int python_load() { //PyErr_Print(); python_log_module(); log_module(PY_LOG, LOG_WARNING, "Failed to load modpython.py"); + exit(1); return 0; } return 0; @@ -1981,8 +2034,11 @@ static MODCMD_FUNC(cmd_command) { else { msg = ""; } - char *args[] = {plugin, command, msg}; + char *args[] = {strdup(plugin), strdup(command), strdup(msg)}; python_call_handler("cmd_command", args, numstrargs(args), cmd->parent->bot->nick, user?user->nick:"", channel?channel->name:""); + free(args[0]); + free(args[1]); + free(args[2]); return 1; } @@ -1996,10 +2052,10 @@ static void modpython_conf_read(void) { } str = database_get_data(conf_node, "scripts_dir", RECDB_QSTRING); - modpython_conf.scripts_dir = str ? str : "./"; + modpython_conf.scripts_dir = strdup(str ? str : "./"); str = database_get_data(conf_node, "main_module", RECDB_QSTRING); - modpython_conf.main_module = str ? str : "modpython"; + modpython_conf.main_module = strdup(str ? str : "modpython"); } int python_init(void) { @@ -2024,7 +2080,7 @@ int python_init(void) { */ modcmd_register(python_module, "reload", cmd_reload, 1, MODCMD_REQUIRE_AUTHED, "flags", "+oper", NULL); modcmd_register(python_module, "run", cmd_run, 2, MODCMD_REQUIRE_AUTHED, "flags", "+oper", NULL); - modcmd_register(python_module, "command", cmd_command, 3, MODCMD_REQUIRE_STAFF, NULL); + modcmd_register(python_module, "command", cmd_command, 3, MODCMD_REQUIRE_AUTHED, "flags", "+oper", NULL); // Please help us by implementing any of the callbacks listed as TODO below. They already exist // in x3, they just need handle_ bridges implemented. (see python_handle_join for an example)