]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chancmds/permban.c
1 /* Automatically generated by refactor.pl.
5 * CMDLEVEL: QCMD_AUTHED
7 * CMDDESC: Permanently bans a hostmask on a channel.
8 * CMDFUNC: csc_dopermban
9 * CMDPROTO: int csc_dopermban(void *source, int cargc, char **cargv);
10 * CMDHELP: Usage: PERMBAN <channel> <hostmask> [<reason>]
11 * CMDHELP: Permanently bans the provided hostmask on the channel. If the ban is
12 * CMDHELP: removed from the channel e.g. by a channel op or the BANTIMER feature, the
13 * CMDHELP: ban will be reapplied if a matching user joins the channel. Bans
14 * CMDHELP: set with the PERMBAN command can be removed with BANCLEAR or BANDEL. Any users
15 * CMDHELP: matching the hostmask will be kicked from the channel.
17 * CMDHELP: channel - channel to set a ban on
18 * CMDHELP: hostmask - hostmask (nick!user@host) to ban.
19 * CMDHELP: reason - reason for the ban. This will be used in kick messages when kicking
20 * CMDHELP: users matching the ban. If this is not provided the generic message
21 * CMDHELP: \"Banned.\" will be used.
22 * CMDHELP: PERMBAN requires master (+m) access on the named channel.
25 #include "../chanserv.h"
26 #include "../../nick/nick.h"
27 #include "../../lib/flags.h"
28 #include "../../lib/irc_string.h"
29 #include "../../channel/channel.h"
30 #include "../../parser/parser.h"
31 #include "../../irc/irc.h"
32 #include "../../localuser/localuserchannel.h"
36 int csc_dopermban(void *source
, int cargc
, char **cargv
) {
39 regban
*rbp
, *toreplace
=NULL
;
41 reguser
*rup
=getreguserfromnick(sender
);
44 unsigned int count
= 0;
47 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "permban");
51 if (!(cip
=cs_checkaccess(sender
, cargv
[0], CA_MASTERPRIV
, NULL
, "permban",0, 0)))
54 rcp
=cip
->exts
[chanservext
];
56 /* saves us having to do repeat a LOT more sanity checking *wink* *wink* */
58 snprintf(banbuf
,sizeof(banbuf
),"%s",bantostring(b
));
62 for(rbp
=rcp
->bans
;rbp
;rbp
=rbp
->next
) {
64 if(banequal(b
,rbp
->cbp
)) { /* if they're equal and one is temporary we just replace it */
66 if(toreplace
) { /* shouldn't happen */
67 chanservsendmessage(sender
, "Internal error, duplicate bans found on banlist.");
73 chanservstdmessage(sender
, QM_PERMBANALREADYSET
);
75 } else if(banoverlap(rbp
->cbp
,b
)) { /* new ban is contained in an already existing one */
76 chanservstdmessage(sender
, QM_NEWBANALREADYBANNED
, bantostring(rbp
->cbp
));
77 }else if(banoverlap(b
,rbp
->cbp
)) { /* existing ban is contained in new one */
78 chanservstdmessage(sender
, QM_NEWBANOVERLAPS
, bantostring(rbp
->cbp
), banbuf
);
86 if(count
>= MAXBANS
) {
88 chanservstdmessage(sender
, QM_TOOMANYBANS
);
94 chanservstdmessage(sender
, QM_REPLACINGTEMPBAN
);
98 freesstring(toreplace
->reason
);
111 rbp
->reason
=getsstring(cargv
[2],200);
115 cs_setregban(cip
, rbp
);
117 csdb_updateban(rcp
, rbp
);
119 csdb_createban(rcp
, rbp
);
121 chanservstdmessage(sender
, QM_DONE
);