diff gpp/phantombrigade/views.py @ 544:c092efc9ce71

Initial version of the phantombrigade application. It has one view to query the TS3 server and output a JSON representation of the status.
author Brian Neal <bgneal@gmail.com>
date Thu, 12 Jan 2012 21:42:01 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/phantombrigade/views.py	Thu Jan 12 21:42:01 2012 -0600
@@ -0,0 +1,101 @@
+"""
+Views for the phantombrigade application.
+
+The phantombrigade application doesn't have anything to do with SG101. It is
+simply some useful web services that we provide to the gaming clan Phantom
+Brigade. Rather than create a whole new website we just use the infrastructure
+of SG101.
+
+Current we provide a TeamSpeak 3 status view for the PhantomBrigade.us website.
+
+"""
+from django.conf import settings
+from django.core.cache import cache
+from django.http import HttpResponse, HttpResponseServerError
+from django.utils import simplejson
+import ts3
+
+
+CACHE_KEY = 'phantombrigade-ts3-json'
+CACHE_TIMEOUT = 2 * 60
+
+
+def ts3_query(request):
+    """
+    Query the TeamSpeak3 server for status, and output a JSON representation.
+
+    The JSON we return is targeted towards the jQuery plugin Dynatree
+    http://code.google.com/p/dynatree/
+
+    """
+    # Do we have the result cached?
+    result = cache.get(CACHE_KEY)
+    if result:
+        return HttpResponse(result, content_type='application/json')
+
+    # Cache miss, go query the remote server
+
+    try:
+        svr = ts3.TS3Server(settings.PB_TS3_IP, settings.PB_TS3_PORT,
+                settings.PB_TS3_VID)
+    except ts3.ConnectionError:
+        return HttpResponseServerError()
+
+    response = svr.send_command('serverinfo')
+    if response.response['msg'] != 'ok':
+        return HttpResponseServerError()
+    svr_info = response.data[0]
+
+    response = svr.send_command('channellist')
+    if response.response['msg'] != 'ok':
+        return HttpResponseServerError()
+    channel_list = response.data
+
+    response = svr.send_command('clientlist')
+    if response.response['msg'] != 'ok':
+        return HttpResponseServerError()
+    client_list = response.data
+
+    # Start building the channel / client tree.
+    # We save tree nodes in a dictionary, keyed by their id so we can find them
+    # later in order to support arbitrary channel hierarchies.
+    channels = {}
+
+    # Build the root, or channel 0
+    channels[0] = {
+        'title': svr_info['virtualserver_name'],
+        'isFolder': True,
+        'expand': True,
+        'children': []
+    }
+
+    # Add the channels to our tree
+
+    for channel in channel_list:
+        node = {
+            'title': channel['channel_name'],
+            'isFolder': True,
+            'expand': True,
+            'children': []
+        }
+        parent = channels[int(channel['pid'])]
+        parent['children'].append(node)
+        channels[int(channel['cid'])] = node
+
+    # Add the clients to the tree
+
+    for client in client_list:
+        if client['client_type'] == '0':
+            node = {
+                'title': client['client_nickname'],
+                'icon': 'client.png'
+            }
+            channel = channels[int(client['cid'])]
+            channel['children'].append(node)
+
+    tree = [channels[0]]
+    json = simplejson.dumps(tree)
+
+    cache.set(CACHE_KEY, json, CACHE_TIMEOUT)
+
+    return HttpResponse(json, content_type='application/json')