]>
jfr.im git - irc/gameservirc.git/blob - gameserv/tcpclient.cpp
2 * This file is provided for use with the unix-socket-faq. It is public
3 * domain, and may be copied freely. There is no copyright on it. The
4 * original work was by Vic Metcalfe (vic@brutus.tlug.org), and any
5 * modifications made to that work were made with the understanding that
6 * the finished work would be in the public domain.
8 * If you have found a bug, please pass it on to me at the above address
9 * acknowledging that there will be no copyright on your work.
11 * The most recent version of this file, and the unix-socket-faq can be
12 * found at http://www.interlog.com/~vic/sock-faq/.
29 char *PACKAGE
= "GameServ";
30 char *VERSION
= "1.1.7";
35 List
<aClient
> clients
;
37 void save_timestamp();
38 void load_timestamp();
42 char buffer
[1024], buf
[1024];
44 char *cmd
, *source
= NULL
;
48 load_config_file(); // default = gameserv.conf
51 sock
= make_connection(remoteport
, SOCK_STREAM
, remoteserver
);
53 fprintf(stderr
,"make_connection failed.\n");
59 raw("PROTOCTL NICKv2 VHP");
60 raw("PASS :%s", remotepass
);
61 raw("SERVER %s 1 :%s", servername
, servername
);
62 raw("NICK %S 1 %d %S %s %s %d +owghraAxNt %s :%s v%s", time(NULL
), gshost
,
63 servername
, time(NULL
), gshost
, PACKAGE
, VERSION
);
64 raw(":%S JOIN %s", c_Forest
);
65 raw(":%S MODE %s +mtn", c_Forest
);
66 #elif defined(BAHAMUT)
67 raw("PASS %s :TS", remotepass
);
68 raw("SERVER %s 1 :%s", servername
, servername
);
69 raw("NICK %S 1 %d +o %s %s %s 0 :GameServ", time(NULL
), gsident
, gshost
,
71 raw(":%s SJOIN %d %d %s +mnt :@%S", servername
, time(NULL
), time(NULL
), c_Forest
);
73 // Server numeric is: [] <-- must be unique
74 raw("PASS :%s", remotepass
);
75 raw("SERVER %s 1 %d %d P10 []AAF :%s", servername
, time(NULL
), time(NULL
), servername
);
76 raw("[] N %S 1 %d %s %s DAqAoB %s :%S", time(NULL
), gsident
, gshost
, gsnum
);
77 raw("[] B %s %d +tnm %s:o", c_Forest
, time(NULL
) - 864000, gsnum
);
81 raw("%s T %s :%s", gsnum
, c_Forest
, c_ForestTopic
);
82 raw("[] EB"); // End burst
84 raw(":%S MODE %s +o %S", c_Forest
);
85 raw(":%S TOPIC %s :%s", c_Forest
, c_ForestTopic
);
88 sock_gets(sock
,buffer
,sizeof(buffer
)-1); /* -1 added thanks to
89 David Duchene <dave@ltd.com> for pointing out the possible
90 buffer overflow resulting from the linefeed added below. */
94 log("Server: %s",buffer
);
100 long int loadtime
= time(NULL
);
101 long int currentTime
;
102 long int oldTime
= loadtime
;
105 if (load_monsters() == false)
109 if (sock_gets(sock
,buffer
,sizeof(buffer
)) == -1) {
115 if (buffer
[0] == ':')
117 source
= strtok(buf
, " ");
118 cmd
= strtok(NULL
, " ");
121 cmd
= strtok(buf
, " ");
123 source
= strtok(buf
, " ");
124 cmd
= strtok(NULL
, " ");
128 log("Server: %s", buffer
);
131 // Wait N seconds then we're loaded.
134 if (time(NULL
) >= welcomedelay
+ loadtime
)
138 // Save the player data every updateperiod seconds
139 currentTime
= time(NULL
);
140 if (currentTime
- oldTime
>= updateperiod
)
142 oldTime
= currentTime
;
148 if (stricmp(cmd
, "PING") == 0) {
150 timestamp
= strtok(NULL
, "");
151 raw("PONG %s", timestamp
);
153 if (stricmp(cmd
, "G") == 0) {
155 timestamp
= strtok(NULL
, " ");
156 raw("[] Z [] %s 0 %s", timestamp
+ 1, timestamp
);
159 } else if (stricmp(cmd
, "EB") == 0) {
162 } else if (stricmp(cmd
, "VERSION") == 0) {
164 server
= strtok(NULL
, " ");
166 raw(":%s 351 %s %s %s. %s", servername
, source
+1, PACKAGE
, VERSION
, servername
);
168 } else if (strncmp(cmd
, "NICK", 4) == 0) {
169 if (buffer
[0] == ':')
172 if ((tempPtr
= find((source
+ 1))))
175 nick
= strtok(NULL
, " ");
176 tempPtr
->setNick(nick
);
183 } else if (stricmp(cmd
, "N") == 0 && strlen(source
) == 2) {
187 for (int x
= 0; x
< 6; x
++)
188 nick
= strtok(NULL
, " ");
193 log ("aClient has modes");
196 // Searching for the +r mode (extra parameter)
197 for (unsigned int count
= 1; count
< strlen(nick
); count
++)
199 if (nick
[count
] == 'r')
201 nick
= strtok(NULL
, " ");
205 nick
= strtok(NULL
, " ");
210 nick
= strtok(NULL
, " ");
212 newuser
= new aClient(nick
);
214 notice(s_GameServ
, nick
, welcomemsg
, nick
);
216 clients
.insertAtBack(newuser
);
220 } else if (stricmp(cmd
, "Q") == 0) {
222 } else if (stricmp(cmd
, "QUIT") == 0) {
230 if ((quitter
= find(source
)))
231 clients
.remove(quitter
);
232 if ((quitter
= findIRCplayer(source
)))
234 quitter
->setNick("!NULL!");
235 quitter
->stats
->user
= NULL
; // Unidentify them
242 } else if (stricmp(cmd
, "P") == 0) {
245 longname
= new char[strlen(s_GameServ
) + strlen(servername
) + 2];
247 sprintf(longname
, "%S@%s", servername
);
249 dest
= strtok(NULL
, " ");
250 rest
= strtok(NULL
, "");
251 if (stricmp(dest
, gsnum
) == 0 || stricmp(dest
, longname
) == 0)
254 gameserv(source
, rest
);
256 else if (stricmp(dest
, c_Forest
) == 0)
259 forest(source
, rest
);
262 } else if (stricmp(cmd
, "PRIVMSG") == 0) {
264 dest
= strtok(NULL
, " ");
265 rest
= strtok(NULL
, "");
266 if (strnicmp(dest
, s_GameServ
, strlen(s_GameServ
)) == 0)
267 gameserv(source
, rest
);
268 else if (stricmp(dest
, c_Forest
) == 0)
269 forest(source
, rest
);
271 } else if (stricmp(cmd
, "JOIN") == 0) {
273 channel
= strtok(NULL
, " ");
274 if (stricmp(channel
, c_Forest
) == 0 && is_playing(source
+ 1))
275 raw(":%S MODE %s +v %s", c_Forest
, (source
+ 1));
278 } else if (stricmp(cmd
, "SJOIN") == 0) {
279 char *channel
, *nick
;
280 strtok(NULL
, " "); // Ignore the TS
281 strtok(NULL
, " "); // Ignore the TS
282 channel
= strtok(NULL
, " ");
284 nick
= strtok(NULL
, " ");
285 nick
++; // Get rid of the :
286 if (stricmp(channel
, c_Forest
) == 0 && is_playing(nick
))
287 raw(":%S MODE %s +v %s", channel
, nick
);
292 log("Unrecognized Message: cmd = %s source = %s", cmd
, source
);
310 unload_config_file();
314 aClient
*find(char *nick
)
316 return findbynick(nick
);
319 aClient
*find(const char *nick
)
321 return findbynick(nick
);
325 aClient
*findbynick(char *nick
)
327 ListNode
<aClient
> *newPtr
;
328 newPtr
= clients
.First();
330 aClient
*client
= NULL
;
334 client
= newPtr
->getData();
336 if (strcmp(client
->getNick(), nick
) == 0)
338 if (stricmp(client
->getNick(), nick
) == 0)
342 newPtr
= newPtr
->Next();
347 aClient
*findIRCplayer(const char *nick
)
349 ListNode
<aClient
> *newPtr
;
352 for (newPtr
= players
.First(); newPtr
; newPtr
= newPtr
->Next())
354 p
= newPtr
->getData();
356 if (strcmp(p
->getNick(), nick
) == 0)
358 if (stricmp(p
->getNick(), nick
) == 0)
365 aClient
*findplayer(const char *name
)
367 ListNode
<aClient
> *newPtr
;
370 for (newPtr
= players
.First(); newPtr
; newPtr
= newPtr
->Next())
372 p
= newPtr
->getData()->stats
;
373 if (stricmp(p
->name
, name
) == 0)
374 return newPtr
->getData();
380 aClient
*findbynick(const char *nick
)
382 ListNode
<aClient
> *newPtr
;
383 newPtr
= clients
.First();
385 aClient
*client
= NULL
;
389 client
= newPtr
->getData();
391 if (strcmp(client
->getNick(), nick
) == 0)
393 if (stricmp(client
->getNick(), nick
) == 0)
397 newPtr
= newPtr
->Next();
402 void load_timestamp()
406 infile
.open(".gstimestamp");
411 log("Error opening .gstimestamp");
416 log("Generating new timestamp");
418 timestamp
= midnight();
425 if (timestamp
< 1000000)
429 void save_timestamp()
433 outfile
.open(".gstimestamp");
437 log("Error creating new file .gstimestamp");
441 outfile
<< timestamp
<< endl
;
446 long int midnight(long int offset
)
448 return (time(NULL
) - (time(NULL
) % 86400)) + (offset
* 3600);