Skip to content

Instantly share code, notes, and snippets.

@zeekay
Created September 16, 2011 10:13
Show Gist options
  • Save zeekay/1221757 to your computer and use it in GitHub Desktop.
Save zeekay/1221757 to your computer and use it in GitHub Desktop.
chat.py
from bottle import route, request, run, static_file, template
from bottle_websocket import websocket, GeventWebSocketServer
from collections import defaultdict, deque
class ChatRoom(object):
users = {}
buffer = deque(maxlen=15)
def message(self, name, message):
self.buffer.append((name, message))
for user, ws in self.users.iteritems():
if user != name:
ws.json({'type': 'msg', 'user': name, 'text': message})
def status(self, type, user):
for user, ws in self.users.iteritems():
ws.json({'type': type, 'user': user})
def join(self, name, ws):
self.status('join', name)
self.users[name] = ws
if self.buffer:
ws.json({'type': 'buffer', 'mgs': [{'user': user, 'text': text} for user, text in self.buffer]})
def part(self, name):
del self.users[name]
self.status('part', name)
chatrooms = defaultdict(ChatRoom)
@route('/')
def index():
return template('index')
@route('/chat/:room/:name', apply=[websocket])
def chat(ws, room, name):
room = chatrooms[room]
if name in room.users:
return ws.json({'error': 'Nickname taken'})
room.join(name, ws)
while True:
message = ws.wait()
if message is not None:
room.message(name, message)
else:
room.part(name)
break
@route('/static/:filename#.+#')
def serve_static(filename):
return static_file(filename, root='static')
run(host='127.0.0.1', port=8080, server=GeventWebSocketServer)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment