]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/usercmds/userflags.c
CHANSERV: listflags fixes
[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: +c ACH'MENTS - enables achievements system - allows use of achievement commands
15 * CMDHELP: and sends achievement messages.
16 * CMDHELP: +n NOTICE - causes the bot to sent you NOTICEs. If this flag is not set the
17 * CMDHELP: bot will communicate using PRIVMSG.
18 */
19
20 #include "../chanserv.h"
21 #include "../../lib/irc_string.h"
22 #include <stdio.h>
23 #include <string.h>
24
25 int csu_douserflags(void *source, int cargc, char **cargv) {
26 nick *sender=source;
27 reguser *rup=getreguserfromnick(sender), *target;
28 int arg=0, wasorisoper;
29 flag_t flagmask, changemask, oldflags;
30 char flagbuf[30];
31
32 if (!rup)
33 return CMD_ERROR;
34
35 if (cargc>0 && (*cargv[0]!='+' && *cargv[0]!='-')) {
36 arg++;
37 /* If the first char isn't a "change" character, it must specify a target */
38
39 if (!(target=findreguser(sender,cargv[0])))
40 return CMD_ERROR;
41
42 if (target!=rup && !cs_privcheck(QPRIV_VIEWUSERFLAGS, sender)) {
43 chanservstdmessage(sender, QM_NOACCESSONUSER, "userflags", cargv[0]);
44 return CMD_ERROR;
45 }
46 } else {
47 target=rup;
48 }
49
50 if (cargc>arg) {
51 /* OK, now we have a changestring.. */
52 if (target!=rup && !cs_privcheck(QPRIV_CHANGEUSERFLAGS, sender)) {
53 /* Safe to use cargv[0] because if target != rup then first arg must have been the target name */
54 chanservstdmessage(sender, QM_NOACCESSONUSER, "userflags", cargv[0]);
55 return CMD_ERROR;
56 }
57
58 strcpy(flagbuf,printflags(target->flags, ruflags));
59 oldflags=target->flags;
60
61 changemask=QUFLAG_NOTICE;
62
63 if (target==rup) {
64 /* If you're changing yourself, you can give up the "status" flags and add/remove notice */
65 changemask|=(target->flags & (QUFLAG_OPER | QUFLAG_DEV | QUFLAG_PROTECT | QUFLAG_HELPER | QUFLAG_ADMIN | QUFLAG_STAFF));
66 }
67
68 /* Warning, policy ahead */
69
70 if (UHasStaffPriv(rup))
71 changemask |= QUFLAG_PROTECT;
72
73 if (UHasOperPriv(rup))
74 changemask |= QUFLAG_PROTECT | QUFLAG_TRUST; /* QUFLAG_NOINFO; */
75
76 if (UHasAdminPriv(rup))
77 changemask |= (QUFLAG_OPER | QUFLAG_HELPER | QUFLAG_CLEANUPEXEMPT | QUFLAG_STAFF);
78
79 if (UIsDev(rup))
80 changemask=QUFLAG_ALL;
81
82 if (time(NULL) > ACHIEVEMENTS_START) {
83 changemask |= QUFLAG_ACHIEVEMENTS;
84 }
85
86 wasorisoper = UHasOperPriv(target);
87 setflags(&target->flags, changemask, cargv[arg], ruflags, REJECT_NONE);
88 wasorisoper |= UHasOperPriv(target);
89
90 /* More policy */
91 if (!UHasStaffPriv(target)) {
92 target->flags &= ~QUFLAG_PROTECT;
93 }
94
95 cs_log(sender,"USERFLAGS #%s %s (%s -> %s)",target->username,cargv[arg],flagbuf,printflags(target->flags, ruflags));
96
97 /* only warn about interesting changes */
98 if((target->flags ^ oldflags) & ~(QUFLAG_NOTICE | QUFLAG_INFO | QUFLAG_TRUST | QUFLAG_ACHIEVEMENTS)) {
99 chanservwallmessage("%s (%s) just used USERFLAGS on %s %s (%s -> %s)",sender->nick,rup->username,target->username,cargv[arg],flagbuf,printflags(target->flags,ruflags));
100
101 #ifdef AUTHGATE_WARNINGS
102 if(wasorisoper)
103 chanservsendmessage(sender, "WARNING FOR PRIVILEGED USERS: you MUST go to https://auth.quakenet.org and attempt to login as %s (with any password) to update the cache, otherwise their old credentials will be preserved in certain circumstances.",target->username);
104 #endif
105 }
106 csdb_updateuser(target);
107
108 /* Disabled this for now as live ircu doesn't support it - splidge
109 if ((anp=findauthname(rup->ID)))
110 localusersetaccountflags(anp, cs_accountflagmap(target));
111 */
112
113 chanservstdmessage(sender, QM_DONE);
114 }
115
116 if (cs_privcheck(QPRIV_VIEWUSERFLAGS, sender))
117 flagmask=QUFLAG_ALL;
118 else
119 flagmask=QUFLAG_INFO | QUFLAG_NOTICE | QUFLAG_OPER | QUFLAG_HELPER | QUFLAG_DEV | QUFLAG_ADMIN | QUFLAG_STAFF | QUFLAG_ACHIEVEMENTS;
120
121 chanservstdmessage(sender, QM_CURUSERFLAGS, target->username, printflagsornone(target->flags & flagmask, ruflags));
122
123 return CMD_OK;
124 }