diff mamba/habitats/userlevelmenu.py @ 362:cc8be536a7fc

Add ability to play uncurated levels via the command line.
author Simon Cross <hodgestar@gmail.com>
date Sat, 17 Sep 2011 00:03:46 +0200
parents d4062344d8f4
children d759f49c477d
line wrap: on
line diff
--- a/mamba/habitats/userlevelmenu.py	Fri Sep 16 23:53:34 2011 +0200
+++ b/mamba/habitats/userlevelmenu.py	Sat Sep 17 00:03:46 2011 +0200
@@ -7,40 +7,58 @@
 import urllib2
 
 
-class UserLevelMenu(LevelMenu):
+class UserLevelApi(object):
 
-    level_namespace = 'curated'
-    LEVEL_SERVER_URL = LEVEL_SERVER + "curated/"
-    TIMEOUT = 5.0  # in seconds
-    CACHE = {}
+    def __init__(self, ctype, url=LEVEL_SERVER, timeout=5):
+        assert ctype in ("curated", "uncurated")
+        assert url.endswith("/")
+        self.ctype = ctype
+        self.level_namespace = ctype
+        self.url = url
+        self.timeout = timeout
+        self.cache = {}
 
-    @classmethod
-    def _url_data(cls, route):
-        url = "%s%s" % (cls.LEVEL_SERVER_URL, route)
-        return urllib2.urlopen(url, timeout=cls.TIMEOUT).read()
+    def _url_data(self, route):
+        url = "%s%s/%s" % (self.url, self.ctype, route)
+        return urllib2.urlopen(url, timeout=self.timeout).read()
 
-    @classmethod
-    def _populate_cache(cls):
+    def _populate_level(self, name):
         try:
-            data = cls._url_data("index")
+            source = self._url_data("level/%s" % name)
+            level = Level(name, self.level_namespace, source)
+        except:
+            print "Failed to download online level %r" % name
+            return
+        self.cache[name] = level
+
+    def _populate_cache(self):
+        try:
+            data = self._url_data("index")
         except:
             print "Failed to download online level index."
             return
         levels = [x.strip() for x in data.splitlines()]
 
         for name in levels:
-            try:
-                source = cls._url_data("level/%s" % name)
-                level = Level(name, cls.level_namespace, source)
-            except:
-                print "Failed to download online level %r" % name
-                continue
-            cls.CACHE[level] = level
+            self._populate_level(name)
 
     def list_levels(self):
-        if not self.CACHE:
+        if not self.cache:
             self._populate_cache()
-        return self.CACHE.keys()
+        return self.cache.keys()
 
     def get_level(self, name):
-        return self.CACHE[name]
+        if name not in self.cache:
+            self._populate_level(name)
+        return self.cache[name]
+
+
+class UserLevelMenu(LevelMenu):
+
+    API = UserLevelApi("curated")
+
+    def list_levels(self):
+        return self.API.list_levels()
+
+    def get_level(self, name):
+        return self.API.get_level(name)