summary refs log tree commit diff stats
path: root/plugins/python/python.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/python/python.c')
-rw-r--r--plugins/python/python.c94
1 files changed, 70 insertions, 24 deletions
diff --git a/plugins/python/python.c b/plugins/python/python.c
index 0fed65ca..8b768799 100644
--- a/plugins/python/python.c
+++ b/plugins/python/python.c
@@ -249,6 +249,7 @@ typedef struct {
 	PyObject *plugin;
 	PyObject *callback;
 	PyObject *userdata;
+	char *name;
 	void *data; /* A handle, when type == HOOK_XCHAT */
 } Hook;
 
@@ -283,7 +284,8 @@ static PyObject *Plugin_New(char *filename, PyObject *xcoobj);
 static PyObject *Plugin_GetCurrent();
 static PluginObject *Plugin_ByString(char *str);
 static Hook *Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
-			    PyObject *userdata, void *data);
+			    PyObject *userdata, char *name, void *data);
+static Hook *Plugin_FindHook(PyObject *plugin, char *name);
 static void Plugin_RemoveHook(PyObject *plugin, Hook *hook);
 static void Plugin_RemoveAllHooks(PyObject *plugin);
 
@@ -356,13 +358,7 @@ Usage: /PY LOAD   <filename>\n\
 /* Remove if/when HexChat supports this command for plugins */
 static const char reload[] = "Usage: RELOAD <name>, reloads a python script";
 
-static const char about[] = "\
-\n\
-X-Chat Python Interface " VERSION "\n\
-\n\
-Copyright (c) 2002-2003  Gustavo Niemeyer <niemeyer@conectiva.com>\n\
-\n";
-
+static const char about[] = "HexChat Python " PY_VERSION " Interface Version " VERSION "\n";
 
 /* ===================================================================== */
 /* Utility functions */
@@ -498,18 +494,20 @@ Callback_Command(char *word[], char *word_eol[], void *userdata)
 	PyObject *retobj;
 	PyObject *word_list, *word_eol_list;
 	int ret = 0;
+	PyObject *plugin;
 
-	BEGIN_PLUGIN(hook->plugin);
+	plugin = hook->plugin;
+	BEGIN_PLUGIN(plugin);
 
 	word_list = Util_BuildList(word+1);
 	if (word_list == NULL) {
-		END_PLUGIN(hook->plugin);
+		END_PLUGIN(plugin);
 		return 0;
 	}
 	word_eol_list = Util_BuildList(word_eol+1);
 	if (word_eol_list == NULL) {
 		Py_DECREF(word_list);
-		END_PLUGIN(hook->plugin);
+		END_PLUGIN(plugin);
 		return 0;
 	}
 
@@ -528,7 +526,7 @@ Callback_Command(char *word[], char *word_eol[], void *userdata)
 		PyErr_Print();
 	}
 
-	END_PLUGIN(hook->plugin);
+	END_PLUGIN(plugin);
 
 	return ret;
 }
@@ -548,6 +546,7 @@ Callback_Print(char *word[], void *userdata)
 	int next = 0;
 	int i;
 	int ret = 0;
+	PyObject *plugin;
 
 	/* Cut off the message identifier. */
 	word += 1;
@@ -579,13 +578,14 @@ Callback_Print(char *word[], void *userdata)
 	}
 	word_eol[i] = "";
 
-	BEGIN_PLUGIN(hook->plugin);
+	plugin = hook->plugin;
+	BEGIN_PLUGIN(plugin);
 
 	word_list = Util_BuildList(word);
 	if (word_list == NULL) {
 		g_free(word_eol_raw);
 		g_free(word_eol);
-		END_PLUGIN(hook->plugin);
+		END_PLUGIN(plugin);
 		return 0;
 	}
 	word_eol_list = Util_BuildList(word_eol);
@@ -593,7 +593,7 @@ Callback_Print(char *word[], void *userdata)
 		g_free(word_eol_raw);
 		g_free(word_eol);
 		Py_DECREF(word_list);
-		END_PLUGIN(hook->plugin);
+		END_PLUGIN(plugin);
 		return 0;
 	}
 
@@ -614,7 +614,7 @@ Callback_Print(char *word[], void *userdata)
 		PyErr_Print();
 	}
 
-	END_PLUGIN(hook->plugin);
+	END_PLUGIN(plugin);
 
 	return ret;
 }
@@ -1168,7 +1168,7 @@ Plugin_ByString(char *str)
 
 static Hook *
 Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
-	       PyObject *userdata, void *data)
+	       PyObject *userdata, char *name, void *data)
 {
 	Hook *hook = (Hook *) g_malloc(sizeof(Hook));
 	if (hook == NULL) {
@@ -1181,6 +1181,7 @@ Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
 	hook->callback = callback;
 	Py_INCREF(userdata);
 	hook->userdata = userdata;
+	hook->name = g_strdup (name);
 	hook->data = NULL;
 	Plugin_SetHooks(plugin, g_slist_append(Plugin_GetHooks(plugin),
 					       hook));
@@ -1188,6 +1189,26 @@ Plugin_AddHook(int type, PyObject *plugin, PyObject *callback,
 	return hook;
 }
 
+static Hook *
+Plugin_FindHook(PyObject *plugin, char *name)
+{
+	Hook *hook = NULL;
+	GSList *plugin_hooks = Plugin_GetHooks(plugin);
+	
+	while (plugin_hooks)
+	{
+		if (g_strcmp0 (((Hook *)plugin_hooks->data)->name, name) == 0)
+		{
+			hook = (Hook *)plugin_hooks->data;
+			break;
+		}
+		
+		plugin_hooks = g_slist_next(plugin_hooks);
+	}
+
+	return hook;
+}
+
 static void
 Plugin_RemoveHook(PyObject *plugin, Hook *hook)
 {
@@ -1207,6 +1228,8 @@ Plugin_RemoveHook(PyObject *plugin, Hook *hook)
 					       hook));
 		Py_DECREF(hook->callback);
 		Py_DECREF(hook->userdata);
+		if (hook->name)
+			g_free(hook->name);
 		g_free(hook);
 	}
 }
@@ -1225,6 +1248,8 @@ Plugin_RemoveAllHooks(PyObject *plugin)
 		}
 		Py_DECREF(hook->callback);
 		Py_DECREF(hook->userdata);
+		if (hook->name)
+			g_free(hook->name);
 		g_free(hook);
 		list = list->next;
 	}
@@ -1696,7 +1721,7 @@ Module_hexchat_hook_command(PyObject *self, PyObject *args, PyObject *kwargs)
 		return NULL;
 	}
 
-	hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL);
+	hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, name, NULL);
 	if (hook == NULL)
 		return NULL;
 
@@ -1732,7 +1757,7 @@ Module_hexchat_hook_server(PyObject *self, PyObject *args, PyObject *kwargs)
 		return NULL;
 	}
 
-	hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL);
+	hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL, NULL);
 	if (hook == NULL)
 		return NULL;
 
@@ -1768,7 +1793,7 @@ Module_hexchat_hook_print(PyObject *self, PyObject *args, PyObject *kwargs)
 		return NULL;
 	}
 
-	hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL);
+	hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, name, NULL);
 	if (hook == NULL)
 		return NULL;
 
@@ -1803,7 +1828,7 @@ Module_hexchat_hook_timer(PyObject *self, PyObject *args, PyObject *kwargs)
 		return NULL;
 	}
 
-	hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL);
+	hook = Plugin_AddHook(HOOK_XCHAT, plugin, callback, userdata, NULL, NULL);
 	if (hook == NULL)
 		return NULL;
 
@@ -1836,7 +1861,7 @@ Module_hexchat_hook_unload(PyObject *self, PyObject *args, PyObject *kwargs)
 		return NULL;
 	}
 
-	hook = Plugin_AddHook(HOOK_UNLOAD, plugin, callback, userdata, NULL);
+	hook = Plugin_AddHook(HOOK_UNLOAD, plugin, callback, userdata, NULL, NULL);
 	if (hook == NULL)
 		return NULL;
 
@@ -1847,13 +1872,29 @@ static PyObject *
 Module_hexchat_unhook(PyObject *self, PyObject *args)
 {
 	PyObject *plugin;
+	PyObject *obj;
 	Hook *hook;
-	if (!PyArg_ParseTuple(args, "l:unhook", &hook))
+	if (!PyArg_ParseTuple(args, "O:unhook", &obj))
 		return NULL;
 	plugin = Plugin_GetCurrent();
 	if (plugin == NULL)
 		return NULL;
-	Plugin_RemoveHook(plugin, hook);
+
+	if (PyUnicode_Check (obj))
+	{
+		hook = Plugin_FindHook(plugin, PyUnicode_AsUTF8 (obj));
+		while (hook)
+		{
+			Plugin_RemoveHook(plugin, hook);
+			hook = Plugin_FindHook(plugin, PyUnicode_AsUTF8 (obj));
+		}
+	}
+	else
+	{
+		hook = (Hook *)PyLong_AsLong(obj);
+		Plugin_RemoveHook(plugin, hook);
+	}	
+
 	Py_INCREF(Py_None);
 	return Py_None;
 }
@@ -1903,6 +1944,7 @@ Module_xchat_get_list(PyObject *self, PyObject *args)
 			PyObject *attr = NULL;
 			const char *sattr;
 			int iattr;
+			time_t tattr;
 			switch(fields[i][0]) {
 			case 's':
 				sattr = hexchat_list_str(ph, list, (char*)fld);
@@ -1912,6 +1954,10 @@ Module_xchat_get_list(PyObject *self, PyObject *args)
 				iattr = hexchat_list_int(ph, list, (char*)fld);
 				attr = PyLong_FromLong((long)iattr);
 				break;
+			case 't':
+				tattr = hexchat_list_time(ph, list, (char*)fld);
+				attr = PyLong_FromLong((long)tattr);
+				break;
 			case 'p':
 				sattr = hexchat_list_str(ph, list, (char*)fld);
 				if (strcmp(fld, "context") == 0) {