journalduhacker/app/models/message.rb
2013-01-22 23:32:45 -07:00

93 lines
2.2 KiB
Ruby

class Message < ActiveRecord::Base
belongs_to :recipient,
:class_name => "User",
:foreign_key => "recipient_user_id"
belongs_to :author,
:class_name => "User",
:foreign_key => "author_user_id"
validates_presence_of :recipient
validates_presence_of :author
attr_accessor :recipient_username
attr_accessible :recipient_username, :subject, :body
validates_length_of :subject, :in => 1..150
validates_length_of :body, :maximum => (64 * 1024)
before_create :assign_short_id
after_create :deliver_reply_notifications
after_save :check_for_both_deleted
after_save :update_unread_counts
def assign_short_id
self.short_id = ShortId.new(self.class).generate
end
def check_for_both_deleted
if self.deleted_by_author && self.deleted_by_recipient
self.destroy
end
end
def update_unread_counts
self.recipient.update_unread_message_count!
end
def deliver_reply_notifications
begin
if self.recipient.email_messages?
EmailMessage.notify(self, self.recipient).deliver
end
if self.recipient.pushover_messages? &&
self.recipient.pushover_user_key.present?
Pushover.push(self.recipient.pushover_user_key,
self.recipient.pushover_device, {
:title => "Lobsters message from #{self.author.username}: " <<
"#{self.subject}",
:message => self.plaintext_body,
:url => self.url,
:url_title => "Reply to #{self.author.username}",
})
end
rescue
end
end
def recipient_username=(username)
self.recipient_user_id = nil
if u = User.find_by_username(username)
self.recipient_user_id = u.id
@recipient_username = username
else
errors.add(:recipient_username, "is not a valid user")
end
end
# TODO: remove remove_mb4 hack
def body=(b)
self[:body] = b.to_s.remove_mb4
end
# TODO: remove remove_mb4 hack
def subject=(s)
self[:subject] = s.to_s.remove_mb4
end
def linkified_body
Markdowner.to_html(self.body)
end
def plaintext_body
# TODO: linkify then strip tags and convert entities back
self.body.to_s
end
def url
Rails.application.routes.url_helpers.root_url + "messages/#{self.short_id}"
end
end