Skip to content
Extraits de code Groupes Projets
common.rb 6,27 ko
Newer Older
  • Learn to ignore specific revisions
  • module Diaspora
    
    ilya's avatar
    ilya a validé
      module XMLParser
    
    maxwell's avatar
    maxwell a validé
    
        def parse_owner_from_xml(xml)
          doc = Nokogiri::XML(xml) { |cfg| cfg.noblanks }
    
    maxwell's avatar
    maxwell a validé
          email = doc.xpath("//person/email").text.to_s
    
    maxwell's avatar
    maxwell a validé
        end
    
    ilya's avatar
    ilya a validé
    
        def parse_body_contents_from_xml(xml)
          doc = Nokogiri::XML(xml) { |cfg| cfg.noblanks }
          doc.xpath("/XML/posts/post")
        end
    
        def parse_objects_from_xml(xml)
          objects = []
          body = parse_body_contents_from_xml(xml)
          body.children.each do |post|
            begin
              object = post.name.camelize.constantize.from_xml post.to_s
    
              object.person =  parse_owner_from_xml post.to_s if object.respond_to? :person  
    
    ilya's avatar
    ilya a validé
              objects << object 
            rescue
    
              Rails.logger.info "Not a real type: #{object.to_s}"
    
    ilya's avatar
    ilya a validé
            end
          end
          objects
        end
    
        def store_objects_from_xml(xml)
          objects = parse_objects_from_xml(xml)
          objects.each do |p|
    
            Rails.logger.info("Receiving object:\n#{p.inspect}")
    
            if p.is_a? Retraction
    
    maxwell's avatar
    maxwell a validé
            elsif p.is_a? Request
    
              User.owner.receive_friend_request(p)
    
            #This line checks if the sender was in the database, among other things?
    
            elsif p.respond_to?(:person) && !(p.person.nil?) && !(p.person.is_a? User) #WTF
    
    ilya's avatar
    ilya a validé
            #p.save if p.respond_to?(:person) && !(p.person == nil) #WTF
          end
        end
      end
    
      module Webhooks
    
        def self.included(klass)
          klass.class_eval do
    
            @@queue = MessageHandler.new
    
              end
    
    maxwell's avatar
    maxwell a validé
    
            def push_to(recipients)
    
    maxwell's avatar
    maxwell a validé
              @@queue.add_hub_notification(APP_CONFIG[:pubsub_server], User.owner.url + self.class.to_s.pluralize.underscore + '.atom')
    
              unless recipients.empty?
                recipients.map!{|x| x = x.url + "receive/"}  
                xml = self.class.build_xml_for([self])
    
    ilya's avatar
    ilya a validé
                Rails.logger.info("Adding xml for #{self} to message queue to #{recipients}")
    
                @@queue.add_post_request( recipients, xml )
              end
    
    maxwell's avatar
    maxwell a validé
              @@queue.process
    
            def push_to_url(url)
              hook_url = url + "receive/"
    
    maxwell's avatar
    maxwell a validé
              xml = self.class.build_xml_for([self])
    
    ilya's avatar
    ilya a validé
              Rails.logger.info("Adding xml for #{self} to message queue to #{url}")
    
    maxwell's avatar
    maxwell a validé
              @@queue.add_post_request( [hook_url], xml )
              @@queue.process
    
            def prep_webhook
              "<post>#{self.to_xml.to_s}</post>"
    
    maxwell's avatar
    maxwell a validé
               Person.friends.all
    
    
            def self.build_xml_for(posts)
    
    maxwell's avatar
    maxwell a validé
              xml += "\n <posts>"
    
              posts.each {|x| xml << x.prep_webhook}
    
              xml += "</posts>"
              xml += "</XML>"
    
    
      module XML
    
        def self.generate(opts= {})
    
          xml = Generate::headers(opts[:current_url])
          xml << Generate::author
          xml << Generate::endpoints
          xml << Generate::subject
          xml << Generate::entries(opts[:objects])
          xml << Generate::footer
    
        module Generate
          def self.headers(current_url)
    
            <<-XML
    <?xml version="1.0" encoding="UTF-8"?>
    <feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
    
    <generator uri="http://joindiaspora.com/">Diaspora</generator>
    
    <id>#{current_url}</id>
    <title>Stream</title>
    <subtitle>its a stream </subtitle>
    <updated>#{Time.now.xmlschema}</updated>
            XML
          end
    
    <name>#{@@user.real_name}</name>
    <uri>#{@@user.url}</uri>
    
    maxwell's avatar
    maxwell a validé
     <link href="#{APP_CONFIG[:pubsub_server]}" rel="hub"/>
    
          end
          
          def self.subject
            <<-XML
    <activity:subject>
    <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
    
    <id>#{@@user.url}</id>
    <title>#{@@user.real_name}</title>
    <link rel="alternative" type="text/html" href="#{@@user.url}"/>
    
          def self.entries(objects)
            xml = ""
            if objects.respond_to? :each
              objects.each {|x| xml << self.entry(x)}
            else
              xml << self.entry(objects)
            end
            xml
          end
    
          def self.entry(object)
            eval "#{object.class}_build_entry(object)"
          end
    
          def self.StatusMessage_build_entry(status_message)
            <<-XML
    <entry>
    
    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
    
    <title>#{status_message.message}</title>
    
    <link rel="alternate" type="text/html" href="#{@@user.url}status_messages/#{status_message.id}"/>
    <id>#{@@user.url}status_messages/#{status_message.id}</id>
    
    <published>#{status_message.created_at.xmlschema}</published>
    <updated>#{status_message.updated_at.xmlschema}</updated>
    </entry>
            XML
          end
    
          def self.Bookmark_build_entry(bookmark)
            <<-XML
    <entry>
    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
    <title>#{bookmark.title}</title>
    
    <link rel="alternate" type="text/html" href="#{@@user.url}bookmarks/#{bookmark.id}"/>
    
    <link rel="related" type="text/html" href="#{bookmark.link}"/>
    
    <id>#{@@user.url}bookmarks/#{bookmark.id}</id>
    
    <published>#{bookmark.created_at.xmlschema}</published>
    <updated>#{bookmark.updated_at.xmlschema}</updated>
    </entry>
            XML
          end
    
    
    
          def self.Blog_build_entry(blog)
            <<-XML
    <entry>
    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
    <title>#{blog.title}</title>
    <content>#{blog.body}</content>
    
    <link rel="alternate" type="text/html" href="#{@@user.url}blogs/#{blog.id}"/>
    <id>#{@@user.url}blogs/#{blog.id}</id>
    
    <published>#{blog.created_at.xmlschema}</published>
    <updated>#{blog.updated_at.xmlschema}</updated>
    </entry>
            XML
          end