]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chancmds/banclear.c
Merge pull request #1 from meeb/meeb
[irc/quakenet/newserv.git] / chanserv / chancmds / banclear.c
1 /* Automatically generated by refactor.pl.
2 *
3 *
4 * CMDNAME: banclear
5 * CMDLEVEL: QCMD_AUTHED
6 * CMDARGS: 1
7 * CMDDESC: Removes all bans from a channel including persistent bans.
8 * CMDFUNC: csc_dobanclear
9 * CMDPROTO: int csc_dobanclear(void *source, int cargc, char **cargv);
10 * CMDHELP: Usage: BANCLEAR <channel>
11 * CMDHELP: Removes all temporary and persistent bans from a channel, where:
12 * CMDHELP: channel - the channel to use
13 * CMDHELP: BANCLEAR requires master (+m) access on the named channel.
14 */
15
16 #include "../chanserv.h"
17 #include "../../nick/nick.h"
18 #include "../../lib/flags.h"
19 #include "../../lib/irc_string.h"
20 #include "../../channel/channel.h"
21 #include "../../parser/parser.h"
22 #include "../../irc/irc.h"
23 #include "../../localuser/localuserchannel.h"
24 #include <string.h>
25 #include <stdio.h>
26
27 int csc_dobanclear(void *source, int cargc, char **cargv) {
28 nick *sender=source;
29 chanindex *cip;
30 regban **rbh, *rbp;
31 chanban **cbh, *cbp;
32 regchan *rcp;
33 modechanges changes;
34 char *banstr;
35
36 if (cargc<1) {
37 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "banclear");
38 return CMD_ERROR;
39 }
40
41 if (!(cip=cs_checkaccess(sender, cargv[0], CA_MASTERPRIV, NULL, "banclear", 0, 0)))
42 return CMD_ERROR;
43
44 rcp=cip->exts[chanservext];
45
46 if (cip->channel)
47 localsetmodeinit(&changes, cip->channel, chanservnick);
48
49 for (rbh=&(rcp->bans); *rbh; ) {
50 rbp=*rbh;
51 banstr=bantostring(rbp->cbp);
52 chanservstdmessage(sender, QM_REMOVEDPERMBAN, banstr, cip->name->content);
53 if (cip->channel)
54 localdosetmode_ban(&changes, banstr, MCB_DEL);
55 /* Remove from database */
56 csdb_deleteban(rbp);
57 /* Remove from list */
58 (*rbh)=rbp->next;
59 /* Free ban/string and update setby refcount, and free actual regban */
60 freesstring(rbp->reason);
61 freechanban(rbp->cbp);
62 freeregban(rbp);
63 }
64
65 if (cip->channel) {
66 for (cbh=&(cip->channel->bans); *cbh; ) {
67 cbp=*cbh;
68 banstr=bantostring(cbp);
69 chanservstdmessage(sender, QM_REMOVEDCHANBAN, banstr, cip->name->content);
70 localdosetmode_ban(&changes, banstr, MCB_DEL);
71 }
72 localsetmodeflush(&changes,1);
73 }
74
75 chanservstdmessage(sender, QM_DONE);
76 return CMD_OK;
77 }