# == 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