From 7585a4509aa6df2368ae44ba0a42562f201b1937 Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Sun, 10 Mar 2013 11:56:01 +0200 Subject: Server, websockets and client boilerplate --- .gitignore | 1 + Procfile.dev | 2 ++ README.md | 24 ++++++++++++++++++++- bitrade.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ index.html | 45 ++++++++++++++++++++++++++++++++++++++ requirements.txt | 4 ++++ 6 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 Procfile.dev create mode 100644 bitrade.py create mode 100644 index.html create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/Procfile.dev b/Procfile.dev new file mode 100644 index 0000000..8616524 --- /dev/null +++ b/Procfile.dev @@ -0,0 +1,2 @@ +redis: redis-server +tornado: python bitrade.py diff --git a/README.md b/README.md index d2f6665..8950e62 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,25 @@ # Bitrade -A simple Bitcoin trading server proof-of-concept. +A highly-concurrent, fault-tolerant, malicious-user-proof, Python-based bitcoin trading server. + +Eat this, Mt.Gox - now how you gonna act? + +## Usage + +Easiest way, run all processes using [foreman](https://github.com/ddollar/foreman): + +```bash +$ foreman start -f Procfile.dev +``` + +or the Python-equivalent [honcho](https://github.com/nickstenning/honcho): + +```bash +$ honcho start -f Procfile.dev +``` + +Test client available on [http://127.0.0.1:9000](http://127.0.0.1:9000). + +## Automated Test Simulation + +WIP :) diff --git a/bitrade.py b/bitrade.py new file mode 100644 index 0000000..daf7cfd --- /dev/null +++ b/bitrade.py @@ -0,0 +1,66 @@ +# encoding: utf8 +import os + +import tornado.httpserver +import tornado.web +import tornado.websocket +import tornado.ioloop +import tornado.gen +import tornadoredis + + +c = tornadoredis.Client() +c.connect() + + +class MainHandler(tornado.web.RequestHandler): + def get(self): + self.render('index.html', title='OHAI BITRADE SERVER') + + +class OrderHandler(tornado.websocket.WebSocketHandler): + def __init__(self, *args, **kwargs): + super(OrderHandler, self).__init__(*args, **kwargs) + self.listen() + + @tornado.gen.engine + def listen(self): + self.client = tornadoredis.Client() + self.client.connect() + yield tornado.gen.Task(self.client.subscribe, 'test_channel') + self.client.listen(self.on_order) + + def on_message(self, msg): + print 'message' + c.publish('test_channel', msg) + + def on_order(self, msg): + print 'order' + if msg.kind == 'message': + self.write_message(str(msg.body)) + + def close(self): + print 'closed' + self.client.unsubscribe('test_channel') + self.client.disconnect() + + +class Application(tornado.web.Application): + def __init__(self): + handlers = [ + (r'/', MainHandler), + (r'/orders', OrderHandler), + ] + settings = dict( + debug=True, + # template_path=os.path.join(os.path.dirname(__file__), 'templates'), + # static_path=os.path.join(os.path.dirname(__file__), 'static'), + ) + tornado.web.Application.__init__(self, handlers, **settings) + +if __name__ == "__main__": + app = Application() + http_server = tornado.httpserver.HTTPServer(app) + http_server.listen(9000) + print('B⃦ Bitrade server running... (Ctrl-C to stop)') + tornado.ioloop.IOLoop.instance().start() diff --git a/index.html b/index.html new file mode 100644 index 0000000..bbc2d6a --- /dev/null +++ b/index.html @@ -0,0 +1,45 @@ + + + + + {{ title }} + + + + + + +

{{ title }}

+

Order

+

+ + +

+ +

Messages

+
+ + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..39c6a5d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +redis==2.7.2 +tornado==2.4.1 +tornado-redis==2.4 +wsgiref==0.1.2 -- cgit v1.3.1