diff --git a/mhdb.py b/mhdb.py index 8e49c9b..8f4cc56 100755 --- a/mhdb.py +++ b/mhdb.py @@ -62,6 +62,13 @@ class MHDB(object): v = self.cache[key][args] = cursor.fetchall() return v + def get_item_names(self): + v = self._get_memoized("item_names", """ + SELECT name FROM items + WHERE type IN ('Bone', 'Flesh', 'Sac/Fluid') + """) + return v + def get_item(self, item_id): v = self._get_memoized("item", """ SELECT * FROM items diff --git a/mhrewards.py b/mhrewards.py index 54fc415..317c5f4 100755 --- a/mhrewards.py +++ b/mhrewards.py @@ -254,7 +254,7 @@ def print_quests_and_rewards(db, item_row, out): out.write(" %20s %s / 100\n" % ("Cap", _format_range(*cap_ev))) if shiny_ev: out.write(" %20s %5.2f / 100\n" % ("Shiny", shiny_ev)) - out.write("\n") + out.write("\n") if __name__ == '__main__': diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..3d24652 --- /dev/null +++ b/web/index.html @@ -0,0 +1,57 @@ + + + Monster Hunter Item Search + + + + + + + + + + + +
+ + +
+ +
+ +
+ diff --git a/web/reward_fcgi.py b/web/reward_fcgi.py new file mode 100755 index 0000000..86be30c --- /dev/null +++ b/web/reward_fcgi.py @@ -0,0 +1,6 @@ +from flup.server.fcgi import WSGIServer + +import reward_webapp + +if __name__ == '__main__': + WSGIServer(reward_webapp.application).run() diff --git a/web/reward_webapp.py b/web/reward_webapp.py new file mode 100755 index 0000000..ed5d691 --- /dev/null +++ b/web/reward_webapp.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python + +import os +import logging + +from webob import Request, Response, exc + +import mhdb +import mhrewards + +# TODO: etag based on db version + manual code version +DB_VERSION = "20150313" +PREFIX = "/mhapi/" + +logging.basicConfig(filename="/tmp/reward_webapp.log", level=logging.INFO) + +class App(object): + def __init__(self): + self.web_path = os.path.dirname(__file__) + self.project_path = os.path.abspath(os.path.join(self.web_path, "..")) + + db_path = os.path.join(self.project_path, "db", "mh4u.db") + self.db = mhdb.MHDB(db_path) + + log_path = os.path.join(self.project_path, "web.log") + + self.log = logging.getLogger("reward_webapp") + self.log.info("app started") + + def __call__(self, environ, start_response): + req = Request(environ) + resp = Response() + resp.charset = "utf8" + + if req.path in ("", "/", "/index.html"): + resp = self.index(req, resp) + elif req.path == PREFIX + "rewards": + resp = self.find_item_rewards(req, resp) + elif req.path == PREFIX + "item_name_list": + resp = self.get_all_names(req, resp) + else: + resp = exc.HTTPNotFound() + + return resp(environ, start_response) + + def index(self, req, resp): + resp.cache_control = "max-age=86400" + html_path = os.path.join(self.web_path, "index.html") + resp.content_type = "text/html" + resp.body = open(html_path, "rb").read() + return resp + + def find_item_rewards(self, req, resp): + version = "1" + resp.cache_control = "max-age=60" + resp.etag = DB_VERSION + version + + self.log.info("etag = %s", resp.etag) + if req.if_match == resp.etag: + return HTTPNotModified() + + resp.content_type = "text/plan" + + item_name = req.params.get("item_name", "").strip() + if not item_name: + resp.body = "Please enter an item name" + else: + item_row = mhrewards.find_item(self.db, item_name, resp.body_file) + if item_row is not None: + mhrewards.print_quests_and_rewards(self.db, item_row, + resp.body_file) + return resp + + def get_all_names(self, req, resp): + version = "2" + resp.cache_control = "max-age=60" + resp.etag = DB_VERSION + version + + self.log.info("get all names etag = %s", resp.etag) + if req.if_match == resp.etag: + return HTTPNotModified() + + resp.content_type = "application/json" + resp.body_file.write("[") + items = self.db.get_item_names() + first = True + for item in items: + if first: + first = False + else: + resp.body_file.write(", ") + resp.body_file.write('"') + resp.body_file.write(item["name"]) + resp.body_file.write('"') + resp.body_file.write("]") + return resp + + +application = App() + + +if __name__ == '__main__': + from wsgiref.simple_server import make_server + httpd = make_server("localhost", 8080, application) + try: + httpd.serve_forever() + except KeyboardInterrupt: + print "^C"