1 /* Automatically generated by refactor.pl.
5 * CMDLEVEL: QCMD_AUTHED
7 * CMDDESC: Bans a hostmask on a channel for a specified time period.
8 * CMDFUNC: csc_dotempban
9 * CMDPROTO: int csc_dotempban(void *source, int cargc, char **cargv);
10 * CMDHELP: Usage: TEMPBAN <channel> <hostmask> <duration> [<reason>]
11 * CMDHELP: Temporarily 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. When the time
14 * CMDHELP: expires the ban will be removed automatically. Bans set with the PERMBAN
15 * CMDHELP: command can be removed via BANCLEAR or BANDEL. Any users matching the hostmask
16 * CMDHELP: will be kicked from the channel.
18 * CMDHELP: channel - channel to set a ban on
19 * CMDHELP: hostmask - hostmask (nick!user@host) to ban.
20 * CMDHELP: duration - length of time to apply the ban for. Suffixes m (minutes), h (hours),
21 * CMDHELP: d (days), w (weeks), M (months) and y (years) can be used to specify
22 * CMDHELP: the duration, for example 3d, 5h, 1h30m, 1M.
23 * CMDHELP: reason - reason for the ban. This will be used in kick messages when kicking
24 * CMDHELP: users matching the ban. If this is not provided the generic message
25 * CMDHELP: \"Banned.\" will be used.
26 * CMDHELP: TEMPBAN requires master (+m) access on the named channel.
29 #include "../chanserv.h"
30 #include "../../nick/nick.h"
31 #include "../../lib/flags.h"
32 #include "../../lib/irc_string.h"
33 #include "../../channel/channel.h"
34 #include "../../parser/parser.h"
35 #include "../../irc/irc.h"
36 #include "../../localuser/localuserchannel.h"
40 int csc_dotempban(void *source
, int cargc
, char **cargv
) {
43 regban
*rbp
, *toreplace
= NULL
;
45 reguser
*rup
=getreguserfromnick(sender
);
46 unsigned int duration
;
49 unsigned int count
= 0;
52 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "tempban");
56 if (!(cip
=cs_checkaccess(sender
, cargv
[0], CA_MASTERPRIV
, NULL
, "tempban",0, 0)))
59 rcp
=cip
->exts
[chanservext
];
61 duration
=durationtolong(cargv
[2]);
62 if (duration
> 400000000) {
63 chanservstdmessage(sender
, QM_DURATIONTOOLONG
, cargv
[2]);
68 /* saves us having to do repeat a LOT more sanity checking *wink* *wink* */
70 snprintf(banbuf
,sizeof(banbuf
),"%s",bantostring(b
));
74 for(rbp
=rcp
->bans
;rbp
;rbp
=rbp
->next
) {
76 if(banequal(b
,rbp
->cbp
)) {
77 if(rbp
->expiry
&& (duration
> rbp
->expiry
)) {
78 if(toreplace
) { /* shouldn't happen */
79 chanservsendmessage(sender
, "Internal error, duplicate bans found on banlist.");
85 chanservstdmessage(sender
, QM_NOTREPLACINGBANLDURATION
);
87 } else if(banoverlap(rbp
->cbp
,b
)) {
88 chanservstdmessage(sender
, QM_NEWBANALREADYBANNED
, bantostring(rbp
->cbp
));
89 } else if(banoverlap(b
,rbp
->cbp
)) {
90 chanservstdmessage(sender
, QM_NEWBANOVERLAPS
, bantostring(rbp
->cbp
), banbuf
);
99 if(count
>= MAXBANS
) {
101 chanservstdmessage(sender
, QM_TOOMANYBANS
);
107 chanservstdmessage(sender
, QM_REPLACINGBANSDURATION
);
110 freesstring(toreplace
->reason
);
121 rbp
->expiry
=duration
;
123 rbp
->reason
=getsstring(cargv
[3],200);
127 cs_setregban(cip
, rbp
);
129 csdb_updateban(rcp
, rbp
);
131 csdb_createban(rcp
, rbp
);
134 chanservstdmessage(sender
, QM_DONE
);