+ connected = 1;
+ load_lastrefresh();
+ load_lastrollover();
+
+ long int loadtime = time(NULL);
+ long int currentTime;
+ long int oldTime = loadtime;
+
+ lastidlecheck = loadtime;
+
+#ifdef DEBUGMODE
+ log("Setting primary Idle Check timestamp: %ld", lastidlecheck);
+#endif
+ bool loaded = false;
+
+ ignore_pipe();
+ sock = conn(remoteserver, remoteport, localhost, 0);
+ // sock = make_connection(remoteport, SOCK_STREAM, remoteserver);
+ if (sock == -1)
+ {
+ fprintf(stderr,"make_connection failed.\n");
+ unload_config_file();
+ return -1;
+ }
+ log("%S socket connected.");
+
+#ifdef UNREAL
+ raw("PASS :%s", remotepass);
+ raw("SERVER %s 1 :%s", servername, servername);
+ raw("NICK %S 1 %d %s %s %s %d :%s v%s", time(NULL), gsident, gshost,
+ servername, time(NULL), PACKAGE, VERSION);
+ raw(":%S JOIN %s", c_Forest);
+ raw(":%S MODE %s +tn", c_Forest);
+#elif defined(BAHAMUT)
+ raw("PASS %s :TS", remotepass);
+ raw("SERVER %s 1 :%s", servername, servername);
+ raw("NICK %S 1 %d +w%s %s %s %s 0 :GameServ", time(NULL), (isBOper() ? "o" : ""),
+ gsident, gshost, servername);
+ raw(":%s SJOIN %d %d %s +nt :@%S", servername, time(NULL), time(NULL), c_Forest);
+#elif defined(HYBRID)
+ raw("PASS %s :TS", remotepass);
+ raw("SERVER %s 1 :%s", servername, servername);
+ raw("NICK %S 1 %d +w%s %s %s %s :GameServ", time(NULL), (isBOper() ? "o" : ""),
+ gsident, gshost, servername);
+ raw(":%s SJOIN %ld %s +nt :@%S", servername, time(NULL), c_Forest);
+#elif defined(ULTIMATE2)
+ raw("PASS %s :TS", remotepass);
+ raw("SERVER %s 1 :%s", servername, servername);
+ raw("NICK %S 1 %d %s %s %s 0 :GameServ",
+ time(NULL), gsident, gshost, servername);
+ if (isBOper())
+ raw(":%S mode %S +o");
+ raw(":%S JOIN %s", c_Forest);
+#elif defined(PTLINK)
+ raw("PASS %s :TS", remotepass);
+ raw("SERVER %s 1 :%s", servername, servername);
+ raw("NICK %S 1 %d %s%s %s %s %s :GameServ", time(NULL), (isBOper() ? "+iow " : ""), gsident, gshost, gshost, servername);
+ raw(":%s SJOIN %d %s +nt :@%S", servername, time(NULL), c_Forest);
+#elif defined(P10)
+ // Server numeric is: [] <-- must be unique
+ raw("PASS :%s", remotepass);
+ raw("SERVER %s 1 %d %d P10 []AAF :%s", servername, time(NULL), time(NULL), servername);
+ raw("[] N %S 1 %d %s %s %s DAqAoB %s :%S", time(NULL), gsident, gshost,
+ (isBOper() ? "+o" : ""), gsnum);
+ raw("[] B %s %d +tn %s:o", c_Forest, time(NULL) - 864000, gsnum);
+#endif
+
+#if defined(P10)
+ raw("%s T %s :%s", gsnum, c_Forest, c_ForestTopic);
+ raw("[] EB"); // End burst
+#else
+#ifndef HYBRID
+#if defined(ULTIMATE2)
+ raw(":%s MODE %s +o %S %ld", servername, c_Forest,
+ time(NULL));
+#else
+ raw(":%S MODE %s +o %S", c_Forest);
+#endif
+#endif
+ raw(":%S TOPIC %s :%s", c_Forest, c_ForestTopic);
+#endif
+
+#ifndef P10
+ if (isUseNickServ())
+ {
+ raw(":%S PRIVMSG %s :IDENTIFY %s", nsname, nspass);
+ }
+#endif
+ sock_gets(sock,buffer,sizeof(buffer)-1); /* -1 added thanks to
+ David Duchene <dave@ltd.com> for pointing out the possible
+ buffer overflow resulting from the linefeed added below. */
+
+
+#ifdef DEBUGMODE
+ log("Server: %s",buffer);
+#endif
+
+ while (connected)
+ {
+ if (sock_gets(sock,buffer,sizeof(buffer)) == -1)
+ {
+ connected = 0;
+ }
+ strcpy(buf, buffer);
+
+#if !defined(P10)
+ if (buffer[0] == ':')
+ {
+ source = strtok(buf, " ");
+ cmd = strtok(NULL, " ");
+ }
+ else
+ {
+ cmd = strtok(buf, " ");
+ }
+#else
+ source = strtok(buf, " ");
+ cmd = strtok(NULL, " ");
+#endif
+
+#ifdef DEBUGMODE
+ log("Server: %s", buffer);
+#endif
+
+ // Wait N seconds then we're loaded.
+ if (!loaded)
+ {
+ if (time(NULL) >= welcomedelay + loadtime)
+ {
+ loaded = true;
+ retry = 0; // Start the reconnection cycle over
+ }
+ }
+ else
+ {
+ long TIME = time(NULL);
+ if (TIME - lastidlecheck >= idlecheckperiod)
+ {
+ check_idles();
+ lastidlecheck = TIME;
+ }
+ }
+
+ // Refresh players and clear news if the time is up
+ currentTime = time(NULL);
+
+ if (isRolloverForestFights())
+ {
+ if (currentTime - lastrollover >= rolloverperiod)
+ {
+ rolloverall();
+ lastrollover = currentTime;
+ save_lastrollover();
+ notice(s_GameServ, c_Forest, "Adding %d forest fights to all players!", numrolloverfights);
+ }
+ }
+
+ if (currentTime - lastrefresh >= refreshperiod)
+ {
+ refreshall();
+ clearNews(todaysnews);
+ saveNews(newsdata, todaysnews);
+ lastrefresh = currentTime;
+ save_lastrefresh();
+ notice(s_GameServ, c_Forest, "Refreshing all players "\
+ "and resetting news!");
+ }
+
+ // Save the player data every updateperiod seconds
+ if (currentTime - oldTime >= updateperiod)
+ {
+ oldTime = currentTime;
+ log("Saving to %s", playerdata);
+
+ save_gs_dbase();
+ saveNews(newsdata, todaysnews);
+ if (isSavedNotice())
+ {
+ // Send notice to the channel of the update
+ notice(s_GameServ, c_Forest, "%S player data saved");
+ }
+ }
+
+
+#if !defined(P10)
+ if (stricmp(cmd, "PING") == 0)
+ {
+ char *timestamp;
+ timestamp = strtok(NULL, "");
+ raw("PONG %s", timestamp);
+ }
+#else
+ // P10 Ping
+ if (stricmp(cmd, "G") == 0)
+ {
+ char *timestamp;
+ timestamp = strtok(NULL, " ");
+ raw("[] Z [] %s 0 %s", timestamp + 1, timestamp);
+ }
+#endif
+#ifdef P10
+ else if (stricmp(cmd, "EB") == 0)
+ {
+ raw("[] EA");
+ }
+#endif
+ else if (stricmp(cmd, "VERSION") == 0)
+ {
+ char *server;
+ server = strtok(NULL, " ");
+ server++;
+ raw(":%s 351 %s %s_%s. %s", servername, source+1, PACKAGE, VERSION, servername);
+ }
+ // Code indenting is clean up until here!
+#if !defined(P10)
+ else if (strncmp(cmd, "NICK", 4) == 0)
+ {
+ if (buffer[0] == ':')
+ {
+ aClient *tempPtr;
+ if ((tempPtr = find((source + 1))))
+ {
+ char *nick;
+ unsigned long oldhv, newhv;
+ nick = strtok(NULL, " ");
+ oldhv = iHASH((unsigned char *) tempPtr->getNick());
+ newhv = iHASH((unsigned char *) nick);
+ tempPtr->setNick(nick);
+ clients[oldhv].remove(tempPtr);
+ clients[newhv].push_back(tempPtr);
+ }
+ }
+ else
+ {
+ char *nick;
+#else
+ } else if (stricmp(cmd, "N") == 0 && strlen(source) == 2) {
+ {
+ char *nick, *realnick;
+ realnick = strtok(NULL, " ");
+
+ for (int x = 0; x < 5; x++)
+ nick = strtok(NULL, " ");
+
+ if (nick[0] == '+')