40e5d2303b
to_s method of HTTP::Response keeps blocking while it receives the whole content, no matter how it is big. This means it may waste time to receive unacceptably large files. It may also consume memory and disk in the process. This solves the inefficency by checking response length while receiving.
62 lines
1.8 KiB
Ruby
62 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
# == Schema Information
|
|
#
|
|
# Table name: custom_emojis
|
|
#
|
|
# id :integer not null, primary key
|
|
# shortcode :string default(""), not null
|
|
# domain :string
|
|
# image_file_name :string
|
|
# image_content_type :string
|
|
# image_file_size :integer
|
|
# image_updated_at :datetime
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
# disabled :boolean default(FALSE), not null
|
|
# uri :string
|
|
# image_remote_url :string
|
|
# visible_in_picker :boolean default(TRUE), not null
|
|
#
|
|
|
|
class CustomEmoji < ApplicationRecord
|
|
LIMIT = 50.kilobytes
|
|
|
|
SHORTCODE_RE_FRAGMENT = '[a-zA-Z0-9_]{2,}'
|
|
|
|
SCAN_RE = /(?<=[^[:alnum:]:]|\n|^)
|
|
:(#{SHORTCODE_RE_FRAGMENT}):
|
|
(?=[^[:alnum:]:]|$)/x
|
|
|
|
has_one :local_counterpart, -> { where(domain: nil) }, class_name: 'CustomEmoji', primary_key: :shortcode, foreign_key: :shortcode
|
|
|
|
has_attached_file :image, styles: { static: { format: 'png', convert_options: '-coalesce -strip' } }
|
|
|
|
validates_attachment :image, content_type: { content_type: 'image/png' }, presence: true, size: { less_than: LIMIT }
|
|
validates :shortcode, uniqueness: { scope: :domain }, format: { with: /\A#{SHORTCODE_RE_FRAGMENT}\z/ }, length: { minimum: 2 }
|
|
|
|
scope :local, -> { where(domain: nil) }
|
|
scope :remote, -> { where.not(domain: nil) }
|
|
scope :alphabetic, -> { order(domain: :asc, shortcode: :asc) }
|
|
|
|
remotable_attachment :image, LIMIT
|
|
|
|
def local?
|
|
domain.nil?
|
|
end
|
|
|
|
def object_type
|
|
:emoji
|
|
end
|
|
|
|
class << self
|
|
def from_text(text, domain)
|
|
return [] if text.blank?
|
|
|
|
shortcodes = text.scan(SCAN_RE).map(&:first).uniq
|
|
|
|
return [] if shortcodes.empty?
|
|
|
|
where(shortcode: shortcodes, domain: domain, disabled: false)
|
|
end
|
|
end
|
|
end
|