Mercurial > mamba
view mamba/habitats/userlevelmenu.py @ 402:001c3797a63b
Editor now uses templates and the user level directory.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sat, 17 Sep 2011 12:56:26 +0200 |
parents | 12d67f69e6b2 |
children | 15771cc126fc |
line wrap: on
line source
"""Level menu.""" import urllib2 from mamba.habitats.levelmenu import LevelMenu from mamba.level import Level from mamba.constants import LEVEL_SERVER from mamba.data import get_level_list, load_file class UserLevelApi(object): 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 = {} def _url_data(self, route): url = "%s%s/%s" % (self.url, self.ctype, route) return urllib2.urlopen(url, timeout=self.timeout).read() def _populate_level(self, name): try: 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: self._populate_level(name) def list_levels(self): if not self.cache: self._populate_cache() return self.cache.keys() def print_levels(self): title = "%s levels:" % self.ctype.title() print title print "=" * len(title) for name in self.list_levels(): print name print "=" * len(title) def get_level(self, name): if name not in self.cache: self._populate_level(name) return self.cache[name] class NetworkLevelMenu(LevelMenu): API = UserLevelApi("curated") @property def level_namespace(self): self.API.level_namespace def list_levels(self): return self.API.list_levels() def get_level(self, name): return self.API.get_level(name) class UserLevelMenu(LevelMenu): level_namespace = "user" def list_levels(self): return get_level_list('user_levels', is_user_dir=True) def get_level(self, name): source = load_file('user_levels/%s.txt' % (name,), is_user_dir=True) return Level(name, self.level_namespace, source.read())