]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/tcpclient.cpp
This is a major bugfix for several mistakes made in coding that were
[irc/gameservirc.git] / gameserv / tcpclient.cpp
index 5aa65b3320b829135167730ab8ab6b54e3c1edf4..4e939d569017f8fbe4153dfb50e9e0e617817f32 100644 (file)
 //#include <sys/wait.h>
 //#include <errno.h>
 
 //#include <sys/wait.h>
 //#include <errno.h>
 
-
-
 using std::ofstream;
 using std::ifstream;
 using std::cerr;
 using std::endl;
 
 char *PACKAGE = "GameServ";
 using std::ofstream;
 using std::ifstream;
 using std::cerr;
 using std::endl;
 
 char *PACKAGE = "GameServ";
-char *VERSION = "1.2.0 +devel";
+char *VERSION = "1.2.4 +devel";
 
 int sock;
 
 int sock;
-int day;
+long lastrefresh;
 
 List<aClient> clients[U_TABLE_SIZE];
 
 
 List<aClient> clients[U_TABLE_SIZE];
 
-void save_day();
-void load_day();
+void save_lastrefresh();
+void load_lastrefresh();
 void prettyIntro();
 void check_idles();
 
 void prettyIntro();
 void check_idles();
 
@@ -57,11 +55,15 @@ void closeall(int fd);
 
 int main(int argc, char *argv[])
 {
 
 int main(int argc, char *argv[])
 {
-  char buffer[1024], buf[1024];
-  int connected;
-  long lastidlecheck;
-  char *cmd, *source = NULL, *conf = "gameserv.conf";
-  srand(time(NULL));
+    char buffer[1024], buf[1024];
+    memset(buffer, 0, 1024);
+    memset(buf, 0, 1024);
+    int connected;
+    long lastidlecheck;
+    char *cmd, *source = NULL, *conf;
+    srand(time(NULL));
+    conf = new char[16];
+    strcpy(conf, "gameserv.conf");
 
   /*
    * This needs to be fixed to work for any number of arguments in any
 
   /*
    * This needs to be fixed to work for any number of arguments in any
@@ -77,8 +79,8 @@ int main(int argc, char *argv[])
            cout << "--help                        Displays this help dialogue" << endl;
            return 1;
        }
            cout << "--help                        Displays this help dialogue" << endl;
            return 1;
        }
-       conf = new char[strlen(argv[1])];
-       strcpy(conf, argv[1]);
+       delete []conf;
+       conf = argv[1];
   }
 
   prettyIntro();
   }
 
   prettyIntro();
@@ -91,17 +93,36 @@ int main(int argc, char *argv[])
   else
        exit(2);
 
   else
        exit(2);
 
+    if (argc <= 1)
+       delete []conf;
+
     // Turn into a daemon
     if (daemon(1,0) < 0)
     {
         perror("Could not turn into a daemon");
         exit(3);
     }
     // Turn into a daemon
     if (daemon(1,0) < 0)
     {
         perror("Could not turn into a daemon");
         exit(3);
     }
-  init_masters();
+
   load_gs_dbase();
   load_gs_dbase();
+  loadNews(newsdata, todaysnews);
+
+  if (load_masters() == false)
+  {
+       log("Error loading masters");
+       goto end;
+  }
 
   if (load_monsters() == false)
 
   if (load_monsters() == false)
+  {
+       log("Error loading monsters");
+       goto end;
+  }
+
+  if (load_levels() == false)
+  {
+       log("Error loading levels");
        goto end;
        goto end;
+  }
 
     shuttingdown = false;
 
 
     shuttingdown = false;
 
@@ -115,21 +136,23 @@ int main(int argc, char *argv[])
        currentserver = strtok(NULL, " ");
     }
 
        currentserver = strtok(NULL, " ");
     }
 
-  strcpy(boss.name, "Red Dragon");
-  strcpy(boss.weapon, "Breath of Unholy Fire");
-  boss.strength = 6667;
+  boss.name = "Red Dragon";
+  boss.weapon = "Breath of Unholy Fire";
+  boss.strength = 2500;
   boss.gold = 2000000000;
   boss.exp = 2000000000;
   boss.gold = 2000000000;
   boss.exp = 2000000000;
-  strcpy(boss.death, "You finally snuff out the deadly murderous "\
+  boss.maxhp = 6667;
+  boss.hp = 6667;
+  boss.death = "You finally snuff out the deadly murderous "\
     "dragon's dark flames. You have freed the land of its terror "\
     "dragon's dark flames. You have freed the land of its terror "\
-    "filled reign from above!");
+    "filled reign from above!";
 
 
  // This loop will retry the connection 3 times
  for (int retry = 0; retry < 3 && !shuttingdown; retry++)
  {
     connected = 1;
 
 
  // This loop will retry the connection 3 times
  for (int retry = 0; retry < 3 && !shuttingdown; retry++)
  {
     connected = 1;
-    load_day();
+    load_lastrefresh();
 
 
     long int loadtime = time(NULL);
 
 
     long int loadtime = time(NULL);
@@ -156,27 +179,36 @@ int main(int argc, char *argv[])
        raw("PROTOCTL NICKv2 VHP");
        raw("PASS :%s", remotepass);
        raw("SERVER %s 1 :%s", servername, servername);
        raw("PROTOCTL NICKv2 VHP");
        raw("PASS :%s", remotepass);
        raw("SERVER %s 1 :%s", servername, servername);
-       raw("NICK %S 1 %d %S %s %s %d +wghraAxNt %s :%s v%s", time(NULL), gshost, 
-               servername, time(NULL), gshost, PACKAGE, VERSION);
+       raw("NICK %S 1 %d %S %s %s %d +w%s %s :%s v%s", time(NULL), gshost, 
+               servername, time(NULL), (isBOper() ? "o" : ""), gshost, 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(":%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 0 :GameServ", time(NULL), gsident, gshost
-               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(":%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 :GameServ", time(NULL), gsident, gshost,
-               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);
        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(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);
 #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("[] 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
 
        raw("[] B %s %d +tn %s:o", c_Forest, time(NULL) - 864000, gsnum);
 #endif
 
@@ -184,9 +216,14 @@ int main(int argc, char *argv[])
        raw("%s T %s :%s", gsnum, c_Forest, c_ForestTopic);
        raw("[] EB");  // End burst
 #else 
        raw("%s T %s :%s", gsnum, c_Forest, c_ForestTopic);
        raw("[] EB");  // End burst
 #else 
-#ifndef HYBRID
-       raw(":%S MODE %s +o %S", c_Forest);
-#endif
+    #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
 
        raw(":%S TOPIC %s :%s", c_Forest, c_ForestTopic);
 #endif
 
@@ -241,13 +278,33 @@ int main(int argc, char *argv[])
            }
        }
 
            }
        }
 
+       // Refresh players and clear news if the time is up
+       currentTime = time(NULL);
+       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
        currentTime = time(NULL);
        if (currentTime - oldTime >= updateperiod)
        {
            oldTime = currentTime;
            log("Saving to %s", playerdata);
        // Save the player data every updateperiod seconds
        currentTime = time(NULL);
        if (currentTime - oldTime >= updateperiod)
        {
            oldTime = currentTime;
            log("Saving to %s", playerdata);
+
            save_gs_dbase();
            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");
+           }
        }
 
 
        }
 
 
@@ -330,20 +387,24 @@ int main(int argc, char *argv[])
 
 
                if (loaded)
 
 
                if (loaded)
+
+               if (isWelcome())
+               {
+                   #ifdef P10
+                       notice(s_GameServ, nick, welcomemsg, realnick);
+                   #else
+                       notice(s_GameServ, nick, welcomemsg, nick);
+                   #endif
+               }
                #ifdef P10
                #ifdef P10
-                   notice(s_GameServ, nick, welcomemsg, realnick);
-               #else
-                   notice(s_GameServ, nick, welcomemsg, nick);
-               #endif
-               #ifdef P10
-                   unsigned long hv = sHASH((unsigned char *) nick)
+                   unsigned long hv = sHASH((unsigned char *) nick);
                #else
                    unsigned long hv = iHASH((unsigned char *) nick);
                #endif
 
                temp = clients[hv].insertAtBack(newuser);
 
                #else
                    unsigned long hv = iHASH((unsigned char *) nick);
                #endif
 
                temp = clients[hv].insertAtBack(newuser);
 
-               #ifdef HYBRID
+               #if defined(HYBRID) || defined(BAHAMUT) || defined(ULTIMATE2)
                    char *nickserver;
                    strtok(NULL, " ");
                    strtok(NULL, " ");
                    char *nickserver;
                    strtok(NULL, " ");
                    strtok(NULL, " ");
@@ -351,7 +412,21 @@ int main(int argc, char *argv[])
                    if (nickserver[0] == '+')
                        strtok(NULL, " ");
                    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;
+                       }
+                   }
+               #elif defined(UNREAL)
+                   char *nickserver;
+                   strtok(NULL, " ");
+                   strtok(NULL, " ");
+                   strtok(NULL, " ");
+                   strtok(NULL, " ");
                    nickserver = strtok(NULL, " ");
                    for (int x = 0; x < 32; x++)
                    {
                    nickserver = strtok(NULL, " ");
                    for (int x = 0; x < 32; x++)
                    {
@@ -366,10 +441,10 @@ int main(int argc, char *argv[])
            }
       #if defined(P10)
        } else if (stricmp(cmd, "Q") == 0) {
            }
       #if defined(P10)
        } else if (stricmp(cmd, "Q") == 0) {
-           unsigned long hv = sHASH((unsigned char *) source);
+//         unsigned long hv = sHASH((unsigned char *) source);
       #else
        } else if (stricmp(cmd, "QUIT") == 0) {
       #else
        } else if (stricmp(cmd, "QUIT") == 0) {
-           unsigned long hv = iHASH((unsigned char *) source);
+//         unsigned long hv = iHASH((unsigned char *) source);
       #endif
            aClient *quitter;
            char z = source[0];
       #endif
            aClient *quitter;
            char z = source[0];
@@ -430,7 +505,7 @@ int main(int argc, char *argv[])
                delete [] longname;
                gameserv(source, rest);
            }
                delete [] longname;
                gameserv(source, rest);
            }
-           else if (stricmp(dest, c_Forest) == 0 && listenonc_forest)
+           else if (stricmp(dest, c_Forest) == 0 && isListenOnCF())
            {
                delete [] longname;
                forest(source, rest);
            {
                delete [] longname;
                forest(source, rest);
@@ -442,7 +517,7 @@ int main(int argc, char *argv[])
            rest = strtok(NULL, "");
            if (strnicmp(dest, s_GameServ, strlen(s_GameServ)) == 0)
                gameserv(source, rest);
            rest = strtok(NULL, "");
            if (strnicmp(dest, s_GameServ, strlen(s_GameServ)) == 0)
                gameserv(source, rest);
-           else if (stricmp(dest, c_Forest) == 0)
+           else if (stricmp(dest, c_Forest) == 0 && isListenOnCF())
                forest(source, rest);
       #endif
       #if defined(P10)
                forest(source, rest);
       #endif
       #if defined(P10)
@@ -465,7 +540,7 @@ int main(int argc, char *argv[])
            {
                #ifdef DEBUGMODE
                    log("Player %s (IRC: %s) joined %s", 
            {
                #ifdef DEBUGMODE
                    log("Player %s (IRC: %s) joined %s", 
-                       joiner->stats->name, 
+                       joiner->stats->name.c_str()
                        #ifdef P10
                            joiner->getRealNick(),
                        #else
                        #ifdef P10
                            joiner->getRealNick(),
                        #else
@@ -516,10 +591,9 @@ int main(int argc, char *argv[])
   end:
 
   save_gs_dbase();
   end:
 
   save_gs_dbase();
-  save_day();
+  saveNews(newsdata, todaysnews);
 
   delete_monsters();
 
   delete_monsters();
-  delete_masters();
 
   #ifdef DEBUGMODE
       log("<CLOSED>");
 
   #ifdef DEBUGMODE
       log("<CLOSED>");
@@ -608,7 +682,7 @@ aClient *findIRCplayer(const char *nick)
     if (!is_playing(p))
        return NULL;
 
     if (!is_playing(p))
        return NULL;
 
-    unsigned long hv = iHASH((unsigned char *) p->stats->name);
+    unsigned long hv = iHASH((unsigned char *) p->stats->name.c_str());
 
     for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
     {
 
     for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
     {
@@ -632,7 +706,7 @@ aClient *findplayer(const char *name)
     for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
     {
        p = newPtr->getData()->stats;
     for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
     {
        p = newPtr->getData()->stats;
-       if (stricmp(p->name, name) == 0)
+       if (stricmp(p->name.c_str(), name) == 0)
            return newPtr->getData();
        p = NULL;
     }
            return newPtr->getData();
        p = NULL;
     }
@@ -649,6 +723,26 @@ void check_idles()
        for (newPtr = players[x].First(); newPtr; newPtr = newPtr->Next())
        {
            p = newPtr->getData()->stats;
        for (newPtr = players[x].First(); newPtr; newPtr = newPtr->Next())
        {
            p = newPtr->getData()->stats;
+           switch(p->level)
+           {
+               case 1:
+               if ((time(NULL) - p->lastlogin) / 86400 >= level1expire)
+               {
+                   logout(newPtr->getData());
+                   players[x].remove(newPtr->getData());
+                   return;
+               }
+                   break;
+
+               default:
+               if ((time(NULL) - p->lastlogin) / 86400 >= defaultexpire)
+               {
+                   logout(newPtr->getData());
+                   players[x].remove(newPtr->getData());
+                   return;
+               }
+                   break;
+           }
            if (timedOut(p))
            {
                timeOutEvent(p);
            if (timedOut(p))
            {
                timeOutEvent(p);
@@ -685,56 +779,6 @@ aClient *findbynick(const char *nick)
     return client;    
 }
 
     return client;    
 }
 
-void load_day()
-{
-    ifstream infile;
-
-    infile.open(".gsday");
-
-    if (infile.fail())
-    {
-       #ifdef DEBUGMODE
-           log("Error opening .gsday");
-       #endif
-
-       generate:
-        #ifdef DEBUGMODE
-           log("Generating new day");
-       #endif
-       struct tm *tm;
-       time_t ti;
-       time(&ti);
-       tm = localtime(&ti);
-
-       day = tm->tm_mday;
-
-        save_day();
-       return;
-    }
-
-    infile >> day;
-    infile.close();
-    if (day < 1 || day > 31)
-       goto generate;
-}
-
-void save_day()
-{
-    ofstream outfile;
-
-    outfile.open(".gsday");
-
-    if (outfile.fail())
-    {
-       log("Error creating new file .gsday");
-       return;
-    }
-
-    outfile << day << endl;
-
-    outfile.close();
-}
-
 /* daemon() - detach process from user and disappear into the background
  * returns -1 on failure, but you can't do much except exit in that case
  * since we may already have forked. This is based on the BSD version,
 /* daemon() - detach process from user and disappear into the background
  * returns -1 on failure, but you can't do much except exit in that case
  * since we may already have forked. This is based on the BSD version,
@@ -809,3 +853,51 @@ cout << "G     G  AA   AA MM    MM EEEEEEE  SSSSS  EEEEEEE RR   RR    VVV" << en
 cout << " GGGGG                                                        V\n\n" << endl;
 cout << "Version: " << VERSION << endl;
 }
 cout << " GGGGG                                                        V\n\n" << endl;
 cout << "Version: " << VERSION << endl;
 }
+
+void load_lastrefresh()
+{
+    ifstream infile;
+    infile.open(".gsrefresh");
+    if (infile.fail())
+    {
+       #ifdef DEBUGMODE
+           log("Error opening .gsrefresh");
+       #endif
+
+       generate:
+       long mytime = time(NULL);
+       #ifdef DEBUGMODE
+           log("Generating new refresh time");
+       #endif
+
+       // Just a safety measure... tho no one should
+       // get anywhere near the time as their refreshperiod
+       if (refreshperiod >= mytime)
+           refreshperiod = 86400;
+
+       lastrefresh = mytime - (mytime % refreshperiod);
+       refreshall();
+       save_lastrefresh();
+       return;
+    }
+    infile >> lastrefresh;
+    infile.close();
+    if (lastrefresh < 0)
+       goto generate;
+}
+
+void save_lastrefresh()
+{
+    ofstream outfile;
+
+    outfile.open(".gsrefresh");
+
+    if (outfile.fail())
+    {
+       log("Error creating new file .gsrefresh");
+       return;
+    }
+    outfile << lastrefresh << endl;
+
+    outfile.close();
+}