]>
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: | |
0f8f333b CP |
14 | * CMDHELP: +c ACH'MENTS - enables achievements system - allows use of achievement commands |
15 | * CMDHELP: and sends achievement messages. | |
9b7c9974 | 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. | |
1dd6d55d | 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; | |
fbc4d9ed | 28 | int arg=0, wasorisoper; |
8dfd270a | 29 | flag_t flagmask, changemask, oldflags; |
1dd6d55d | 30 | char flagbuf[30]; |
31 | ||
32 | if (!rup) | |
33 | return CMD_ERROR; | |
34 | ||
1482fb78 | 35 | if (cargc>0 && (*cargv[0]!='+' && *cargv[0]!='-')) { |
1dd6d55d | 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)) { | |
1482fb78 | 43 | chanservstdmessage(sender, QM_NOACCESSONUSER, "userflags", cargv[0]); |
1dd6d55d | 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)) { | |
1482fb78 | 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]); | |
1dd6d55d | 55 | return CMD_ERROR; |
56 | } | |
57 | ||
58 | strcpy(flagbuf,printflags(target->flags, ruflags)); | |
8dfd270a | 59 | oldflags=target->flags; |
1dd6d55d | 60 | |
3a744b8f | 61 | changemask=QUFLAG_NOTICE; |
1dd6d55d | 62 | |
63 | if (target==rup) { | |
64 | /* If you're changing yourself, you can give up the "status" flags and add/remove notice */ | |
347686bd | 65 | changemask|=(target->flags & (QUFLAG_OPER | QUFLAG_DEV | QUFLAG_PROTECT | QUFLAG_HELPER | QUFLAG_ADMIN | QUFLAG_STAFF)); |
1dd6d55d | 66 | } |
67 | ||
68 | /* Warning, policy ahead */ | |
69 | ||
c005651e CP |
70 | if (UHasStaffPriv(rup)) |
71 | changemask |= QUFLAG_PROTECT; | |
72 | ||
1dd6d55d | 73 | if (UHasOperPriv(rup)) |
caee16ec | 74 | changemask |= QUFLAG_PROTECT | QUFLAG_TRUST; /* QUFLAG_NOINFO; */ |
1dd6d55d | 75 | |
76 | if (UHasAdminPriv(rup)) | |
347686bd | 77 | changemask |= (QUFLAG_OPER | QUFLAG_HELPER | QUFLAG_CLEANUPEXEMPT | QUFLAG_STAFF); |
1dd6d55d | 78 | |
79 | if (UIsDev(rup)) | |
80 | changemask=QUFLAG_ALL; | |
81 | ||
58a9529d | 82 | if (time(NULL) > ACHIEVEMENTS_START) { |
83 | changemask |= QUFLAG_ACHIEVEMENTS; | |
84 | } | |
85 | ||
fbc4d9ed | 86 | wasorisoper = UHasOperPriv(target); |
1dd6d55d | 87 | setflags(&target->flags, changemask, cargv[arg], ruflags, REJECT_NONE); |
fbc4d9ed CP |
88 | wasorisoper |= UHasOperPriv(target); |
89 | ||
1dd6d55d | 90 | /* More policy */ |
c005651e | 91 | if (!UHasStaffPriv(target)) { |
1dd6d55d | 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)); | |
8dfd270a CP |
96 | |
97 | /* only warn about interesting changes */ | |
58a9529d | 98 | if((target->flags ^ oldflags) & ~(QUFLAG_NOTICE | QUFLAG_INFO | QUFLAG_TRUST | QUFLAG_ACHIEVEMENTS)) { |
8dfd270a CP |
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 | ||
e9f49ea9 | 101 | #ifdef AUTHGATE_WARNINGS |
fbc4d9ed CP |
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); | |
e9f49ea9 CP |
104 | #endif |
105 | } | |
1dd6d55d | 106 | csdb_updateuser(target); |
3294b10b | 107 | |
de00c123 | 108 | /* Disabled this for now as live ircu doesn't support it - splidge |
3294b10b CP |
109 | if ((anp=findauthname(rup->ID))) |
110 | localusersetaccountflags(anp, cs_accountflagmap(target)); | |
de00c123 | 111 | */ |
112 | ||
1dd6d55d | 113 | chanservstdmessage(sender, QM_DONE); |
114 | } | |
115 | ||
116 | if (cs_privcheck(QPRIV_VIEWUSERFLAGS, sender)) | |
117 | flagmask=QUFLAG_ALL; | |
118 | else | |
58a9529d | 119 | flagmask=QUFLAG_INFO | QUFLAG_NOTICE | QUFLAG_OPER | QUFLAG_HELPER | QUFLAG_DEV | QUFLAG_ADMIN | QUFLAG_STAFF | QUFLAG_ACHIEVEMENTS; |
1dd6d55d | 120 | |
43583524 | 121 | chanservstdmessage(sender, QM_CURUSERFLAGS, target->username, printflagsornone(target->flags & flagmask, ruflags)); |
1dd6d55d | 122 | |
123 | return CMD_OK; | |
124 | } |