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