diff options
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/account.rb | 20 | ||||
-rw-r--r-- | app/models/concerns/account_interactions.rb | 20 | ||||
-rw-r--r-- | app/models/mute.rb | 11 | ||||
-rw-r--r-- | app/models/user.rb | 4 |
4 files changed, 42 insertions, 13 deletions
diff --git a/app/models/account.rb b/app/models/account.rb index 0b025d1be..de7998db4 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -53,6 +53,8 @@ class Account < ApplicationRecord include Attachmentable include Remotable + MAX_NOTE_LENGTH = 500 + enum protocol: [:ostatus, :activitypub] # Local users @@ -67,7 +69,7 @@ class Account < ApplicationRecord validates :username, format: { with: /\A[a-z0-9_]+\z/i }, uniqueness: { scope: :domain, case_sensitive: false }, length: { maximum: 30 }, if: -> { local? && will_save_change_to_username? } validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? } validates :display_name, length: { maximum: 30 }, if: -> { local? && will_save_change_to_display_name? } - validates :note, length: { maximum: 160 }, if: -> { local? && will_save_change_to_note? } + validate :note_length_does_not_exceed_length_limit, if: -> { local? && will_save_change_to_note? } # Timelines has_many :stream_entries, inverse_of: :account, dependent: :destroy @@ -278,6 +280,22 @@ class Account < ApplicationRecord self.public_key = keypair.public_key.to_pem end + YAML_START = "---\r\n" + YAML_END = "\r\n...\r\n" + + def note_length_does_not_exceed_length_limit + note_without_metadata = note + if note.start_with? YAML_START + idx = note.index YAML_END + unless idx.nil? + note_without_metadata = note[(idx + YAML_END.length) .. -1] + end + end + if note_without_metadata.mb_chars.grapheme_length > MAX_NOTE_LENGTH + errors.add(:note, "can't be longer than 500 graphemes") + end + end + def normalize_domain return if local? diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index b26520f5b..0afdebf89 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -17,7 +17,11 @@ module AccountInteractions end def muting_map(target_account_ids, account_id) - follow_mapping(Mute.where(target_account_id: target_account_ids, account_id: account_id), :target_account_id) + Mute.where(target_account_id: target_account_ids, account_id: account_id).each_with_object({}) do |mute, mapping| + mapping[mute.target_account_id] = { + notifications: mute.hide_notifications? + } + end end def requested_map(target_account_ids, account_id) @@ -70,8 +74,14 @@ module AccountInteractions block_relationships.find_or_create_by!(target_account: other_account) end - def mute!(other_account) - mute_relationships.find_or_create_by!(target_account: other_account) + def mute!(other_account, notifications: nil) + notifications = true if notifications.nil? + mute = mute_relationships.create_with(hide_notifications: notifications).find_or_create_by!(target_account: other_account) + # When toggling a mute between hiding and allowing notifications, the mute will already exist, so the find_or_create_by! call will return the existing Mute without updating the hide_notifications attribute. Therefore, we check that hide_notifications? is what we want and set it if it isn't. + if mute.hide_notifications? != notifications + mute.hide_notifications = notifications + mute.save! + end end def mute_conversation!(conversation) @@ -127,6 +137,10 @@ module AccountInteractions conversation_mutes.where(conversation: conversation).exists? end + def muting_notifications?(other_account) + mute_relationships.where(target_account: other_account, hide_notifications: true).exists? + end + def requested?(other_account) follow_requests.where(target_account: other_account).exists? end diff --git a/app/models/mute.rb b/app/models/mute.rb index 00e5661a7..0d597a275 100644 --- a/app/models/mute.rb +++ b/app/models/mute.rb @@ -3,11 +3,12 @@ # # Table name: mutes # -# id :integer not null, primary key -# account_id :integer not null -# target_account_id :integer not null -# created_at :datetime not null -# updated_at :datetime not null +# id :integer not null, primary key +# account_id :integer not null +# target_account_id :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# hide_notifications :boolean default(TRUE), not null # class Mute < ApplicationRecord diff --git a/app/models/user.rb b/app/models/user.rb index 3bf069a31..5e548c1ef 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -110,10 +110,6 @@ class User < ApplicationRecord settings.noindex end - def setting_theme - settings.theme - end - def token_for_app(a) return nil if a.nil? || a.owner != self Doorkeeper::AccessToken |