]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/usercmds/userflags.c
Added help for most remaining user commands.
[irc/quakenet/newserv.git] / chanserv / usercmds / userflags.c
1 /* Automatically generated by refactor.pl.
2 *
3 *
4 * CMDNAME: userflags
5 * CMDLEVEL: QCMD_AUTHED
6 * CMDARGS: 2
7 * CMDDESC: Shows or changes user flags.
8 * CMDFUNC: csu_douserflags
9 * CMDPROTO: int csu_douserflags(void *source, int cargc, char **cargv);
10 * CMDHELP: Usage: USERFLAGS <flags>
11 * CMDHELP: Changes your current user flags, where:
12 * CMDHELP: flags - changes to apply, in the usual flag letters preceded by +/- format.
13 * CMDHELP: Valid user flags are:
14 * CMDHELP: +n NOTICE - causes the bot to sent you NOTICEs. If this flag is not set the
15 * CMDHELP: bot will communicate using PRIVMSG.
16 */
17
18 #include "../chanserv.h"
19 #include "../../lib/irc_string.h"
20 #include <stdio.h>
21 #include <string.h>
22
23 int csu_douserflags(void *source, int cargc, char **cargv) {
24 nick *sender=source;
25 reguser *rup=getreguserfromnick(sender), *target;
26 int arg=0;
27 flag_t flagmask, changemask, oldflags;
28 char flagbuf[30];
29
30 if (!rup)
31 return CMD_ERROR;
32
33 if (cargc<1) {
34 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "userflags");
35 return CMD_ERROR;
36 }
37
38 if (*cargv[0]!='+' && *cargv[0]!='-') {
39 arg++;
40 /* If the first char isn't a "change" character, it must specify a target */
41
42 if (!(target=findreguser(sender,cargv[0])))
43 return CMD_ERROR;
44
45 if (target!=rup && !cs_privcheck(QPRIV_VIEWUSERFLAGS, sender)) {
46 chanservstdmessage(sender, QM_NOACCESS, "userflags");
47 return CMD_ERROR;
48 }
49 } else {
50 target=rup;
51 }
52
53 if (cargc>arg) {
54 /* OK, now we have a changestring.. */
55 if (target!=rup && !cs_privcheck(QPRIV_CHANGEUSERFLAGS, sender)) {
56 chanservstdmessage(sender, QM_NOACCESS, "userflags");
57 return CMD_ERROR;
58 }
59
60 strcpy(flagbuf,printflags(target->flags, ruflags));
61 oldflags=target->flags;
62
63 changemask=QUFLAG_NOTICE | QUFLAG_INFO;
64
65 if (target==rup) {
66 /* If you're changing yourself, you can give up the "status" flags and add/remove notice */
67 changemask|=(target->flags & (QUFLAG_OPER | QUFLAG_DEV | QUFLAG_PROTECT | QUFLAG_HELPER | QUFLAG_ADMIN));
68 }
69
70 /* Warning, policy ahead */
71
72 if (UHasOperPriv(rup))
73 changemask |= QUFLAG_GLINE | QUFLAG_DELAYEDGLINE | QUFLAG_RESTRICTED | QUFLAG_PROTECT;
74
75 if (UHasAdminPriv(rup))
76 changemask |= (QUFLAG_OPER | QUFLAG_HELPER);
77
78 if (UIsDev(rup))
79 changemask=QUFLAG_ALL;
80
81 setflags(&target->flags, changemask, cargv[arg], ruflags, REJECT_NONE);
82
83 /* More policy */
84 if (!UHasHelperPriv(target)) {
85 target->flags &= ~QUFLAG_PROTECT;
86 }
87
88 cs_log(sender,"USERFLAGS #%s %s (%s -> %s)",target->username,cargv[arg],flagbuf,printflags(target->flags, ruflags));
89
90 /* only warn about interesting changes */
91 if((target->flags ^ oldflags) & ~(QUFLAG_NOTICE | QUFLAG_INFO))
92 chanservwallmessage("%s (%s) just used USERFLAGS on %s %s (%s -> %s)",sender->nick,rup->username,target->username,cargv[arg],flagbuf,printflags(target->flags,ruflags));
93
94 csdb_updateuser(target);
95 chanservstdmessage(sender, QM_DONE);
96 }
97
98 if (cs_privcheck(QPRIV_VIEWUSERFLAGS, sender))
99 flagmask=QUFLAG_ALL;
100 else
101 flagmask=QUFLAG_INFO | QUFLAG_NOTICE | QUFLAG_OPER | QUFLAG_HELPER | QUFLAG_DEV | QUFLAG_ADMIN;
102
103 chanservstdmessage(sender, QM_CURUSERFLAGS, target->username, printflags(target->flags & flagmask, ruflags));
104
105 return CMD_OK;
106 }