view 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 source

"""Level menu."""

from mamba.habitats.levelmenu import LevelMenu
from mamba.level import Level
from mamba.constants import LEVEL_SERVER

import urllib2


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 get_level(self, 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)