3caa6451bf18b144f2efd50073e6860286e26902
[jelmer/ctrlproxy.git] / python / ctrlproxy.c
1 /* 
2         ctrlproxy: A modular IRC proxy
3         (c) 2002-2007 Jelmer Vernooij <jelmer@nl.linux.org>
4
5         This program is free software; you can redistribute it and/or modify
6         it under the terms of the GNU General Public License as published by
7         the Free Software Foundation; either version 3 of the License, or
8         (at your option) any later version.
9
10         This program is distributed in the hope that it will be useful,
11         but WITHOUT ANY WARRANTY; without even the implied warranty of
12         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13         GNU General Public License for more details.
14
15         You should have received a copy of the GNU General Public License
16         along with this program; if not, write to the Free Software
17         Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #include <Python.h>
21 #include "ctrlproxy.h"
22
23 #include "libirc/python/irc.h"
24
25 extern struct global *my_global;
26
27 static PyObject *py_log_global(PyObject *self, PyObject *args)
28 {
29         int level;
30         char *text;
31         if (!PyArg_ParseTuple(args, "is", &level, &text))
32                 return NULL;
33
34         log_global(level, "%s", text);
35
36         Py_RETURN_NONE;
37 }
38
39 static PyMethodDef ctrlproxy_methods[] = {
40         { "log_global", (PyCFunction)py_log_global, METH_VARARGS,
41                 "log_global(level, text)\n"
42                 "Log" },
43         { NULL }
44 };
45
46 typedef struct {
47         PyObject_HEAD
48 } PyNetworkDictObject;
49
50 static Py_ssize_t py_network_dict_length(PyNetworkDictObject *self)
51 {
52         return g_list_length(my_global->networks);
53 }
54
55 static PyObject *py_network_dict_get(PyNetworkDictObject *self, PyObject *py_name)
56 {
57         struct irc_network *n;
58         char *name;
59         PyNetworkObject *ret;
60
61         if (!PyString_Check(py_name)) {
62                 PyErr_SetNone(PyExc_KeyError);
63                 return NULL;
64         }
65
66         name = PyString_AsString(py_name);
67
68         n = find_network(my_global->networks, name);
69         if (n == NULL) {
70                 PyErr_SetNone(PyExc_KeyError);
71                 return NULL;
72         }
73
74         ret = PyObject_New(PyNetworkObject, &PyNetworkType);
75         if (ret == NULL) {
76                 PyErr_NoMemory();
77                 return NULL;
78         }
79         ret->network = n;
80         return (PyObject *)ret;
81 }       
82
83 static PyMappingMethods py_network_dict_mapping = {
84         .mp_length = (lenfunc)py_network_dict_length,
85         .mp_subscript = (binaryfunc)py_network_dict_get,
86 };
87
88 static PyTypeObject PyNetworkDictType = {
89         .tp_name = "NetworkDict",
90         .tp_basicsize = sizeof(PyNetworkDictObject),
91         .tp_dealloc = (destructor)PyObject_Del,
92         .tp_flags = Py_TPFLAGS_DEFAULT,
93         .tp_as_mapping = &py_network_dict_mapping,
94 };
95
96 static PyObject *PyNetworkDict_New(void)
97 {
98         PyNetworkDictObject *ret = PyObject_New(PyNetworkDictObject, &PyNetworkDictType);
99         if (ret == NULL) {
100                 PyErr_NoMemory();
101                 return NULL;
102         }
103         return (PyObject *)ret;
104 }
105
106 void initctrlproxy(void)
107 {
108         PyObject *m, *networkdict;
109
110         if (PyType_Ready(&PyNetworkDictType) < 0)
111                 return;
112
113         m = Py_InitModule3("ctrlproxy", ctrlproxy_methods, 
114                                            "ControlProxy");
115         if (m == NULL)
116                 return;
117
118         PyModule_AddIntConstant(m, "LOG_DATA", LOG_DATA);
119         PyModule_AddIntConstant(m, "LOG_TRACE", LOG_TRACE);
120         PyModule_AddIntConstant(m, "LOG_INFO", LOG_INFO);
121         PyModule_AddIntConstant(m, "LOG_WARNING", LOG_WARNING);
122         PyModule_AddIntConstant(m, "LOG_ERROR", LOG_ERROR);
123         networkdict = PyNetworkDict_New();
124         if (networkdict == NULL) {
125                 return;
126         }
127         PyModule_AddObject(m, "networks", networkdict);
128 }