ensl.org/app/models/log.rb
2015-05-18 17:24:18 +01:00

197 lines
5.9 KiB
Ruby

# == Schema Information
#
# Table name: logs
#
# id :integer not null, primary key
# server_id :integer
# text :text
# domain :integer
# created_at :datetime
# round_id :integer
# details :string(255)
# actor_id :integer
# target_id :integer
# specifics1 :string(255)
# specifics2 :string(255)
# log_file_id :integer
#
class Log < ActiveRecord::Base
include Extra
attr_accessor :text
DOMAIN_LOG = 1
DOMAIN_INFO = 4
TEAM_MARINES = 1
TEAM_ALIENS = 2
RE_PLAYER = /".*?<\d*><STEAM_\d*:\d*:\d*><\w*>"/
RE_PLAYER_ID = /".*?<\d*><STEAM_(\d*:\d*:\d*)><\w*>"/
RE_PLAYER_ID_NAME_TEAM = /"(.*?)<\d*><STEAM_(\d*:\d*:\d*)><([a-z]*)1team>"/
RE_PLAYER_NAME = /"(.*?)<\d*><STEAM_\d*:\d*:\d*><[a-z]*1team>"/
RE_PLAYER_NAME_TEAM = /"(.*?)<\d*><STEAM_\d*:\d*:\d*><([a-z]*)1team>"/
scope :recent, :order => "id DESC", :limit => 5
scope :ordered, :order => "created_at ASC, id ASC"
scope :with_details,
lambda { |details| {:conditions => ["details LIKE ?", details]} }
scope :unhandled, :conditions => {:details => nil}
scope :stats,
:select => "id, details, COUNT(*) as num",
:group => "details",
:order => "details"
belongs_to :details, :class_name => "LogEvent"
belongs_to :server
belongs_to :round
belongs_to :server
belongs_to :log_file
belongs_to :actor, :class_name => "Rounder"
belongs_to :target, :class_name => "Rounder"
def since
(created_at - round.start).to_i
end
def time
return sprintf("%02d:%02d", since/60, since%60)
end
def frag
text.match(/^#{RE_PLAYER_NAME_TEAM} killed #{RE_PLAYER_NAME_TEAM} with "([a-z0-9_]*)"$/)
end
def role
text.match(/^#{RE_PLAYER_NAME} changed role to "([a-z0-9_]*)"$/)
end
def match_map vars
if m = text.match(/^Started map "([A-Za-z0-9_]*)"/)
vars[:map] = m[1]
self.details = LogEvent.get "map"
self.specifics1 = m[1]
end
end
def match_start vars
if text.match(/^Game reset complete.$/)
vars[:round] = Round.new
vars[:round].server = server
vars[:round].start = created_at
vars[:round].map_name = vars[:map]
vars[:round].map = Map.with_name(vars[:map]).first
vars[:round].save
vars[:lifeforms] = {}
self.details = LogEvent.get "start"
end
end
def match_end vars
if m = text.match(/^Team ([1-2]) has lost.$/)
vars[:round].winner = (m[1].to_i == 1 ? 2 : 1)
vars[:round].end = created_at
[1, 2].each do |team|
if s = vars[:round].rounders.team(team).stats.first
vars[:round]["team#{team}_id"] = s["team_id"]
end
end
vars[:round].save
vars[:round] = nil
self.details = LogEvent.get "end"
end
end
def match_join vars
if m = text.match(/^#{RE_PLAYER_ID_NAME_TEAM} .*$/) and !(self.actor = vars[:round].rounders.match(m[2]).first)
self.actor = Rounder.new
self.actor.round = vars[:round]
self.actor.name = m[1]
self.actor.steamid = m[2]
self.actor.user = User.first(:conditions => {:steamid => m[2]}) or User.historic(m[2])
self.actor.team = (m[3] == "marine" ? TEAM_MARINES : TEAM_ALIENS)
if self.actor.user and t = Teamer.historic(actor.user, vars[:round].start).first
self.actor.ensl_team = t.team
end
self.actor.kills = 0
self.actor.deaths = 0
self.actor.save
self.details = LogEvent.get "join"
end
end
def match_kill vars
if m = text.match(/^#{RE_PLAYER} killed #{RE_PLAYER_ID} with "([a-z0-9_]*)"$/)
if self.actor
actor.increment :kills
actor.save
end
if self.target = vars[:round].rounders.match(m[1]).first
target.increment :deaths
target.save
end
self.details = LogEvent.get "kill"
self.specifics1 = m[3]
save
end
end
def match_say vars
if m = text.match(/^#{RE_PLAYER} (say(_team)?) ".*"$/)
self.details = "say"
self.specifics1 = m[1]
end
end
def match_built vars
if m = text.match(/^#{RE_PLAYER} triggered "structure_built" \(type "([a-z0-9_]*)"\)$/)
self.details = "built_" + m[1]
end
end
def match_destroyed vars
if m = text.match(/^#{RE_PLAYER} triggered "structure_destroyed" \(type "([a-z0-9_]*)"\)$/)
self.details = "destroyed_" + m[1]
end
end
def match_research_start vars
if m = text.match(/^#{RE_PLAYER} triggered "research_start" \(type "([a-z0-9_]*)"\)$/)
self.details = m[1]
end
end
def match_research_cancel vars
if m = text.match(/^#{RE_PLAYER} triggered "research_cancel" \(type "([a-z0-9_]*)"\)$/)
self.details = "research_cancel"
end
end
def match_role vars
if m = text.match(/^#{RE_PLAYER_ID} changed role to "([a-z0-9_]*)"$/)
if m[2] == "gestate"
self.details = "gestate"
elsif actor
if m[2] == "commander" and !vars[:round].commander
vars[:round].commander = actor
vars[:round].save
end
if !actor.roles
actor.update_attribute :roles, m[2]
elsif !self.actor.roles.include?(m[2])
actor.update_attribute :roles, actor.roles + ", " + m[2]
end
self.details = ((vars[:lifeforms].include? actor.id and vars[:lifeforms][actor.id] == m[2]) ? "upgrade" : m[2])
vars[:lifeforms][actor.id] = m[2]
end
end
end
def self.add server, domain, text
log = new
log.server = server
log.domain = domain
log.text = text
log.save
end
end