about summary refs log tree commit diff
path: root/app/models/keyword_mute.rb
blob: e1a8c3712c53d1a88f1de0d747965d54989f2d6a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# frozen_string_literal: true
# == Schema Information
#
# Table name: keyword_mutes
#
#  id         :integer          not null, primary key
#  account_id :integer          not null
#  keyword    :string           not null
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class KeywordMute < ApplicationRecord
  belongs_to :account, required: true

  validates_presence_of :keyword

  def self.matcher_for(account)
    Rails.cache.fetch("keyword_mutes:matcher:#{account}") { Matcher.new(account) }
  end

  class Matcher
    attr_reader :regex

    def initialize(account)
      re = String.new.tap do |str|
        scoped = KeywordMute.where(account: account)
        keywords = scoped.select(:id, :keyword)
        count = scoped.count

        keywords.find_each.with_index do |kw, index|
          str << Regexp.escape(kw.keyword.strip)
          str << '|' if index < count - 1
        end
      end

      @regex = /\b(?:#{re})\b/i unless re.empty?
    end

    def =~(str)
      regex ? regex =~ str : false
    end
  end
end