static bool
IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
{
- bool is_visible, is_member, is_ircop;
+ bool is_visible, is_member, is_ircop, is_oper;
CL2CHAN *cl2chan;
char flags[10];
CLIENT *c;
assert( Chan != NULL );
is_member = Channel_IsMemberOf(Chan, Client);
+ is_oper = Client_HasMode(Client, 'o');
/* Secret channel? */
- if (!is_member && Channel_HasMode(Chan, 's'))
+ if (!is_member && !is_oper && Channel_HasMode(Chan, 's'))
return IRC_WriteStrClient(Client, RPL_ENDOFWHO_MSG,
Client_ID(Client), Channel_Name(Chan));
continue;
is_visible = !Client_HasMode(c, 'i');
- if (is_member || is_visible) {
+ if (is_member || is_visible || is_oper) {
memset(flags, 0, sizeof(flags));
if (Client_HasMode(c, 'a'))
list = Class_GetList(CLASS_GLINE);
else
list = Class_GetList(CLASS_KLINE);
- list_item = Lists_GetFirst(list);
- while (list_item) {
- if (!IRC_WriteStrClient(from, RPL_STATSXLINE_MSG,
+ list_item = Lists_GetFirst(list);
+ while (list_item) {
+ if (!IRC_WriteStrClient(from, RPL_STATSXLINE_MSG,
Client_ID(from), query,
Lists_GetMask(list_item),
Lists_GetValidity(list_item),
Lists_GetReason(list_item)))
- return DISCONNECTED;
- list_item = Lists_GetNext(list_item);
- }
+ return DISCONNECTED;
+ list_item = Lists_GetNext(list_item);
+ }
break;
case 'L': /* Link status (servers and user links) */
if (!Op_Check(from, Req))