summaryrefslogtreecommitdiffstats
path: root/src/objects/ban-object.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/objects/ban-object.c')
-rw-r--r--src/objects/ban-object.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/objects/ban-object.c b/src/objects/ban-object.c
new file mode 100644
index 0000000..908bae2
--- /dev/null
+++ b/src/objects/ban-object.c
@@ -0,0 +1,155 @@
+#include <Python.h>
+#include "pyirssi_irc.h"
+#include "pymodule.h"
+#include "ban-object.h"
+#include "pycore.h"
+
+/* monitor "ban remove" signal */
+static void ban_cleanup(CHANNEL_REC *chan, BAN_REC *ban)
+{
+ PyBan *pyban = signal_get_user_data();
+
+ if (ban == pyban->data)
+ {
+ pyban->data = NULL;
+ pyban->cleanup_installed = 0;
+ signal_remove_data("ban remove", ban_cleanup, pyban);
+ }
+}
+
+static void PyBan_dealloc(PyBan *self)
+{
+ if (self->cleanup_installed)
+ signal_remove_data("ban remove", ban_cleanup, self);
+
+ self->ob_type->tp_free((PyObject*)self);
+}
+
+static PyObject *PyBan_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyBan *self;
+
+ self = (PyBan *)type->tp_alloc(type, 0);
+ if (!self)
+ return NULL;
+
+ return (PyObject *)self;
+}
+
+PyDoc_STRVAR(PyBan_ban_doc,
+ "The ban"
+);
+static PyObject *PyBan_ban_get(PyBan *self, void *closure)
+{
+ BAN_REC *data = self->data;
+ RET_NULL_IF_INVALID(self->data);
+ RET_AS_STRING_OR_NONE(data->ban);
+}
+
+PyDoc_STRVAR(PyBan_setby_doc,
+ "Nick of who set the ban"
+);
+static PyObject *PyBan_setby_get(PyBan *self, void *closure)
+{
+ BAN_REC *data = self->data;
+ RET_NULL_IF_INVALID(self->data);
+ RET_AS_STRING_OR_NONE(data->setby);
+}
+
+PyDoc_STRVAR(PyBan_time_doc,
+ "Timestamp when ban was set"
+);
+static PyObject *PyBan_time_get(PyBan *self, void *closure)
+{
+ BAN_REC *data = self->data;
+ RET_NULL_IF_INVALID(self->data);
+ return PyLong_FromUnsignedLong(data->time);
+}
+
+/* specialized getters/setters */
+static PyGetSetDef PyBan_getseters[] = {
+ {"ban", (getter)PyBan_ban_get, NULL,
+ PyBan_ban_doc, NULL},
+ {"setby", (getter)PyBan_setby_get, NULL,
+ PyBan_setby_doc, NULL},
+ {"time", (getter)PyBan_time_get, NULL,
+ PyBan_time_doc, NULL},
+ {NULL}
+};
+
+/* Methods for object */
+static PyMethodDef PyBan_methods[] = {
+ {NULL} /* Sentinel */
+};
+
+PyTypeObject PyBanType = {
+ PyObject_HEAD_INIT(NULL)
+ 0, /*ob_size*/
+ "Ban", /*tp_name*/
+ sizeof(PyBan), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)PyBan_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ "PyBan objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ PyBan_methods, /* tp_methods */
+ 0, /* tp_members */
+ PyBan_getseters, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ PyBan_new, /* tp_new */
+};
+
+
+/* window item wrapper factory function */
+PyObject *pyban_new(void *ban)
+{
+ PyBan *pyban;
+
+ pyban = py_inst(PyBan, PyBanType);
+ if (!pyban)
+ return NULL;
+
+ pyban->data = ban;
+ pyban->cleanup_installed = 1;
+ signal_add_last_data("ban remove", ban_cleanup, pyban);
+
+ return (PyObject *)pyban;
+}
+
+int ban_object_init(void)
+{
+ g_return_val_if_fail(py_module != NULL, 0);
+
+ if (PyType_Ready(&PyBanType) < 0)
+ return 0;
+
+ Py_INCREF(&PyBanType);
+ PyModule_AddObject(py_module, "Ban", (PyObject *)&PyBanType);
+
+ return 1;
+}