Skip to content

Instantly share code, notes, and snippets.

@gmarik
Forked from mloughran/README.md
Created May 11, 2011 05:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gmarik/965943 to your computer and use it in GitHub Desktop.
Save gmarik/965943 to your computer and use it in GitHub Desktop.

Getting started

First add your twitter username and password. Then server.rb and once it's started open websocket.html in your browser. You should see some tweets appear. If not take a look at the javascript console.

require 'em-http'
require 'json'
class LanguageDetector
URL = "http://www.google.com/uds/GlangDetect"
include EM::Deferrable
def initialize(text)
request = EM::HttpRequest.new(URL).get({
:query => {:v => "1.0", :q => text}
})
# This is called if the request completes successfully (whatever the code)
request.callback {
begin
if request.response_header.status == 200
info = JSON.parse(request.response)["responseData"]
if info['isReliable']
self.succeed(info['language'])
else
self.fail("Language could not be reliably determined")
end
else
self.fail("Call to fetch language failed")
end
rescue
puts request.response
self.fail
end
}
# This is called if the request totally failed
request.errback {
self.fail("Error making API call")
}
end
end
require 'rubygems'
require 'eventmachine'
require 'em-websocket'
require 'twitter_stream'
require 'language_detector'
TWITTER_USERNAME = ''
TWITTER_PASSWORD = ''
TWITTER_TERM = 'twitter'
EM.run {
websocket_connections = []
EM::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen {
puts "Websocket connection opened"
websocket_connections << ws
}
ws.onclose {
puts "Websocket connection closed"
websocket_connections.delete(ws)
}
end
stream = TwitterStream.new(TWITTER_USERNAME, TWITTER_PASSWORD, TWITTER_TERM)
stream.ontweet { |tweet|
puts "New tweet in : #{tweet}"
websocket_connections.each do |socket|
socket.send(JSON.generate({
:tweet => tweet
}))
end
# LanguageDetector.new(tweet).callback { |lang|
#
# websocket_connections.each do |socket|
# socket.send(JSON.generate({
# :lang => lang,
# :tweet => tweet
# }))
# end
# }
}
}
require 'em-http'
require 'json'
class TwitterStream
URL = 'http://stream.twitter.com/1/statuses/filter.json'
def initialize(username, password, term)
@username, @password = username, password
@term = term
@callbacks = []
@buffer = ""
listen
end
def ontweet(&block)
@callbacks << block
end
private
def listen
http = EventMachine::HttpRequest.new(URL).post({
:head => { 'Authorization' => [@username, @password] },
:query => { "track" => @term }
})
http.stream do |chunk|
@buffer += chunk
process_buffer
end
end
def process_buffer
while line = @buffer.slice!(/.+\r\n/)
tweet = JSON.parse(line)
@callbacks.each { |c| c.call(tweet['text']) }
end
end
end
<!DOCTYPE html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
var container = $('.container');
var addTweetToPage = function(language, tweet) {
var id = 'tweet' + language;
if ($('#'+id).length == 0) {
container.prepend('<div id="'+id+'"><h1>'+language+'</h1></div>')
}
$('#'+id).prepend('<div class="tweet">'+tweet+'</div>');
};
var socket = new WebSocket('ws://0.0.0.0:8080/');
socket.onopen = function() {
console.log("Socket opened");
};
socket.onmessage = function(message) {
var info = JSON.parse(message.data);
console.log(info.lang, info.tweet);
addTweetToPage(info.lang, info.tweet);
};
socket.onclose = function() {
console.log("Socket closed");
};
})
</script>
</head>
<body>
<div class="container"></div>
</body>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment