1 /* Some utterly useless dog */
3 #include "../core/schedule.h"
4 #include "../lib/irc_string.h"
5 #include "../localuser/localuserchannel.h"
6 #include "../control/control.h"
7 #include "../usercount/usercount.h"
8 #include "../lib/version.h"
16 int cmd_serverlist(void *sender
, int cargc
, char **cargv
);
17 void serverlist_hook_newserver(int hook
, void *arg
);
18 void serverlist_hook_lostserver(int hook
, void *arg
);
19 int serverlist_versionreply(void *source
, int cargc
, char **cargv
);
26 } serverinfo
[MAXSERVERS
];
28 void serverlist_doversion(void);
32 registercontrolhelpcmd("serverlist",NO_OPER
,1,&cmd_serverlist
,"Usage: serverlist [pattern]\nShows all currently connected servers");
33 /* hooks for serverlist */
34 registerhook(HOOK_SERVER_NEWSERVER
, &serverlist_hook_newserver
);
35 registerhook(HOOK_SERVER_LOSTSERVER
, &serverlist_hook_lostserver
);
38 for (i
= 0; i
< MAXSERVERS
; i
++) {
39 if (serverlist
[i
].linkstate
== LS_LINKED
)
40 serverinfo
[i
].used
= 1;
42 serverinfo
[i
].used
= 0;
44 serverinfo
[i
].ts
= getnettime();
45 serverinfo
[i
].version1
= NULL
;
46 serverinfo
[i
].version2
= NULL
;
48 registernumerichandler(351, &serverlist_versionreply
, 2);
54 for (i
= 0; i
< MAXSERVERS
; i
++) {
55 if (serverinfo
[i
].used
) {
56 freesstring(serverinfo
[i
].version1
);
57 freesstring(serverinfo
[i
].version2
);
60 deregisternumerichandler(351, &serverlist_versionreply
);
62 deregisterhook(HOOK_SERVER_NEWSERVER
, &serverlist_hook_newserver
);
63 deregisterhook(HOOK_SERVER_LOSTSERVER
, &serverlist_hook_lostserver
);
65 deregistercontrolcmd("serverlist",cmd_serverlist
);
68 int cmd_serverlist(void *sender
, int cargc
, char **cargv
) {
69 nick
*np
= (nick
*)sender
;
70 int a
, i
, ucount
, acount
, scount
;
72 controlreply(np
, "%-7s %-30s %5s/%5s/%-5s %-7s %-15s %-20s", "Numeric", "Hostname", "ECl", "Cl", "MaxCl", "Flags", "Connected for", "Version");
76 for (i
= 0; i
< MAXSERVERS
; i
++) {
77 if (serverlist
[i
].linkstate
== LS_LINKED
&& (cargc
< 1 || match2strings(cargv
[0], serverlist
[i
].name
->content
))) {
80 for (a
= 0; a
<= serverlist
[i
].maxusernum
; a
++)
81 if (servernicks
[i
][a
] != NULL
)
87 controlreply(np
, "%-7d %-30s %5d/%5d/%-5d %-7s %-15s %-20s - %s", i
, serverlist
[i
].name
->content
,
88 servercount
[i
], ucount
, serverlist
[i
].maxusernum
,
89 printflags(serverlist
[i
].flags
, smodeflags
),
90 longtoduration(getnettime() - serverinfo
[i
].ts
, 0),
91 serverinfo
[i
].version1
? serverinfo
[i
].version1
->content
: "Unknown",
92 serverinfo
[i
].version2
? serverinfo
[i
].version2
->content
: "Unknown");
96 controlreply(np
, "--- End of list. %d users and %d servers on the net.", acount
, scount
);
98 /* update version info for next time */
99 serverlist_doversion();
104 int serverlist_versionreply(void *source
, int cargc
, char **cargv
) {
110 num
= numerictolong(cargv
[0], 2);
112 if (serverinfo
[num
].used
) {
113 freesstring(serverinfo
[num
].version1
);
114 freesstring(serverinfo
[num
].version2
);
116 serverinfo
[num
].version1
= getsstring(cargv
[3], strlen(cargv
[3]));
117 serverinfo
[num
].version2
= getsstring(cargv
[5], strlen(cargv
[5]));
122 void serverlist_doversion(void) {
124 char *num1
, *numeric
;
129 for (i
= 0; i
< MAXSERVERS
; i
++) {
130 if (serverlist
[i
].linkstate
== LS_LINKED
&& serverinfo
[i
].version1
== NULL
) {
131 numeric
= longtonumeric(mynick
->numeric
,5);
132 num1
= (char*)malloc(strlen(numeric
) + 1); /* bleh.. longtonumeric() is using static variables */
133 strcpy(num1
, numeric
);
135 irc_send("%s V :%s", num1
, longtonumeric(i
,2));
141 void serverlist_hook_newserver(int hook
, void *arg
) {
142 char *num1
, *numeric
;
143 long num
= (long)arg
;
148 serverinfo
[num
].used
= 1;
149 serverinfo
[num
].ts
= getnettime();
150 serverinfo
[num
].version1
= NULL
;
151 serverinfo
[num
].version2
= NULL
;
153 numeric
= longtonumeric(mynick
->numeric
,5);
154 num1
= (char*)malloc(strlen(numeric
) + 1); /* bleh.. longtonumeric() is using static variables */
155 strcpy(num1
, numeric
);
157 irc_send("%s V :%s", num1
, longtonumeric(num
,2));
162 void serverlist_hook_lostserver(int hook
, void *arg
) {
163 long num
= (long)arg
;
165 serverinfo
[num
].used
= 0;
166 freesstring(serverinfo
[num
].version1
);
167 freesstring(serverinfo
[num
].version2
);