]> 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 92f0814fb0783c0b3f4f1c0f8fb8b51f71c4a474..4e939d569017f8fbe4153dfb50e9e0e617817f32 100644 (file)
@@ -35,15 +35,15 @@ using std::cerr;
 using std::endl;
 
 char *PACKAGE = "GameServ";
 using std::endl;
 
 char *PACKAGE = "GameServ";
-char *VERSION = "1.2.1 +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();
 
@@ -102,11 +102,27 @@ int main(int argc, char *argv[])
         perror("Could not turn into a daemon");
         exit(3);
     }
         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;
        goto end;
+  }
+
+  if (load_levels() == false)
+  {
+       log("Error loading levels");
+       goto end;
+  }
 
     shuttingdown = false;
 
 
     shuttingdown = false;
 
@@ -120,23 +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 = 1000;
+  boss.name = "Red Dragon";
+  boss.weapon = "Breath of Unholy Fire";
+  boss.strength = 2500;
   boss.gold = 2000000000;
   boss.exp = 2000000000;
   boss.maxhp = 6667;
   boss.hp = 6667;
   boss.gold = 2000000000;
   boss.exp = 2000000000;
   boss.maxhp = 6667;
   boss.hp = 6667;
-  strcpy(boss.death, "You finally snuff out the deadly murderous "\
+  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);
@@ -179,6 +195,14 @@ int main(int argc, char *argv[])
        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("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(P10)
        // Server numeric is: []  <-- must be unique
        raw("PASS :%s", remotepass);
 #elif defined(P10)
        // Server numeric is: []  <-- must be unique
        raw("PASS :%s", remotepass);
@@ -192,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
 
@@ -249,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");
+           }
        }
 
 
        }
 
 
@@ -355,7 +404,7 @@ int main(int argc, char *argv[])
 
                temp = clients[hv].insertAtBack(newuser);
 
 
                temp = clients[hv].insertAtBack(newuser);
 
-               #if defined(HYBRID) || defined(BAHAMUT)
+               #if defined(HYBRID) || defined(BAHAMUT) || defined(ULTIMATE2)
                    char *nickserver;
                    strtok(NULL, " ");
                    strtok(NULL, " ");
                    char *nickserver;
                    strtok(NULL, " ");
                    strtok(NULL, " ");
@@ -363,7 +412,6 @@ 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++)
                    {
                    nickserver = strtok(NULL, " ");
                    for (int x = 0; x < 32; x++)
                    {
@@ -469,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)
@@ -492,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
@@ -543,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>");
@@ -635,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())
     {
@@ -659,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;
     }
@@ -676,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);
@@ -712,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,
@@ -836,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();
+}