]> jfr.im git - irc/quakenet/newserv.git/blob - nterface/nterfacer_spamscan2.c
Add jupe support
[irc/quakenet/newserv.git] / nterface / nterfacer_spamscan2.c
1 /*
2 nterfacer spamscan2 module
3 Copyright (C) 2005 Chris Porter.
4
5 */
6
7 #include "../localuser/localuserchannel.h"
8 #include "../channel/channel.h"
9 #include "../lib/version.h"
10
11 #include "../spamscan2/spamscan2.h"
12
13 #include "library.h"
14 #include "nterfacer.h"
15
16 MODULE_VERSION("");
17
18 #define ERR_TARGET_NOT_FOUND 0x01
19 #define ERR_CHANNEL_NOT_REGISTERED 0x02
20 #define ERR_PROFILE_DOES_NOT_EXIST 0x03
21 #define ERR_BAD_FLAGS 0x04
22 #define ERR_MEMORY_ERROR 0x05
23 #define ERR_CHANNEL_ALREADY_REGISTERED 0x06
24
25 int handle_getprofile(struct rline *li, int argc, char **argv);
26 int handle_setprofile(struct rline *li, int argc, char **argv);
27 int handle_delchan(struct rline *li, int argc, char **argv);
28 int handle_addchan(struct rline *li, int argc, char **argv);
29
30 struct service_node *s_node;
31
32 void _init(void) {
33 s_node = register_service("S2");
34 if(!s_node)
35 return;
36
37 register_handler(s_node, "getprofile", 1, handle_getprofile);
38 register_handler(s_node, "setprofile", 3, handle_setprofile);
39 register_handler(s_node, "delchan", 1, handle_delchan);
40 register_handler(s_node, "addchan", 2, handle_addchan);
41 }
42
43 void _fini(void) {
44 if(s_node)
45 deregister_service(s_node);
46 }
47
48 int 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
58 ri_append(li, "%s", cs->cp?cs->cp->profilename:"unknown");
59 ri_append(li, "%s", printflags(cs->flags, s_cfflags));
60 return ri_final(li);
61 }
62
63 int 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
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
81 /* TODO: beat Cruicky till he refactors this functionality */
82 spamscan_checkchannelpresence(findchannel(cs->channelname)); /* what if findchannel returns NULL? */
83 cs->cp = cp;
84 cs->modified = time(NULL);
85 cs->modifiedby = spamscan_getaccountsettings("nterfacer", 0); /* ugly hack, should be 1... */
86 spamscan_updatechanneldb(cs);
87
88 ri_append(li, "Done.");
89 return ri_final(li);
90 }
91
92 int 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
96 if(spamscan_deletechannelsettings(argv[0]))
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
103 int 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;
128 cs->modified = cs->added = time(NULL);
129 cs->modifiedby = cs->addedby = spamscan_getaccountsettings("nterfacer", 0); /* ugly hack, should be 1... */
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
150