Add support to show user links using "STATS L"

Change "stats L" to show servers and user links and restrict it to
IRC Operators.
This commit is contained in:
Federico G. Schwindt 2013-09-18 23:51:44 +01:00 committed by Alexander Barton
parent 13a5358a3d
commit ec5ab4fcd1
2 changed files with 16 additions and 6 deletions

View File

@ -451,17 +451,21 @@ Status and Informational Commands
Show statistics and other information of type <query> of a particular Show statistics and other information of type <query> of a particular
IRC server in the network. IRC server in the network.
. .
The following <query> types are supported (case-insensitive): The following <query> types are supported (case-insensitive where
applicable):
. .
- g Network-wide bans ("G-Lines"). - g Network-wide bans ("G-Lines").
- k Server-local bans ("K-Lines"). - k Server-local bans ("K-Lines").
- l Link status (parent server and own link only). - L Link status (servers and user links).
- l Link status (servers and own link).
- m Command usage count. - m Command usage count.
- u Server uptime. - u Server uptime.
. .
<target> can be a server name, the nickname of a client connected to <target> can be a server name, the nickname of a client connected to
a specific server, or a mask matching a server name in the network. a specific server, or a mask matching a server name in the network.
The server of the current connection is used when <target> is omitted. The server of the current connection is used when <target> is omitted.
.
To use "STATS L" the user must be an IRC Operator.
References: References:
- RFC 2812, 3.4.4 "Stats message" - RFC 2812, 3.4.4 "Stats message"

View File

@ -41,6 +41,7 @@
#include "irc-macros.h" #include "irc-macros.h"
#include "irc-write.h" #include "irc-write.h"
#include "client-cap.h" #include "client-cap.h"
#include "op.h"
#include "exp.h" #include "exp.h"
#include "irc-info.h" #include "irc-info.h"
@ -865,6 +866,7 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
unsigned int days, hrs, mins; unsigned int days, hrs, mins;
struct list_head *list; struct list_head *list;
struct list_elem *list_item; struct list_elem *list_item;
bool more_links = false;
assert(Client != NULL); assert(Client != NULL);
assert(Req != NULL); assert(Req != NULL);
@ -909,16 +911,20 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
list_item = Lists_GetNext(list_item); list_item = Lists_GetNext(list_item);
} }
break; break;
case 'L': /* Link status (servers and user links) */
if (!Op_Check(from, Req))
return Op_NoPrivileges(from, Req);
more_links = true;
case 'l': /* Link status (servers and own link) */ case 'l': /* Link status (servers and own link) */
case 'L':
time_now = time(NULL); time_now = time(NULL);
for (con = Conn_First(); con != NONE; con = Conn_Next(con)) { for (con = Conn_First(); con != NONE; con = Conn_Next(con)) {
cl = Conn_GetClient(con); cl = Conn_GetClient(con);
if (!cl) if (!cl)
continue; continue;
if ((Client_Type(cl) == CLIENT_SERVER) if (Client_Type(cl) == CLIENT_SERVER ||
|| (cl == Client)) { cl == Client ||
/* Server link or our own connection */ (more_links && Client_Type(cl) == CLIENT_USER)) {
#ifdef ZLIB #ifdef ZLIB
if (Conn_Options(con) & CONN_ZIP) { if (Conn_Options(con) & CONN_ZIP) {
if (!IRC_WriteStrClient if (!IRC_WriteStrClient