diff --git a/Gemfile b/Gemfile index a37827cf3..acc67da92 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,10 @@ source 'http://rubygems.org' gem 'rails', '3.0.0.beta4' - +gem 'mongrel' +gem 'thin' +gem 'em-http-request' +gem 'addressable' gem "mongoid", :git => "http://github.com/durran/mongoid.git" gem "bson_ext", "1.0.1" gem "haml" diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f2569b3a7..958d7a9e2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,4 +1,10 @@ class ApplicationController < ActionController::Base protect_from_forgery layout 'application' + + def receive + puts response.inspect + puts "holy boner batman" + end + end diff --git a/app/models/post.rb b/app/models/post.rb index e4f4eb175..6375cbe84 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1,4 +1,5 @@ class Post + require 'lib/common' # XML accessors must always preceed mongo field tags @@ -6,6 +7,8 @@ class Post include Mongoid::Timestamps include ROXML + include Diaspora::Hookey + xml_accessor :owner xml_accessor :snippet xml_accessor :source diff --git a/app/models/status_message.rb b/app/models/status_message.rb index 4aec011e6..b9eb2c4fc 100644 --- a/app/models/status_message.rb +++ b/app/models/status_message.rb @@ -18,7 +18,7 @@ class StatusMessage < Post end def self.retrieve_from_friend(friend) - StatusMessages.from_xml Curl.curl(friend.url+"status_messages.xml") + StatusMessages.from_xml Curl.get(friend.url+"status_messages.xml") end def ==(other) diff --git a/config/routes.rb b/config/routes.rb index 81cd16e47..f1466709a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -13,7 +13,8 @@ Diaspora::Application.routes.draw do |map| match 'login', :to => 'devise/sessions#new', :as => "new_user_session" match 'logout', :to => 'devise/sessions#destroy', :as => "destroy_user_session" match 'signup', :to => 'devise/registrations#new', :as => "new_user_registration" - + + match 'receive', :to => 'application#receive' resources :users resources :status_messages diff --git a/lib/common.rb b/lib/common.rb index a89072fc5..312d7f773 100644 --- a/lib/common.rb +++ b/lib/common.rb @@ -1,18 +1,61 @@ -module CommonField +module Diaspora + module CommonFields + def self.included(klass) + klass.class_eval do + include Mongoid::Document + include ROXML + include Mongoid::Timestamps - def self.included(klass) - klass.class_eval do - include Mongoid::Document - include ROXML - include Mongoid::Timestamps + xml_accessor :owner + xml_accessor :snippet + xml_accessor :source - xml_accessor :owner - xml_accessor :snippet - xml_accessor :source + field :owner + field :source + field :snippet + end + end + end - field :owner - field :source - field :snippet + module Hookey + +class Curl + def self.post(s) + `curl -X POST -d #{s}`;; + end + + def self.get(s) + `curl -X GET #{s}` + end +end + + + def self.included(klass) + + klass.class_eval do + require 'lib/message_handler' + before_save :notify_friends + + def notify_friends + m = MessageHandler.new + + xml = prep_webhook + #friends_with_permissions.each{ |friend| puts friend; Curl.post( "\"" + xml + "\" " + friend) } + m.add_post_request( friends_with_permissions, xml ) + m.process + end + + def prep_webhook + self.to_xml.to_s.chomp + end + + def friends_with_permissions + #Friend.only(:url).map{|x| x = x.url + "/receive/"} + googles = [] + 5.times{ googles <<"http://google.com/"} #"http://localhost:4567/receive/"} #"http://google.com/"} + googles + end + end end end end diff --git a/lib/message_handler.rb b/lib/message_handler.rb new file mode 100644 index 000000000..8ef7594fa --- /dev/null +++ b/lib/message_handler.rb @@ -0,0 +1,64 @@ + require 'em-http' + require 'eventmachine' + require 'addressable/uri' + + class MessageHandler + + + NUM_TRIES = 3 + TIMEOUT = 5 #seconds + + def initialize + @queue = EM::Queue.new + end + + def add_get_request(destinations) + destinations.each{ |dest| @queue.push(Message.new(:get, dest))} + end + + + def add_post_request(destinations, body) + destinations.each{|dest| @queue.push(Message.new(:post, dest, body))} + end + + def process + @queue.pop{ |query| + case query.type + when :post + http = EventMachine::HttpRequest.new(query.destination).post :timeout => TIMEOUT, :body =>query.body + http.callback { process} + when :get + http = EventMachine::HttpRequest.new(query.destination).get :timeout => TIMEOUT + http.callback {send_to_seed(query, http.response); process} + else + raise "message is not a type I know!" + end + + http.errback { + query.try_count +=1 + @queue.push query unless query.try_count >= NUM_TRIES + process + } + } unless @queue.size == 0 + end + + + def send_to_seed(message, http_response) + #DO SOMETHING! + end + + def size + @queue.size + end + + class Message + attr_accessor :type, :destination, :body, :try_count + def initialize(type, dest, body= nil) + @type = type + @destination = dest + @body = body + @try_count = 0 + end + end +end + diff --git a/lib/net/curl.rb b/lib/net/curl.rb index 410255146..4220a27f7 100644 --- a/lib/net/curl.rb +++ b/lib/net/curl.rb @@ -1,6 +1,10 @@ class Curl - def self.curl(s) - `curl #{s}` + def self.post(s) + `curl -X POST -d #{s}`;; + end + + def self.get(s) + `curl -X GET #{s}` end end