ensl.org/app/models/ban.rb

106 lines
2.5 KiB
Ruby
Raw Normal View History

# == Schema Information
#
# Table name: bans
#
# id :integer not null, primary key
# steamid :string(255)
# user_id :integer
# addr :string(255)
# server_id :integer
# expiry :datetime
# reason :string(255)
# created_at :datetime
# updated_at :datetime
# ban_type :integer
# ip :string(255)
#
class Ban < ActiveRecord::Base
include Extra
TYPE_SITE = 0
TYPE_MUTE = 1
TYPE_LEAGUE = 2
TYPE_SERVER = 3
TYPE_VENT = 4
TYPE_GATHER = 5
VENT_BANS = "tmp/bans.txt"
attr_protected :id, :created_at, :updated_at
attr_accessor :ts, :sign, :len, :user_name
scope :ordered, :order => "created_at DESC"
scope :effective, :conditions => "expiry > UTC_TIMESTAMP()"
scope :ineffective, :conditions => "expiry < UTC_TIMESTAMP()"
validate :validate_ts
validate :validate_type
validate :validate_ventban
validates_format_of :steamid, :with => /\A([0-9]{1,10}:){2}[0-9]{1,10}\Z/, :allow_blank => true
validates_format_of :addr, :with => /\A([0-9]{1,3}\.){3}[0-9]{1,3}:?[0-9]{0,5}\z/, :allow_blank => true
validates_length_of :reason, :maximum => 255, :allow_nil => true, :allow_blank => true
before_validation :check_user
belongs_to :user
belongs_to :server
def color
expiry.past? ? "green" : "red"
end
def types
{TYPE_SITE => "Website Logon",
TYPE_MUTE => "Commenting",
TYPE_LEAGUE => "Contests",
TYPE_SERVER => "NS Servers",
TYPE_VENT => "Ventrilo",
TYPE_GATHER => "Gather"}
end
def validate_ts
if ts and Verification.verify(steamid + ts.to_s) != sign
errors.add :ts, I18n.t(:wrong_verification_code)
end
end
def validate_type
errors.add :ban_type, I18n.t(:invalid_ban_type) unless types.include? ban_type
end
def validate_ventban
if ban_type == TYPE_VENT and !ip.match(/\A([0-9]{1,3}\.){3}[0-9]{1,3}\z/)
errors.add :ip, I18n.t(:ventrilos_ip_ban)
end
end
def check_user
if user_name
self.user = User.find_by_username(user_name)
else
self.user = User.first(:conditions => {:steamid => steamid})
self.server = Server.first(:conditions => ["CONCAT(ip, ':', port) = ?", addr])
end
end
def can_create? cuser
cuser and cuser.admin?
end
def can_update? cuser
cuser and cuser.admin?
end
def can_destroy? cuser
cuser and cuser.admin?
end
def self.refresh
#file = File.new(VENT_BANS, "w")
#Ban.all(:conditions => ["ban_type = ? AND expiry > UTC_TIMESTAMP()", TYPE_VENT]).each do |ban|
# file.write "#{ban.ip},,,"
#end
#file.close
end
end