Skip to content
Extraits de code Groupes Projets
status_message.rb 4,33 ko
Newer Older
  • Learn to ignore specific revisions
  • Raphael's avatar
    Raphael a validé
    #   Copyright (c) 2010, Diaspora Inc.  This file is
    
    Raphael's avatar
    Raphael a validé
    #   licensed under the Affero General Public License version 3 or later.  See
    
    Raphael's avatar
    Raphael a validé
    #   the COPYRIGHT file.
    
      include Diaspora::Socketable
    
      include Diaspora::Taggable
    
    
      include YoutubeTitles
      require File.join(Rails.root, 'lib/youtube_titles')
    
    Raphael Sofaer's avatar
    Raphael Sofaer a validé
      acts_as_taggable_on :tags
    
      extract_tags_from :raw_message
    
    Raphael Sofaer's avatar
    Raphael Sofaer a validé
    
    
      validates_length_of :text, :maximum => 10000, :message => I18n.t('status_messages.too_long', :count => 10000)
    
      xml_name :status_message
    
      xml_attr :raw_message
    
    ilya's avatar
    ilya a validé
    
    
      has_many :photos, :dependent => :destroy, :foreign_key => :status_message_guid, :primary_key => :guid
    
    Raphael's avatar
    Raphael a validé
      serialize :youtube_titles, Hash
    
    Raphael Sofaer's avatar
    Raphael Sofaer a validé
    
    
    Raphael Sofaer's avatar
    Raphael Sofaer a validé
      def text(opts = {})
    
    maxwell's avatar
    maxwell a validé
        self.formatted_message(opts)
    
      end
      def raw_message=(text)
    
      def formatted_message(opts={})
    
        return self.raw_message unless self.raw_message
    
    
        escaped_message = opts[:plain_text] ? self.raw_message: ERB::Util.h(self.raw_message)
        mentioned_message = self.format_mentions(escaped_message, opts)
    
        Diaspora::Taggable.format_tags(mentioned_message, opts.merge(:no_escape => true))
    
      end
    
      def format_mentions(text, opts = {})
    
    Raphael's avatar
    Raphael a validé
        regex = /@\{([^;]+); ([^\}]+)\}/
    
        form_message = text.to_str.gsub(regex) do |matched_string|
    
          person = people.detect{ |p|
    
    maxwell's avatar
    maxwell a validé
            p.diaspora_handle == $~[2] unless p.nil?
    
    
          if opts[:plain_text]
    
    Raphael Sofaer's avatar
    Raphael Sofaer a validé
            person ? ERB::Util.h(person.name) : ERB::Util.h($~[1])
    
          else
    
            person ? person_link(person, :class => 'mention hovercardable') : ERB::Util.h($~[1])
    
          end
    
    Raphael's avatar
    Raphael a validé
        end
    
    Raphael's avatar
    Raphael a validé
      end
    
      def mentioned_people
    
        if self.persisted?
          create_mentions if self.mentions.empty?
          self.mentions.includes(:person => :profile).map{ |mention| mention.person }
        else
          mentioned_people_from_string
        end
      end
    
      def create_mentions
        mentioned_people_from_string.each do |person|
          self.mentions.create(:person => person)
        end
      end
    
    
    zhitomirskiyi's avatar
    zhitomirskiyi a validé
      def mentions?(person)
        mentioned_people.include? person
      end
    
      def notify_person(person)
        self.mentions.where(:person_id => person.id).first.try(:notify_recipient)
      end
    
    
      def mentioned_people_from_string
    
    Raphael's avatar
    Raphael a validé
        regex = /@\{([^;]+); ([^\}]+)\}/
    
        identifiers = self.raw_message.scan(regex).map do |match|
    
    Raphael's avatar
    Raphael a validé
          match.last
        end
    
        identifiers.empty? ? [] : Person.where(:diaspora_handle => identifiers)
    
    Raphael's avatar
    Raphael a validé
      end
    
    
      def to_activity(opts={})
        author = opts[:author] || self.author #Use an already loaded author if passed in.
    
        <title>#{x(self.formatted_message(:plain_text => true))}</title>
    
    maxwell's avatar
    maxwell a validé
        <content>#{x(self.formatted_message(:plain_text => true))}</content>
    
        <link rel="alternate" type="text/html" href="#{author.url}p/#{self.id}"/>
        <id>#{author.url}p/#{self.id}</id>
    
    danielvincent's avatar
    danielvincent a validé
        <published>#{self.created_at.xmlschema}</published>
        <updated>#{self.updated_at.xmlschema}</updated>
    
    danielvincent's avatar
    danielvincent a validé
        <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
        <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
    
    danielgrippi's avatar
    danielgrippi a validé
        XML
    
    Raphael Sofaer's avatar
    Raphael Sofaer a validé
      def socket_to_user(user_or_id, opts={})
        unless opts[:aspect_ids]
          user_id = user_or_id.instance_of?(Fixnum) ? user_or_id : user_or_id.id
    
          aspect_ids = AspectMembership.connection.select_values(
    
    Raphael Sofaer's avatar
    Raphael Sofaer a validé
            AspectMembership.joins(:contact).where(:contacts => {:user_id => user_id, :person_id => self.author_id}).select('aspect_memberships.aspect_id').to_sql
    
    Raphael Sofaer's avatar
    Raphael Sofaer a validé
          opts.merge!(:aspect_ids => aspect_ids)
        end
        super(user_or_id, opts)
      end
    
    
      def after_dispatch sender
        unless self.photos.empty?
          self.photos.update_all(:pending => false, :public => self.public)
          for photo in self.photos
            if photo.pending
              sender.add_to_streams(photo, self.aspects)
              sender.dispatch_post(photo)
            end
          end
        end
      end
    
    
      def comment_email_subject
        formatted_message(:plain_text => true)
    
          errors[:base] << 'Status message requires a message or at least one photo'
        end
      end