summaryrefslogtreecommitdiffstats
path: root/objects/irc-server-object.c
diff options
context:
space:
mode:
Diffstat (limited to 'objects/irc-server-object.c')
-rw-r--r--objects/irc-server-object.c143
1 files changed, 101 insertions, 42 deletions
diff --git a/objects/irc-server-object.c b/objects/irc-server-object.c
index 0e0ccdc..c162dfa 100644
--- a/objects/irc-server-object.c
+++ b/objects/irc-server-object.c
@@ -1,59 +1,53 @@
#include <Python.h>
#include "pymodule.h"
#include "base-objects.h"
-#include "server-object.h"
#include "irc-server-object.h"
-#include "irc-connect-object.h"
+#include "factory.h"
#include "pyirssi_irc.h"
#include "pycore.h"
#include "pyutils.h"
-/* member IDs */
-enum
-{
- M_IRC_SERVER_REAL_ADDRESS,
- M_IRC_SERVER_USERMODE,
- M_IRC_SERVER_USERHOST,
-};
-
/* cleanup and dealloc inherited from base Server */
-static PyObject *PyIrcServer_get(PyIrcServer *self, void *closure)
+/* Getters */
+PyDoc_STRVAR(PyIrcServer_real_address_doc,
+ "Address the IRC server gives"
+);
+static PyObject *PyIrcServer_real_address_get(PyIrcServer *self, void *closure)
{
- int member = GPOINTER_TO_INT(closure);
+ RET_NULL_IF_INVALID(self->data);
+ RET_AS_STRING_OR_NONE(self->data->real_address);
+}
+PyDoc_STRVAR(PyIrcServer_usermode_doc,
+ "User mode in server"
+);
+static PyObject *PyIrcServer_usermode_get(PyIrcServer *self, void *closure)
+{
RET_NULL_IF_INVALID(self->data);
+ RET_AS_STRING_OR_NONE(self->data->usermode);
+}
- switch (member)
- {
- case M_IRC_SERVER_REAL_ADDRESS:
- RET_AS_STRING_OR_NONE(self->data->real_address);
- case M_IRC_SERVER_USERMODE:
- RET_AS_STRING_OR_NONE(self->data->usermode);
- case M_IRC_SERVER_USERHOST:
- RET_AS_STRING_OR_NONE(self->data->userhost);
- }
-
- /* This shouldn't be reached... but... */
- return PyErr_Format(PyExc_RuntimeError, "invalid member id, %d", member);
+PyDoc_STRVAR(PyIrcServer_userhost_doc,
+ "Your user host in server"
+);
+static PyObject *PyIrcServer_userhost_get(PyIrcServer *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ RET_AS_STRING_OR_NONE(self->data->userhost);
}
static PyGetSetDef PyIrcServer_getseters[] = {
- {"real_address", (getter)PyIrcServer_get, NULL,
- "Address the IRC server gives",
- GINT_TO_POINTER(M_IRC_SERVER_REAL_ADDRESS)},
-
- {"usermode", (getter)PyIrcServer_get, NULL,
- "User mode in server",
- GINT_TO_POINTER(M_IRC_SERVER_USERMODE)},
-
- {"userhost", (getter)PyIrcServer_get, NULL,
- "Your user host in server",
- GINT_TO_POINTER(M_IRC_SERVER_USERHOST)},
-
+ {"real_address", (getter)PyIrcServer_real_address_get, NULL,
+ PyIrcServer_real_address_doc, NULL},
+ {"usermode", (getter)PyIrcServer_usermode_get, NULL,
+ PyIrcServer_usermode_doc, NULL},
+ {"userhost", (getter)PyIrcServer_userhost_get, NULL,
+ PyIrcServer_userhost_doc, NULL},
{NULL}
};
+/* Methods */
PyDoc_STRVAR(get_channels_doc,
"Return a string of all channels (and keys, if any have them) in server,\n"
"like '#a,#b,#c,#d x,b_chan_key,x,x' or just '#e,#f,#g'\n"
@@ -181,26 +175,91 @@ static PyObject *PyIrcServer_isupport(PyIrcServer *self, PyObject *args, PyObjec
RET_AS_STRING_OR_NONE(found);
}
+PyDoc_STRVAR(PyIrcServer_netsplit_find_doc,
+ "Check if nick!address is on the other side of netsplit. Netsplit records\n"
+ "are automatically removed after 30 minutes (current default)..\n"
+);
+static PyObject *PyIrcServer_netsplit_find(PyIrcServer *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"nick", "address", NULL};
+ char *nick = "";
+ char *address = "";
+ NETSPLIT_REC *ns;
+
+ RET_NULL_IF_INVALID(self->data);
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss", kwlist,
+ &nick, &address))
+ return NULL;
+
+ ns = netsplit_find(self->data, nick, address);
+ if (ns)
+ return pynetsplit_new(ns);
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(PyIrcServer_netsplit_find_channel_doc,
+ "Find nick record for nick!address in channel `channel'."
+);
+static PyObject *PyIrcServer_netsplit_find_channel(PyIrcServer *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"nick", "address", "channel", NULL};
+ char *nick = "";
+ char *address = "";
+ char *channel = "";
+ NETSPLIT_CHAN_REC *nsc;
+
+ RET_NULL_IF_INVALID(self->data);
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "sss", kwlist,
+ &nick, &address, &channel))
+ return NULL;
+
+ nsc = netsplit_find_channel(self->data, nick, address, channel);
+ if (nsc)
+ return pynetsplit_channel_new(nsc);
+
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(PyIrcServer_notifylist_ison_doc,
+ "Check if nick is on server"
+);
+static PyObject *PyIrcServer_notifylist_ison(PyIrcServer *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"nick", NULL};
+ char *nick = "";
+
+ RET_NULL_IF_INVALID(self->data);
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist,
+ &nick))
+ return NULL;
+
+ return PyBool_FromLong(notifylist_ison_server(self->data, nick));
+}
+
/* Methods for object */
static PyMethodDef PyIrcServer_methods[] = {
{"get_channels", (PyCFunction)PyIrcServer_get_channels, METH_NOARGS,
get_channels_doc},
-
{"send_raw", (PyCFunction)PyIrcServer_send_raw, METH_VARARGS | METH_KEYWORDS,
send_raw_doc},
-
{"send_raw_now", (PyCFunction)PyIrcServer_send_raw_now, METH_VARARGS | METH_KEYWORDS,
send_raw_now_doc},
-
{"send_raw_split", (PyCFunction)PyIrcServer_send_raw_split, METH_VARARGS | METH_KEYWORDS,
send_raw_split_doc},
-
{"ctcp_send_reply", (PyCFunction)PyIrcServer_ctcp_send_reply, METH_VARARGS | METH_KEYWORDS,
ctcp_send_reply_doc},
-
{"isupport", (PyCFunction)PyIrcServer_isupport, METH_VARARGS | METH_KEYWORDS,
isupport_doc},
-
+ {"netsplit_find", (PyCFunction)PyIrcServer_netsplit_find, METH_VARARGS | METH_KEYWORDS,
+ PyIrcServer_netsplit_find_doc},
+ {"netsplit_find_channel", (PyCFunction)PyIrcServer_netsplit_find_channel, METH_VARARGS | METH_KEYWORDS,
+ PyIrcServer_netsplit_find_channel_doc},
+ {"notifylist_ison", (PyCFunction)PyIrcServer_notifylist_ison, METH_VARARGS | METH_KEYWORDS,
+ PyIrcServer_notifylist_ison_doc},
{NULL} /* Sentinel */
};