]> jfr.im git - irc/gameservirc.git/blame_incremental - gameserv/tcpclient.cpp
fixed the config.cpp file back to strcpy() (oops)
[irc/gameservirc.git] / gameserv / tcpclient.cpp
... / ...
CommitLineData
1/*
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.
7 *
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.
10 *
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/.
13 */
14
15#include "sockhelp.h"
16#include "options.h"
17#include "aClient.h"
18#include "extern.h"
19#include "flags.h"
20#include <stdio.h>
21#include <unistd.h>
22#include <string.h>
23#include <fstream>
24#include <stdlib.h>
25#include <fcntl.h>
26#include <signal.h>
27#include <algorithm>
28
29//#include <sys/types.h>
30//#include <sys/wait.h>
31//#include <errno.h>
32
33using namespace std;
34
35char *PACKAGE = "GameServ";
36char *VERSION = "1.3.3 +devel";
37
38int sock;
39long lastrefresh;
40long lastrollover;
41
42list<aClient*> clients[U_TABLE_SIZE];
43
44void save_lastrefresh();
45void load_lastrefresh();
46void load_lastrollover();
47void save_lastrollover();
48void prettyIntro();
49void check_idles();
50void clearClients();
51void clearPlayers();
52void clearItems();
53
54// Make this a daemon
55int daemon(int nochdir, int noclose);
56
57// Close all file descriptors from >= fd
58void closeall(int fd);
59
60int main(int argc, char *argv[])
61{
62 char buffer[1024], buf[1024];
63 memset(buffer, 0, 1024);
64 memset(buf, 0, 1024);
65 int connected;
66 long lastidlecheck;
67 char *cmd, *source = NULL, *conf;
68 srand(time(NULL));
69 conf = new char[16];
70 strcpy(conf, "gameserv.conf");
71
72 /*
73 * This needs to be fixed to work for any number of arguments in any
74 * order
75 *
76 */
77 if (argc > 1)
78 {
79 if ( argc > 2 || stricmp(argv[1], "--help") == 0)
80 {
81 cout << "Usage: gameserv [options] [configfile]" << endl;
82 cout << "Options:" << endl;
83 cout << "--help Displays this help dialogue" << endl;
84 delete []conf;
85 return 1;
86 }
87 delete []conf;
88 conf = argv[1];
89 }
90
91 prettyIntro();
92
93 if (load_config_file(conf))
94 {
95 cout << "Config file loaded ok...\n"
96 << "Turning into a daemon" << endl;
97 }
98 else
99 exit(2);
100
101 if (argc <= 1)
102 delete []conf;
103
104 // Turn into a daemon
105 if (daemon(1,0) < 0)
106 {
107 perror("Could not turn into a daemon");
108 exit(3);
109 }
110 if (load_items() == 0)
111 {
112 log("Error loading items");
113 goto end;
114 }
115
116 if (load_store() == 0)
117 {
118 log("Error loading store");
119 goto end;
120 }
121 if (load_tavern() == 0)
122 {
123 log("Error loading tavern");
124 goto end;
125 }
126
127 load_gs_dbase();
128 loadNews(newsdata, todaysnews);
129
130
131 if (load_masters() == false)
132 {
133 log("Error loading masters");
134 goto end;
135 }
136
137 if (load_monsters() == false)
138 {
139 log("Error loading monsters");
140 goto end;
141 }
142
143 if (!load_dragon())
144 {
145 log("Error loading dragon");
146 goto end;
147 }
148
149 if (load_levels() == false)
150 {
151 log("Error loading levels");
152 goto end;
153 }
154
155 shuttingdown = false;
156
157 char ignoreservers[32][256];
158 char *currentserver;
159 currentserver = strtok(ignoreserverslist, " ");
160 for (int server = 0; server < 32 && currentserver != NULL; server++)
161 {
162 strncpy(ignoreservers[server], currentserver, 255);
163 log("Placing %s on the server ignore list", currentserver);
164 currentserver = strtok(NULL, " ");
165 }
166
167 // This loop will retry the connection 3 times
168 for (int retry = 0; retry < 3 && !shuttingdown; retry++)
169 {
170 connected = 1;
171 load_lastrefresh();
172 load_lastrollover();
173
174 long int loadtime = time(NULL);
175 long int currentTime;
176 long int oldTime = loadtime;
177
178 lastidlecheck = loadtime;
179
180#ifdef DEBUGMODE
181 log("Setting primary Idle Check timestamp: %ld", lastidlecheck);
182#endif
183 bool loaded = false;
184
185 ignore_pipe();
186 sock = conn(remoteserver, remoteport, localhost, 0);
187 // sock = make_connection(remoteport, SOCK_STREAM, remoteserver);
188 if (sock == -1)
189 {
190 fprintf(stderr,"make_connection failed.\n");
191 unload_config_file();
192 return -1;
193 }
194 log("%S socket connected.");
195
196#ifdef UNREAL
197 raw("PASS :%s", remotepass);
198 raw("SERVER %s 1 :%s", servername, servername);
199 raw("NICK %S 1 %d %s %s %s %d :%s v%s", time(NULL), gsident, gshost,
200 servername, time(NULL), PACKAGE, VERSION);
201 raw(":%S JOIN %s", c_Forest);
202 raw(":%S MODE %s +tn", c_Forest);
203#elif defined(BAHAMUT)
204 raw("PASS %s :TS", remotepass);
205 raw("SERVER %s 1 :%s", servername, servername);
206 raw("NICK %S 1 %d +w%s %s %s %s 0 :GameServ", time(NULL), (isBOper() ? "o" : ""),
207 gsident, gshost, servername);
208 raw(":%s SJOIN %d %d %s +nt :@%S", servername, time(NULL), time(NULL), c_Forest);
209#elif defined(HYBRID)
210 raw("PASS %s :TS", remotepass);
211 raw("SERVER %s 1 :%s", servername, servername);
212 raw("NICK %S 1 %d +w%s %s %s %s :GameServ", time(NULL), (isBOper() ? "o" : ""),
213 gsident, gshost, servername);
214 raw(":%s SJOIN %ld %s +nt :@%S", servername, time(NULL), c_Forest);
215#elif defined(ULTIMATE2)
216 raw("PASS %s :TS", remotepass);
217 raw("SERVER %s 1 :%s", servername, servername);
218 raw("NICK %S 1 %d %s %s %s 0 :GameServ",
219 time(NULL), gsident, gshost, servername);
220 if (isBOper())
221 raw(":%S mode %S +o");
222 raw(":%S JOIN %s", c_Forest);
223#elif defined(PTLINK)
224 raw("PASS %s :TS", remotepass);
225 raw("SERVER %s 1 :%s", servername, servername);
226 raw("NICK %S 1 %d %s%s %s %s %s :GameServ", time(NULL), (isBOper() ? "+iow " : ""), gsident, gshost, gshost, servername);
227 raw(":%s SJOIN %d %s +nt :@%S", servername, time(NULL), c_Forest);
228#elif defined(P10)
229 // Server numeric is: [] <-- must be unique
230 raw("PASS :%s", remotepass);
231 raw("SERVER %s 1 %d %d P10 []AAF :%s", servername, time(NULL), time(NULL), servername);
232 raw("[] N %S 1 %d %s %s %s DAqAoB %s :%S", time(NULL), gsident, gshost,
233 (isBOper() ? "+o" : ""), gsnum);
234 raw("[] B %s %d +tn %s:o", c_Forest, time(NULL) - 864000, gsnum);
235#endif
236
237#if defined(P10)
238 raw("%s T %s :%s", gsnum, c_Forest, c_ForestTopic);
239 raw("[] EB"); // End burst
240#else
241#ifndef HYBRID
242#if defined(ULTIMATE2)
243 raw(":%s MODE %s +o %S %ld", servername, c_Forest,
244 time(NULL));
245#else
246 raw(":%S MODE %s +o %S", c_Forest);
247#endif
248#endif
249 raw(":%S TOPIC %s :%s", c_Forest, c_ForestTopic);
250#endif
251
252#ifndef P10
253 if (isUseNickServ())
254 {
255 raw(":%S PRIVMSG %s :IDENTIFY %s", nsname, nspass);
256 }
257#endif
258 sock_gets(sock,buffer,sizeof(buffer)-1); /* -1 added thanks to
259 David Duchene <dave@ltd.com> for pointing out the possible
260 buffer overflow resulting from the linefeed added below. */
261
262
263#ifdef DEBUGMODE
264 log("Server: %s",buffer);
265#endif
266
267 while (connected)
268 {
269 if (sock_gets(sock,buffer,sizeof(buffer)) == -1)
270 {
271 connected = 0;
272 }
273 strcpy(buf, buffer);
274
275#if !defined(P10)
276 if (buffer[0] == ':')
277 {
278 source = strtok(buf, " ");
279 cmd = strtok(NULL, " ");
280 }
281 else
282 {
283 cmd = strtok(buf, " ");
284 }
285#else
286 source = strtok(buf, " ");
287 cmd = strtok(NULL, " ");
288#endif
289
290#ifdef DEBUGMODE
291 log("Server: %s", buffer);
292#endif
293
294 // Wait N seconds then we're loaded.
295 if (!loaded)
296 {
297 if (time(NULL) >= welcomedelay + loadtime)
298 {
299 loaded = true;
300 retry = 0; // Start the reconnection cycle over
301 }
302 }
303 else
304 {
305 long TIME = time(NULL);
306 if (TIME - lastidlecheck >= idlecheckperiod)
307 {
308 check_idles();
309 lastidlecheck = TIME;
310 }
311 }
312
313 // Refresh players and clear news if the time is up
314 currentTime = time(NULL);
315
316 if (isRolloverForestFights())
317 {
318 if (currentTime - lastrollover >= rolloverperiod)
319 {
320 rolloverall();
321 lastrollover = currentTime;
322 save_lastrollover();
323 notice(s_GameServ, c_Forest, "Adding %d forest fights to all players!", numrolloverfights);
324 }
325 }
326
327 if (currentTime - lastrefresh >= refreshperiod)
328 {
329 refreshall();
330 clearNews(todaysnews);
331 saveNews(newsdata, todaysnews);
332 lastrefresh = currentTime;
333 save_lastrefresh();
334 notice(s_GameServ, c_Forest, "Refreshing all players "\
335 "and resetting news!");
336 }
337
338 // Save the player data every updateperiod seconds
339 if (currentTime - oldTime >= updateperiod)
340 {
341 oldTime = currentTime;
342 log("Saving to %s", playerdata);
343
344 save_gs_dbase();
345 saveNews(newsdata, todaysnews);
346 if (isSavedNotice())
347 {
348 // Send notice to the channel of the update
349 notice(s_GameServ, c_Forest, "%S player data saved");
350 }
351 }
352
353
354#if !defined(P10)
355 if (stricmp(cmd, "PING") == 0)
356 {
357 char *timestamp;
358 timestamp = strtok(NULL, "");
359 raw("PONG %s", timestamp);
360 }
361#else
362 // P10 Ping
363 if (stricmp(cmd, "G") == 0)
364 {
365 char *timestamp;
366 timestamp = strtok(NULL, " ");
367 raw("[] Z [] %s 0 %s", timestamp + 1, timestamp);
368 }
369#endif
370#ifdef P10
371 else if (stricmp(cmd, "EB") == 0)
372 {
373 raw("[] EA");
374 }
375#endif
376 else if (stricmp(cmd, "VERSION") == 0)
377 {
378 char *server;
379 server = strtok(NULL, " ");
380 server++;
381 raw(":%s 351 %s %s_%s. %s", servername, source+1, PACKAGE, VERSION, servername);
382 }
383 // Code indenting is clean up until here!
384#if !defined(P10)
385 else if (strncmp(cmd, "NICK", 4) == 0)
386 {
387 if (buffer[0] == ':')
388 {
389 aClient *tempPtr;
390 if ((tempPtr = find((source + 1))))
391 {
392 char *nick;
393 unsigned long oldhv, newhv;
394 nick = strtok(NULL, " ");
395 oldhv = iHASH((unsigned char *) tempPtr->getNick());
396 newhv = iHASH((unsigned char *) nick);
397 tempPtr->setNick(nick);
398 clients[oldhv].remove(tempPtr);
399 clients[newhv].push_back(tempPtr);
400 }
401 }
402 else
403 {
404 char *nick;
405#else
406 } else if (stricmp(cmd, "N") == 0 && strlen(source) == 2) {
407 {
408 char *nick, *realnick;
409 realnick = strtok(NULL, " ");
410
411 for (int x = 0; x < 5; x++)
412 nick = strtok(NULL, " ");
413
414 if (nick[0] == '+')
415 {
416#ifdef DEBUGMODE
417 log ("aClient has modes");
418#endif
419 // Searching for the +r mode (extra parameter)
420 for (unsigned int count = 1; count < strlen(nick); count++)
421 {
422 if (nick[count] == 'r')
423 {
424 nick = strtok(NULL, " ");
425 break;
426 }
427 }
428 nick = strtok(NULL, " ");
429 }
430#endif
431 aClient *newuser;
432
433 nick = strtok(NULL, " ");
434
435#ifdef P10
436 newuser = new aClient(nick, realnick);
437#else
438 newuser = new aClient(nick);
439#endif
440
441
442 if (loaded)
443 if (isWelcome())
444 {
445#ifdef P10
446 notice(s_GameServ, nick, welcomemsg, realnick);
447#else
448 notice(s_GameServ, nick, welcomemsg, nick);
449#endif
450 }
451#ifdef P10
452 unsigned long hv = sHASH((unsigned char *) nick);
453#else
454 unsigned long hv = iHASH((unsigned char *) nick);
455#endif
456
457#if defined(HYBRID) || defined(BAHAMUT) || defined(ULTIMATE2) || defined(PTLINK)
458 char *nickserver;
459 strtok(NULL, " ");
460 strtok(NULL, " ");
461 nickserver = strtok(NULL, " ");
462 if (nickserver[0] == '+')
463 strtok(NULL, " ");
464 strtok(NULL, " ");
465 nickserver = strtok(NULL, " ");
466 for (int x = 0; x < 32; x++)
467 {
468 if (stricmp(ignoreservers[x], nickserver) == 0)
469 {
470 setIgnore(newuser);
471 break;
472 }
473 }
474#elif defined(UNREAL)
475 char *nickserver;
476 strtok(NULL, " ");
477 strtok(NULL, " ");
478 strtok(NULL, " ");
479 strtok(NULL, " ");
480 nickserver = strtok(NULL, " ");
481 for (int x = 0; x < 32; x++)
482 {
483 if (stricmp(ignoreservers[x], nickserver) == 0)
484 {
485 setIgnore(newuser);
486 break;
487 }
488 }
489#endif
490 clients[hv].push_back(newuser);
491 }
492#if defined(P10)
493 } else if (stricmp(cmd, "Q") == 0) {
494// unsigned long hv = sHASH((unsigned char *) source);
495#else
496 } else if (stricmp(cmd, "QUIT") == 0)
497 {
498
499#endif
500 aClient *quitter;
501 char z = source[0];
502
503 if (z == ':')
504 source++;
505
506 unsigned long hv = iHASH((unsigned char *) source);
507 if (!(quitter = find(source)))
508 {
509 log("Fatal Error: could not find %s in the "\
510 "clients list", source);
511 goto end;
512 }
513
514 clients[hv].remove(quitter);
515 logout(quitter);
516
517 delete quitter;
518
519 if (z == ':')
520 source--;
521
522#if defined(P10)
523 }
524 else if (stricmp(cmd, "P") == 0)
525 {
526 char *rest, *dest;
527 char *longname;
528 longname = new char[strlen(s_GameServ) + strlen(servername) + 2];
529
530 sprintf(longname, "%S@%s", servername);
531
532 dest = strtok(NULL, " ");
533 rest = strtok(NULL, "");
534 if (stricmp(dest, gsnum) == 0 || stricmp(dest, longname) == 0)
535 {
536 delete [] longname;
537 gameserv(source, rest);
538 }
539 else if (stricmp(dest, c_Forest) == 0 && isListenOnCF())
540 {
541 delete [] longname;
542 forest(source, rest);
543 }
544#else
545 }
546 else if (stricmp(cmd, "PRIVMSG") == 0)
547 {
548 char *rest, *dest;
549 dest = strtok(NULL, " ");
550 rest = strtok(NULL, "");
551 if (strnicmp(dest, s_GameServ, strlen(s_GameServ)) == 0)
552 gameserv(source, rest);
553 else if (stricmp(dest, c_Forest) == 0 && isListenOnCF())
554 forest(source, rest);
555#endif
556#if defined(P10)
557 } else if (stricmp(cmd, "J") == 0) {
558#else
559 } else if (stricmp(cmd, "JOIN") == 0) {
560#endif
561 char *channel;
562 aClient *joiner;
563 channel = strtok(NULL, " ");
564
565 char z = source[0];
566
567 if (z == ':')
568 source++;
569
570 joiner = find(source);
571
572 if (stricmp(channel, c_Forest) == 0 && is_playing(joiner))
573 {
574#ifdef DEBUGMODE
575 log("Player %s (IRC: %s) joined %s",
576 joiner->stats->getName().c_str(),
577#ifdef P10
578 joiner->getRealNick(),
579#else
580 joiner->getNick(),
581#endif
582 c_Forest);
583#endif
584 raw(":%S MODE %s +v %s", c_Forest, (source));
585 }
586
587 if (z == ':')
588 source--;
589
590#if defined(BAHAMUT)
591 } else if (stricmp(cmd, "SJOIN") == 0) {
592 char *channel, *nick, *tmp, *rest;
593 strtok(NULL, " "); // Ignore the TS
594#ifndef HYBRID
595 strtok(NULL, " "); // Ignore the TS
596#endif
597 channel = strtok(NULL, " ");
598 rest = strtok(NULL, "");
599 tmp = strchr(rest, ':');
600 tmp++;
601 nick = strtok(tmp, " ");
602 while (nick != NULL)
603 {
604 if (*nick == '@')
605 nick++;
606 if (*nick == '+')
607 nick++; // Assume for users set op and voice, they
608 // are never passed as +@nick
609 if (stricmp(channel, c_Forest) == 0 && is_playing(nick))
610 raw(":%S MODE %s +v %s", channel, nick);
611
612 nick = strtok(NULL, " ");
613 }
614#endif
615 } else {
616#ifdef DEBUGMODE
617 log("Unrecognized Message: cmd = %s source = %s", cmd, source);
618#endif
619 }
620 }
621
622 } // for loop for connection retry
623
624 end:
625
626 save_gs_dbase();
627 save_dragon();
628 saveNews(newsdata, todaysnews);
629 clearClients();
630 clearPlayers();
631 clearItems();
632 delete_monsters();
633
634#ifdef DEBUGMODE
635 log("<CLOSED>");
636#endif
637
638 close(sock);
639 unload_config_file();
640 return 0;
641}
642
643aClient *find(char *nick)
644{
645 return findbynick(nick);
646}
647
648aClient *find(const char *nick)
649{
650 return findbynick(nick);
651}
652
653#ifdef P10
654
655aClient *findbyrealnick(char *realnick)
656{
657 ListNode <aClient> *newPtr;
658 unsigned long hv = sHASH((unsigned char *) realnick);
659 newPtr = clients[hv].First();
660
661 aClient *client = NULL;
662
663 while (newPtr)
664 {
665 client = newPtr->getData();
666 if (stricmp(client->getRealNick(), realnick) == 0)
667 return client;
668 client = NULL;
669 newPtr = newPtr->Next();
670 }
671 return client;
672}
673
674#else
675
676aClient *findbyrealnick(char *realnick)
677{
678 return findbynick(realnick);
679}
680
681#endif
682
683aClient *findbynick(char *nick)
684{
685 list<aClient*>::iterator iter;
686#ifdef P10
687 unsigned long hv = sHASH((unsigned char *) nick);
688#else
689 unsigned long hv = iHASH((unsigned char *) nick);
690#endif
691
692 aClient *client = NULL;
693
694 for(iter = clients[hv].begin(); iter != clients[hv].end(); iter++)
695 {
696 client = (*iter);
697#ifdef P10
698 if (strcmp(client->getNick(), nick) == 0)
699 {
700#else
701 if (stricmp(client->getNick(), nick) == 0)
702 {
703#endif
704 return client;
705 }
706 client = NULL;
707 }
708 return client;
709}
710
711Player *findplayer(const char *name)
712{
713 list<Player*>::iterator iter;
714 Player *p;
715 unsigned long hv = iHASH((unsigned char *) name);
716 for (iter = players[hv].begin(); iter != players[hv].end(); iter++)
717 {
718 p = (*iter);
719 if (stricmp(p->getName().c_str(), name) == 0)
720 return p;
721 p = NULL;
722 }
723 return NULL;
724}
725
726void check_idles()
727{
728 list<Player*>::iterator iter;
729 Player *p;
730
731 for (int x = 0; x < U_TABLE_SIZE; x++)
732 {
733 for (iter = players[x].begin(); iter != players[x].end(); iter++)
734 {
735 p = (*iter);
736
737 switch(p->getLevel())
738 {
739 case 1:
740 if ((time(NULL) - p->lastlogin) / 86400 >= level1expire)
741 {
742 logout(p->getClient());
743 return;
744 }
745 break;
746
747 default:
748 if ((time(NULL) - p->lastlogin) / 86400 >= defaultexpire)
749 {
750 logout(p->getClient());
751 return;
752 }
753 break;
754 }
755 if (timedOut(p))
756 {
757 timeOutEvent(p);
758 }
759 }
760 }
761}
762
763aClient *findbynick(const char *nick)
764{
765 list<aClient*>::iterator iter;
766#ifdef P10
767 unsigned long hv = sHASH((unsigned char *) nick);
768#else
769 unsigned long hv = iHASH((unsigned char *) nick);
770#endif
771
772 aClient *client = NULL;
773
774 for (iter = clients[hv].begin(); iter != clients[hv].end(); iter++)
775 {
776 client = (*iter);
777#ifdef P10
778 if (strcmp(client->getNick(), nick) == 0)
779#else
780 if (stricmp(client->getNick(), nick) == 0)
781#endif
782 return client;
783 client = NULL;
784 }
785 return client;
786}
787
788/* daemon() - detach process from user and disappear into the background
789 * returns -1 on failure, but you can't do much except exit in that case
790 * since we may already have forked. This is based on the BSD version,
791 * so the caller is responsible for things like the umask, etc.
792 */
793
794/* believed to work on all Posix systems */
795
796int daemon(int nochdir, int noclose)
797{
798 pid_t pid;
799 switch (pid = fork())
800 {
801 case 0: break;
802 case -1: return -1;
803 default: _exit(0); /* exit the original process */
804 }
805
806 if (setsid() < 0) /* shoudn't fail */
807 return -1;
808
809 /* dyke out this switch if you want to acquire a control tty in */
810 /* the future -- not normally advisable for daemons */
811
812 switch (pid = fork())
813 {
814 case 0: break;
815 case -1: return -1;
816 default:
817 ofstream outfile;
818 outfile.open(pidfile);
819 if (outfile.fail())
820 cerr << "Unable to open " << pidfile << endl;
821 outfile << pid << endl;
822 outfile.close();
823
824 _exit(0);
825 }
826
827 if (!nochdir)
828 chdir("/");
829
830 if (!noclose)
831 {
832 closeall(0);
833 open("/dev/null",O_RDWR);
834 dup(0); dup(0);
835 }
836
837 return 0;
838}
839
840
841/* closeall() -- close all FDs >= a specified value */
842
843void closeall(int fd)
844{
845 int fdlimit = sysconf(_SC_OPEN_MAX);
846
847 while (fd < fdlimit)
848 close(fd++);
849}
850
851void prettyIntro()
852{
853 cout << endl;
854 cout << " GGGG AAA MM MM EEEEEEE SSSSS EEEEEEE RRRRRR VV VV " << endl;
855 cout << " GG GG AAAAA MMM MMM EE SS EE RR RR VV VV " << endl;
856 cout << "GG AA AA MM MM MM EEEEE SSSSS EEEEE RRRRRR VV VV " << endl;
857 cout << "GG GGG AAAAAAA MM MM EE SS EE RR RR VV VV " << endl;
858 cout << "G G AA AA MM MM EEEEEEE SSSSS EEEEEEE RR RR VVV" << endl;
859 cout << " GGGGG V\n\n" << endl;
860 cout << "Version: " << VERSION << endl;
861 cout << "http://www.gameserv.us - http://www.sourceforge.net/projects/gameservirc" << endl;
862}
863
864void load_lastrefresh()
865{
866 ifstream infile;
867 infile.open(".gsrefresh");
868 if (infile.fail())
869 {
870#ifdef DEBUGMODE
871 log("Error opening .gsrefresh");
872#endif
873
874 generate:
875 long mytime = time(NULL);
876#ifdef DEBUGMODE
877 log("Generating new refresh time");
878#endif
879
880 // Just a safety measure... tho no one should
881 // get anywhere near the actual time as their refreshperiod
882 if (refreshperiod >= mytime)
883 {
884 log("Refresh period is greater than or equal to the actual time... setting it to 86400");
885 refreshperiod = 86400;
886 }
887
888 lastrefresh = mytime - (mytime % refreshperiod);
889
890 refreshall();
891 save_lastrefresh();
892 return;
893 }
894 infile >> lastrefresh;
895
896 infile.close();
897 if (lastrefresh < 0)
898 goto generate;
899}
900
901void load_lastrollover()
902{
903 ifstream infile;
904 infile.open(".gsrollover");
905 if (infile.fail())
906 {
907#ifdef DEBUGMODE
908 log("Error opening .gsrollover");
909#endif
910
911 generate:
912 long mytime = time(NULL);
913#ifdef DEBUGMODE
914 log("Generating new rollover time");
915#endif
916 lastrollover = mytime;
917 return;
918 }
919 infile >> lastrollover;
920
921 infile.close();
922 if (lastrollover < 0)
923 goto generate;
924}
925
926void save_lastrefresh()
927{
928 ofstream outfile;
929
930 outfile.open(".gsrefresh");
931
932 if (outfile.fail())
933 {
934 log("Error creating new file .gsrefresh");
935 return;
936 }
937 outfile << lastrefresh << endl << lastrollover;
938
939 outfile.close();
940}
941
942void save_lastrollover()
943{
944 ofstream outfile;
945
946 outfile.open(".gsrollover");
947
948 if (outfile.fail())
949 {
950 log("Error creating new file .gsrollover");
951 return;
952 }
953 outfile << lastrollover << endl;
954 outfile.close();
955}
956void clearItems()
957{
958 list<item*>::iterator iter;
959 for (iter = Items.begin(); iter != Items.end(); iter++)
960 {
961 delete (*iter);
962 Items.erase(iter);
963 }
964}
965void clearClients()
966{
967 list<aClient*>::iterator iter;
968 for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
969 {
970 for (iter = clients[x].begin(); iter != clients[x].end(); iter++)
971 {
972 delete (*iter);
973 clients[x].erase(iter);
974 }
975 }
976}
977
978void clearPlayers()
979{
980 list<Player*>::iterator iter;
981 for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
982 {
983 for (iter = players[x].begin(); iter != players[x].end(); iter++)
984 {
985 delete (*iter);
986 players[x].erase(iter);
987 }
988 }
989}