ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/chanserv/ban.C
Revision: 1.4
Committed: Sun Jul 22 18:38:42 2007 UTC (19 years, 2 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.3: +5 -5 lines
Log Message:
-fixed help
- temporarily work around corruption in jsonrpc

File Contents

# User Rev Content
1 pippijn 1.1 /*
2     * Copyright © 2005 William Pitcock, et al.
3 pippijn 1.2 * Rights to this code are as documented in doc/pod/license.pod.
4 pippijn 1.1 *
5 pippijn 1.4 * This file contains code for the ChanServ BAN/UNBAN function.
6 pippijn 1.1 *
7 pippijn 1.4 * $Id: ban.C,v 1.3 2007-07-21 13:23:18 pippijn Exp $
8 pippijn 1.1 */
9    
10     #include "atheme.h"
11     #include <account/mychan.h>
12     #include <account/chanacs.h>
13    
14 pippijn 1.4 static char const rcsid[] = "$Id: ban.C,v 1.3 2007-07-21 13:23:18 pippijn Exp $";
15 pippijn 1.1
16     struct cs_ban_listeners : callback::has_listeners
17     {
18     };
19    
20     cs_ban_listeners listeners;
21    
22     DECLARE_MODULE_V1 ("chanserv/ban", false, _modinit, _moddeinit, rcsid, "The Ermyth Team <http://ermyth.schmorp.de>");
23    
24     static void cs_cmd_ban (sourceinfo_t *si, int parc, char *parv[]);
25     static void cs_cmd_unban (sourceinfo_t *si, int parc, char *parv[]);
26    
27     command_t cs_ban = { "BAN", N_("Sets a ban on a channel."),
28     AC_NONE, 2, cs_cmd_ban
29     };
30     command_t cs_unban = { "UNBAN", N_("Removes a ban on a channel."),
31     AC_NONE, 2, cs_cmd_unban
32     };
33    
34    
35     cmdvec *cs_cmdtree;
36     helpvec *cs_helptree;
37    
38     void
39     _modinit (module_t *m)
40     {
41     MODULE_USE_SYMBOL_T (cs_cmdtree, cmdvec, "chanserv/main", "cs_cmdtree");
42     MODULE_USE_SYMBOL_T (cs_helptree, helpvec, "chanserv/main", "cs_helptree");
43    
44     cs_cmdtree << cs_ban;
45     cs_cmdtree << cs_unban;
46    
47 pippijn 1.4 help_addentry (cs_helptree, "BAN", "help/chanserv/ban", NULL);
48     help_addentry (cs_helptree, "UNBAN", "help/chanserv/unban", NULL);
49 pippijn 1.1 }
50    
51     void
52     _moddeinit ()
53     {
54     cs_cmdtree >> cs_ban;
55     cs_cmdtree >> cs_unban;
56    
57     help_delentry (cs_helptree, "BAN");
58     help_delentry (cs_helptree, "UNBAN");
59     }
60    
61     static void
62     cs_cmd_ban (sourceinfo_t *si, int parc, char *parv[])
63     {
64     char *channel = parv[0];
65     char *target = parv[1];
66     channel_t *c = channel_find (channel);
67     mychan_t *mc = mychan_find (channel);
68     user_t *tu;
69    
70     if (!channel || !target)
71     {
72     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "BAN");
73     command_fail (si, fault_needmoreparams, _("Syntax: BAN <#channel> <nickname|hostmask>"));
74     return;
75     }
76    
77     if (!mc)
78     {
79     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), channel);
80     return;
81     }
82    
83     if (!c)
84     {
85     command_fail (si, fault_nosuch_target, _("\2%s\2 is currently empty."), channel);
86     return;
87     }
88    
89     if (!si->smu)
90     {
91     command_fail (si, fault_noprivs, _("You are not logged in."));
92     return;
93     }
94    
95     if (!chanacs_source_has_flag (mc, si, CA_REMOVE))
96     {
97     command_fail (si, fault_noprivs, _("You are not authorized to perform this operation."));
98     return;
99     }
100    
101     if (mc->find_metadata ("private:close:closer"))
102     {
103     command_fail (si, fault_noprivs, _("\2%s\2 is closed."), channel);
104     return;
105     }
106    
107     if (validhostmask (target))
108     {
109     modestack_mode_param (chansvs.nick, c, MTYPE_ADD, 'b', target);
110     chanban_add (c, target, 'b');
111     logcommand (si, CMDLOG_DO, "%s BAN %s", mc->name, target);
112     if (!chanuser_find (mc->chan, si->su))
113     command_success_nodata (si, _("Banned \2%s\2 on \2%s\2."), target, channel);
114     return;
115     }
116     else if ((tu = user_find_named (target)))
117     {
118     char hostbuf[BUFSIZE];
119    
120     hostbuf[0] = '\0';
121    
122     strlcat (hostbuf, "*!*@", BUFSIZE);
123     strlcat (hostbuf, tu->vhost, BUFSIZE);
124    
125     modestack_mode_param (chansvs.nick, c, MTYPE_ADD, 'b', hostbuf);
126     chanban_add (c, hostbuf, 'b');
127     logcommand (si, CMDLOG_DO, "%s BAN %s (for user %s!%s@%s)", mc->name, hostbuf, tu->nick, tu->user, tu->vhost);
128     if (!chanuser_find (mc->chan, si->su))
129     command_success_nodata (si, _("Banned \2%s\2 on \2%s\2."), target, channel);
130     return;
131     }
132     else
133     {
134     command_fail (si, fault_badparams, _("Invalid nickname/hostmask provided: \2%s\2"), target);
135     command_fail (si, fault_badparams, _("Syntax: BAN <#channel> <nickname|hostmask>"));
136     return;
137     }
138     }
139    
140     static void
141     cs_cmd_unban (sourceinfo_t *si, int parc, char *parv[])
142     {
143     char *channel = parv[0];
144     char *target = parv[1];
145     channel_t *c = channel_find (channel);
146     mychan_t *mc = mychan_find (channel);
147     user_t *tu;
148     chanban_t *cb;
149    
150     if (!channel)
151     {
152     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "UNBAN");
153     command_fail (si, fault_needmoreparams, _("Syntax: UNBAN <#channel> <nickname|hostmask>"));
154     return;
155     }
156    
157     if (!target)
158     {
159     if (si->su == NULL)
160     {
161     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "UNBAN");
162     command_fail (si, fault_needmoreparams, _("Syntax: UNBAN <#channel> <nickname|hostmask>"));
163     return;
164     }
165     target = si->su->nick;
166     }
167    
168     if (!mc)
169     {
170     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), channel);
171     return;
172     }
173    
174     if (!c)
175     {
176     command_fail (si, fault_nosuch_target, _("\2%s\2 is currently empty."), channel);
177     return;
178     }
179    
180     if (!si->smu)
181     {
182     command_fail (si, fault_noprivs, _("You are not logged in."));
183     return;
184     }
185    
186     if (!chanacs_source_has_flag (mc, si, CA_REMOVE))
187     {
188     command_fail (si, fault_noprivs, _("You are not authorized to perform this operation."));
189     return;
190     }
191    
192     if ((tu = user_find_named (target)))
193     {
194     node_t *n, *tn;
195     char hostbuf2[BUFSIZE];
196     int count = 0;
197    
198     snprintf (hostbuf2, BUFSIZE, "%s!%s@%s", tu->nick, tu->user, tu->vhost);
199     for (n = next_matching_ban (c, tu, 'b', c->bans.head); n != NULL; n = next_matching_ban (c, tu, 'b', tn))
200     {
201     tn = n->next;
202     cb = static_cast<chanban_t *> (n->data);
203    
204     logcommand (si, CMDLOG_DO, "%s UNBAN %s (for user %s)", mc->name, cb->mask, hostbuf2);
205     modestack_mode_param (chansvs.nick, c, MTYPE_DEL, cb->type, cb->mask);
206     chanban_delete (cb);
207     count++;
208     }
209     if (count > 0)
210     command_success_nodata (si, _("Unbanned \2%s\2 on \2%s\2 (%d ban%s removed)."), target, channel, count, (count != 1 ? "s" : ""));
211     else
212     command_success_nodata (si, _("No bans found matching \2%s\2 on \2%s\2."), target, channel);
213     return;
214     }
215     else if ((cb = chanban_find (c, target, 'b')) != NULL || validhostmask (target))
216     {
217     if (cb)
218     {
219     modestack_mode_param (chansvs.nick, c, MTYPE_DEL, 'b', target);
220     chanban_delete (cb);
221     logcommand (si, CMDLOG_DO, "%s UNBAN %s", mc->name, target);
222     if (!chanuser_find (mc->chan, si->su))
223     command_success_nodata (si, _("Unbanned \2%s\2 on \2%s\2."), target, channel);
224     }
225     else
226     command_fail (si, fault_nosuch_key, _("No such ban \2%s\2 on \2%s\2."), target, channel);
227    
228     return;
229     }
230     else
231     {
232     command_fail (si, fault_badparams, _("Invalid nickname/hostmask provided: \2%s\2"), target);
233     command_fail (si, fault_badparams, _("Syntax: UNBAN <#channel> [nickname|hostmask]"));
234     return;
235     }
236     }
237    
238     /* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
239     * vim:ts=8
240     * vim:sw=8
241     * vim:noexpandtab
242     */