]> jfr.im git - irc/quakenet/newserv.git/blame - nterface/nterfacer_spamscan2.c
Sigh
[irc/quakenet/newserv.git] / nterface / nterfacer_spamscan2.c
CommitLineData
8498747e
CP
1/*
2 nterfacer spamscan2 module
3 Copyright (C) 2005 Chris Porter.
4
5*/
6
7#include "../localuser/localuserchannel.h"
8#include "../channel/channel.h"
87698d77 9#include "../lib/version.h"
8498747e
CP
10
11#include "../spamscan2/spamscan2.h"
12
13#include "library.h"
14#include "nterfacer.h"
15
0a55e401 16MODULE_VERSION("$Id: nterfacer_spamscan2.c 663 2006-05-16 17:27:36Z newserv $")
87698d77 17
8498747e
CP
18#define ERR_TARGET_NOT_FOUND 0x01
19#define ERR_CHANNEL_NOT_REGISTERED 0x02
20#define ERR_PROFILE_DOES_NOT_EXIST 0x03
b2fb8ee6 21#define ERR_BAD_FLAGS 0x04
59508d20
CP
22#define ERR_MEMORY_ERROR 0x05
23#define ERR_CHANNEL_ALREADY_REGISTERED 0x06
8498747e
CP
24
25int handle_getprofile(struct rline *li, int argc, char **argv);
26int handle_setprofile(struct rline *li, int argc, char **argv);
2def14d2 27int handle_delchan(struct rline *li, int argc, char **argv);
59508d20 28int handle_addchan(struct rline *li, int argc, char **argv);
8498747e
CP
29
30struct service_node *s_node;
31
32void _init(void) {
2def14d2 33 s_node = register_service("S2");
8498747e
CP
34 if(!s_node)
35 return;
36
37 register_handler(s_node, "getprofile", 1, handle_getprofile);
b2fb8ee6 38 register_handler(s_node, "setprofile", 3, handle_setprofile);
2def14d2 39 register_handler(s_node, "delchan", 1, handle_delchan);
59508d20 40 register_handler(s_node, "addchan", 2, handle_addchan);
8498747e
CP
41}
42
43void _fini(void) {
44 if(s_node)
45 deregister_service(s_node);
46}
47
48int handle_getprofile(struct rline *li, int argc, char **argv) {
49 spamscan_channelsettings *cs;
50
51 if(argv[0][0] != '#')
52 return ri_error(li, ERR_TARGET_NOT_FOUND, "Channel not found");
53
54 cs = spamscan_getchannelsettings(argv[0], 0);
55 if(!cs)
56 return ri_error(li, ERR_CHANNEL_NOT_REGISTERED, "Channel not registered");
57
dc223012
CP
58 ri_append(li, "%s", cs->cp?cs->cp->profilename:"unknown");
59 ri_append(li, "%s", printflags(cs->flags, s_cfflags));
8498747e
CP
60 return ri_final(li);
61}
62
63int handle_setprofile(struct rline *li, int argc, char **argv) {
64 spamscan_channelsettings *cs;
65 spamscan_channelprofile *cp;
66
67 if(argv[0][0] != '#')
68 return ri_error(li, ERR_TARGET_NOT_FOUND, "Channel not found");
69
70 cs = spamscan_getchannelsettings(argv[0], 0);
71 if(!cs)
72 return ri_error(li, ERR_CHANNEL_NOT_REGISTERED, "Channel not registered");
73
74 cp = spamscan_getchannelprofile(argv[1], 0);
75 if(!cp)
76 return ri_error(li, ERR_PROFILE_DOES_NOT_EXIST, "Profile does not exist");
77
b2fb8ee6
CP
78 if(setflags(&cs->flags, SPAMSCAN_CF_ALL, argv[2], s_cfflags, REJECT_UNKNOWN) != REJECT_NONE)
79 return ri_error(li, ERR_BAD_FLAGS, "Bad flags");
80
8498747e 81 /* TODO: beat Cruicky till he refactors this functionality */
b2fb8ee6 82 spamscan_checkchannelpresence(findchannel(cs->channelname)); /* what if findchannel returns NULL? */
8498747e
CP
83 cs->cp = cp;
84 cs->modified = time(NULL);
2def14d2 85 cs->modifiedby = spamscan_getaccountsettings("nterfacer", 0); /* ugly hack, should be 1... */
8498747e
CP
86 spamscan_updatechanneldb(cs);
87
88 ri_append(li, "Done.");
89 return ri_final(li);
90}
91
2def14d2
CP
92int handle_delchan(struct rline *li, int argc, char **argv) {
93 if(argv[0][0] != '#')
94 return ri_error(li, ERR_TARGET_NOT_FOUND, "Channel not found");
95
05f36eb8 96 if(spamscan_deletechannelsettings(argv[0]))
2def14d2
CP
97 return ri_error(li, ERR_CHANNEL_NOT_REGISTERED, "Channel not registered");
98
99 ri_append(li, "Done");
100 return ri_final(li);
101}
102
59508d20
CP
103int handle_addchan(struct rline *li, int argc, char **argv) {
104 spamscan_channelsettings *cs;
105 spamscan_channelprofile *cp;
106 flag_t flags = 0;
107 chanindex *sc_index;
108
109 if(argv[0][0] != '#')
110 return ri_error(li, ERR_TARGET_NOT_FOUND, "Channel not found");
111
112 if(spamscan_getchannelsettings(argv[0], 0))
113 return ri_error(li, ERR_CHANNEL_ALREADY_REGISTERED, "Channel already registered");
114
115 if((argc > 2) && (setflags(&flags, SPAMSCAN_CF_ALL, argv[2], s_cfflags, REJECT_UNKNOWN) != REJECT_NONE))
116 return ri_error(li, ERR_BAD_FLAGS, "Bad flags");
117
118 cp = spamscan_getchannelprofile(argv[1], 0);
119 if(!cp)
120 return ri_error(li, ERR_PROFILE_DOES_NOT_EXIST, "Profile does not exist");
121
122 cs = spamscan_getchannelsettings(argv[0], 1);
123 if(!cs)
124 return ri_error(li, ERR_MEMORY_ERROR, "Memory allocation error");
125
126 cs->cp = cp;
127 cs->flags = flags;
e6cf9432
CP
128 cs->modified = cs->added = time(NULL);
129 cs->modifiedby = cs->addedby = spamscan_getaccountsettings("nterfacer", 0); /* ugly hack, should be 1... */
59508d20
CP
130
131 sc_index = findorcreatechanindex(argv[0]);
132 if(sc_index) {
133 spamscan_channelext *ce = spamscan_getchanext(sc_index, 1);
134 ce->cs = cs;
135
136 if (s_nickname && !CFIsSuspended(cs) && sc_index->channel) {
137 ce->joinedchan = 1;
138 localjoinchannel(s_nickname, sc_index->channel);
139 localgetops(s_nickname, sc_index->channel);
140 }
141 }
142
143 spamscan_insertchanneldb(cs);
144 spamscan_log("ADDCHAN: %s added %s with flags %s", "nterfacer", argv[0], printflags(cs->flags, s_cfflags));
145
146 ri_append(li, "Done");
147 return ri_final(li);
148}
149
2def14d2 150