]> jfr.im git - irc/quakenet/newserv.git/blame - splitlist/splitlist.c
LUA: add function for channel chanop notice
[irc/quakenet/newserv.git] / splitlist / splitlist.c
CommitLineData
c96aa815
P
1/* shroud's splitlist */
2
3#include <string.h>
4#include "../irc/irc.h"
5#include "splitlist.h"
6#include "../core/hooks.h"
df3bf970 7#include "../lib/version.h"
c96aa815 8
ef7154fb
P
9MODULE_VERSION("");
10
c96aa815
P
11array splitlist;
12
81f6c579
CP
13static void sphook_newserver(int hook, void *arg);
14static void sphook_lostserver(int hook, void *arg);
15static void sp_addsplit(const char *name, time_t ts, flag_t flags);
c96aa815
P
16
17void _init(void) {
18 registerhook(HOOK_SERVER_NEWSERVER, &sphook_newserver);
19 registerhook(HOOK_SERVER_LOSTSERVER, &sphook_lostserver);
20
21 array_init(&splitlist, sizeof(splitserver));
22 array_setlim1(&splitlist, 5);
23 array_setlim2(&splitlist, 5);
24
81f6c579 25 sp_addsplit("default.split.quakenet.org", getnettime(), SERVERTYPEFLAG_CRITICAL_SERVICE | SERVERTYPEFLAG_SERVICE);
c96aa815
P
26}
27
28void _fini(void) {
29 int i;
30
31 deregisterhook(HOOK_SERVER_NEWSERVER, &sphook_newserver);
32 deregisterhook(HOOK_SERVER_LOSTSERVER, &sphook_lostserver);
33
34 for (i = 0; i < splitlist.cursi; i++) {
35 freesstring(((splitserver*)splitlist.content)[i].name);
36 }
37
38 array_free(&splitlist);
39}
40
81f6c579 41static void sphook_newserver(int hook, void *arg) {
c3db6f7e 42 sp_deletesplit(serverlist[(long)arg].name->content);
c96aa815
P
43}
44
81f6c579
CP
45static void sphook_lostserver(int hook, void *arg) {
46 server *server = &serverlist[(long)arg];
47 sp_addsplit(server->name->content, getnettime(), getservertype(server));
c96aa815
P
48}
49
81f6c579
CP
50int sp_countsplitservers(flag_t orflags) {
51 int result = 0;
c96aa815
P
52 int i;
53
81f6c579
CP
54 for (i = 0; i < splitlist.cursi; i++)
55 if((((splitserver*)splitlist.content)[i].type | orflags) != 0)
56 result++;
c96aa815 57
81f6c579 58 return result;
c96aa815
P
59}
60
61void sp_deletesplit(const char *name) {
62 int i;
63
64 if (splitlist.cursi == 0)
65 return;
66
67 for (i = splitlist.cursi - 1; i >= 0; i--) {
68 if (strcmp(name, ((splitserver*)splitlist.content)[i].name->content) == 0) {
69 freesstring(((splitserver*)splitlist.content)[i].name);
70 array_delslot(&splitlist, i);
71 }
72 }
73}
74
81f6c579 75static void sp_addsplit(const char *name, time_t ts, flag_t type) {
c96aa815
P
76 int slot;
77 splitserver *srv;
78
79 slot = array_getfreeslot(&splitlist);
80
81 srv = &(((splitserver*)splitlist.content)[slot]);
82
83 srv->name = getsstring(name, HOSTLEN);
84 srv->ts = ts;
81f6c579 85 srv->type = type;
c96aa815 86}