TeensyMud - 'A ruby mud server.'

Browse repository
back

eventmanager.rb

#
# file:: eventmanager.rb
# author:: Jon A. Lambert
# version:: 2.6.0
# date:: 10/28/2005
#
# This source code copyright (C) 2005 by Jon A. Lambert
# All rights reserved.
#
# Released under the terms of the TeensyMUD Public License
# See LICENSE file for additional information.
#
$:.unshift "lib" if !$:.include? "lib"
$:.unshift "vendor" if !$:.include? "vendor"

require 'engine/event'
require 'utility/log'
require 'core/character'

class EventManager
logger 'DEBUG'

def initialize
@tits = []
@bra = Mutex.new
log.info "Event manager starting..."
end

# Add an Event to the TITS queue.
# [+e+] The event to be added.
# [+return+] Undefined.
def add_event(from,to,kind,msg=nil)
@bra.synchronize do
@tits.push(Event.new(from,to,kind,msg))
end
end

# Get an Event from the TITS queue.
# [+return+] The Event or nil
def get_event
@bra.synchronize do
@tits.shift
end
end

def contents
@tits.inspect
end

# Process events
# A false return in a PRE trigger will prevent execution of the event
def process_events
while e = get_event
begin
# pre triggers
obj = Engine.instance.db.get(e.to)
obj2 = Engine.instance.db.get(e.from)
sid = obj.get_trigger("pre_"+e.kind.to_s)
if sid
script = Engine.instance.db.get(sid)
if script
if script.execute(e)
# success
if obj2.class == Character
s,o = obj.msgsucc.split("|")
obj2.sendto(s) if s && !s.empty?
if o && !o.empty?
Engine.instance.db.get(obj2.location).characters(obj2.id).each do |p|
add_event(obj2.id,p.id,:show,"#{obj2.name} #{o}")
end
end
end
else
# failure
if obj2.class == Character
s,o = obj.msgfail.split("|")
obj2.sendto(s) if s && !s.empty?
if o && !o.empty?
Engine.instance.db.get(obj2.location).characters(obj2.id).each do |p|
add_event(obj2.id,p.id,:show,"#{obj2.name} #{o}")
end
end
end
next
end
else
log.error "Script not found: #{sid} for Event: #{e}"
# We fail the action slently
next
end
end

# action receiver
obj.send(e.kind,e)

# post triggers
sid = obj.get_trigger(e.kind)
if sid
script = Engine.instance.db.get(sid)
if script
if script.execute(e)
# success
if obj2.class == Character
s,o = obj.msgsucc.split("|")
obj2.sendto(s) if s && !s.empty?
if o && !o.empty?
Engine.instance.db.get(obj2.location).characters(obj2.id).each do |p|
add_event(obj2.id,p.id,:show,"#{obj2.name} #{o}")
end
end
end
else
# failure
if obj2.class == Character
s,o = obj.msgfail.split("|")
obj2.sendto(s) if s && !s.empty?
if o && !o.empty?
Engine.instance.db.get(obj2.location).characters(obj2.id).each do |p|
add_event(obj2.id,p.id,:show,"#{obj2.name} #{o}")
end
end
end
end
else
log.error "Script not found: #{sid} for Event: #{e.inspect}"
# We fail the action slently
end
end
rescue
log.error "Event failed: #{e.inspect}"
log.error $!
end
end
end
end