-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit a178fb3
Showing
9 changed files
with
223 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
sinatra | ||
json | ||
mash --version '= 0.0.3' | ||
httparty --version '= 0.4.3' | ||
fakeweb | ||
siuying-twitter --source gems.github.com | ||
activesupport --version '=> 2.2.0' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
require 'green' | ||
|
||
run Green.new |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#!/usr/bin/env ruby | ||
require 'rubygems' | ||
require 'json' | ||
require 'sinatra/base' | ||
|
||
require 'lib/green' | ||
|
||
DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{FileUtils.pwd}/green.db") | ||
Tweet.first rescue DataMapper.auto_migrate! | ||
|
||
class Green < Sinatra::Default | ||
register Sinatra::Green::Controller | ||
|
||
set :views, 'views' | ||
set :public, 'public' | ||
set :environment, :production | ||
set :search_terms, ["綠壩", "绿坝", "greendam"] | ||
|
||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
path = File.expand_path(File.dirname(__FILE__)) | ||
$:.unshift(path) unless $:.include?(path) | ||
|
||
gem 'datamapper', '>= 0.9.11' | ||
gem 'data_objects', '>= 0.9.11' | ||
require 'data_objects' | ||
gem 'do_postgres', '>= 0.9.11' | ||
require 'do_postgres' | ||
require 'datamapper' | ||
|
||
require 'search' | ||
require 'green/model' | ||
require 'green/controller' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
require 'sinatra/base' | ||
$KCODE = 'UTF8' | ||
|
||
module Sinatra | ||
module Green | ||
module Controller | ||
def self.registered(app) | ||
app.helpers Helpers | ||
|
||
app.before do | ||
@log = Logger.new($stdout) | ||
begin | ||
options.search_terms.each do |term| | ||
tweet(term) | ||
end | ||
rescue StandardError => e | ||
@log.error "error loading tweet: #{e}" | ||
end | ||
end | ||
|
||
app.get '/' do | ||
@items = Tweet.all(:order => [:twitter_id.desc], :limit => 50) | ||
erb :index | ||
end | ||
|
||
app.error do | ||
"Opps! Something happened. Please report to me @<a href=\"http://twitter.com/siuying\">siuying</a>" | ||
end | ||
end | ||
|
||
module Helpers | ||
def tweet(term) | ||
last_tweet = Tweet.first(:order => [:twitter_id.desc]).twitter_id rescue 0 | ||
s = Twitter::Search.new(term).since(last_tweet).each do |t| | ||
tweet = Tweet.first(:twitter_id => t['id']) | ||
if tweet.nil? | ||
Tweet.new(:from_user => t['from_user'], | ||
:to_user => t['to_user'], | ||
:created_at => t['created_at'], | ||
:profile_image_url => t['profile_image_url'], | ||
:text => t['text'], | ||
:twitter_id => t['id']).save | ||
end | ||
tweet | ||
end | ||
end | ||
def h(text) | ||
Rack::Utils.escape_html(text) | ||
end | ||
end | ||
end | ||
|
||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
class Tweet | ||
include DataMapper::Resource | ||
property :id, Serial | ||
property :from_user, String, :length => 50 | ||
property :to_user, String, :length => 50 | ||
property :created_at, DateTime | ||
property :profile_image_url, String, :length => 256 | ||
property :text, String, :length => 140 | ||
property :twitter_id, Integer | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
require 'httparty' | ||
|
||
module Twitter | ||
class Search | ||
include HTTParty | ||
include Enumerable | ||
|
||
attr_reader :result, :query | ||
|
||
def initialize(q=nil) | ||
clear | ||
containing(q) if q && q.strip != '' | ||
end | ||
|
||
def from(user) | ||
@query[:q] << "from:#{user}" | ||
self | ||
end | ||
|
||
def to(user) | ||
@query[:q] << "to:#{user}" | ||
self | ||
end | ||
|
||
def referencing(user) | ||
@query[:q] << "@#{user}" | ||
self | ||
end | ||
alias :references :referencing | ||
alias :ref :referencing | ||
|
||
def containing(word) | ||
@query[:q] << "#{word}" | ||
self | ||
end | ||
alias :contains :containing | ||
|
||
# adds filtering based on hash tag ie: #twitter | ||
def hashed(tag) | ||
@query[:q] << "##{tag}" | ||
self | ||
end | ||
|
||
# lang must be ISO 639-1 code ie: en, fr, de, ja, etc. | ||
# | ||
# when I tried en it limited my results a lot and took | ||
# out several tweets that were english so i'd avoid | ||
# this unless you really want it | ||
def lang(lang) | ||
@query[:lang] = lang | ||
self | ||
end | ||
|
||
# Limits the number of results per page | ||
def per_page(num) | ||
@query[:rpp] = num | ||
self | ||
end | ||
|
||
# Which page of results to fetch | ||
def page(num) | ||
@query[:page] = num | ||
self | ||
end | ||
|
||
# Only searches tweets since a given id. | ||
# Recommended to use this when possible. | ||
def since(since_id) | ||
@query[:since_id] = since_id | ||
self | ||
end | ||
|
||
# Search tweets by longitude, latitude and a given range. | ||
# Ranges like 25km and 50mi work. | ||
def geocode(long, lat, range) | ||
@query[:geocode] = [long, lat, range].join(',') | ||
self | ||
end | ||
|
||
def max(id) | ||
@query[:max_id] = id | ||
self | ||
end | ||
|
||
# Clears all the query filters to make a new search | ||
def clear | ||
@fetch = nil | ||
@query = {} | ||
@query[:q] = [] | ||
self | ||
end | ||
|
||
def fetch(force=false) | ||
if @fetch.nil? || force | ||
query = @query.dup | ||
query[:q] = query[:q].join(' ') | ||
response = self.class.get('http://search.twitter.com/search.json', :query => query, :format => :json) | ||
@fetch = Mash.new(response) | ||
end | ||
|
||
@fetch | ||
end | ||
|
||
def each | ||
fetch()['results'].each { |r| yield r } | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
<ul> | ||
<% for item in @items do %> | ||
<li> | ||
<span class="name"><%= h item.from_user %></span> | ||
<span class="message"><%= h item.text %></span> | ||
<span class="time"><%= h item.created_at %></span> | ||
</li> | ||
<% end %> | ||
</ul> |