void python_on_room_history_message_hook(ProfPlugin *plugin, const char *const room, const char *const nick, const char *const message, const char *const timestamp) { disable_python_threads(); PyObject *p_args = Py_BuildValue("ssss", room, nick, message, timestamp); PyObject *p_function; PyObject *p_module = plugin->module; if (PyObject_HasAttrString(p_module, "prof_on_room_history_message")) { p_function = PyObject_GetAttrString(p_module, "prof_on_room_history_message"); python_check_error(); if (p_function && PyCallable_Check(p_function)) { PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); } } allow_python_threads(); }
void python_on_contact_presence_hook(ProfPlugin *plugin, const char *const barejid, const char *const resource, const char *const presence, const char *const status, const int priority) { disable_python_threads(); PyObject *p_args = Py_BuildValue("ssssi", barejid, resource, presence, status, priority); PyObject *p_function; PyObject *p_module = plugin->module; if (PyObject_HasAttrString(p_module, "prof_on_contact_presence")) { p_function = PyObject_GetAttrString(p_module, "prof_on_contact_presence"); python_check_error(); if (p_function && PyCallable_Check(p_function)) { PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); } } Py_XDECREF(p_args); allow_python_threads(); }
void python_post_priv_message_send_hook(ProfPlugin *plugin, const char *const barejid, const char *const nick, const char *const message) { disable_python_threads(); PyObject *p_args = Py_BuildValue("sss", barejid, nick, message); PyObject *p_function; PyObject *p_module = plugin->module; if (PyObject_HasAttrString(p_module, "prof_post_priv_message_send")) { p_function = PyObject_GetAttrString(p_module, "prof_post_priv_message_send"); python_check_error(); if (p_function && PyCallable_Check(p_function)) { PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); } } Py_XDECREF(p_args); allow_python_threads(); }
void python_init_hook(ProfPlugin *plugin, const char *const version, const char *const status, const char *const account_name, const char *const fulljid) { disable_python_threads(); PyObject *p_args = Py_BuildValue("ssss", version, status, account_name, fulljid); PyObject *p_function; PyObject *p_module = plugin->module; if (PyObject_HasAttrString(p_module, "prof_init")) { p_function = PyObject_GetAttrString(p_module, "prof_init"); python_check_error(); if (p_function && PyCallable_Check(p_function)) { PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); } } Py_XDECREF(p_args); allow_python_threads(); }
ProfPlugin* python_plugin_create(const char *const filename) { disable_python_threads(); gchar *module_name = g_strndup(filename, strlen(filename) - 3); PyObject *p_module = PyImport_ImportModule(module_name); python_check_error(); if (p_module) { ProfPlugin *plugin = malloc(sizeof(ProfPlugin)); plugin->name = strdup(filename); plugin->lang = LANG_PYTHON; plugin->module = p_module; plugin->init_func = python_init_hook; plugin->on_start_func = python_on_start_hook; plugin->on_shutdown_func = python_on_shutdown_hook; plugin->on_connect_func = python_on_connect_hook; plugin->on_disconnect_func = python_on_disconnect_hook; plugin->pre_chat_message_display = python_pre_chat_message_display_hook; plugin->post_chat_message_display = python_post_chat_message_display_hook; plugin->pre_chat_message_send = python_pre_chat_message_send_hook; plugin->post_chat_message_send = python_post_chat_message_send_hook; plugin->pre_room_message_display = python_pre_room_message_display_hook; plugin->post_room_message_display = python_post_room_message_display_hook; plugin->pre_room_message_send = python_pre_room_message_send_hook; plugin->post_room_message_send = python_post_room_message_send_hook; plugin->on_room_history_message = python_on_room_history_message_hook; plugin->pre_priv_message_display = python_pre_priv_message_display_hook; plugin->post_priv_message_display = python_post_priv_message_display_hook; plugin->pre_priv_message_send = python_pre_priv_message_send_hook; plugin->post_priv_message_send = python_post_priv_message_send_hook; plugin->on_message_stanza_send = python_on_message_stanza_send_hook; plugin->on_message_stanza_receive = python_on_message_stanza_receive_hook; plugin->on_presence_stanza_send = python_on_presence_stanza_send_hook; plugin->on_presence_stanza_receive = python_on_presence_stanza_receive_hook; plugin->on_iq_stanza_send = python_on_iq_stanza_send_hook; plugin->on_iq_stanza_receive = python_on_iq_stanza_receive_hook; plugin->on_contact_offline = python_on_contact_offline_hook; plugin->on_contact_presence = python_on_contact_presence_hook; plugin->on_chat_win_focus = python_on_chat_win_focus_hook; plugin->on_room_win_focus = python_on_room_win_focus_hook; g_free(module_name); allow_python_threads(); return plugin; } else { g_free(module_name); allow_python_threads(); return NULL; } }
gboolean python_on_iq_stanza_receive_hook(ProfPlugin *plugin, const char *const text) { disable_python_threads(); PyObject *p_args = Py_BuildValue("(s)", text); PyObject *p_function; PyObject *p_module = plugin->module; if (PyObject_HasAttrString(p_module, "prof_on_iq_stanza_receive")) { p_function = PyObject_GetAttrString(p_module, "prof_on_iq_stanza_receive"); python_check_error(); if (p_function && PyCallable_Check(p_function)) { PyObject *result = PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); Py_XDECREF(p_args); return _handle_boolean_result(plugin, result, "prof_on_iq_stanza_receive"); } } Py_XDECREF(p_args); allow_python_threads(); return TRUE; }
char* python_on_message_stanza_send_hook(ProfPlugin *plugin, const char *const text) { disable_python_threads(); PyObject *p_args = Py_BuildValue("(s)", text); PyObject *p_function; PyObject *p_module = plugin->module; if (PyObject_HasAttrString(p_module, "prof_on_message_stanza_send")) { p_function = PyObject_GetAttrString(p_module, "prof_on_message_stanza_send"); python_check_error(); if (p_function && PyCallable_Check(p_function)) { PyObject *result = PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); Py_XDECREF(p_args); return _handle_string_or_none_result(plugin, result, "prof_on_message_stanza_send"); } } Py_XDECREF(p_args); allow_python_threads(); return NULL; }
char* python_pre_room_message_display_hook(ProfPlugin *plugin, const char * const barejid, const char * const nick, const char *message) { disable_python_threads(); PyObject *p_args = Py_BuildValue("sss", barejid, nick, message); PyObject *p_function; PyObject *p_module = plugin->module; if (PyObject_HasAttrString(p_module, "prof_pre_room_message_display")) { p_function = PyObject_GetAttrString(p_module, "prof_pre_room_message_display"); python_check_error(); if (p_function && PyCallable_Check(p_function)) { PyObject *result = PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); Py_XDECREF(p_args); return _handle_string_or_none_result(plugin, result, "prof_pre_room_message_display"); } } Py_XDECREF(p_args); allow_python_threads(); return NULL; }
char* python_pre_priv_message_send_hook(ProfPlugin *plugin, const char *const room, const char *const nick, const char *const message) { disable_python_threads(); PyObject *p_args = Py_BuildValue("sss", room, nick, message); PyObject *p_function; PyObject *p_module = plugin->module; if (PyObject_HasAttrString(p_module, "prof_pre_priv_message_send")) { p_function = PyObject_GetAttrString(p_module, "prof_pre_priv_message_send"); python_check_error(); if (p_function && PyCallable_Check(p_function)) { PyObject *result = PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); if (PyUnicode_Check(result)) { char *result_str = strdup(PyString_AsString(PyUnicode_AsUTF8String(result))); Py_XDECREF(result); allow_python_threads(); return result_str; } else if (result != Py_None) { char *result_str = strdup(PyString_AsString(result)); Py_XDECREF(result); allow_python_threads(); return result_str; } else { allow_python_threads(); return NULL; } } } allow_python_threads(); return NULL; }
void python_env_init(void) { loaded_modules = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)_unref_module); python_init_prof(); char *plugins_dir = files_get_data_path(DIR_PLUGINS); GString *path = g_string_new("import sys\n"); g_string_append(path, "sys.path.append(\""); g_string_append(path, plugins_dir); g_string_append(path, "/\")\n"); PyRun_SimpleString(path->str); python_check_error(); g_string_free(path, TRUE); g_free(plugins_dir); allow_python_threads(); }