Friday, September 20, 2024 12:02:09 AM
> settings

Customize


Authenticate

> user_notification_route.rb
# frozen_string_literal: true

class UserNotificationRoute < ApplicationRecord
  attribute :uuid, :uuid
  attribute :user_id, :integer
  attribute :source_server_id, :integer # nil means "any server"
  attribute :destination_community_id, :integer
  attribute :channel_id, :string
  attribute :notification_type, :string
  attribute :enabled, :boolean, default: true
  attribute :user_accepted, :boolean, default: false
  attribute :community_accepted, :boolean, default: false
  attribute :created_at, :datetime
  attribute :updated_at, :datetime

  belongs_to :user
  belongs_to :destination_community, class_name: "Community"
  belongs_to :source_server, class_name: "Server", optional: true

  validates :uuid, :user_id, :destination_community_id, :channel_id, presence: true
  validates :notification_type, presence: true, uniqueness: {scope: %i[user_id destination_community_id source_server_id channel_id]}

  before_create :create_uuid

  scope :accepted, -> { where(user_accepted: true, community_accepted: true) }
  scope :pending_community_acceptance, -> { where(user_accepted: true, community_accepted: false) }
  scope :pending_user_acceptance, -> { where(user_accepted: false, community_accepted: true) }

  TYPES = %w[
    custom
    base-raid
    flag-stolen
    flag-restored
    flag-steal-started
    protection-money-due
    protection-money-paid
    grind-started
    hack-started
    charge-plant-started
    marxet-item-sold
  ].freeze

  TYPE_PRESETS = {
    raids: %w[
      base-raid
      flag-stolen
      flag-restored
      flag-steal-started
      grind-started
      hack-started
      charge-plant-started
    ].freeze,
    payments: %w[
      protection-money-due
      protection-money-paid
    ].freeze
  }.freeze

  def self.by_channel_server_and_user
    all.includes(:user, :source_server, :destination_community).sort_by { |r| r.user.discord_username }.group_by { |r| [r.user, r.destination_community, r.channel_id] }
  end

  def self.clientize
    by_channel_server_and_user.filter_map do |(user, destination_community, channel_id), routes|
      servers = routes.group_by(&:source_server).map do |source_server, server_routes|
        types = server_routes.sort_by(&:notification_type).map do |r|
          {
            id: r.uuid,
            name: r.notification_type.titleize,
            enabled: r.enabled?,
            user_accepted: r.user_accepted?,
            community_accepted: r.community_accepted?,
            editable: r.user_accepted? && r.community_accepted?
          }
        end

        {id: source_server&.server_id, name: source_server&.server_name || "Any server", types: types}
      end

      channel = ESM.channel(channel_id, community_id: destination_community.id, user_id: user.id)
      next if channel.nil? # Ensures the user has access

      {
        user: user.clientize,
        channel: {id: channel[:id], name: channel[:name]},
        servers: servers,
        community: destination_community.clientize
      }
    end
  end

  private

  def create_uuid
    self.uuid = SecureRandom.uuid
  end
end
All opinions represented herein are my own
- © 2024 itsthedevman
- build 3c15a1b