]> jfr.im git - irc/quakenet/newserv.git/blame - serverlist/serverlist.c
Add server flag support.
[irc/quakenet/newserv.git] / serverlist / serverlist.c
CommitLineData
b7eccf5f
P
1/* Some utterly useless dog */
2
3#include "../core/schedule.h"
4#include "../lib/irc_string.h"
5#include "../localuser/localuserchannel.h"
6#include "../control/control.h"
074a4529 7#include "../usercount/usercount.h"
b7eccf5f
P
8
9#include <stdlib.h>
10#include <string.h>
11#include <stdarg.h>
12
13int cmd_serverlist(void *sender, int cargc, char **cargv);
14void serverlist_hook_newserver(int hook, void *arg);
15void serverlist_hook_lostserver(int hook, void *arg);
16int serverlist_versionreply(void *source, int cargc, char **cargv);
17
18struct {
19 int used;
20 time_t ts;
21 sstring *version1;
22 sstring *version2;
23} serverinfo[MAXSERVERS];
24
25void serverlist_doversion(void);
26
27
28void _init(void) {
29 registercontrolhelpcmd("serverlist",NO_OPER,1,&cmd_serverlist,"Usage: serverlist [pattern]\nShows all currently connected servers");
30 /* hooks for serverlist */
31 registerhook(HOOK_SERVER_NEWSERVER, &serverlist_hook_newserver);
32 registerhook(HOOK_SERVER_LOSTSERVER, &serverlist_hook_lostserver);
33 int i;
34
35 for (i = 0; i < MAXSERVERS; i++) {
36 if (serverlist[i].linkstate == LS_LINKED)
37 serverinfo[i].used = 1;
38 else
39 serverinfo[i].used = 0;
40
41 serverinfo[i].ts = getnettime();
42 serverinfo[i].version1 = NULL;
43 serverinfo[i].version2 = NULL;
44 }
45 registernumerichandler(351, &serverlist_versionreply, 2);
46
47}
48
49void _fini(void) {
50 int i;
51 for (i = 0; i < MAXSERVERS; i++) {
52 if (serverinfo[i].used) {
53 freesstring(serverinfo[i].version1);
54 freesstring(serverinfo[i].version2);
55 }
56 }
57 deregisternumerichandler(351, &serverlist_versionreply);
58
59 deregisterhook(HOOK_SERVER_NEWSERVER, &serverlist_hook_newserver);
60 deregisterhook(HOOK_SERVER_LOSTSERVER, &serverlist_hook_lostserver);
61
62 deregistercontrolcmd("serverlist",cmd_serverlist);
63}
64
65int cmd_serverlist(void *sender, int cargc, char **cargv) {
66 nick *np = (nick*)sender;
67 int a, i, ucount, acount, scount;
68
4f2ceb49 69 controlreply(np, "%-7s %-30s %5s/%5s/%-5s %-7s %-15s %-20s", "Numeric", "Hostname", "ECl", "Cl", "MaxCl", "Flags", "Connected for", "Version");
b7eccf5f
P
70
71 scount = acount = 0;
72
73 for (i = 0; i < MAXSERVERS; i++) {
74 if (serverlist[i].linkstate == LS_LINKED && (cargc < 1 || match2strings(cargv[0], serverlist[i].name->content))) {
75 ucount = 0;
76
19f8fda5 77 for (a = 0; a <= serverlist[i].maxusernum; a++)
b7eccf5f
P
78 if (servernicks[i][a] != NULL)
79 ucount++;
80
81 acount += ucount;
82 scount++;
83
4f2ceb49
CP
84 controlreply(np, "%-7d %-30s %5d/%5d/%-5d %-7s %-15s %-20s - %s", i, serverlist[i].name->content,
85 servercount[i], ucount, serverlist[i].maxusernum,
86 printflags(serverlist[i].flags, smodeflags),
87 longtoduration(getnettime() - serverinfo[i].ts, 0),
b7eccf5f
P
88 serverinfo[i].version1 ? serverinfo[i].version1->content : "Unknown",
89 serverinfo[i].version2 ? serverinfo[i].version2->content : "Unknown");
90 }
91 }
92
93 controlreply(np, "--- End of list. %d users and %d servers on the net.", acount, scount);
94
95 /* update version info for next time */
96 serverlist_doversion();
97
98 return CMD_OK;
99}
100
101int serverlist_versionreply(void *source, int cargc, char **cargv) {
102 int num;
103
104 if (cargc < 6)
105 return CMD_OK;
106
107 num = numerictolong(cargv[0], 2);
108
109 if (serverinfo[num].used) {
110 freesstring(serverinfo[num].version1);
111 freesstring(serverinfo[num].version2);
112
113 serverinfo[num].version1 = getsstring(cargv[3], strlen(cargv[3]));
114 serverinfo[num].version2 = getsstring(cargv[5], strlen(cargv[5]));
115 }
116 return CMD_OK;
117}
118
119void serverlist_doversion(void) {
120 int i;
121 char *num1, *numeric;
122
123 if (mynick == NULL)
124 return;
125
126 for (i = 0; i < MAXSERVERS; i++) {
127 if (serverlist[i].linkstate == LS_LINKED && serverinfo[i].version1 == NULL) {
128 numeric = longtonumeric(mynick->numeric,5);
129 num1 = (char*)malloc(strlen(numeric) + 1); /* bleh.. longtonumeric() is using static variables */
130 strcpy(num1, numeric);
131
132 irc_send("%s V :%s", num1, longtonumeric(i,2));
133 free(num1);
134 }
135 }
136}
137
138void serverlist_hook_newserver(int hook, void *arg) {
139 char *num1, *numeric;
074a4529 140 long num = (long)arg;
b7eccf5f
P
141
142 if (mynick == NULL)
143 return;
144
145 serverinfo[num].used = 1;
146 serverinfo[num].ts = getnettime();
147 serverinfo[num].version1 = NULL;
148 serverinfo[num].version2 = NULL;
149
150 numeric = longtonumeric(mynick->numeric,5);
151 num1 = (char*)malloc(strlen(numeric) + 1); /* bleh.. longtonumeric() is using static variables */
152 strcpy(num1, numeric);
153
154 irc_send("%s V :%s", num1, longtonumeric(num,2));
155
156 free(num1);
157}
158
159void serverlist_hook_lostserver(int hook, void *arg) {
074a4529 160 long num = (long)arg;
b7eccf5f
P
161
162 serverinfo[num].used = 0;
163 freesstring(serverinfo[num].version1);
164 freesstring(serverinfo[num].version2);
165}
166