annotate mamba/habitats/userlevelmenu.py @ 361:d4062344d8f4

Level namespaces (for telling that a level is complete, no matter where it came from)
author Stefano Rivera <stefano@rivera.za.net>
date Fri, 16 Sep 2011 23:53:34 +0200
parents c2f7920563e4
children cc8be536a7fc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
334
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """Level menu."""
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
3 from mamba.habitats.levelmenu import LevelMenu
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
4 from mamba.level import Level
345
04bb1ffcd054 Activated ctpug level server.
Simon Cross <hodgestar@gmail.com>
parents: 340
diff changeset
5 from mamba.constants import LEVEL_SERVER
334
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
6
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
7 import urllib2
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
8
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
9
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
10 class UserLevelMenu(LevelMenu):
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
11
361
d4062344d8f4 Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
12 level_namespace = 'curated'
345
04bb1ffcd054 Activated ctpug level server.
Simon Cross <hodgestar@gmail.com>
parents: 340
diff changeset
13 LEVEL_SERVER_URL = LEVEL_SERVER + "curated/"
335
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
14 TIMEOUT = 5.0 # in seconds
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
15 CACHE = {}
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
16
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
17 @classmethod
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
18 def _url_data(cls, route):
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
19 url = "%s%s" % (cls.LEVEL_SERVER_URL, route)
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
20 return urllib2.urlopen(url, timeout=cls.TIMEOUT).read()
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
21
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
22 @classmethod
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
23 def _populate_cache(cls):
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
24 try:
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
25 data = cls._url_data("index")
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
26 except:
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
27 print "Failed to download online level index."
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
28 return
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
29 levels = [x.strip() for x in data.splitlines()]
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
30
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
31 for name in levels:
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
32 try:
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
33 source = cls._url_data("level/%s" % name)
361
d4062344d8f4 Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
34 level = Level(name, cls.level_namespace, source)
335
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
35 except:
336
3ec7acdf3065 Fix bug in error printing.
Simon Cross <hodgestar@gmail.com>
parents: 335
diff changeset
36 print "Failed to download online level %r" % name
335
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
37 continue
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
38 cls.CACHE[level] = level
334
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
39
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
40 def list_levels(self):
335
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
41 if not self.CACHE:
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
42 self._populate_cache()
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
43 return self.CACHE.keys()
334
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
44
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
45 def get_level(self, name):
335
b0ac80c7db04 Cache online levels.
Simon Cross <hodgestar@gmail.com>
parents: 334
diff changeset
46 return self.CACHE[name]