Websites/app/models/api_user.rb
Donovan Daniels b1c702e3cd
Add image management ui
poorly tested but it worked well enough, I'm sure I'll be patching bugs over the next few weeks
Also remove turbo because it sucks
Also changed the way we handle hosts in dev
2024-05-06 03:25:17 -05:00

86 lines
2.1 KiB
Ruby

# frozen_string_literal: true
require "open-uri"
class APIUser < ApplicationRecord
has_many :api_keys, foreign_key: :owner_id
has_many :api_images, foreign_key: :creator_id
has_many :short_urls, foreign_key: :creator_id
has_many :e621_thumbnails, foreign_key: :creator_id
has_one_attached :avatar
attr_accessor :discord_data
before_create do
self.level = Levels::DEFAULT if level.blank?
self.name = "User#{id}" if name.blank?
end
module Levels
DEFAULT = 0
MANAGER = 10
ADMIN = 20
def self.level_name(level)
name = constants.find { |c| const_get(c) == level }.to_s.titleize
return "Unknown: #{level}" if name.blank?
name
end
end
module LevelMethods
Levels.constants.each do |constant|
define_method("is_#{constant.downcase}?") do
level >= Levels.const_get(constant)
end
define_method("is_exactly_#{constant.downcase}?") do
level == Levels.const_get(constant)
end
end
def level_name
Levels.level_name(level)
end
def is_anonymous?
self == APIUser.anonymous
end
end
include LevelMethods
def self.anonymous
user = new(id: "0", name: "Anonymous", level: Levels::DEFAULT, created_at: Time.now)
user.freeze.readonly!
user
end
def self.system
sys = find_or_create_by(id: "875334238856163368")
sys.update_columns(name: "System") if sys.name != "System"
sys
end
def method_missing(method, *)
return discord_data[method.to_s] if discord_data.present? && discord_data.key?(method.to_s)
super
end
def update_avatar(hash)
return false if hash == last_avatar_hash && avatar.attached?
return false if Cache.fetch("avatar_update:#{id}")
Cache.write("avatar_update:#{id}", "1", expires_in: 1.day)
avatar.purge
url = "https://yiff.rest/Blep.png"
url = "https://cdn.discordapp.com/avatars/#{id}/#{hash}.webp?size=128" unless hash.nil?
image = URI.open(url) # rubocop:disable Security/Open
avatar.attach(io: image, filename: "#{hash}.webp")
update!(last_avatar_hash: hash)
true
end
def can_create_apikey?
api_keys.length < 3
end
end