]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/usercmds/whois.c
Purge all references to localtime.
[irc/quakenet/newserv.git] / chanserv / usercmds / whois.c
CommitLineData
1dd6d55d 1/* Automatically generated by refactor.pl.
2 *
3 *
4 * CMDNAME: whois
5 * CMDLEVEL: QCMD_AUTHED
6 * CMDARGS: 1
7 * CMDDESC: Displays information about a user.
8 * CMDFUNC: csu_dowhois
9 * CMDPROTO: int csu_dowhois(void *source, int cargc, char **cargv);
50cd26d6 10 * CMDHELP: Usage: WHOIS <user>
11 * CMDHELP: Displays information about a user, where:
12 * CMDHELP: user - user to request information for, either the nickname of an active user on
13 * CMDHELP: the network or #accountname.
1dd6d55d 14 */
15
16#include "../chanserv.h"
17#include "../../lib/irc_string.h"
f305c646 18#include "../../lib/strlfunc.h"
1dd6d55d 19#include <stdio.h>
20#include <string.h>
21
22int csu_dowhois(void *source, int cargc, char **cargv) {
23 nick *sender=source;
24 reguser *rup=getreguserfromnick(sender), *target;
25 char buf[200];
26 char nbpos=0;
1dd6d55d 27 struct tm *tmp;
28 regchanuser *rcup, *rcup2;
29 flag_t flagmask, flags;
30 int doneheader=0;
23b85e10 31 authname *anp;
32 nick *tnp;
1dd6d55d 33
34 if (!(rup=getreguserfromnick(sender)))
35 return CMD_ERROR;
36
37 if (cargc<1) {
38 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "whois");
39 return CMD_ERROR;
40 }
41
42 if (!(target=findreguser(sender, cargv[0]))) {
23b85e10 43 nick *np;
1dd6d55d 44
8ae8bd45 45 if (cs_privcheck(QPRIV_VIEWFULLWHOIS, sender) && (np=getnickbynick(cargv[0]))) {
23b85e10 46 activeuser *aup=getactiveuserfromnick(np);
1dd6d55d 47 chanservsendmessage(sender, "%s has attempted to auth %d time%s.", np->nick, aup->authattempts,
48 aup->authattempts==1?"":"s");
49 }
50 return CMD_ERROR;
51 }
52
53 if (cargv[0][0]=='#') {
54 chanservstdmessage(sender, QM_WHOISHEADER_AUTH, target->username);
55 } else {
56 chanservstdmessage(sender, QM_WHOISHEADER_NICK, cargv[0], target->username);
57 }
58
59 if (rup==target || cs_privcheck(QPRIV_VIEWFULLWHOIS, sender)) {
60 chanservstdmessage(sender, QM_WHOIS_USERID, target->ID);
61 }
62
63 if (cs_privcheck(QPRIV_VIEWUSERFLAGS, sender)) {
347686bd 64 flagmask=QUFLAG_ALL & ~(QUFLAG_SUSPENDED | QUFLAG_GLINE | QUFLAG_DELAYEDGLINE);
65 if (UIsDev(rup))
66 flagmask=QUFLAG_ALL;
f305c646
CP
67
68 if (UHasSuspension(target)) {
79313d98 69 char expiresbuf[100];
f305c646
CP
70 char *reason, *suspendtype, *whom;
71
72 if(UIsDelayedGline(target)) {
73 suspendtype = "delayed gline";
74 } else if(UIsGline(target)) {
75 suspendtype = "gline";
76 } else if(UIsSuspended(target)) {
77 suspendtype = "suspended";
78 } else {
79 suspendtype = "???";
80 }
81
82 if(target->suspendexp) {
83 if(time(NULL) >= target->suspendexp) {
84 strlcpy(expiresbuf, "(next auth)", sizeof(expiresbuf));
85 } else {
79313d98 86 strftime(expiresbuf, sizeof(expiresbuf), Q9_FORMAT_TIME, gmtime(&(target->suspendexp)));
f305c646
CP
87 }
88 } else {
89 strlcpy(expiresbuf, "(never)", sizeof(expiresbuf));
90 }
f305c646 91
a49c6c1c 92 if(cs_privcheck(QPRIV_VIEWSUSPENDEDBY, sender)) {
f305c646
CP
93 reguser *trup = findreguserbyID(target->suspendby);
94 if(trup) {
95 whom = trup->username;
96 } else {
97 whom = "(unknown)";
98 }
99 } else {
100 whom = "(hidden)";
101 }
102
103 if(target->suspendreason && target->suspendreason->content) {
104 reason = target->suspendreason->content;
105 } else {
106 reason = "(none)";
107 }
108
109 chanservstdmessage(sender, QM_USERSUSPENDEDTYPE, suspendtype);
110 chanservstdmessage(sender, QM_USERSUSPENDEDBY, whom);
111 chanservstdmessage(sender, QM_USERSUSPENDEDREASON, reason);
79313d98 112 chanservstdmessage(sender, QM_USERSUSPENDEDAT, target->suspendtime);
f305c646
CP
113 chanservstdmessage(sender, QM_USERSUSPENDEDEXPIRY, expiresbuf);
114 }
1dd6d55d 115 } else {
347686bd 116 /* Incidentally none of the QM_USERIS* mesages take parameters. Just thought I'd mention it.. */
1dd6d55d 117 if (UIsAdmin(target))
118 chanservstdmessage(sender, QM_USERISADMIN, target->username);
119 else if (UIsOper(target))
120 chanservstdmessage(sender, QM_USERISOPER, target->username);
121 else if (UIsHelper(target))
122 chanservstdmessage(sender, QM_USERISHELPER, target->username);
347686bd 123 else if (UIsStaff(target))
124 chanservstdmessage(sender, QM_USERISSTAFF, target->username);
1dd6d55d 125
126 if (UIsDev(target))
127 chanservstdmessage(sender, QM_USERISDEV, target->username);
128
129 flagmask=0;
130 }
131
132 if (rup==target)
133 flagmask|=(QUFLAG_OPER | QUFLAG_DEV | QUFLAG_HELPER |
347686bd 134 QUFLAG_ADMIN | QUFLAG_INFO | QUFLAG_NOTICE | QUFLAG_STAFF);
1dd6d55d 135
136 if (flagmask & target->flags)
43583524 137 chanservstdmessage(sender, QM_WHOIS_FLAGS, printflagsornone(flagmask & target->flags, ruflags));
1dd6d55d 138
23b85e10 139 if (!(anp=findauthname(target->ID)) || !anp->nicks) {
1dd6d55d 140 chanservstdmessage(sender, QM_WHOIS_USERS, "(none)");
141 } else {
23b85e10 142 for (tnp=anp->nicks; ;tnp=tnp->nextbyauthname) {
143 if (nbpos>0 && (!tnp || nbpos+strlen(tnp->nick) > 60)) {
1dd6d55d 144 chanservstdmessage(sender, QM_WHOIS_USERS, buf);
145 nbpos=0;
146 }
147
23b85e10 148 if (!tnp)
1dd6d55d 149 break;
150
23b85e10 151 nbpos+=sprintf(buf+nbpos,"%s ",tnp->nick);
1dd6d55d 152 }
153 }
154
79313d98
CP
155 if (target->created)
156 chanservstdmessage(sender, QM_WHOIS_CREATED, target->created);
1dd6d55d 157
cf50e022
CP
158 if (target->lastauth == 0) {
159 snprintf(buf,sizeof(buf),"(never)");
160 } else {
161 tmp=gmtime(&(target->lastauth));
79313d98 162 strftime(buf,sizeof(buf),Q9_FORMAT_TIME,tmp);
cf50e022 163 }
1dd6d55d 164 chanservstdmessage(sender, QM_WHOIS_LASTAUTH, buf);
165
166 if (target->lastuserhost && (rup==target || cs_privcheck(QPRIV_VIEWFULLWHOIS, sender))) {
50cd26d6 167/* Commenting out language until we implement some - splidge
1dd6d55d 168 chanservstdmessage(sender, QM_WHOIS_USERLANG, cslanguages[target->languageid] ?
50cd26d6 169 cslanguages[target->languageid]->name->content : "(unknown)"); */
1dd6d55d 170 chanservstdmessage(sender, QM_WHOIS_LASTUSERHOST, target->lastuserhost->content);
171 }
172
173 if (target->email && (rup==target || cs_privcheck(QPRIV_VIEWEMAIL, sender))) {
174 chanservstdmessage(sender, QM_WHOIS_EMAIL, target->email->content);
79313d98 175 chanservstdmessage(sender, QM_WHOIS_EMAILSET, target->lastemailchange);
1dd6d55d 176 }
177
3a744b8f 178 if (target->info && *target->info->content) {
1dd6d55d 179 chanservstdmessage(sender, QM_WHOIS_INFO, target->info->content);
180 }
181
182 if (target->comment && (cs_privcheck(QPRIV_VIEWCOMMENTS, sender))) {
183 chanservstdmessage(sender, QM_WHOIS_COMMENT, target->comment->content);
184 }
185
186 for (rcup=target->knownon;rcup;rcup=rcup->nextbyuser) {
a19424d6 187 if (!UHasHelperPriv(rup) || (UHasOperPriv(target) && UHasHelperPriv(rup) && !UHasOperPriv(rup))) {
1dd6d55d 188 if (!(rcup2=findreguseronchannel(rcup->chan,rup)))
189 continue;
190
50ec21f3 191 if (!CUKnown(rcup2))
1dd6d55d 192 continue;
193
194 flagmask = (QCUFLAG_OWNER | QCUFLAG_MASTER | QCUFLAG_OP | QCUFLAG_VOICE | QCUFLAG_AUTOVOICE |
50ec21f3 195 QCUFLAG_AUTOOP | QCUFLAG_TOPIC | QCUFLAG_KNOWN | QCUFLAG_PROTECT );
1dd6d55d 196
197 if (CUHasMasterPriv(rcup2))
50ec21f3 198 flagmask |= QCUFLAGS_PUNISH;
199
200 if (rcup2==rcup)
201 flagmask |= QCUFLAGS_PERSONAL;
1dd6d55d 202 } else {
203 flagmask=QCUFLAG_ALL;
204 }
205
206 if (!(flags=rcup->flags & flagmask))
207 continue;
208
209 if (!doneheader) {
210 doneheader=1;
211 chanservstdmessage(sender, QM_WHOIS_CHANHEADER, target->username);
212 }
213
214 chanservsendmessage(sender, " %-30s %s",rcup->chan->index->name->content,printflags(flags, rcuflags));
215 }
216
0c393f78 217 chanservstdmessage(sender, QM_ENDOFLIST);
1dd6d55d 218
219 return CMD_OK;
220}