]>
Commit | Line | Data |
---|---|---|
1dd6d55d | 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); | |
50cd26d6 | 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. | |
1dd6d55d | 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; | |
8dfd270a | 27 | flag_t flagmask, changemask, oldflags; |
1dd6d55d | 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)); | |
8dfd270a | 61 | oldflags=target->flags; |
1dd6d55d | 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)); | |
8dfd270a CP |
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 | ||
1dd6d55d | 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 | } |