Explorar o código

Update db so you set the username and done.

It makes it easier to use the database.
We verify this by having the last_call time_t
value stored in the database.  We can tell you
how many days/hours/minutes since your last
door usage.
Steve Thielemann %!s(int64=4) %!d(string=hai) anos
pai
achega
0c0352d652
Modificáronse 3 ficheiros con 51 adicións e 15 borrados
  1. 4 4
      db.cpp
  2. 10 5
      db.h
  3. 37 6
      main.cpp

+ 4 - 4
db.cpp

@@ -18,8 +18,9 @@ settings(username TEXT, setting TEXT, value TEXT, \
 PRIMARY KEY(username, setting));");
 }
 
-std::string DBData::getSetting(const std::string &user,
-                               const std::string &setting,
+void DBData::setUser(std::string currentUser) { user = currentUser; }
+
+std::string DBData::getSetting(const std::string &setting,
                                std::string ifMissing) {
   SQLite::Statement query(
       db, "SELECT value FROM settings WHERE username=? AND setting=?");
@@ -33,8 +34,7 @@ std::string DBData::getSetting(const std::string &user,
   return ifMissing;
 }
 
-void DBData::setSetting(const std::string &user, const std::string &setting,
-                        const std::string &value) {
+void DBData::setSetting(const std::string &setting, const std::string &value) {
   SQLite::Statement stmt(
       db, "REPLACE INTO settings(username, setting, value) VALUES(?,?,?);");
   stmt.reset();

+ 10 - 5
db.h

@@ -6,15 +6,20 @@
 class DBData {
   SQLite::Database db;
   void init(void);
+  std::string user;
 
 public:
   DBData();
   virtual ~DBData();
-
-  std::string getSetting(const std::string &user, const std::string &setting,
-                         std::string ifMissing);
-  void setSetting(const std::string &user, const std::string &setting,
-                  const std::string &value);
+  void setUser(std::string user);
+  void clearUser(void) { user.clear(); };
+  /*
+    std::string getSetting(const std::string &user, const std::string &setting,
+                           std::string ifMissing);
+    void setSetting(const std::string &user, const std::string &setting,
+                    const std::string &value);*/
+  std::string getSetting(const std::string &setting, std::string ifMissing);
+  void setSetting(const std::string &setting, const std::string &value);
 };
 
 #endif

+ 37 - 6
main.cpp

@@ -543,8 +543,7 @@ int configure(door::Door &door, DBData &db) {
         // Ok, deck colors
         // get default
         std::string key("DeckColor");
-        std::string currentDefault =
-            db.getSetting(door.username, key, std::string("ALL"));
+        std::string currentDefault = db.getSetting(key, std::string("ALL"));
         int currentOpt = opt_from_string(currentDefault);
 
         door << door::reset << door::cls;
@@ -559,7 +558,7 @@ int configure(door::Door &door, DBData &db) {
           if (newOpt != currentOpt) {
             door.log() << key << " was " << currentDefault << ", " << currentOpt
                        << ". Now " << newColor << ", " << newOpt << std::endl;
-            db.setSetting(door.username, key, newColor);
+            db.setSetting(key, newColor);
           }
         }
       }
@@ -580,8 +579,7 @@ int play_cards(door::Door &door, DBData &db, std::mt19937 &rng) {
 
   door::ANSIColor deck_color;
   std::string key("DeckColor");
-  std::string currentDefault =
-      db.getSetting(door.username, key, std::string("ALL"));
+  std::string currentDefault = db.getSetting(key, std::string("ALL"));
   door.log() << key << " shows as " << currentDefault << std::endl;
   deck_color = from_string(currentDefault);
 
@@ -835,7 +833,7 @@ void display_space_ace(door::Door &door) {
       door << s; // << door::nl;
     sa_y++;
   }
-  // pause 5 seconds so they can enjoy our awesome logo
+  // pause 5 seconds so they can enjoy our awesome logo -- if they want.
   door.sleep_key(5);
 }
 
@@ -856,6 +854,39 @@ int main(int argc, char *argv[]) {
 
   DBData spacedb;
 
+  spacedb.setUser(door.username);
+
+  time_t last_call = std::stol(spacedb.getSetting("LastCall", "0"));
+  time_t now =
+      std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
+
+  spacedb.setSetting("LastCall", std::to_string(now));
+
+  if (last_call != 0) {
+    door << "Welcome Back!" << door::nl;
+    auto nowClock = std::chrono::system_clock::from_time_t(now);
+    auto lastClock = std::chrono::system_clock::from_time_t(last_call);
+    auto delta = nowClock - lastClock;
+
+    // int days = chrono::duration_cast<chrono::days>(delta).count();  // c++ 20
+    int hours = chrono::duration_cast<chrono::hours>(delta).count();
+    int days = hours / 24;
+    int minutes = chrono::duration_cast<chrono::minutes>(delta).count();
+
+    if (days > 1) {
+      door << "It's been " << days << " days since you last played."
+           << door::nl;
+    } else {
+      if (hours > 1) {
+        door << "It's been " << hours << " hours since you last played."
+             << door::nl;
+      } else {
+        door << "It's been " << minutes << " minutes since you last played."
+             << door::nl;
+      }
+    }
+    press_a_key(door);
+  }
   /*
   std::function<std::ofstream &(void)> get_logger;