changeset 139:75cf14ee99a7

More work on party information system.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 22 Oct 2013 23:58:41 +0300
parents e04f6e3c04f7
children 20ca8edfb01a
files createdb.php msite.inc.php show.php showajax.php
diffstat 4 files changed, 299 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/createdb.php	Tue Oct 22 22:05:00 2013 +0300
+++ b/createdb.php	Tue Oct 22 23:58:41 2013 +0300
@@ -144,8 +144,27 @@
   "attendees" => "id INTEGER PRIMARY KEY AUTOINCREMENT, regtime INT, name VARCHAR(64), groups VARCHAR(64), oneliner VARCHAR(64), email VARCHAR(80), key_id INT DEFAULT NULL",
 
   "votekeys" => "id INTEGER PRIMARY KEY AUTOINCREMENT, key VARCHAR(64), active INT DEFAULT 0",
-  
   "votes" => "id INTEGER PRIMARY KEY AUTOINCREMENT, entry_id INT DEFAULT NULL, voter_id INT DEFAULT NULL, value INT DEFAULT 0",
+
+  "displayVars" => "key VARCHAR(32) PRIMARY KEY, vtype INT, vstr VARCHAR(128), vtext TEXT, vint INT, desc VARCHAR(128)",
+  "displayPages" => "id INTEGER PRIMARY KEY AUTOINCREMENT, title VARCHAR(128), text VARCHAR(4096)",
+  "displayListData" => "id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(128)",
+  "displayListPages" => "id INTEGER PRIMARY KEY AUTOINCREMENT, list_id INT DEFAULT 0, page_id INT DEFAULT 0",
+);
+
+$siteDisplayVars = array(
+  "tempPageDuration" => array(VT_INT, 120, "Temporary page display time (seconds)"),
+  "tempPage"         => array(VT_INT, 0, "Temporary page ID"),
+
+  "showMode"         => array(VT_INT, 0, "Currently active display mode"),
+
+  "activePageMode"   => array(VT_INT, 0, "Current active page display mode"),
+  "activePage"       => array(VT_INT, 0, "Current active page"),
+  "activePageExpire" => array(VT_INT, 0, "Expiration timestamp of current page"),
+
+  "rotateDuration"   => array(VT_INT, 60, "Page rotation time per page (seconds)"),
+  "rotateList"       => array(VT_INT, 0, "Current rotation list ID"),
+  "rotateListIndex"  => array(VT_INT, 0, "Current index in rotation list"),
 );
 
 $siteTestData = array(
@@ -188,6 +207,29 @@
     array("penis song", "reed/flt", 2, "penis.mod"),
     array("jenkka", "aegis", 2, "jenkka.mod"),
   ),
+  
+  "displayPages" => array(
+    "title,text",
+    "%s,%s",
+    array("Next Up", "<h1>Next up: 4k intro</h1><h2>4k intro compo is about to begin</h2>... in about 10 minutes."),
+    array("Astu to infodesk", "<h1>Astu</h1>Please come to orga info desk!"),
+    array("Gentle Eye mainos", "<h1>Buy Amiga stuff!</h1><h2>Gentle Eye Oy is selling Amiga-related stuff near organizer desk!"),
+  ),
+  
+  "displayListData" => array(
+    "name",
+    "%s",
+    array("Main rotation"),
+    array("Next Up"),
+  ),
+  
+  "displayListPages" => array(
+    "list_id,page_id",
+    "%d,%d",
+    array(1,2),
+    array(1,3),
+    array(2,1),
+  ),
 );
 
 
@@ -255,12 +297,11 @@
 }
 
 
-function stAddSettings()
+function stAddSettings($settings, $table)
 {
-  global $siteDefaults;
-  echo "Adding settings to settings table.\n";
+  echo "Adding settings to '".$table."' table.\n";
 
-  foreach ($siteDefaults as $key => $data)
+  foreach ($settings as $key => $data)
   {
     switch ($data[0])
     {
@@ -272,7 +313,7 @@
     }
 
     $sql = stPrepareSQL(
-      "INSERT INTO settings (key,vtype,".$var.",desc) VALUES (%s,%d,".$type.",%s)",
+      "INSERT INTO ".$table." (key,vtype,".$var.",desc) VALUES (%s,%d,".$type.",%s)",
       $key, $data[0], $data[1], $data[2]);
 
     stExecSQL($sql);
@@ -352,7 +393,10 @@
 
   case "new":
     if (stCreateTables())
-      stAddSettings();
+    {
+      stAddSettings($siteDefaults, "settings");
+      stAddSettings($siteDisplayVars, "displayVars");
+    }
     
     if ($addData)
       stAddTestData();
--- a/msite.inc.php	Tue Oct 22 22:05:00 2013 +0300
+++ b/msite.inc.php	Tue Oct 22 23:58:41 2013 +0300
@@ -17,6 +17,9 @@
 define("SESS_USER", "user");
 define("SESS_ADMIN", "admin");
 
+define("SMODE_ROTATE", 1);
+define("SMODE_COMPO", 2);
+
 
 //
 // Different voting modes
--- a/show.php	Tue Oct 22 22:05:00 2013 +0300
+++ b/show.php	Tue Oct 22 23:58:41 2013 +0300
@@ -11,14 +11,7 @@
 
 stSetupCacheControl();
 
-// Initiate SQL database connection
-if (!stConnectSQLDB())
-  die("Could not connect to SQL database.");
-
-// Fetch non-"hardcoded" settings from SQL database
-stReloadSettings();
-
-cmPrintPageHeader("PARTY DISPLAY", "", FALSE);
+cmPrintPageHeader("PARTY INFORMATION DISPLAY SYSTEM", "", FALSE);
 stCommonAJAX("showajax.php", "show.php", TRUE);
 ?>
 
@@ -35,18 +28,8 @@
   </div>
 </noscript>
 
-<div class="showView" id="mainView0">
-  <div class="showHeader">
-    <img src="img/fapsm.png" />
-  </div>
-  <div class="showText">
-    <h1>Next up</h1>
-    <h2>4k intro competition</h2>
-  </div>
-</div>
-
-<div class="showView" id="mainView1">
-</div>
+<div class="showView" id="mainView0"></div>
+<div class="showView" id="mainView1"></div>
 
 <!-- ========================== -->
 
@@ -92,7 +75,7 @@
     updateView(txt);
   }
 
-  sendPOSTRequest("mode=get", msuccess, displayError);
+  sendPOSTRequest("action=get", msuccess, displayError);
 }
 
 
@@ -105,15 +88,28 @@
   {
     failCount = 0;
     if (txt == "changed")
+    {
       viewChanged();
+      setTimeout("tickMain();", 500);
+    }
+    else
+    {
+      setTimeout("tickMain();", 2000);
+    }
+  }
+  
+  var mfail = function(txt)
+  {
+    displayError();
+    setTimeout("tickMain();", 5000);
   }
 
-  sendPOSTRequest("mode=check", msuccess, displayError);
+  sendPOSTRequest("action=check", msuccess, mfail);
 }
 
 
-setTimeout("tickMain();", 500);
-setTimeout("tickAnim();", 20);
+setTimeout("tickMain();", 1000);
+setInterval("tickAnim();", 25);
 
 </script>
 <?
--- a/showajax.php	Tue Oct 22 22:05:00 2013 +0300
+++ b/showajax.php	Tue Oct 22 23:58:41 2013 +0300
@@ -7,61 +7,232 @@
 require "mconfig.inc.php";
 require "msite.inc.php";
 
+
+function stPrintCompoEntry($entry, $class, $compo, $title = false)
+{
+  echo
+  "  <div class=\"".$class."\">\n"; 
+  
+  if ($title !== false)
+  echo
+  "    <div class=\"title\">".$title."</div>\n";
+
+  echo
+  "    <div class=\"entryIndex\">#".$entry["show_id"]."</div>\n".
+  "    <div class=\"entryName\">".chentities($entry["name"])."</div>\n";
+
+  if ($compo["showAuthors"])
+    echo "    <div class=\"entryAuthor\">".chentities($entry["author"])."</div>\n";
+
+  echo
+  "    <div class=\"entryInfo\">".chentities($entry["info"])."</div>\n".
+  "  </div>\n";
+}
+
+function stPrintCompoPage($compo, $entry, $prev)
+{
+  echo
+  "  <div class=\"compoHeader\">\n".
+  "    <img src=\"img/fapsm.png\" /><br />\n".
+  "    <div class=\"title\">".chentities($compo["name"])." competition</div>\n".
+  "  </div>\n";
+  
+  if ($entry !== false)
+  stPrintCompoEntry($entry, "compoNext", $compo, false);
+  
+  if ($prev !== false)
+    stPrintCompoEntry($prev, "compoPrev", $compo, "Previous entry");
+}
+
+
+function stPrintRotationPage($page)
+{
+  echo
+  "  <div class=\"showHeader\">\n".
+  "    <img src=\"img/fapsm.png\" /><br />\n".
+  "  </div>\n".
+  "  <div class=\"showText\">\n".
+  $page["text"].
+  "  </div>\n";
+}
+
+
+// Handle requests
 stSetupCacheControl();
 
-// Initiate SQL database connection
 if (!stConnectSQLDB())
   die("Could not connect to SQL database.");
 
-// Fetch non-"hardcoded" settings from SQL database
-stReloadSettings();
+
+// Fetch party display variables and settings
+if (($res = stExecSQL("SELECT * FROM displayVars")) !== FALSE)
+{
+  $displayVars = array();
+  $displayVarsChanged = array();
+
+  foreach ($res as $row)
+  {
+    switch ($row["vtype"])
+    {
+      case VT_INT:  $val = intval($row["vint"]); break;
+      case VT_BOOL: $val = intval($row["vint"]) ? true : false; break;
+      case VT_STR:  $val = $row["vstr"]; break;
+      case VT_TEXT: $val = $row["vtext"]; break;
+    }
+    $displayVars[$row["key"]] = $val;
+  }
+}
+else
+  exit;
+
+
+function stGetDisplayVar($name)
+{
+  global $displayVars;
+  if (isset($displayVars[$name]))
+    return $displayVars[$name];
+  else
+    die("No display setting for '".$name."'.\n");
+}
+
+
+function stSetDisplayVar($name, $value)
+{
+  global $displayVars, $displayVarsChanged;
+  if (isset($displayVars[$name]))
+  {
+    $displayVars[$name] = $value;
+    $displayVarsChanged[$name] = true;
+  }
+  else
+    die("No display setting for '".$name."'.\n");
+}
 
 
-// XMLHttp responses
-$action = "ERROR";
-if (stChkRequestItem("action") && stChkRequestItem("type"))
-{
-  $action = $_REQUEST["action"];
-  $type = $_REQUEST["type"];
-}
-
+$action = stChkRequestItem("action") ? $_REQUEST["action"] : "";
 switch ($action)
 {
-  case "get":
-    //
-    // Get specific data
-    //
-    switch ($type)
+  case "check":
+    // Check if there has been any change
+    $changed = FALSE;
+    if (stGetDisplayVar("tempPageDuration") > 0 && stGetDisplayVar("tempPage") > 0)
+    {
+      $sql = stPrepareSQL("SELECT * FROM displayPages WHERE id=%d",
+        stGetDisplayVar("tempPage"));
+
+      if (($res = stFetchSQL($sql)) !== false)
+      {
+        stSetDisplayVar("tempPageDuration", 0);
+        stSetDisplayVar("activePageMode", SMODE_ROTATE);
+        stSetDisplayVar("activePage", stGetDisplayVar("tempPage"));
+        stSetDisplayVar("activePageExpire", time() + stGetDisplayVar("tempPageDuration"));
+        $changed = TRUE;
+      }
+    }
+    else
+    switch (stGetDisplayVar("showMode"))
     {
-      case "votes":
-        $sql = "SELECT * FROM votes ORDER BY utime DESC";
+      case SMODE_ROTATE:
+      default:
+        stSetDisplayVar("activePageMode", SMODE_ROTATE);
+        
+        if (stGetDisplayVar("rotateList") == 0)
+        {
+          stSetDisplayVar("rotateList", 1);
+          stSetDisplayVar("activePageExpire", 0);
+          $changed = TRUE;
+        }
+
+        if (time() >= stGetDisplayVar("activePageExpire") &&
+            stGetDisplayVar("rotateList") > 0)
+        {
+          error_log("page rotated");
+
+          // Get list of pages from active rotation list
+          $list = stGetDisplayVar("rotateList");
+          $sql = stPrepareSQL(
+            "SELECT * FROM displayListPages WHERE list_id=%d ORDER BY id",
+            $list);
+
+          if (($pageList = stFetchSQL($sql)) !== false)
+          {
+            // Get page at current index
+            $index = stGetDisplayVar("rotateListIndex");
+
+            if (count($pageList) < $index)
+            {
+              $page_id = $pageList[$index]["page_id"];
+              stSetDisplayVar("activePage", $page_id);
+              stSetDisplayVar("activePageExpire", time() + stGetDisplayVar("rotatePageTime"));
+            }
+
+            // Rotate to next page
+            if (++$index >= count($pageList))
+              $index = 0;
+            
+            stSetDisplayVar("rotateListIndex", $index);
+            $changed = TRUE;
+          }
+        }
+        else
+        if (stGetDisplayVar("activePage") != -1)
+        {
+          // Emergency page
+          stSetDisplayVar("activePage", -1);
+          stSetDisplayVar("activePageExpire", time() + stGetDisplayVar("rotatePageTime"));
+          $changed = TRUE;
+        }
+        break;
+      
+      case SMODE_COMPO:
         break;
     }
+
+    $changed = FALSE;
     
-    //
-    // Perform query if we need to, output results
-    //
-    if (isset($sql) && ($res = stExecSQLCond($sql, "")) !== FALSE)
-    {
-      if ($type == "votes")
-      {
-      }
-    }
+    
+    echo $changed ? "changed" : "nochange";
+    stSetStatus(200, "OK");
     break;
 
-  case "set":
-    //
-    // Set vote
-    //
-    if ($type == "votes" && stChkRequestItem("voter_id") &&
-      stChkRequestItem("entry_id") && stChkRequestItem("vote"))
+  case "get":
+    // Based on the currently active mode ...
+    switch (stGetDisplayVar("activePageMode"))
     {
-      stGetCompoList(FALSE);
+      case SMODE_ROTATE:
+        // Page rotation mode, display currently active page
+        if (stGetDisplayVar("activePage") > 0)
+        {
+          $sql = stPrepareSQL("SELECT * FROM displayPages WHERE id=%d",
+            stGetDisplayVar("activePage"));
+
+          if (($page = stFetchSQL($sql)) !== false)
+            stPrintRotationPage($page);
+        }
+        else
+        {
+          echo "<div>ERROR!</div>\n";
+        }
+        break;
       
-      stSubmitOneVote(stGetRequestItem("voter_id"), stGetRequestItem("entry_id"), stGetRequestItem("vote"));
+      case SMODE_COMPO:
+        // Competition mode
+        $compo = stFetchSQL(stPrepareSQL(
+          "SELECT * FROM compos WHERE id=%d",
+          stGetDisplayVar("compoCompo")));
+
+        $prev = stFetchSQL(stPrepareSQL(
+          "SELECT * FROM entries WHERE id=%d",
+          stGetDisplayVar("compoPrevEntry")));
+
+        $entry = stFetchSQL(stPrepareSQL(
+          "SELECT * FROM entries WHERE id=%d",
+          stGetDisplayVar("compoCurrEntry")));
+
+        if ($compo !== false)
+          stPrintCompoPage($compo, $entry, $prev);
+        break;
     }
-    else
-      stSetStatus(902, "No data.");
     break;
 
   default:
@@ -69,4 +240,21 @@
     break;
 }
 
+
+// Save changed variables
+foreach (stExecSQL("SELECT * FROM displayVars") as $item)
+if (isset($displayVarsChanged[$item["key"]]))
+{
+  $val = $displayVars[$item["key"]];
+  switch ($item["vtype"])
+  {
+    case VT_INT:  $vsql = stPrepareSQL("vint=%d", $val); break;
+    case VT_BOOL: $vsql = stPrepareSQL("vint=%d", $val ? 1 : 0); break;
+    case VT_STR:  $vsql = stPrepareSQL("vstr=%s", $val); break;
+    case VT_TEXT: $vsql = stPrepareSQL("vtext=%s", $val); break;
+  }
+  
+  $sql = "UPDATE displayVars SET ".$vsql." WHERE key=".$db->quote($item["key"]);
+  stExecSQL($sql);
+}
 ?>
\ No newline at end of file