]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/usercmds/whois.c
1 /* Automatically generated by refactor.pl.
5 * CMDLEVEL: QCMD_AUTHED
7 * CMDDESC: Displays information about a user.
9 * CMDPROTO: int csu_dowhois(void *source, int cargc, char **cargv);
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.
16 #include "../chanserv.h"
17 #include "../../lib/irc_string.h"
18 #include "../../lib/strlfunc.h"
19 #include "../../lib/ccassert.h"
23 int csu_dowhois(void *source
, int cargc
, char **cargv
) {
25 reguser
*rup
, *target
;
28 regchanuser
*rcup
, *rcup2
;
29 flag_t flagmask
, flags
;
34 CCASSERT(sizeof(buf
) > TIMELEN
);
36 if (!(rup
=getreguserfromnick(sender
)))
40 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "whois");
44 if (!(target
=findreguser(sender
, cargv
[0]))) {
47 if (cs_privcheck(QPRIV_VIEWFULLWHOIS
, sender
) && (np
=getnickbynick(cargv
[0]))) {
48 activeuser
*aup
=getactiveuserfromnick(np
);
49 chanservsendmessage(sender
, "%s has attempted to auth %d time%s.", np
->nick
, aup
->authattempts
,
50 aup
->authattempts
==1?"":"s");
55 if (cargv
[0][0]=='#') {
56 chanservstdmessage(sender
, QM_WHOISHEADER_AUTH
, target
->username
);
58 chanservstdmessage(sender
, QM_WHOISHEADER_NICK
, cargv
[0], target
->username
);
61 if (rup
==target
|| cs_privcheck(QPRIV_VIEWFULLWHOIS
, sender
)) {
62 chanservstdmessage(sender
, QM_WHOIS_USERID
, target
->ID
);
65 if (cs_privcheck(QPRIV_VIEWUSERFLAGS
, sender
)) {
66 flagmask
=QUFLAG_ALL
& ~(QUFLAG_SUSPENDED
| QUFLAG_GLINE
| QUFLAG_DELAYEDGLINE
);
70 if (UHasSuspension(target
)) {
72 char *reason
, *suspendtype
, *whom
;
74 CCASSERT(sizeof(expiresbuf
) > TIMELEN
);
76 if(UIsDelayedGline(target
)) {
77 suspendtype
= "delayed gline";
78 } else if(UIsGline(target
)) {
79 suspendtype
= "gline";
80 } else if(UIsSuspended(target
)) {
81 suspendtype
= "suspended";
86 if(target
->suspendexp
) {
87 if(time(NULL
) >= target
->suspendexp
) {
88 strlcpy(expiresbuf
, "(next auth)", sizeof(expiresbuf
));
90 q9strftime(expiresbuf
, sizeof(expiresbuf
), target
->suspendexp
);
93 strlcpy(expiresbuf
, "(never)", sizeof(expiresbuf
));
96 if(cs_privcheck(QPRIV_VIEWSUSPENDEDBY
, sender
)) {
97 reguser
*trup
= findreguserbyID(target
->suspendby
);
99 whom
= trup
->username
;
107 if(target
->suspendreason
&& target
->suspendreason
->content
) {
108 reason
= target
->suspendreason
->content
;
113 chanservstdmessage(sender
, QM_USERSUSPENDEDTYPE
, suspendtype
);
114 chanservstdmessage(sender
, QM_USERSUSPENDEDBY
, whom
);
115 chanservstdmessage(sender
, QM_USERSUSPENDEDREASON
, reason
);
116 chanservstdmessage(sender
, QM_USERSUSPENDEDAT
, target
->suspendtime
);
117 chanservstdmessage(sender
, QM_USERSUSPENDEDEXPIRY
, expiresbuf
);
120 /* Incidentally none of the QM_USERIS* mesages take parameters. Just thought I'd mention it.. */
121 if (UIsAdmin(target
))
122 chanservstdmessage(sender
, QM_USERISADMIN
, target
->username
);
123 else if (UIsOper(target
))
124 chanservstdmessage(sender
, QM_USERISOPER
, target
->username
);
125 else if (UIsHelper(target
))
126 chanservstdmessage(sender
, QM_USERISHELPER
, target
->username
);
127 else if (UIsStaff(target
))
128 chanservstdmessage(sender
, QM_USERISSTAFF
, target
->username
);
131 chanservstdmessage(sender
, QM_USERISDEV
, target
->username
);
137 flagmask
|=(QUFLAG_OPER
| QUFLAG_DEV
| QUFLAG_HELPER
| QUFLAG_ADMIN
|
138 QUFLAG_INFO
| QUFLAG_NOTICE
| QUFLAG_STAFF
| QUFLAG_ACHIEVEMENTS
);
140 if (flagmask
& target
->flags
)
141 chanservstdmessage(sender
, QM_WHOIS_FLAGS
, printflagsornone(flagmask
& target
->flags
, ruflags
));
143 if (!(anp
=findauthname(target
->ID
)) || !anp
->nicks
) {
144 chanservstdmessage(sender
, QM_WHOIS_USERS
, "(none)");
146 for (tnp
=anp
->nicks
; ;tnp
=tnp
->nextbyauthname
) {
147 if (nbpos
>0 && (!tnp
|| nbpos
+strlen(tnp
->nick
) > 60)) {
148 chanservstdmessage(sender
, QM_WHOIS_USERS
, buf
);
155 nbpos
+=sprintf(buf
+nbpos
,"%s ",tnp
->nick
);
160 chanservstdmessage(sender
, QM_WHOIS_CREATED
, target
->created
);
162 if (target
->lastauth
== 0) {
163 snprintf(buf
,sizeof(buf
),"(never)");
165 q9strftime(buf
,sizeof(buf
),target
->lastauth
);
167 chanservstdmessage(sender
, QM_WHOIS_LASTAUTH
, buf
);
169 /* The third clause of this hides user@host of opers from non-opered staff. */
170 if (target
->lastuserhost
&& (rup
==target
|| cs_privcheck(QPRIV_VIEWFULLWHOIS
, sender
)) &&
171 (!UHasOperPriv(target
) || UHasOperPriv(rup
)) ) {
172 /* Commenting out language until we implement some - splidge
173 chanservstdmessage(sender, QM_WHOIS_USERLANG, cslanguages[target->languageid] ?
174 cslanguages[target->languageid]->name->content : "(unknown)"); */
175 chanservstdmessage(sender
, QM_WHOIS_LASTUSERHOST
, target
->lastuserhost
->content
);
178 if (target
->email
&& (rup
==target
|| cs_privcheck(QPRIV_VIEWEMAIL
, sender
))) {
179 chanservstdmessage(sender
, QM_WHOIS_EMAIL
, target
->email
->content
);
181 if (target
->lastemailchange
)
182 chanservstdmessage(sender
, QM_WHOIS_EMAILSET
, target
->lastemailchange
);
183 if (target
->lastpasschange
)
184 chanservstdmessage(sender
, QM_WHOIS_PASSSET
, target
->lastpasschange
);
187 if (target
->info
&& *target
->info
->content
) {
188 chanservstdmessage(sender
, QM_WHOIS_INFO
, target
->info
->content
);
191 if (target
->comment
&& (cs_privcheck(QPRIV_VIEWCOMMENTS
, sender
))) {
192 chanservstdmessage(sender
, QM_WHOIS_COMMENT
, target
->comment
->content
);
195 for (rcup
=target
->knownon
;rcup
;rcup
=rcup
->nextbyuser
) {
196 if (!UHasHelperPriv(rup
) || (UHasOperPriv(target
) && UHasHelperPriv(rup
) && !UHasOperPriv(rup
))) {
197 if (!(rcup2
=findreguseronchannel(rcup
->chan
,rup
)))
203 flagmask
= (QCUFLAG_OWNER
| QCUFLAG_MASTER
| QCUFLAG_OP
| QCUFLAG_VOICE
| QCUFLAG_AUTOVOICE
|
204 QCUFLAG_AUTOOP
| QCUFLAG_TOPIC
| QCUFLAG_KNOWN
| QCUFLAG_PROTECT
);
206 if (CUHasMasterPriv(rcup2
))
207 flagmask
|= QCUFLAGS_PUNISH
;
210 flagmask
|= QCUFLAGS_PERSONAL
;
212 flagmask
=QCUFLAG_ALL
;
215 if (!(flags
=rcup
->flags
& flagmask
))
220 chanservstdmessage(sender
, QM_WHOIS_CHANHEADER
, target
->username
);
223 chanservsendmessage(sender
, " %-30s %s",rcup
->chan
->index
->name
->content
,printflags(flags
, rcuflags
));
226 chanservstdmessage(sender
, QM_ENDOFLIST
);
229 triggerhook(HOOK_CHANSERV_WHOAMI
, sender
);
231 triggerhook(HOOK_CHANSERV_WHOIS
, sender
);