# encoding: US-ASCII # == Schema Information # # Table name: log_files # # id :integer not null, primary key # name :string(255) # md5 :string(255) # size :integer # server_id :integer # updated_at :datetime # require 'digest/md5' class LogFile < ActiveRecord::Base NON_ASCII = /[\x80-\xff]/ LOGS = File.join(Rails.root, "tmp", "logs") attr_accessor :path belongs_to :server has_many :logs has_many :rounds, :through => :logs def after_create Pathname(path).each_line do |line| if m = line.gsub(NON_ASCII, "").match(/\d{2}:\d{2}:\d{2}: (.*)/) log = Log.new log.server = server log.domain = Log::DOMAIN_LOG log.log_file = self log.text = m[1].strip next if log.text.match(/^Server cvar/) next if log.text.match(/^\[ENSL\]/) next if log.text.match(/STEAM USERID validated/) next if log.text.match(/^\[META\]/) l.created_at = DateTime.parse(line.match(/\d{2}\/\d{2}\/\d{4} \- \d{2}:\d{2}:\d{2}:/)[0]) vars = {} log.match_map vars or log.match_start vars if vars[:round] and !log.details log.match_end vars \ or log.match_join vars \ or log.match_kill vars \ or log.match_say vars \ or log.match_built vars \ or log.match_destroyed vars \ or log.match_research_start vars \ or log.match_research_cancel vars \ or log.match_role vars \ end if log.details log.round = vars[:round] if vars[:round] log.save end end end rounds.each do |r| unless r.end r.destroy end end Log.delete_all(["details IS NULL AND log_file_id = ?", self.id]) end def format path self.name = File.basename(path) self.size = File.size(path) self.md5 = Digest::MD5.hexdigest(File.read(path)) self.updated_at = File.mtime(path) self.path = path end def deal # TODO end def self.process Dir.glob("#{LOGS}/*").each do |entry| dir = File.basename(entry).to_i if File.directory?(entry) and dir > 0 and Server.find(dir) Dir.glob("#{entry}/*.log").each do |file| lf = LogFile.new lf.format file lf.server_id = dir unless LogFile.first(:conditions => {:name => lf.name, :size => lf.size, :server_id => dir.to_i}) lf.save end end end end end end