]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/mod-python.c
Couple of srvx updates.
[irc/evilnet/x3.git] / src / mod-python.c
index e267f497e612684ea455fd5a0b4d9c608b35ae44..6322041cedc670e1d6d28d4b803fc26d233f1604 100644 (file)
@@ -1194,6 +1194,60 @@ emb_service_register(UNUSED_ARG(PyObject* self_), PyObject* args) {
     return pyobj_from_service(service_register(user));
 }
 
+size_t logs_size = 0;
+static struct log_type **logs_list = NULL;
+
+PyDoc_STRVAR(emb_log_register_type__doc__,
+        "registers a log source to write event data to.");
+static PyObject* emb_log_register_type(UNUSED_ARG(PyObject *self), PyObject* args) {
+    const char* logName;
+    const char* defaultLog;
+    struct log_type* log;
+    struct log_type** newlogs;
+
+    if (!PyArg_ParseTuple(args, "ss", &logName, &defaultLog))
+        return NULL;
+
+    newlogs = realloc(logs_list, (logs_size+1)*sizeof(struct log_type*));
+    if (newlogs == NULL) {
+        PyErr_SetString(PyExc_Exception, "unable to allocate memory for log structures. aborting.");
+        return NULL;
+    }
+    logs_list = newlogs;
+
+    log = log_register_type(logName, defaultLog);
+    if (log == NULL) {
+        PyErr_SetString(PyExc_Exception, "unable to register log");
+        return NULL;
+    }
+
+    logs_list[logs_size++] = log;
+
+    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__},
@@ -1224,6 +1278,12 @@ static PyMethodDef EmbMethods[] = {
     {"timeq_add", emb_timeq_add, METH_VARARGS, emb_timeq_add__doc__},
     {"timeq_del", emb_timeq_del, METH_VARARGS, emb_timeq_del__doc__},
 
+    /* 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__},
     {"get_users", emb_get_users, METH_VARARGS, emb_get_users__doc__},
@@ -1484,7 +1544,7 @@ PyObject *python_new_handler_object() {
    it first? We will start by doing it every time.
  */
 static int
-python_handle_join(struct modeNode *mNode)
+python_handle_join(struct modeNode *mNode, UNUSED_ARG(void *extra))
 {
     /* callback for handle_join events. 
     */
@@ -1504,7 +1564,7 @@ python_handle_join(struct modeNode *mNode)
 }
 
 static int
-python_handle_server_link(struct server *server)
+python_handle_server_link(struct server *server, UNUSED_ARG(void *extra))
 {
     PyObject* srv = NULL;
     PyObject* funcname = NULL;
@@ -1555,7 +1615,7 @@ cleanup:
 }
 
 static int
-python_handle_new_user(struct userNode *user)
+python_handle_new_user(struct userNode *user, UNUSED_ARG(void *extra))
 {
     PyObject* name = NULL;
     PyObject* usr = NULL;
@@ -1605,7 +1665,7 @@ cleanup:
 }
 
 static void
-python_handle_nick_change(struct userNode *user, const char *old_nick)
+python_handle_nick_change(struct userNode *user, const char *old_nick, UNUSED_ARG(void *extra))
 {
     PyObject* usr = NULL;
     PyObject* name = NULL;
@@ -1652,7 +1712,7 @@ cleanup:
         log_module(PY_LOG, LOG_WARNING, "%s", err);
 }
 
-void python_handle_del_user(struct userNode *user, struct userNode *killer, const char *why) {
+void python_handle_del_user(struct userNode *user, struct userNode *killer, const char *why, UNUSED_ARG(void *extra)) {
     PyObject *usr = NULL, *killr = NULL, *name = NULL;
     PyObject *reason = NULL, *retval = NULL;
     char const* err = NULL;
@@ -1718,7 +1778,7 @@ cleanup:
         log_module(PY_LOG, LOG_WARNING, "%s", err);
 }
 
-int python_handle_topic(struct userNode *who, struct chanNode *chan, const char *old_topic) {
+int python_handle_topic(struct userNode *who, struct chanNode *chan, const char *old_topic, UNUSED_ARG(void *extra)) {
     PyObject* pwho = NULL, *pchan = NULL, *oldtopic = NULL;
     PyObject* name = NULL, *retval = NULL;
     const char* err = NULL;
@@ -1847,7 +1907,7 @@ python_finalize(void) {
 }
 
 static void
-python_cleanup(void) {
+python_cleanup(UNUSED_ARG(void *extra)) {
     /* Called on shutdown of the python module  (or before reloading)
     */
 
@@ -1870,7 +1930,7 @@ static MODCMD_FUNC(cmd_reload) {
     /* reload the python system completely 
     */
     log_module(PY_LOG, LOG_INFO, "Shutting python down");
-    python_cleanup();
+    python_cleanup(NULL);
     log_module(PY_LOG, LOG_INFO, "Loading python stuff");
     if(python_load()) {
          reply("PYMSG_RELOAD_SUCCESS");
@@ -1881,59 +1941,6 @@ static MODCMD_FUNC(cmd_reload) {
     return 1;
 }
 
-static char* format_python_error(int space_nls) {
-    PyObject* extype = NULL, *exvalue = NULL, *extraceback = NULL;
-    PyObject* pextypestr = NULL, *pexvaluestr = NULL;
-    char* extypestr = NULL, *exvaluestr = NULL;
-    size_t retvallen = 0;
-    char* retval = NULL, *tmp;
-
-    PyErr_Fetch(&extype, &exvalue, &extraceback);
-    if (!extype)
-        goto cleanup;
-
-    pextypestr = PyObject_Str(extype);
-    if (!pextypestr)
-        goto cleanup;
-    extypestr = PyString_AsString(pextypestr);
-    if (!extypestr)
-        goto cleanup;
-
-    pexvaluestr = PyObject_Str(exvalue);
-    if (pexvaluestr)
-        exvaluestr = PyString_AsString(pexvaluestr);
-
-    retvallen = strlen(extypestr) + (exvaluestr ? strlen(exvaluestr) + 2 : 0) + 1;
-    retval = (char*)malloc(retvallen);
-    if (exvaluestr)
-        snprintf(retval, retvallen, "%s: %s", extypestr, exvaluestr);
-    else
-        strncpy(retval, extypestr, retvallen);
-
-    if (space_nls) {
-        tmp = retval;
-        while (*tmp) {
-            if (*tmp == '\n')
-                *tmp = ' ';
-            ++tmp;
-        }
-    }
-
-cleanup:
-    if (PyErr_Occurred())
-        PyErr_Clear(); /* ignore errors caused by formatting */
-    Py_XDECREF(extype);
-    Py_XDECREF(exvalue);
-    Py_XDECREF(extraceback);
-    Py_XDECREF(pextypestr);
-    Py_XDECREF(pexvaluestr);
-
-    if (retval)
-        return retval;
-
-    return strdup("unknown exception");
-}
-
 static MODCMD_FUNC(cmd_run) {
     /* this method allows running arbitrary python commands.
      * use with care.
@@ -2045,10 +2052,10 @@ int python_init(void) {
 
 //  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)
-    reg_server_link_func(python_handle_server_link);
-    reg_new_user_func(python_handle_new_user);
-    reg_nick_change_func(python_handle_nick_change);
-    reg_del_user_func(python_handle_del_user);
+    reg_server_link_func(python_handle_server_link, NULL);
+    reg_new_user_func(python_handle_new_user, NULL);
+    reg_nick_change_func(python_handle_nick_change, NULL);
+    reg_del_user_func(python_handle_del_user, NULL);
 //TODO:    reg_account_func(python_handle_account); /* stamping of account name to the ircd */
 //TODO:    reg_handle_rename_func(python_handle_handle_rename); /* handle used to ALSO mean account name */
 //TODO:    reg_failpw_func(python_handle_failpw);
@@ -2057,11 +2064,11 @@ int python_init(void) {
 //
 //TODO:    reg_oper_func(python_handle_oper);
 //TODO:    reg_new_channel_func(python_handle_new_channel);
-    reg_join_func(python_handle_join);
+    reg_join_func(python_handle_join, NULL);
 //TODO:    reg_del_channel_func(python_handle_del_channel);
 //TODO:    reg_part_func(python_handle_part);
 //TODO:    reg_kick_func(python_handle_kick);
-    reg_topic_func(python_handle_topic);
+    reg_topic_func(python_handle_topic, NULL);
 //TODO:    reg_channel_mode_func(python_handle_channel_mode);
 
 //TODO:    reg_privmsg_func(python_handle_privmsg);
@@ -2071,7 +2078,7 @@ int python_init(void) {
 //TODO:    reg_allchanmsg_func
 //TODO:    reg_user_mode_func
 
-    reg_exit_func(python_cleanup);
+    reg_exit_func(python_cleanup, NULL);
 
     python_load();
     return 1;