Added extern script to allow exporting some stats through a JSON or XML API. WiP.
authorDan
Tue, 30 Dec 2008 06:16:28 -0500
changeset 36 a7d884914a74
parent 33 c3179049f670
child 37 c3cbefda414a
Added extern script to allow exporting some stats through a JSON or XML API. WiP.
htdocs/extern.php
stats-fe.php
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htdocs/extern.php	Tue Dec 30 06:16:28 2008 -0500
@@ -0,0 +1,157 @@
+<?php
+
+require('../stats-fe.php');
+require('../timezone.php');
+
+$channel_list = stats_channel_list();
+$first_channel = $channel_list[0];
+$channel = ( isset($_REQUEST['channel']) && in_array($_REQUEST['channel'], $channel_list) ) ? $_REQUEST['channel'] : $first_channel;
+
+$formats = array('json', 'xml');
+$format = ( isset($_GET['format']) ) ? $_GET['format'] : $formats[0];
+if ( !in_array($format, $formats) )
+{
+  $format = $formats[0];
+  $formatclass = "format_$format";
+  $formatter = new $formatclass();
+  $formatter->send_headers();
+  die_in_output_format('Invalid output format specified.');
+}
+
+$formatclass = "format_$format";
+$formatter = new $formatclass();
+$formatter->send_headers();
+
+if ( !isset($_GET['action']) )
+  die_in_output_format('Please specify action on GET.');
+
+switch($_GET['action'])
+{
+  case 'get_activity':
+    $minutes = isset($_GET['minutes']) ? intval($_GET['minutes']) : 10;
+    if ( $minutes < 1 )
+      die_in_output_format('minutes < 1');
+    $datum = stats_activity_percent($channel, $minutes);
+    $count = stats_message_count($channel, $minutes);
+    foreach ( $datum as &$pct )
+    {
+      $pct = $pct * $count;
+    }
+    $output = array(
+        'result' => 'success',
+        'minutes' => $minutes,
+        'message_count' => $count,
+        'active_users' => $datum
+      );
+    $result = $formatter->encode($output);
+    if ( $format == 'xml' )
+    {
+      $activeusers = '<activeusers>';
+      foreach ( $datum as $nick => $count )
+      {
+        $activeusers .= '<user nick="' . htmlspecialchars($nick) . '" count="' . $count . '" />';
+      }
+      $activeusers .= '</activeusers>';
+      $result = preg_replace('#<activeusers>(.*?)</activeusers>#', $activeusers, $result);
+    }
+    echo $result;
+    break;
+}
+
+/** FUNCTIONS **/
+
+function die_in_output_format($message)
+{
+  global $formatter;
+  echo $formatter->encode(array(
+      'result' => 'error',
+      'error' => $message
+    ));
+  exit;
+}
+
+/** FORMATS **/
+
+class format_json
+{
+  public function encode($data)
+  {
+    require_once('../libjson.php');
+    return eb_json_encode($data);
+  }
+  public function send_headers()
+  {
+    header('Content-type: text/javascript');
+  }
+}
+
+/**
+ * From <http://snipplr.com/view/3491/convert-php-array-to-xml-or-simple-xml-object-if-you-wish/>.
+ */
+
+class format_xml
+{
+	/**
+	 * The main function for converting to an XML document.
+	 * Pass in a multi dimensional array and this recrusively loops through and builds up an XML document.
+	 *
+	 * @param array $data
+	 * @param string $rootNodeName - what you want the root node to be - defaultsto data.
+	 * @param SimpleXMLElement $xml - should only be used recursively
+	 * @return string XML
+	 */
+	public static function toXml($data, $rootNodeName = 'response', $xml = null)
+	{
+		// turn off compatibility mode as simple xml throws a wobbly if you don't.
+		if (ini_get('zend.ze1_compatibility_mode') == 1)
+		{
+			ini_set ('zend.ze1_compatibility_mode', 0);
+		}
+		
+		if ($xml == null)
+		{
+			$xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$rootNodeName />");
+		}
+		
+		// loop through the data passed in.
+		foreach($data as $key => $value)
+		{
+			// no numeric keys in our xml please!
+			if (is_numeric($key))
+			{
+				// make string key...
+				$key = "unknownNode_". (string) $key;
+			}
+			
+			// replace anything not alpha numeric
+			$key = preg_replace('/[^a-z0-9]/i', '', $key);
+			
+			// if there is another array found recrusively call this function
+			if (is_array($value))
+			{
+				$node = $xml->addChild($key);
+				// recrusive call.
+				format_xml::toXml($value, $rootNodeName, $node);
+			}
+			else 
+			{
+				// add single node.
+        $value = htmlentities($value);
+				$xml->addChild($key,$value);
+			}
+			
+		}
+		// pass back as string. or simple xml object if you want!
+		return $xml->asXML();
+	}
+  
+  public function encode($data)
+  {
+    return format_xml::toXml($data);
+  }
+  
+  public function send_headers()
+  {
+    header('Content-type: text/xml');
+  }
+}
--- a/stats-fe.php	Sun Dec 07 17:54:29 2008 -0500
+++ b/stats-fe.php	Tue Dec 30 06:16:28 2008 -0500
@@ -59,7 +59,7 @@
     {
       eb_mysql_query("INSERT INTO stats_count_cache(channel, time_min, time_max, message_count) VALUES('$channel', $time_min, $time_max, $count);");
     }
-    return $count;
+    return intval($count);
   }
   return false;
 }