Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
siuying committed Jun 24, 2009
0 parents commit a178fb3
Show file tree
Hide file tree
Showing 9 changed files with 223 additions and 0 deletions.
7 changes: 7 additions & 0 deletions .gems
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'
3 changes: 3 additions & 0 deletions config.ru
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
require 'green'

run Green.new
Binary file added green.db
Binary file not shown.
19 changes: 19 additions & 0 deletions green.rb
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
13 changes: 13 additions & 0 deletions lib/green.rb
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'
54 changes: 54 additions & 0 deletions lib/green/controller.rb
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
10 changes: 10 additions & 0 deletions lib/green/model.rb
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
108 changes: 108 additions & 0 deletions lib/search.rb
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
9 changes: 9 additions & 0 deletions views/index.erb
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>

0 comments on commit a178fb3

Please sign in to comment.