about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/command/command.c2
-rw-r--r--src/plugins/c_plugins.c10
-rw-r--r--src/plugins/c_plugins.h3
-rw-r--r--src/plugins/plugins.c29
-rw-r--r--src/plugins/plugins.h4
-rw-r--r--src/plugins/python_plugins.c31
-rw-r--r--src/plugins/python_plugins.h3
7 files changed, 42 insertions, 40 deletions
diff --git a/src/command/command.c b/src/command/command.c
index 990e211a..191415ae 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -3773,7 +3773,7 @@ _plugins_autocomplete(ProfWin *window, const char *const input)
     if ((strncmp(input, "/plugins load ", 14) == 0) && (strlen(input) > 14)) {
         if (plugins_load_ac == NULL) {
             plugins_load_ac = autocomplete_new();
-            GSList *plugins = plugins_file_list();
+            GSList *plugins = plugins_unloaded_list();
             GSList *curr = plugins;
             while (curr) {
                 autocomplete_add(plugins_load_ac, curr->data);
diff --git a/src/plugins/c_plugins.c b/src/plugins/c_plugins.c
index ff05791d..7fe10905 100644
--- a/src/plugins/c_plugins.c
+++ b/src/plugins/c_plugins.c
@@ -113,10 +113,12 @@ c_plugin_create(const char *const filename)
 }
 
 void
-c_init_hook(ProfPlugin *plugin, const char *const version, const char *const status)
+c_init_hook(ProfPlugin *plugin, const char *const version, const char *const status, const char *const account_name,
+    const char *const fulljid)
 {
     void *f = NULL;
-    void (*func)(const char *const __version, const char *const __status);
+    void (*func)(const char *const __version, const char *const __status, const char *const __account_name,
+        const char *const __fulljid);
 
     assert(plugin && plugin->module);
 
@@ -125,10 +127,10 @@ c_init_hook(ProfPlugin *plugin, const char *const version, const char *const sta
         return;
     }
 
-    func = (void (*)(const char *const, const char *const))f;
+    func = (void (*)(const char *const, const char *const, const char *const, const char *const))f;
 
     // FIXME maybe we want to make it boolean to see if it succeeded or not?
-    func(version, status);
+    func(version, status, account_name, fulljid);
 }
 
 void
diff --git a/src/plugins/c_plugins.h b/src/plugins/c_plugins.h
index 1517ecb2..a62e302f 100644
--- a/src/plugins/c_plugins.h
+++ b/src/plugins/c_plugins.h
@@ -43,7 +43,8 @@ ProfPlugin* c_plugin_create(const char *const filename);
 void c_plugin_destroy(ProfPlugin *plugin);
 void c_shutdown(void);
 
-void c_init_hook(ProfPlugin *plugin, const char *const version, const char *const status);
+void c_init_hook(ProfPlugin *plugin, const char *const version, const char *const status, const char *const account_name,
+    const char *const fulljid);
 void c_on_start_hook(ProfPlugin *plugin);
 void c_on_shutdown_hook(ProfPlugin *plugin);
 void c_on_connect_hook(ProfPlugin *plugin, const char *const account_name, const char *const fulljid);
diff --git a/src/plugins/plugins.c b/src/plugins/plugins.c
index e2d0bdf3..cb222a32 100644
--- a/src/plugins/plugins.c
+++ b/src/plugins/plugins.c
@@ -114,7 +114,7 @@ plugins_init(void)
         GSList *curr = plugins;
         while (curr) {
             ProfPlugin *plugin = curr->data;
-            plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS);
+            plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS, NULL, NULL);
             curr = g_slist_next(curr);
         }
     }
@@ -155,7 +155,13 @@ plugins_load(const char *const name)
 #endif
     if (plugin) {
         plugins = g_slist_append(plugins, plugin);
-        plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS);
+        if (jabber_get_connection_status() == JABBER_CONNECTED) {
+            const char *account_name = jabber_get_account_name();
+            const char *fulljid = jabber_get_fulljid();
+            plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS, account_name, fulljid);
+        } else {
+            plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS, NULL, NULL);
+        }
         log_info("Loaded plugin: %s", name);
         return TRUE;
     } else {
@@ -181,29 +187,30 @@ _get_plugins_dir(void)
 }
 
 void
-_plugins_list_dir(const gchar *const dir, GSList **result)
+_plugins_unloaded_list_dir(const gchar *const dir, GSList **result)
 {
-    GDir *plugins = g_dir_open(dir, 0, NULL);
-    if (plugins == NULL) {
+    GDir *plugins_dir = g_dir_open(dir, 0, NULL);
+    if (plugins_dir == NULL) {
         return;
     }
 
-    const gchar *plugin = g_dir_read_name(plugins);
+    const gchar *plugin = g_dir_read_name(plugins_dir);
     while (plugin) {
-        if (g_str_has_suffix(plugin, ".so") || g_str_has_suffix(plugin, ".py")) {
+        GSList *found = g_slist_find_custom(plugins, plugin, (GCompareFunc)_find_by_name);
+        if ((g_str_has_suffix(plugin, ".so") || g_str_has_suffix(plugin, ".py")) && !found) {
             *result = g_slist_append(*result, strdup(plugin));
         }
-        plugin = g_dir_read_name(plugins);
+        plugin = g_dir_read_name(plugins_dir);
     }
-    g_dir_close(plugins);
+    g_dir_close(plugins_dir);
 }
 
 GSList*
-plugins_file_list(void)
+plugins_unloaded_list(void)
 {
     GSList *result = NULL;
     char *plugins_dir = _get_plugins_dir();
-    _plugins_list_dir(plugins_dir, &result);
+    _plugins_unloaded_list_dir(plugins_dir, &result);
     free(plugins_dir);
 
     return result;
diff --git a/src/plugins/plugins.h b/src/plugins/plugins.h
index 85792674..d59bc280 100644
--- a/src/plugins/plugins.h
+++ b/src/plugins/plugins.h
@@ -47,7 +47,7 @@ typedef struct prof_plugin_t {
     lang_t lang;
     void *module;
     void (*init_func)(struct prof_plugin_t* plugin, const char * const version,
-        const char * const status);
+        const char * const status, const char *const account_name, const char *const fulljid);
 
     void (*on_start_func)(struct prof_plugin_t* plugin);
     void (*on_shutdown_func)(struct prof_plugin_t* plugin);
@@ -99,7 +99,7 @@ typedef struct prof_plugin_t {
 
 void plugins_init(void);
 GSList* plugins_get_list(void);
-GSList *plugins_file_list(void);
+GSList *plugins_unloaded_list(void);
 char* plugins_autocomplete(const char *const input);
 void plugins_reset_autocomplete(void);
 void plugins_shutdown(void);
diff --git a/src/plugins/python_plugins.c b/src/plugins/python_plugins.c
index a73cc15b..7861f484 100644
--- a/src/plugins/python_plugins.c
+++ b/src/plugins/python_plugins.c
@@ -62,27 +62,17 @@ python_env_init(void)
     Py_Initialize();
     PyEval_InitThreads();
     python_api_init();
-    GString *path = g_string_new(Py_GetPath());
 
-    g_string_append(path, ":");
+    GString *path = g_string_new("import sys\n");
+    g_string_append(path, "sys.path.append(\"");
     gchar *plugins_dir = plugins_get_dir();
     g_string_append(path, plugins_dir);
-    g_string_append(path, "/");
     g_free(plugins_dir);
+    g_string_append(path, "/\")\n");
 
-    PySys_SetPath(path->str);
-    g_string_free(path, TRUE);
-
-    // add site packages paths
-    PyRun_SimpleString(
-        "import site\n"
-        "import sys\n"
-        "from distutils.sysconfig import get_python_lib\n"
-        "sys.path.append(get_python_lib())\n"
-        "for dir in site.getsitepackages():\n"
-        "   sys.path.append(dir)\n"
-    );
+    PyRun_SimpleString(path->str);
 
+    g_string_free(path, TRUE);
     allow_python_threads();
 }
 
@@ -138,10 +128,11 @@ python_plugin_create(const char *const filename)
 }
 
 void
-python_init_hook(ProfPlugin *plugin, const char *const version, const char *const status)
+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("ss", version, status);
+    PyObject *p_args = Py_BuildValue("ssss", version, status, account_name, fulljid);
     PyObject *p_function;
 
     PyObject *p_module = plugin->module;
@@ -655,7 +646,7 @@ python_on_message_stanza_receive_hook(ProfPlugin *plugin, const char *const text
             PyObject *result = PyObject_CallObject(p_function, p_args);
             python_check_error();
             Py_XDECREF(p_function);
-            if (PyBool_Check(result)) {
+            if (PyObject_IsTrue(result)) {
                 allow_python_threads();
                 return TRUE;
             } else {
@@ -720,7 +711,7 @@ python_on_presence_stanza_receive_hook(ProfPlugin *plugin, const char *const tex
             PyObject *result = PyObject_CallObject(p_function, p_args);
             python_check_error();
             Py_XDECREF(p_function);
-            if (PyBool_Check(result)) {
+            if (PyObject_IsTrue(result)) {
                 allow_python_threads();
                 return TRUE;
             } else {
@@ -785,7 +776,7 @@ python_on_iq_stanza_receive_hook(ProfPlugin *plugin, const char *const text)
             PyObject *result = PyObject_CallObject(p_function, p_args);
             python_check_error();
             Py_XDECREF(p_function);
-            if (PyBool_Check(result)) {
+            if (PyObject_IsTrue(result)) {
                 allow_python_threads();
                 return TRUE;
             } else {
diff --git a/src/plugins/python_plugins.h b/src/plugins/python_plugins.h
index 6f81e2b8..71a62f1c 100644
--- a/src/plugins/python_plugins.h
+++ b/src/plugins/python_plugins.h
@@ -43,7 +43,8 @@ void python_check_error(void);
 void allow_python_threads();
 void disable_python_threads();
 
-void python_init_hook(ProfPlugin *plugin, const char *const version, const char *const status);
+void python_init_hook(ProfPlugin *plugin, const char *const version, const char *const status,
+    const char *const account_name, const char *const fulljid);
 void python_on_start_hook(ProfPlugin *plugin);
 void python_on_shutdown_hook(ProfPlugin *plugin);
 void python_on_connect_hook(ProfPlugin *plugin, const char *const account_name, const char *const fulljid);