Skip to content

Instantly share code, notes, and snippets.

@minikomi
Created November 4, 2011 04:49
Show Gist options
  • Select an option

  • Save minikomi/1338681 to your computer and use it in GitHub Desktop.

Select an option

Save minikomi/1338681 to your computer and use it in GitHub Desktop.
Barebones chat based on longpolling demo
*/*.pid
*/*.db
*/*.conf
<html>
<head>
<title>Long Poller</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css" media="screen">
body { background:#fff; color:#000; font-size:.9em; }
#header { background: #333; color: #fff; padding: 10px;}
#input_box { background: border: 1px #ccc solid; padding: 10px; width: 100%;}
.msg{ background:#aaeeaa; border-bottom: 1px #000 solid; padding: 3px;}
</style>
<script type="text/javascript" charset="utf-8">
function addmsg(type, response_json) {
var msgarray = $.parseJSON(response_json);
$("#messages").html("");
for(var i = 0; i < msgarray.length; i++){
$("#messages").prepend(
"<div class='msg "+ type +"'>"+ msgarray[i] +"</div>"
);
}
}
function waitForMsg() {
$.ajax({
type: "GET",
url: "/feed",
async: true,
cache: false,
timeout:50000,
success: function(data) {
addmsg("new", data);
setTimeout('waitForMsg()', 1000);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
addmsg("error", textStatus + " (" + errorThrown + ")");
setTimeout('waitForMsg()', "15000");
},
});
};
$(document).ready(function(){
waitForMsg();
$("#chat form").submit(function(e){
e.preventDefault();
var success = function(){
$("#msgbox").attr("value", "");
$("#chat .notice").text("Message sent!").show().delay(400).fadeOut(400);
};
var message = $("#msgbox").val();
$.ajax({
type: 'POST',
url: "/feed",
data: {"message": message},
success: success,
dataType: "json"
});
});
});
</script>
</head>
<body>
<div id="header">
</div>
<div id="chat">
<form action="/" method="post" >
<input id="msgbox" type="text" name="message" />
<input type="submit" />
<span class="notice"></span>
</div>
<div id="messages">
</div>
</body>
</html>
#!/usr/bin/env python
from brubeck.request_handling import Brubeck, WebMessageHandler
from brubeck.templating import load_jinja2_env, Jinja2Rendering
import sys
import datetime
import time
import json
import cgi
from gevent.event import Event
class DemoHandler(WebMessageHandler, Jinja2Rendering):
def get(self):
name = self.get_argument('name', 'dude')
self.set_body('Take five, %s!' % name)
return self.render_template('base.html')
class FeedHandler(WebMessageHandler):
def post(self):
message = self.get_argument('message')
if (len(message) > 0):
buffer_array.append(cgi.escape(message))
if len(buffer_array) > 20:
del buffer_array[0]
self.set_body(json.dumps(buffer_array))
new_message_event.set()
new_message_event.clear()
return self.render()
def get(self):
new_message_event.wait()
self.set_body(json.dumps(buffer_array))
return self.render()
config = {
'mongrel2_pair': ('ipc://127.0.0.1:9999', 'ipc://127.0.0.1:9998'),
'handler_tuples': [(r'^/$', DemoHandler),
(r'^/feed', FeedHandler)],
'template_loader': load_jinja2_env('./templates/chat'),
}
new_message_event = Event()
buffer_array = ["Hi there! Welcome to barebones chat."]
app = Brubeck(**config)
app.run()
brubeck_handler = Handler(
send_spec='ipc://127.0.0.1:9999',
send_ident='34f9ceee-cd52-4b7f-b197-88bf2f0ec378',
recv_spec='ipc://127.0.0.1:9998',
recv_ident='')
media_dir = Dir(
base='media/',
index_file='index.html',
default_ctype='text/plain')
brubeck_host = Host(
name="localhost",
routes={
'/media/': media_dir,
'/': brubeck_handler})
brubeck_serv = Server(
uuid="f400bf85-4538-4f7a-8908-67e313d515c2",
access_log="/log/mongrel2.access.log",
error_log="/log/mongrel2.error.log",
chroot="./",
default_host="localhost",
name="brubeck test",
pid_file="/run/mongrel2.pid",
port=6767,
hosts = [brubeck_host]
)
settings = {"zeromq.threads": 1}
servers = [brubeck_serv]
@j2labs
Copy link
Copy Markdown

j2labs commented Nov 4, 2011

This is great! Mind if I hack on it a little bit too? I'd like to add a splash page that asks a user for a user name and then uses a cookie value for submission with each chat message.

I'd also like to put it in the demos, but perhaps we can coauthor a full chat system and give it's own repo too? Would you be into that?

@minikomi
Copy link
Copy Markdown
Author

minikomi commented Nov 4, 2011 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment