simonreed-lyrebird 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,12 @@
1
+ = LyreBird
2
+
3
+ Twitter Gateway, allows your app to respond to natural language questions from Twitter.
4
+
5
+ == Requirements
6
+
7
+ * HTTParty http://github.com/jnunemaker/httparty/ - For accessing the Twitter web service.
8
+
9
+ == Install
10
+
11
+ * sudo gem sources -a http://gems.github.com
12
+ * sudo gem install simonreed-lyrebird
@@ -0,0 +1,15 @@
1
+ class LyreBird::Request
2
+
3
+ attr_accessor :tweet
4
+ attr_accessor :response
5
+
6
+ def initialize(options={})
7
+ self.tweet = options[:tweet]
8
+ self.response = self.respond(:text => self.tweet['text'].gsub(/\@nicetripper /,''))
9
+ end
10
+
11
+ def respond(options={})
12
+ params = LyreBird::Route.route(options[:text])
13
+ LyreBird::Response.new(:params => params,:to => self.tweet['user']['screen_name'], :request_tweet => self.tweet)
14
+ end
15
+ end
@@ -0,0 +1,78 @@
1
+ class LyreBird::Response
2
+
3
+ attr_accessor :to
4
+ attr_accessor :text
5
+ attr_accessor :params
6
+ attr_accessor :request_tweet
7
+
8
+ def initialize(options={})
9
+ self.params = options[:params]
10
+ self.to = options[:to]
11
+ self.request_tweet = options[:request_tweet]
12
+
13
+ if self.params.nil?
14
+ error
15
+ return
16
+ end
17
+
18
+ history = $responses[self.to]
19
+
20
+ klass = self.params['class'] || 'LyresController'
21
+ method = self.params['method'] || 'hot'
22
+
23
+ self.text = klass.constantize.new.send method.to_sym, self, history, self.params
24
+
25
+ end
26
+
27
+ def register_response(params)
28
+ $responses[self.to] = params
29
+ end
30
+
31
+ def error
32
+ puts "LyreBird::Response.error"
33
+ $no_responses.push(self.request_tweet)
34
+ msg = "Don't know what you're asking for"
35
+ self.text = msg
36
+ puts "LyreBird::Response.error self.text #{self.text}"
37
+ if DEBUG
38
+ puts "-" * 50
39
+ puts
40
+ puts "From @#{self.request_tweet['user']['screen_name']} - \"#{self.request_tweet['text']}\""
41
+ puts
42
+ puts "POSTING Don't get it - \"#{msg}\""
43
+ puts
44
+ puts "-" * 50
45
+ end
46
+ end
47
+
48
+ def post(live=false)
49
+
50
+ history = $responses[self.to]
51
+
52
+ msg = self.text
53
+
54
+ puts
55
+ puts "-" * 50
56
+ puts
57
+ puts "From @#{self.request_tweet['user']['screen_name']} - \"#{self.request_tweet['text']}\""
58
+ puts
59
+ puts "Reply - \"#{msg}\""
60
+ puts
61
+ puts "-" * 50
62
+ puts
63
+
64
+ if DEBUG
65
+ puts
66
+ puts "Params - #{self.params.inspect}"
67
+ puts
68
+ puts "History - #{history.inspect}"
69
+ puts
70
+ puts "-" * 50
71
+ end
72
+
73
+
74
+ if live
75
+ $twitter.post(msg)
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,48 @@
1
+ ROUTES = YAML.load_file("#{RAILS_ROOT}/config/lyre_routes.yml")
2
+
3
+ class LyreBird::Route
4
+ def initialize(options={})
5
+
6
+ end
7
+
8
+ def self.route(str='', debug=false)
9
+
10
+ successes = []
11
+ puts "Parsing '#{str}'" if DEBUG
12
+ ::ROUTES.each do | r |
13
+ route = r['str']
14
+ clear = r['clear']
15
+ puts "- Trying '#{route}'" if DEBUG
16
+ regex = {}
17
+ regex[:vars] = route.gsub(/(:[a-z]*)/, '(:[a-z]*)')
18
+ puts "- REGEX VARS '#{regex[:vars]}'" if DEBUG
19
+ vars = route.match(regex[:vars])
20
+
21
+ puts "str = '#{str}'" if CONSOLE and vars.nil?
22
+ puts "str.match(/#{regex[:vars]}/)" if CONSOLE and vars.nil?
23
+
24
+ puts "- NO VARS '#{vars.inspect}'" if DEBUG and vars.nil?
25
+ next if vars.nil?
26
+
27
+ regex[:values] = regex[:vars].gsub(/\:\[a\-z\]/, '.')
28
+ puts "- Trying '#{regex[:values]}'" if DEBUG
29
+ values = str.match(regex[:values])
30
+
31
+ next if values.nil?
32
+
33
+ params = {}.merge(r)
34
+
35
+ i = 1;
36
+
37
+ vars[1,vars.size].each do | var |
38
+ clean_name = var.gsub(/:/,'')
39
+ params[clean_name.to_sym] = values[i]
40
+ i += 1
41
+ end
42
+ params = (str.match(/good|ok|pretty good/).nil?) ? params : params.merge({:sort => :rating})
43
+ puts "-- PASS '#{route}' got #{params.inspect}" if DEBUG
44
+ successes.unshift(params)
45
+ end
46
+ return successes.last
47
+ end
48
+ end
@@ -0,0 +1,34 @@
1
+ require 'httparty'
2
+
3
+ class LyreBird::Twitter
4
+ include HTTParty
5
+ base_uri 'twitter.com'
6
+
7
+ def initialize(u, p)
8
+ @auth = {:username => u, :password => p}
9
+ end
10
+
11
+ # which can be :friends, :user or :public
12
+ # options[:query] can be things like since, since_id, count, etc.
13
+ def mentions(which=:mentions, options={})
14
+ since_id = options[:since_id]
15
+ options = {}
16
+ options.merge!({:basic_auth => @auth})
17
+ url = "/statuses/#{which}.json?"
18
+ url += "since_id=#{since_id}" unless since_id.nil?
19
+ puts "Requesting #{url} from Twitter API"
20
+ self.class.get(url, options)
21
+ end
22
+
23
+ # which can be :friends, :user or :public
24
+ # options[:query] can be things like since, since_id, count, etc.
25
+ def timeline(which=:friends, options={})
26
+ options.merge!({:basic_auth => @auth})
27
+ self.class.get("/statuses/#{which}_timeline.json", options)
28
+ end
29
+
30
+ def post(text)
31
+ options = { :query => {:status => text}, :basic_auth => @auth }
32
+ self.class.post('/statuses/update.json', options)
33
+ end
34
+ end
data/lib/lyre_bird.rb ADDED
@@ -0,0 +1,69 @@
1
+ CONSOLE = false
2
+ DEBUG = false
3
+
4
+ class LyreBird
5
+
6
+ attr_accessor :username
7
+ attr_accessor :password
8
+
9
+ def initialize(options={})
10
+ $responses = {}
11
+ self.username = options[:username] || 'username'
12
+ self.password = options[:password] || 'password'
13
+ end
14
+
15
+ def listen(options={})
16
+ options = { :limit => 1, :sleep=> 5}.merge(options)
17
+
18
+ responses = []
19
+ :limit.to_i.times do
20
+ responses.push(self.check(:post => true))
21
+ end
22
+ responses
23
+ end
24
+
25
+ def get_since
26
+ since = 0;
27
+ filename = "#{RAILS_ROOT}/config/listenSince.txt"
28
+ File.open(filename).each { |line|
29
+ since = line
30
+ }
31
+ since
32
+ end
33
+
34
+ def set_since(since_id)
35
+ filename = "#{RAILS_ROOT}/config/listenSince.txt"
36
+ puts "Modified SINCE_ID to - #{since_id}"
37
+ since = File.open(filename, 'w') {|f| f.write(since_id) }
38
+ since
39
+ end
40
+
41
+ def check(options={})
42
+
43
+ options = {:live=>true}.merge(options)
44
+ responses = []
45
+
46
+ if options[:messages]
47
+ puts "DOING AN OFFLINE LYREBIRD CHECK"
48
+ mentions = options[:messages]
49
+ else
50
+ $twitter = LyreBird::Twitter.new(self.username,self.password)
51
+ since = options[:since] || get_since()
52
+ mentions = $twitter.mentions(:mentions,{ :since_id => since })
53
+ end
54
+
55
+ mentions = mentions.sort {|a,b| a['id']<=>b['id']}
56
+ mentions.each do | tweet |
57
+ puts "Tweet - #{tweet.keys.to_yaml}" if DEBUG
58
+ req = LyreBird::Request.new(:tweet => tweet)
59
+ if options[:post]
60
+ req.response.post(options[:live])
61
+ end
62
+ responses.push(req.response)
63
+ end
64
+
65
+ puts "NO NEW TWEETS @ #{Time.now}" unless mentions.size > 0
66
+ set_since(mentions.last['id']) unless mentions.size == 0
67
+ end
68
+
69
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simonreed-lyrebird
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.1"
5
+ platform: ruby
6
+ authors:
7
+ - Simon Reed
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-09-07 00:00:00 -07:00
13
+ default_executable: lyrebird
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: httparty
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.4.4
24
+ version:
25
+ description: Twitter Gateway, respond to natural language questions from Twitter.
26
+ email: simonpreed@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - lib/lyre_bird/request.rb
35
+ - lib/lyre_bird/response.rb
36
+ - lib/lyre_bird/route.rb
37
+ - lib/lyre_bird/twitter.rb
38
+ - lib/lyre_bird.rb
39
+ - README.rdoc
40
+ has_rdoc: true
41
+ homepage: http://github.com/simonreed/LyreBird/tree/master
42
+ post_install_message: Thanks for installing LyreBird!
43
+ rdoc_options:
44
+ - --line-numbers
45
+ - --inline-source
46
+ - --title
47
+ - Httparty
48
+ - --main
49
+ - README.rdoc
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ version:
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "1.2"
63
+ version:
64
+ requirements: []
65
+
66
+ rubyforge_project:
67
+ rubygems_version: 1.2.0
68
+ signing_key:
69
+ specification_version: 2
70
+ summary: Twitter Gateway, respond to natural language questions from Twitter.
71
+ test_files: []
72
+