tmud-2.9.0/benchmark/
tmud-2.9.0/cmd/
tmud-2.9.0/cmd/objects/
tmud-2.9.0/cmd/tiny/
tmud-2.9.0/db/
tmud-2.9.0/doc/classes/Acceptor.src/
tmud-2.9.0/doc/classes/BoolExpParser.src/
tmud-2.9.0/doc/classes/CacheStats.src/
tmud-2.9.0/doc/classes/Character.src/
tmud-2.9.0/doc/classes/Client.src/
tmud-2.9.0/doc/classes/ColorFilter.src/
tmud-2.9.0/doc/classes/Command.src/
tmud-2.9.0/doc/classes/Configuration.src/
tmud-2.9.0/doc/classes/Connector.src/
tmud-2.9.0/doc/classes/ConsoleClient.src/
tmud-2.9.0/doc/classes/CursesClient.src/
tmud-2.9.0/doc/classes/DebugFilter.src/
tmud-2.9.0/doc/classes/Dumper.src/
tmud-2.9.0/doc/classes/Engine.src/
tmud-2.9.0/doc/classes/Event.src/
tmud-2.9.0/doc/classes/EventManager.src/
tmud-2.9.0/doc/classes/Farts/AttributeSyntaxNode.src/
tmud-2.9.0/doc/classes/Farts/CallSyntaxNode.src/
tmud-2.9.0/doc/classes/Farts/CommandSyntaxNode.src/
tmud-2.9.0/doc/classes/Farts/CommentSyntaxNode.src/
tmud-2.9.0/doc/classes/Farts/EndSyntaxNode.src/
tmud-2.9.0/doc/classes/Farts/IfSyntaxNode.src/
tmud-2.9.0/doc/classes/Farts/Interpreter.src/
tmud-2.9.0/doc/classes/Farts/Lexer.src/
tmud-2.9.0/doc/classes/Farts/Lib.src/
tmud-2.9.0/doc/classes/Farts/LiteralSyntaxNode.src/
tmud-2.9.0/doc/classes/Farts/LocalVarSyntaxNode.src/
tmud-2.9.0/doc/classes/Farts/Parser.src/
tmud-2.9.0/doc/classes/Farts/ProgramSyntaxNode.src/
tmud-2.9.0/doc/classes/Farts/SyntaxNode.src/
tmud-2.9.0/doc/classes/Filter.src/
tmud-2.9.0/doc/classes/LineIO.src/
tmud-2.9.0/doc/classes/Loader.src/
tmud-2.9.0/doc/classes/Log.src/
tmud-2.9.0/doc/classes/Module.src/
tmud-2.9.0/doc/classes/ObjCmd.src/
tmud-2.9.0/doc/classes/PacketIO.src/
tmud-2.9.0/doc/classes/ProtocolStack.src/
tmud-2.9.0/doc/classes/Publisher.src/
tmud-2.9.0/doc/classes/Reactor.src/
tmud-2.9.0/doc/classes/Room.src/
tmud-2.9.0/doc/classes/SQLite/
tmud-2.9.0/doc/classes/SQLite/Database.src/
tmud-2.9.0/doc/classes/SQLite3/
tmud-2.9.0/doc/classes/SQLite3/Database.src/
tmud-2.9.0/doc/classes/Script.src/
tmud-2.9.0/doc/classes/SockIO.src/
tmud-2.9.0/doc/classes/String.src/
tmud-2.9.0/doc/classes/TerminalFilter.src/
tmud-2.9.0/doc/classes/TernaryTrie.src/
tmud-2.9.0/doc/classes/TernaryTrie/
tmud-2.9.0/doc/classes/TernaryTrie/TNode.src/
tmud-2.9.0/doc/classes/Timer.src/
tmud-2.9.0/doc/classes/Utility.src/
tmud-2.9.0/doc/classes/XmlStore.src/
tmud-2.9.0/doc/classes/YamlStore.src/
tmud-2.9.0/doc/dot/
tmud-2.9.0/doc/files/cmd/objects/
tmud-2.9.0/doc/files/cmd/tiny/
tmud-2.9.0/doc/files/lib/
tmud-2.9.0/doc/files/lib/engine/
tmud-2.9.0/doc/files/lib/farts/
tmud-2.9.0/doc/files/tclient_rb.src/
tmud-2.9.0/doc/files/tmud_rb.src/
tmud-2.9.0/farts/
tmud-2.9.0/lib/
tmud-2.9.0/lib/core/
tmud-2.9.0/lib/engine/
tmud-2.9.0/lib/farts/
tmud-2.9.0/logs/
#
# 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