Mercurial > mamba
annotate mamba/forest.py @ 550:91e1a95343b2
Add option to inform CIA of new levels.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Tue, 20 Sep 2011 17:29:38 +0200 |
parents | 0c5853bb7a14 |
children | 16344424dfcc |
rev | line source |
---|---|
328 | 1 """Where mamba's hang out with each other.""" |
2 | |
330 | 3 from werkzeug.utils import secure_filename |
4 from flask import Flask, request, abort | |
5 | |
496
0c5853bb7a14
Timestamp uncurated level files.
Simon Cross <hodgestar@gmail.com>
parents:
340
diff
changeset
|
6 from datetime import datetime |
550
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
7 import xmlrpclib |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
8 import time |
330 | 9 import os |
10 import sys | |
11 | |
12 app = Flask(__name__) | |
13 app.config['LEVEL_FOLDER'] = None # set later | |
550
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
14 app.config['CIA_PROJECT'] = None # set to activate CIA sending |
330 | 15 |
16 | |
340
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
17 def path(ctype): |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
18 if ctype == "curated": |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
19 return os.path.join(app.config['LEVEL_FOLDER'], 'curated') |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
20 elif ctype == "uncurated": |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
21 return os.path.join(app.config['LEVEL_FOLDER'], 'uncurated') |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
22 abort(404, "Not found") |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
23 |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
24 |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
25 def list_levels(folder): |
330 | 26 endl = len(".txt") |
340
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
27 files = [x[:-endl] for x in os.listdir(folder) |
330 | 28 if not x.startswith('.') and x.endswith('.txt')] |
29 return "\n".join(files) | |
328 | 30 |
31 | |
340
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
32 @app.route("/<ctype>/index") |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
33 def index(ctype): |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
34 ctype = path(ctype) |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
35 return list_levels(ctype) |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
36 |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
37 |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
38 @app.route("/<ctype>/level/<levelname>") |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
39 def level(ctype, levelname): |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
40 ctype = path(ctype) |
330 | 41 levelname = "%s.txt" % secure_filename(levelname) |
340
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
42 levelpath = os.path.join(ctype, levelname) |
330 | 43 if not os.path.isfile(levelpath): |
44 abort(404, "Level not found. Hsss.") | |
45 with open(levelpath) as level: | |
46 return level.read() | |
47 | |
328 | 48 |
330 | 49 @app.route("/save/<levelname>", methods=['GET', 'POST']) |
50 def save(levelname): | |
496
0c5853bb7a14
Timestamp uncurated level files.
Simon Cross <hodgestar@gmail.com>
parents:
340
diff
changeset
|
51 ts = datetime.now().strftime("%Y%m%d.%H%M%S") |
0c5853bb7a14
Timestamp uncurated level files.
Simon Cross <hodgestar@gmail.com>
parents:
340
diff
changeset
|
52 levelname = "%s.%s.txt" % (secure_filename(levelname), ts) |
340
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
53 levelpath = os.path.join(path("uncurated"), levelname) |
330 | 54 if request.method == 'POST': |
55 if os.path.exists(levelpath): | |
56 abort(409, "Mamba already resident.") | |
57 leveldata = request.form['data'].encode('ascii') | |
58 with open(levelpath, 'w') as level: | |
59 level.write(leveldata) | |
550
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
60 inform_cia(levelname, "New level uploaded.", branch="uncurated") |
330 | 61 return "Ssss." |
62 else: | |
63 abort(405, "Post levels here. Hsss.") | |
328 | 64 |
65 | |
550
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
66 MAMBA_VERSION = "0.1" |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
67 MAMBA_URL = "https://ctpug.org.za/hg/mamba" |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
68 CIA_URL = "http://cia.navi.cx" |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
69 CIA_MSG_TEMPLATE = """ |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
70 <message |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
71 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
72 xsi:noNamespaceSchemaLocation="schema.xsd"> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
73 <generator> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
74 <name>Mutable Mamba Level Server</name> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
75 <version>%(mamba_version)s</version> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
76 <url>%(mamba_url)s</url> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
77 </generator> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
78 <source> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
79 <project>%(project)s</project> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
80 <module>%(module)s</module> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
81 <branch>%(branch)s</branch> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
82 </source> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
83 <timestamp> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
84 %(timestamp)d |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
85 </timestamp> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
86 <body> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
87 <commit> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
88 <revision>%(revision)s</revision> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
89 <author>%(author)s</author> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
90 <files> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
91 <file>%(file)s</file> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
92 </files> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
93 <log> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
94 %(log)s |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
95 </log> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
96 </commit> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
97 </body> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
98 </message> |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
99 """ |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
100 |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
101 |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
102 def inform_cia(filename, log, branch='uncurated'): |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
103 if app.config['CIA_PROJECT'] is None: |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
104 return |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
105 msg = CIA_MSG_TEMPLATE % { |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
106 'mamba_version': MAMBA_VERSION, |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
107 'mamba_url': MAMBA_URL, |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
108 'project': app.config['CIA_PROJECT'], |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
109 'module': 'level-server', |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
110 'branch': branch, |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
111 'timestamp': int(time.time()), |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
112 'revision': '0', |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
113 'author': 'unknown', |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
114 'file': filename, |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
115 'log': log, |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
116 } |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
117 srv = xmlrpclib.Server(CIA_URL) |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
118 srv.hub.deliver(msg) |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
119 |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
120 |
328 | 121 if __name__ == "__main__": |
550
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
122 if len(sys.argv) not in (3, 4): |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
123 print ("Usage: python -m mamba.forest <port> <level folder>" |
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
124 " [<cia project>]") |
330 | 125 sys.exit(1) |
126 | |
127 host = '0.0.0.0' | |
128 port = int(sys.argv[1]) | |
129 level_folder = sys.argv[2] | |
340
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
130 for ctype in ("curated", "uncurated"): |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
131 folder = os.path.join(level_folder, ctype) |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
132 if not os.path.exists(folder): |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
133 os.makedirs(folder) |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
134 if not os.path.isdir(folder): |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
135 print "Level folder must be a folder." |
5456db312f7f
Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents:
330
diff
changeset
|
136 sys.exit(1) |
550
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
137 cia_project = sys.argv[3] if len(sys.argv) > 3 else None |
330 | 138 |
139 app.config['LEVEL_FOLDER'] = level_folder | |
550
91e1a95343b2
Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents:
496
diff
changeset
|
140 app.config['CIA_PROJECT'] = cia_project |
330 | 141 # app.debug = True |
142 app.run(host=host, port=port) |