]> git.pond.sub.org Git - empserver/commitdiff
Rewrite accounting of play time
authorRon Koenderink <rkoenderink@yahoo.ca>
Sat, 15 Nov 2008 19:08:19 +0000 (13:08 -0600)
committerRon Koenderink <rkoenderink@yahoo.ca>
Sat, 15 Nov 2008 19:08:19 +0000 (13:08 -0600)
Replace daychange() and gettimeleft() by update_timeused_login(),
update_timeused() and enforce_minimum_session_time().  The new
code doesn't assume the day is always 24 hours long which can
occur when transitioning into or out of DST and such.  Logging
in after more a multiple of 128 days now resets nat_timeused
properly.

Fix nat_timeused calculation on midnight rollover to include
the time since midnight.

struct natstr member nat_dayno and struct player member timeleft
are now unused, remove them.

include/nat.h
include/player.h
include/prototypes.h
src/lib/common/nsc.c
src/lib/player/empdis.c
src/lib/player/player.c
src/lib/subs/natsub.c
src/scripts/nightly/patches/All/emptime.c.patch

index 69f74b37f00ea5aeb17c694dfac52bd40d211dd3..1e15fab5b55e561daedede36ba14ac7751f52cb7 100644 (file)
@@ -95,7 +95,6 @@ struct natstr {
     char nat_userid[32];       /* userid of last user, may be empty */
     coord nat_xcap, nat_ycap;  /* cap location in abs coords */
     coord nat_xorg, nat_yorg;  /* origin location in abs coords */
-    signed char nat_dayno;     /* day of the year mod 128 */
     signed char nat_update;    /* Want an update or not. */
     unsigned short nat_tgms;   /* # of telegrams to be announced */
     unsigned short nat_ann;    /* # of annos pending */
index 2d2638e5ca64ed6512c40df3bb0ff63b6a893139..5b5c6f70e1fce75e544ee2d565613b801b40cf90 100644 (file)
@@ -67,8 +67,7 @@ struct player {
     char *argp[128];           /* arguments, ASCII, valid if command */
     char *condarg;             /* conditional, ASCII, valid if command */
     char *comtail[128];                /* start of args in combuf[] */
-    time_t lasttime;           /* when timeleft was last debited */
-    int timeleft;
+    time_t lasttime;           /* when nat_timeused was last updated */
     int btused;
     int god;
     int owner;
index 11c32e391fb7dfee8a2e563e258c87d761c33997..a8036ba57e84cb6df5a1dddb15d8fcb1e905cafc 100644 (file)
@@ -367,8 +367,9 @@ extern int getcommand(char *);
 extern void init_player_commands(void);
 extern void log_last_commands(void);
 extern int gamedown(void);
-extern void daychange(time_t);
-extern int gettimeleft(time_t, int);
+extern void update_timeused_login(time_t now);
+extern void update_timeused(time_t now);
+extern void enforce_minimum_session_time(void);
 /* more under Commands */
 /* empmod.c */
 /* init_nats.c */
index d507e30b858b94d1f6f003c409b57cb826c77895..0efd0e7f878477be831bbbc5b902b9d826b46357 100644 (file)
@@ -563,7 +563,6 @@ struct castr cou_ca[] = {
      EF_BAD, NSC_DEITY | NSC_EXTRA},
     {"yorg", fldoff(nat_yorg), NSC_YCOORD, 0, NULL,
      EF_BAD, NSC_DEITY | NSC_EXTRA},
-    {"dayno", fldoff(nat_dayno), NSC_CHAR, 0, NULL, EF_BAD, 0},
     {"update", fldoff(nat_update), NSC_CHAR, 0, NULL, EF_BAD, 0},
     {"tgms", fldoff(nat_tgms), NSC_USHORT, 0, NULL, EF_BAD, 0},
     {"ann", fldoff(nat_ann), NSC_USHORT, 0, NULL, EF_BAD, 0},
index ce8b7607012c448ce48fbfa874c6928bbbacbaac..4b1eacbe2958708c9fb66c081fa11f60c15f7050 100644 (file)
@@ -213,33 +213,58 @@ gamedown(void)
     return 1;
 }
 
+static int
+seconds_since_midnight(time_t time)
+{
+    struct tm *tm = localtime(&time);
+    time_t midnight;
+
+    tm->tm_hour = 0;
+    tm->tm_min = 0;
+    tm->tm_sec = 0;
+    tm->tm_isdst = -1;
+    midnight = mktime(tm);
+
+    return(time - midnight);
+}
+
 void
-daychange(time_t now)
+update_timeused_login(time_t now)
 {
-    struct natstr *natp;
-    struct tm *tm;
+    struct natstr *natp = getnatp(player->cnum);
+    time_t midnight_secs = seconds_since_midnight(player->lasttime);
 
-    natp = getnatp(player->cnum);
-    tm = localtime(&now);
-    if ((tm->tm_yday % 128) != natp->nat_dayno) {
-       natp->nat_dayno = tm->tm_yday % 128;
+    if (now - natp->nat_last_logout > midnight_secs) {
        natp->nat_timeused = 0;
+       putnat(natp);
     }
+    player->lasttime = now;
 }
 
-int
-gettimeleft(time_t now, int mpd)
+void
+update_timeused(time_t now)
 {
-    struct tm *tm;
-    int nsecleft;
-    struct natstr *natp;
-    int n;
-
-    tm = localtime(&now);
-    natp = getnatp(player->cnum);
-    nsecleft = mpd * 60 - natp->nat_timeused;
-    n = 60 * 60 * 24 - (tm->tm_sec + tm->tm_min * 60 + tm->tm_hour * 3600);
-    if (n < nsecleft)
-       nsecleft = n;
-    return nsecleft;
+    struct natstr *natp = getnatp(player->cnum);
+    time_t midnight_secs = seconds_since_midnight(now);
+    time_t dt = now - player->lasttime;
+
+    if (dt > midnight_secs)
+        natp->nat_timeused = midnight_secs;
+    else
+        natp->nat_timeused += dt;
+    player->lasttime = now;
+    putnat(natp);
+}
+
+void
+enforce_minimum_session_time(void)
+{
+   struct natstr *natp = getnatp(player->cnum);
+
+    time_t dt = natp->nat_last_logout - natp->nat_last_login;
+    if (dt > seconds_since_midnight(natp->nat_last_logout))
+       dt = seconds_since_midnight(natp->nat_last_logout);
+    if (dt < 15)
+       natp->nat_timeused += 15 - dt;
+    putnat(natp);
 }
index 437d374bda01360869bd164b6a521249845d425f..f81e2f029a369fb131b281d2bc1c39edb9690121 100644 (file)
@@ -60,13 +60,12 @@ void
 player_main(struct player *p)
 {
     struct natstr *natp;
-    int secs;
     char buf[128];
 
     p->state = PS_PLAYING;
     player = p;
-    time(&player->lasttime);
     time(&player->curup);
+    update_timeused_login(player->curup);
     show_motd();
     if (init_nats() < 0) {
        pr("Server confused, try again later\n");
@@ -78,8 +77,8 @@ player_main(struct player *p)
        if (natp->nat_stat != STAT_GOD)
            return;
     }
-    daychange(player->curup);
-    if ((player->timeleft = gettimeleft(player->curup, m_m_p_d)) <= 0) {
+    if (natp->nat_stat == STAT_ACTIVE &&
+       natp->nat_timeused > m_m_p_d * 60) {
        pr("Time exceeded today\n");
        return;
     }
@@ -118,14 +117,10 @@ player_main(struct player *p)
     }
     /* #*# I put the following line in to prevent server crash -KHS */
     natp = getnatp(player->cnum);
-    /*
-     * randomly round up to the nearest minute,
-     * charging at least 15 seconds.
-     */
     time(&natp->nat_last_logout);
-    secs = MAX(natp->nat_last_logout - player->lasttime, 15);
-    natp->nat_timeused += secs;
     putnat(natp);
+    update_timeused(natp->nat_last_logout);
+    enforce_minimum_session_time();
     pr("Bye-bye\n");
     journal_logout();
 }
@@ -182,27 +177,7 @@ status(void)
        pr("You are no longer broke!\n");
 
     time(&player->curup);
-    second = player->curup - player->lasttime;
-    if (second > 0) {
-       player->timeleft -= second;
-       if (player->timeleft <= 0) {
-           /*
-            * countdown timer "player->timeleft" has expired.
-            * either day change, or hours restriction
-            */
-           daychange(player->curup);
-           if (!gamehours(player->curup)) {
-               pr("Empire hours restriction in force\n");
-               if (natp->nat_stat != STAT_GOD) {
-                   putnat(natp);
-                   return 0;
-               }
-           }
-           player->timeleft = gettimeleft(player->curup, m_m_p_d);
-       }
-       player->lasttime += second;
-       natp->nat_timeused += second;
-    }
+    update_timeused(player->curup);
     if (natp->nat_stat == STAT_ACTIVE &&
        natp->nat_timeused > m_m_p_d * 60) {
        pr("Max minutes per day limit exceeded.\n");
index 8a676f23394a30a5858830a08674013354650660..04c8e8dc980ac135b92231a6b38a6331799855b2 100644 (file)
@@ -84,7 +84,6 @@ nat_reset(struct natstr *natp, enum nat_status stat, coord x, coord y)
        natp->nat_yorg = 0;
     }
 
-    natp->nat_dayno = 0;
     natp->nat_timeused = 0;
     natp->nat_update = 0;
 
index c13a0cd7a91a6ccf19f723bc5319aff74cbf5b56..bcd607ed87b55ab0fabf91beb615f1b1698b4fc3 100644 (file)
@@ -780,7 +780,7 @@ index 3106849..726b5fc 100644
      return lp;
  }
 diff --git a/src/lib/player/player.c b/src/lib/player/player.c
-index 513382b..4b97be7 100644
+index f81e2f0..a9a1f74 100644
 --- a/src/lib/player/player.c
 +++ b/src/lib/player/player.c
 @@ -40,6 +40,7 @@
@@ -791,18 +791,16 @@ index 513382b..4b97be7 100644
  #include "file.h"
  #include "journal.h"
  #include "misc.h"
-@@ -65,8 +66,8 @@ player_main(struct player *p)
+@@ -64,7 +65,7 @@ player_main(struct player *p)
  
      p->state = PS_PLAYING;
      player = p;
--    time(&player->lasttime);
 -    time(&player->curup);
-+    empire_time(&player->lasttime);
 +    empire_time(&player->curup);
+     update_timeused_login(player->curup);
      show_motd();
      if (init_nats() < 0) {
-       pr("Server confused, try again later\n");
-@@ -100,7 +101,7 @@ player_main(struct player *p)
+@@ -98,7 +99,7 @@ player_main(struct player *p)
      strcpy(natp->nat_hostname, player->hostname);
      strcpy(natp->nat_hostaddr, player->hostaddr);
  
@@ -811,24 +809,24 @@ index 513382b..4b97be7 100644
      putnat(natp);
      journal_login();
      if (natp->nat_flags & NF_INFORM && natp->nat_tgms > 0) {
-@@ -123,7 +124,7 @@ player_main(struct player *p)
-      * randomly round up to the nearest minute,
-      * charging at least 15 seconds.
-      */
+@@ -117,7 +118,7 @@ player_main(struct player *p)
+     }
+     /* #*# I put the following line in to prevent server crash -KHS */
+     natp = getnatp(player->cnum);
 -    time(&natp->nat_last_logout);
 +    empire_time(&natp->nat_last_logout);
-     secs = MAX(natp->nat_last_logout - player->lasttime, 15);
-     natp->nat_timeused += secs;
      putnat(natp);
-@@ -182,7 +183,7 @@ status(void)
+     update_timeused(natp->nat_last_logout);
+     enforce_minimum_session_time();
+@@ -176,7 +177,7 @@ status(void)
      if (!(old_nstat & MONEY) && (player->nstat & MONEY))
        pr("You are no longer broke!\n");
  
 -    time(&player->curup);
 +    empire_time(&player->curup);
-     second = player->curup - player->lasttime;
-     if (second > 0) {
-       player->timeleft -= second;
+     update_timeused(player->curup);
+     if (natp->nat_stat == STAT_ACTIVE &&
+       natp->nat_timeused > m_m_p_d * 60) {
 diff --git a/src/lib/player/recvclient.c b/src/lib/player/recvclient.c
 index ab4ef69..8934189 100644
 --- a/src/lib/player/recvclient.c