]>
Commit | Line | Data |
---|---|---|
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 | 16 | MODULE_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 | |
25 | int handle_getprofile(struct rline *li, int argc, char **argv); | |
26 | int handle_setprofile(struct rline *li, int argc, char **argv); | |
2def14d2 | 27 | int handle_delchan(struct rline *li, int argc, char **argv); |
59508d20 | 28 | int handle_addchan(struct rline *li, int argc, char **argv); |
8498747e CP |
29 | |
30 | struct service_node *s_node; | |
31 | ||
32 | void _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 | ||
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 | ||
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 | ||
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 | ||
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 |
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 | ||
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 |
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; | |
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 |