]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/tcpclient.cpp
New config file directive listenonc_forest
[irc/gameservirc.git] / gameserv / tcpclient.cpp
index 69d5dd768fa523e884102b4bac66595a7c772843..7e92d58d0e747d98ccce75cd4846dd6d80ec1752 100644 (file)
@@ -41,11 +41,12 @@ char *VERSION = "1.2.0 +devel";
 int sock;
 int day;
 
-List<aClient> clients;
+List<aClient> clients[U_TABLE_SIZE];
 
 void save_day();
 void load_day();
 void prettyIntro();
+void check_idles();
 
 // Make this a daemon
 int daemon(int nochdir, int noclose);
@@ -56,7 +57,8 @@ void closeall(int fd);
 int main(int argc, char *argv[])
 {
   char buffer[1024], buf[1024];
-  int connected = 1;
+  int connected;
+  long lastidlecheck;
   char *cmd, *source = NULL, *conf = "gameserv.conf";
   srand(time(NULL));
 
@@ -94,11 +96,44 @@ int main(int argc, char *argv[])
         perror("Could not turn into a daemon");
         exit(2);
     }
+  init_masters();
+  load_gs_dbase();
+
+  if (load_monsters() == false)
+       goto end;
+
+   shuttingdown = false;
+
+  strcpy(boss.name, "Red Dragon");
+  strcpy(boss.weapon, "Breath of Unholy Fire");
+  boss.strength = 6667;
+  boss.gold = 2000000000;
+  boss.exp = 2000000000;
+  strcpy(boss.death, "You finally snuff out the deadly murderous "\
+    "dragon's dark flames. You have freed the land of its terror "\
+    "filled reign from above!");
 
-  ignore_pipe();
-  sock = make_connection(remoteport, SOCK_STREAM, remoteserver);
-  if (sock == -1) {
-    fprintf(stderr,"make_connection failed.\n");
+ // This loop will retry the connection 3 times
+ for (int retry = 0; retry < 3 && !shuttingdown; retry++)
+ {
+    connected = 1;
+    load_day();
+
+    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 = make_connection(remoteport, SOCK_STREAM, remoteserver);
+    if (sock == -1) {
+       fprintf(stderr,"make_connection failed.\n");
     unload_config_file();
     return -1;
   }
@@ -107,29 +142,28 @@ int main(int argc, char *argv[])
        raw("PROTOCTL NICKv2 VHP");
        raw("PASS :%s", remotepass);
        raw("SERVER %s 1 :%s", servername, servername);
-       raw("NICK %S 1 %d %S %s %s %d +owghraAxNt %s :%s v%s", time(NULL), gshost, 
+       raw("NICK %S 1 %d %S %s %s %d +wghraAxNt %s :%s v%s", time(NULL), gshost, 
                servername, time(NULL), gshost, PACKAGE, VERSION);
        raw(":%S JOIN %s", c_Forest);
-       raw(":%S MODE %s +mtn", 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 +o %s %s %s 0 :GameServ", time(NULL), gsident, gshost, 
+        raw("NICK %S 1 %d +w %s %s %s 0 :GameServ", time(NULL), gsident, gshost, 
                servername);
-       raw(":%s SJOIN %d %d %s +mnt :@%S", servername, time(NULL), time(NULL), c_Forest);
+       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 +o %s %s %s :GameServ", time(NULL), gsident, gshost,
+       raw("NICK %S 1 %d +w %s %s %s :GameServ", time(NULL), gsident, gshost,
                servername);
-       // Sending a timestamp of 1 to force ops.
-       raw(":%s SJOIN 1 %s +ntm :@%S", servername, c_Forest);
+       raw(":%s SJOIN %ld %s +ntm :@%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 DAqAoB %s :%S", time(NULL), gsident, gshost, gsnum);
-       raw("[] B %s %d +tnm %s:o", c_Forest, time(NULL) - 864000, gsnum);
+       raw("[] B %s %d +tn %s:o", c_Forest, time(NULL) - 864000, gsnum);
 #endif
 
 #if defined(P10)
@@ -151,26 +185,6 @@ int main(int argc, char *argv[])
       log("Server: %s",buffer);
   #endif
 
-  strcpy(boss.name, "Red Dragon");
-  strcpy(boss.weapon, "Breath of Unholy Fire");
-  boss.strength = 6667;
-  boss.gold = 2000000000;
-  boss.exp = 2000000000;
-  strcpy(boss.death, "You finally snuff out the deadly murderous "\
-    "dragon's dark flames. You have freed the land of its terror "\
-    "filled reign from above!");
-
-  init_masters();
-  load_gs_dbase();
-  load_day();
-  long int loadtime = time(NULL);
-  long int currentTime;
-  long int oldTime = loadtime;
-  bool loaded = false;
-
-  if (load_monsters() == false)
-       goto end;
-
   while (connected) {
       if (sock_gets(sock,buffer,sizeof(buffer)) == -1) {
         connected = 0;
@@ -198,7 +212,19 @@ int main(int argc, char *argv[])
         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;
+           }
        }
 
        // Save the player data every updateperiod seconds
@@ -206,6 +232,7 @@ int main(int argc, char *argv[])
        if (currentTime - oldTime >= updateperiod)
        {
            oldTime = currentTime;
+           log("Saving to %s", playerdata);
            save_gs_dbase();
        }
 
@@ -238,8 +265,14 @@ int main(int argc, char *argv[])
                if ((tempPtr = find((source + 1))))
                {
                    char *nick;
+                   unsigned long oldhv, newhv;
                    nick = strtok(NULL, " ");
+                   oldhv = HASH((unsigned char *) tempPtr->getNick(),
+                               U_TABLE_SIZE);
+                   newhv = HASH((unsigned char *) nick, U_TABLE_SIZE);
                    tempPtr->setNick(nick);
+                   clients[oldhv].remove(tempPtr);
+                   clients[newhv].insertAtBack(tempPtr);
                }
            }
            else
@@ -289,8 +322,8 @@ int main(int argc, char *argv[])
                #else
                    notice(s_GameServ, nick, welcomemsg, nick);
                #endif
-
-               clients.insertAtBack(newuser);
+               unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+               clients[hv].insertAtBack(newuser);
                delete newuser;
            }
       #if defined(P10)
@@ -304,8 +337,9 @@ int main(int argc, char *argv[])
            if (z == ':')
                source++;
 
+           unsigned long hv = HASH((unsigned char *) source, U_TABLE_SIZE);
            if ((quitter = find(source)))
-               clients.remove(quitter);
+               clients[hv].remove(quitter);
            if ((quitter = findIRCplayer(source)))
            {
                if (player_fight(quitter))
@@ -321,11 +355,11 @@ int main(int argc, char *argv[])
                quitter->stats->fight = NULL;
                quitter->stats->master = NULL;
 
-               quitter->setNick("!NULL!");
+               quitter->setNick("Not Playing");
                #ifdef P10
-                   quitter->setRealNick("!NULL!");
+                   quitter->setRealNick("Not Playing");
                #endif
-               quitter->stats->user = NULL; // Unidentify them
+               quitter->stats->client = NULL; // Unidentify them
            }
 
            if (z == ':')
@@ -346,7 +380,7 @@ int main(int argc, char *argv[])
                delete [] longname;
                gameserv(source, rest);
            }
-           else if (stricmp(dest, c_Forest) == 0)
+           else if (stricmp(dest, c_Forest) == 0 && listenonc_forest)
            {
                delete [] longname;
                forest(source, rest);
@@ -427,6 +461,8 @@ int main(int argc, char *argv[])
        }
   }
 
+ } // for loop for connection retry
+
   end:
 
   save_gs_dbase();
@@ -459,7 +495,8 @@ aClient *find(const char *nick)
 aClient *findbyrealnick(char *realnick)
 {
    ListNode <aClient> *newPtr;
-    newPtr = clients.First();
+   unsigned long hv = HASH((unsigned char *) realnick, U_TABLE_SIZE);
+    newPtr = clients[hv].First();
 
     aClient *client = NULL;
 
@@ -486,7 +523,8 @@ aClient *findbyrealnick(char *realnick)
 aClient *findbynick(char *nick)
 {
     ListNode <aClient> *newPtr;
-    newPtr = clients.First();
+    unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+    newPtr = clients[hv].First();
 
     aClient *client = NULL;
 
@@ -510,7 +548,8 @@ aClient *findIRCplayer(const char *nick)
     ListNode <aClient> *newPtr;
     aClient *p = NULL;
 
-    for (newPtr = players.First(); newPtr; newPtr = newPtr->Next())
+    unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+    for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
     {
        p = newPtr->getData();
        #ifdef P10
@@ -523,12 +562,13 @@ aClient *findIRCplayer(const char *nick)
     }
     return NULL;
 }
+
 aClient *findplayer(const char *name)
 {
     ListNode <aClient> *newPtr;
     Player *p = NULL;
-
-    for (newPtr = players.First(); newPtr; newPtr = newPtr->Next())
+    unsigned long hv = HASH((unsigned char *) name, U_TABLE_SIZE);
+    for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
     {
        p = newPtr->getData()->stats;
        if (stricmp(p->name, name) == 0)
@@ -538,10 +578,29 @@ aClient *findplayer(const char *name)
     return NULL;
 }
 
+void check_idles()
+{
+    ListNode <aClient> *newPtr;
+    Player *p = NULL;
+
+    for (int x = 0; x < U_TABLE_SIZE; x++)
+    {
+       for (newPtr = players[x].First(); newPtr; newPtr = newPtr->Next())
+       {
+           p = newPtr->getData()->stats;
+           if (timedOut(p))
+           {
+               timeOutEvent(p);
+           }
+       }
+    }
+}
+
 aClient *findbynick(const char *nick)
 {
     ListNode <aClient> *newPtr;
-    newPtr = clients.First();
+    unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+    newPtr = clients[hv].First();
 
     aClient *client = NULL;