#!/usr/local/bin/ruby require 'rubygems' require 'dm-core' require 'twitter' require 'net/smtp' require 'net/http' require 'uri' require 'json' require 'dm-core' # # passwords # TWITTER_USER_NAME = "kissmehere" TWITTER_PASSWORD = "" METACARTA_USERID = "" METACARTA_PASSWORD = "" METACARTA_KEY = "" # # a very very nice metacarta utility to brute force discover location in text # def geolocate(location) location = URI.escape(location, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")) # location = URI.escape(location) host = "ondemand.metacarta.com" path = "/webservices/GeoTagger/JSON/basic?version=1.0.0" path = "#{path}&doc=#{location}" data = {} begin req = Net::HTTP::Get.new(path) req.basic_auth METACARTA_USERID, METACARTA_PASSWORD http = Net::HTTP.start(host) #if response.is_a?(Net::HTTPSuccess) response = http.request(req) puts response.body data = JSON.parse(response.body) #end rescue Timeout::Error # DO SOMETHING WISER return 0,0 rescue return 0,0 end begin lat = data["Locations"][0]["Centroid"]["Latitude"] lon = data["Locations"][0]["Centroid"]["Longitude"] return lat,lon rescue end return 0,0 end # # Only send out 10 tweets at a time # twittercap = 10 # # Grab a database # DataMapper.setup(:default, { :adapter => 'postgres', :database => "kissmehere", :username => '', :password => '', :host => 'localhost' }) # # here is our schema # class Kiss include DataMapper::Resource property :id, Integer, :serial => true property :provenance, Text property :uuid, Text property :title, Text property :link, Text property :description, Text property :screenname, Text property :userid, Text property :location, Text property :lat, Float property :lon, Float property :secret, Integer, :default => 0 property :friended, Integer, :default => 0 property :kissed_at, DateTime property :created_at, DateTime end # # uncomment to remake the database # # DataMapper.auto_migrate! # # Remember kiss requests # twitter = Twitter::Base.new(TWITTER_USER_NAME, TWITTER_PASSWORD ) twitter.replies().each do |twit| uuid = "#{twit.id}" kiss = Kiss.first(:provenance => "twitter", :uuid => uuid) next if kiss secret = 0 secret = 1 if twit.text[/ secret/] != nil lat = 0 lon = 0 if twit.user.location && twit.user.location.length > 1 lat,lon = geolocate(twit.user.location) end kiss = Kiss.create( :provenance => "twitter", :uuid => uuid, :title => twit.text, :link => nil, :description => nil, :screenname => twit.user.screen_name, :userid => twit.user.id, :location => twit.user.location, :lon => lon, :lat => lat, :secret => secret ) kiss.save puts "Saved a kiss on twitter! #{kiss.userid} #{kiss.title} #{kiss.lat} #{kiss.lon}" end # # Remember secret kiss requests # twitter.direct_messages().each do |twit| uuid = "#{twit.id}" kiss = Kiss.first(:provenance => "twitter", :uuid => uuid) next if kiss secret = 1 kiss = Kiss.create( :provenance => "twitter", :uuid => uuid, :title => twit.text, :link => nil, :description => nil, :screenname => twit.user.screen_name, :userid => twit.user.id, :location => twit.user.location, :lon => 0, :lat => 0, :secret => secret ) puts "Found a secret kiss on twitter! #{kiss.userid} #{kiss.title} #{kiss.lat} #{kiss.lon}" end # # Pass new kisses onwards ( only do twittercaps worth ) # @kisses = Kiss.all(:order => [:created_at.desc], :limit => twittercap, :kissed_at => nil ).each do |kiss| # tease each kiss apart for multiple receivers kisses = kiss.title.scan(/\@\w+/) kisses.each do |luckyduck| next if luckyduck == "@kissmehere" if kiss.secret == 0 kiss.link = "http://twitter.com/#{kiss.screenname}/statuses/#{kiss.uuid}" gossip = "#{luckyduck} got a kiss from @#{kiss.screenname} - see #{kiss.link} " # if kiss.lat != 0 && kiss.lon != 0 # gossip = " - #{gossip} near #{kiss.location}" # end else kiss.link = nil gossip = "@#{luckyduck} got a kiss from an anonymous admirer!" end kiss.description = gossip result = twitter.post(gossip) puts "Told everybody #{result} of #{gossip}" end if kisses.length == 0 puts "No love from #{kiss.screenname}" end kiss.kissed_at = DateTime.now kiss.save # friend everybody - could improve this begin twitter.create_friendship(kiss.screenname) rescue end kisses.each do |luckyduck| begin #if twitter.friendship_exists(TWITTER_USER_NAME,luckyduck) twitter.create_friendship(luckyduck) rescue end end end File.open("kisses.xml","w") do |f| f.puts('') f.puts('') f.puts('') f.puts('makerlab.org') f.puts('Kisses all over the world') f.puts('http://kisses.makerlab.org') f.puts('kisses all over the world') f.puts('en') f.puts('Sun, 12 Apr 2009 23:03:28 GMT') @kisses = Kiss.all(:order => [:created_at.desc], :limit => twittercap, :description.not => nil, :lon.not => 0, :lat.not => 0).each do |kiss| f.puts("") f.puts("#{kiss.description}") f.puts("#{kiss.link}") f.puts("http://twitter.com/statuses/#{kiss.uuid}") f.puts("a kiss no way") # f.puts("#{kiss.created_at}") f.puts("#{kiss.lat}") f.puts("#{kiss.lon}") f.puts("") end f.puts('') f.puts('') end