]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/tcpclient.cpp
Added a new config file directive USE_PRIVMSG and implemented a flag system for confi...
[irc/gameservirc.git] / gameserv / tcpclient.cpp
index e5cfcba6d6ee0915dd81b1e819a3876b17e0bf6b..38274584674987e00f1e077d6aded391d476abc3 100644 (file)
@@ -17,6 +17,7 @@
 #include "list.h"
 #include "aClient.h"
 #include "extern.h"
+#include "flags.h"
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
@@ -36,7 +37,7 @@ using std::cerr;
 using std::endl;
 
 char *PACKAGE = "GameServ";
-char *VERSION = "1.2.0 +devel";
+char *VERSION = "1.2.1 +devel";
 
 int sock;
 int day;
@@ -94,7 +95,7 @@ int main(int argc, char *argv[])
     if (daemon(1,0) < 0)
     {
         perror("Could not turn into a daemon");
-        exit(2);
+        exit(3);
     }
   init_masters();
   load_gs_dbase();
@@ -102,7 +103,17 @@ int main(int argc, char *argv[])
   if (load_monsters() == false)
        goto end;
 
-   shuttingdown = false;
+    shuttingdown = false;
+
+    char ignoreservers[32][256];
+    char *currentserver;
+    currentserver = strtok(ignoreserverslist, " ");
+    for (int server = 0; server < 32 && currentserver != NULL; server++)
+    {
+       strncpy(ignoreservers[server], currentserver, 255);
+       log("Placing %s on the server ignore list", currentserver);
+       currentserver = strtok(NULL, " ");
+    }
 
   strcpy(boss.name, "Red Dragon");
   strcpy(boss.weapon, "Breath of Unholy Fire");
@@ -113,12 +124,14 @@ int main(int argc, char *argv[])
     "dragon's dark flames. You have freed the land of its terror "\
     "filled reign from above!");
 
+
  // 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;
@@ -137,34 +150,34 @@ int main(int argc, char *argv[])
     unload_config_file();
     return -1;
   }
+    log("%S socket connected.");
 
 #ifdef UNREAL
        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 +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 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)
@@ -268,9 +281,8 @@ int main(int argc, char *argv[])
                    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);
+                   oldhv = iHASH((unsigned char *) tempPtr->getNick());
+                   newhv = iHASH((unsigned char *) nick);
                    tempPtr->setNick(nick);
                    clients[oldhv].remove(tempPtr);
                    clients[newhv].insertAtBack(tempPtr);
@@ -306,7 +318,7 @@ int main(int argc, char *argv[])
                    nick = strtok(NULL, " ");
                }
       #endif
-               aClient *newuser;
+               aClient *newuser, *temp;
 
                nick = strtok(NULL, " ");
 
@@ -323,14 +335,41 @@ int main(int argc, char *argv[])
                #else
                    notice(s_GameServ, nick, welcomemsg, nick);
                #endif
-               unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
-               clients[hv].insertAtBack(newuser);
+               #ifdef P10
+                   unsigned long hv = sHASH((unsigned char *) nick)
+               #else
+                   unsigned long hv = iHASH((unsigned char *) nick);
+               #endif
+
+               temp = clients[hv].insertAtBack(newuser);
+
+               #if defined(HYBRID) || defined(BAHAMUT)
+                   char *nickserver;
+                   strtok(NULL, " ");
+                   strtok(NULL, " ");
+                   nickserver = strtok(NULL, " ");
+                   if (nickserver[0] == '+')
+                       strtok(NULL, " ");
+                   strtok(NULL, " ");
+
+                   nickserver = strtok(NULL, " ");
+                   for (int x = 0; x < 32; x++)
+                   {
+                       if (stricmp(ignoreservers[x], nickserver) == 0)
+                       {
+                           setIgnore(temp);
+                           break;
+                       }
+                   }
+               #endif
                delete newuser;
            }
       #if defined(P10)
        } else if (stricmp(cmd, "Q") == 0) {
+//         unsigned long hv = sHASH((unsigned char *) source);
       #else
        } else if (stricmp(cmd, "QUIT") == 0) {
+//         unsigned long hv = iHASH((unsigned char *) source);
       #endif
            aClient *quitter;
            char z = source[0];
@@ -338,7 +377,19 @@ int main(int argc, char *argv[])
            if (z == ':')
                source++;
 
-           unsigned long hv = HASH((unsigned char *) source, U_TABLE_SIZE);
+           if (!(quitter = find(source)))
+           {
+               log("Fatal Error: could not find %s in the "\
+                       "clients list", source);
+               goto end;
+           }
+
+           logout(quitter);
+
+           if (z == ':')
+               source--;
+
+           /* Attempting to use the logout() function
            if ((quitter = find(source)))
                clients[hv].remove(quitter);
            if ((quitter = findIRCplayer(source)))
@@ -362,9 +413,7 @@ int main(int argc, char *argv[])
                #endif
                quitter->stats->client = NULL; // Unidentify them
            }
-
-           if (z == ':')
-               source--;
+           */
 
       #if defined(P10)
        } else if (stricmp(cmd, "P") == 0) {
@@ -381,7 +430,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 && isListenOnCF(configflags))
            {
                delete [] longname;
                forest(source, rest);
@@ -496,7 +545,7 @@ aClient *find(const char *nick)
 aClient *findbyrealnick(char *realnick)
 {
    ListNode <aClient> *newPtr;
-   unsigned long hv = HASH((unsigned char *) realnick, U_TABLE_SIZE);
+   unsigned long hv = sHASH((unsigned char *) realnick);
     newPtr = clients[hv].First();
 
     aClient *client = NULL;
@@ -524,7 +573,12 @@ aClient *findbyrealnick(char *realnick)
 aClient *findbynick(char *nick)
 {
     ListNode <aClient> *newPtr;
-    unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+    #ifdef P10
+       unsigned long hv = sHASH((unsigned char *) nick);
+    #else
+       unsigned long hv = iHASH((unsigned char *) nick);
+    #endif
+
     newPtr = clients[hv].First();
 
     aClient *client = NULL;
@@ -549,7 +603,13 @@ aClient *findIRCplayer(const char *nick)
     ListNode <aClient> *newPtr;
     aClient *p = NULL;
 
-    unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+    p = find(nick);
+
+    if (!is_playing(p))
+       return NULL;
+
+    unsigned long hv = iHASH((unsigned char *) p->stats->name);
+
     for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
     {
        p = newPtr->getData();
@@ -568,7 +628,7 @@ aClient *findplayer(const char *name)
 {
     ListNode <aClient> *newPtr;
     Player *p = NULL;
-    unsigned long hv = HASH((unsigned char *) name, U_TABLE_SIZE);
+    unsigned long hv = iHASH((unsigned char *) name);
     for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
     {
        p = newPtr->getData()->stats;
@@ -600,7 +660,12 @@ void check_idles()
 aClient *findbynick(const char *nick)
 {
     ListNode <aClient> *newPtr;
-    unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+    #ifdef P10
+       unsigned long hv = sHASH((unsigned char *) nick);
+    #else
+       unsigned long hv = iHASH((unsigned char *) nick);
+    #endif
+
     newPtr = clients[hv].First();
 
     aClient *client = NULL;