class Message < ApplicationRecord include Attachment, Broadcasts, Mentionee, Pagination, Searchable belongs_to :room, touch: true belongs_to :creator, class_name: "User", default: -> { Current.user } has_many :boosts, dependent: :destroy has_rich_text :body before_create -> { self.client_message_id ||= Random.uuid } # Bots don't care after_create_commit -> { room.receive(self) } scope :ordered, -> { order(:created_at) } scope :with_creator, -> { includes(:creator) } def plain_text_body body.to_plain_text.presence || attachment&.filename&.to_s || "" end def to_key [ client_message_id ] end def content_type case when attachment? then "attachment" when sound.present? then "sound" else "text" end.inquiry end def sound plain_text_body.match(/\A\/play (?\w+)\z/) do |match| Sound.find_by_name match[:name] end end end