changeset 335:b0ac80c7db04

Cache online levels.
author Simon Cross <hodgestar@gmail.com>
date Fri, 16 Sep 2011 21:33:16 +0200
parents 387b901bb462
children 3ec7acdf3065
files mamba/habitats/userlevelmenu.py
diffstat 1 files changed, 29 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/habitats/userlevelmenu.py	Fri Sep 16 21:15:59 2011 +0200
+++ b/mamba/habitats/userlevelmenu.py	Fri Sep 16 21:33:16 2011 +0200
@@ -9,14 +9,36 @@
 class UserLevelMenu(LevelMenu):
 
     LEVEL_SERVER_URL = "http://localhost:5000/"
+    TIMEOUT = 5.0  # in seconds
+    CACHE = {}
+
+    @classmethod
+    def _url_data(cls, route):
+        url = "%s%s" % (cls.LEVEL_SERVER_URL, route)
+        return urllib2.urlopen(url, timeout=cls.TIMEOUT).read()
+
+    @classmethod
+    def _populate_cache(cls):
+        try:
+            data = cls._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, source)
+            except:
+                print "Failed to download online level %r" % level
+                continue
+            cls.CACHE[level] = level
 
     def list_levels(self):
-        url = "%s%s" % (self.LEVEL_SERVER_URL, "index")
-        data = urllib2.urlopen(url).read()
-        levels = [x.strip() for x in data.splitlines()]
-        return levels
+        if not self.CACHE:
+            self._populate_cache()
+        return self.CACHE.keys()
 
     def get_level(self, name):
-        url = "%s%s/%s" % (self.LEVEL_SERVER_URL, "level", name)
-        source = urllib2.urlopen(url).read()
-        return Level(name, source)
+        return self.CACHE[name]