From 68c26240b7471c1f580cb49b84da192bdc773a68 Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <the@jeffreyfreeman.me>
Date: Mon, 27 Apr 2020 16:48:47 -0400
Subject: [PATCH] Removed observer pattern witht he intent of replacing it with
 wisper.

---
 lib/aethyr/core/cache_gary.rb              |  4 +-
 lib/aethyr/core/commands/admin/aforce.rb   | 15 ++--
 lib/aethyr/core/components/manager.rb      | 79 +---------------------
 lib/aethyr/core/components/storage.rb      |  2 +-
 lib/aethyr/core/objects/game_object.rb     | 20 ------
 lib/aethyr/core/objects/traits/expires.rb  |  2 +-
 lib/aethyr/core/objects/traits/location.rb | 11 ++-
 lib/aethyr/core/objects/traits/reacts.rb   |  9 ++-
 lib/aethyr/core/objects/traits/respawns.rb |  3 +-
 9 files changed, 23 insertions(+), 122 deletions(-)

diff --git a/lib/aethyr/core/cache_gary.rb b/lib/aethyr/core/cache_gary.rb
index 9283202..2cf41d3 100644
--- a/lib/aethyr/core/cache_gary.rb
+++ b/lib/aethyr/core/cache_gary.rb
@@ -67,7 +67,6 @@ class CacheGary < Gary
       log "Loading #{goid} from storage" , Logger::Ultimate
       begin
         obj = @storage.load_object(goid, self)
-        obj.add_observer(@manager)
       rescue MUDError::NoSuchGOID
         log "Tried to load #{goid}, but it must have been deleted."
         return nil
@@ -78,12 +77,11 @@ class CacheGary < Gary
     end
   end
 
-  #Add object to CacheGary, also adds the Manager as an observer.
+  #Add object to CacheGary.
   def << game_object
     @mutex.synchronize do
       @ghash[game_object.goid] = game_object
       @all_goids << game_object.goid
-      game_object.add_observer(@manager)
     end
   end
 
diff --git a/lib/aethyr/core/commands/admin/aforce.rb b/lib/aethyr/core/commands/admin/aforce.rb
index 07f1e40..318060f 100644
--- a/lib/aethyr/core/commands/admin/aforce.rb
+++ b/lib/aethyr/core/commands/admin/aforce.rb
@@ -15,7 +15,7 @@ module Aethyr
             syntax_formats = ["AFORCE [OBJECT] [ACTION]"]
             aliases = nil
             content =  <<'EOF'
-Sorry no help has been written for this command yet
+Forces another player to execute a command.
 EOF
             help_entries.push(Aethyr::Core::Help::HelpEntry.new(command, content: content, syntax_formats: syntax_formats, see_also: see_also, aliases: aliases))
 
@@ -50,17 +50,12 @@ EOF
             if object.nil?
               player.output "Force who?"
               return
-            elsif object.is_a? Mobile
-              unless object.info.redirect_output_to == player.goid
-                object.info.redirect_output_to = player.goid
-
-                after 10 do
-                  object.info.redirect_output_to = nil
-                end
-              end
+            elsif object.is_a? Player
+              object.handle_input(event[:command])
+            else
+              player.output "You can only force other players to execute a command."
             end
 
-            player.add_event(CommandParser.parse(object, event[:command]))
           end
 
         end
diff --git a/lib/aethyr/core/components/manager.rb b/lib/aethyr/core/components/manager.rb
index b83fc15..469af6f 100644
--- a/lib/aethyr/core/components/manager.rb
+++ b/lib/aethyr/core/components/manager.rb
@@ -7,7 +7,7 @@ require 'aethyr/core/registry'
 require 'aethyr/core/util/publisher'
 require 'set'
 
-#The Manager class uses the observer model to recieve commands from objects, which
+#The Manager class uses the wisper to recieve commands from objects, which
 #it then passes along to the EventHandler.
 #The Manager also keeps track of all game objects and takes care of adding, removing, and
 #finding them.
@@ -184,7 +184,7 @@ class Manager < Publisher
   def add_object(game_object, position = nil)
 
     @game_objects << game_object unless @game_objects.loaded? game_object.goid
-    
+
     broadcast(:object_added, { :publisher => self, :game_object => game_object, :position => position})
 
     unless game_object.room.nil?
@@ -348,81 +348,6 @@ class Manager < Publisher
     log "Error when dropping player, but recovering and continuing."
   end
 
-  #Update gets called when an event occurs. The event is just passed along to the EventHandler, unless it is a :quit  or :save
-  #event, in which case the Manager takes care of it.
-  def update(event)
-    return if not @running
-    log "Got event: #{event}", Logger::Medium
-    if event.nil?
-      return
-    elsif event[:type] == :Future
-      future_event(event)
-      return
-    end
-
-    log "Adding event to event handler from #{event[:player]}", Logger::Ultimate
-    @event_handler.event_queue << event
-
-    #EventMachine.defer lambda {@event_handler.run}
-    @event_handler.run
-  end
-
-  #Add a future event.
-  def future_event(event)
-    if event[:action] == :call
-      EventMachine.add_timer(event[:time]) do
-        if $manager.cancelled? event
-          $manager.remove_cancelled event
-          break
-        end
-
-        e = event[:event].call
-
-        if e.is_a? String
-          e = CommandParser.parse(event[:player], e)
-        end
-
-        if e.is_a? Event
-          $manager.update(e)
-        end
-
-      end
-    else
-      EventMachine.add_timer(event[:time]) do
-        if $manager.cancelled? event
-          $manager.remove_cancelled event
-          break
-        end
-
-        $manager.update(event[:event])
-      end
-    end
-  end
-
-  def cancel_event event
-    if event.is_a? Integer
-      @cancelled_events << event
-    else
-      @cancelled_events << event.object_id
-    end
-  end
-
-  def cancelled? event
-    if event.is_a? Integer
-      @cancelled_events.include? event
-    else
-      @cancelled_events.include? event.object_id
-    end
-  end
-
-  def remove_cancelled event
-    if event.is_a? Integer
-      @cancelled_event.delete event
-    else
-      @cancelled_event.delete event.object_id
-    end
-  end
-
   #Calls update on all objects.
   def update_all
     #require 'benchmark'
diff --git a/lib/aethyr/core/components/storage.rb b/lib/aethyr/core/components/storage.rb
index f249225..362b211 100644
--- a/lib/aethyr/core/components/storage.rb
+++ b/lib/aethyr/core/components/storage.rb
@@ -182,7 +182,7 @@ class StorageMachine
 
   #Recursively stores object and its inventory.
   #
-  #Warning: this temporarily removes the object's observers.
+  #Warning: this temporarily removes the object's subscribers.
   def store_object(object)
 
     volatile_data = object.dehydrate()
diff --git a/lib/aethyr/core/objects/game_object.rb b/lib/aethyr/core/objects/game_object.rb
index f238ed9..b2fafb9 100644
--- a/lib/aethyr/core/objects/game_object.rb
+++ b/lib/aethyr/core/objects/game_object.rb
@@ -1,4 +1,3 @@
-require 'observer'
 require 'aethyr/core/util/publisher'
 require 'aethyr/core/util/log'
 require 'aethyr/core/objects/inventory'
@@ -9,7 +8,6 @@ require 'aethyr/core/event'
 
 #Base class for all game objects, including players. Should be subclassed to do anything useful.
 class GameObject < Publisher
-  include Observable
   include Pronoun
 
   attr_reader :short_desc, :game_object_id, :alt_names, :generic, :article, :sex, :show_in_look, :actions, :balance, :admin, :manager
@@ -18,7 +16,6 @@ class GameObject < Publisher
   alias :room :container
   alias :can? :respond_to?
   alias :goid :game_object_id
-  volatile :@observer_peers
 
   #Creates a new GameObject. Most of this long list of parameters is simply ignored at creation time,
   #because they can all be set later.
@@ -73,17 +70,6 @@ class GameObject < Publisher
     @admin = false
   end
 
-  def rehydrate(volatile_data)
-    super(volatile_data)
-    if volatile_data.nil?
-      if RUBY_VERSION < "1.9.0"
-        self.instance_variable_set(:@observer_peers, [])
-      else
-        self.instance_variable_set(:@observer_peers, {})
-      end
-    end
-  end
-
   def flags
     Hash.new @info.flags
   end
@@ -145,12 +131,6 @@ class GameObject < Publisher
   def run
   end
 
-  #Just a way to put an event into the system, nothing more, nothing less.
-  def add_event(event)
-    changed
-    notify_observers(event)
-  end
-
   #Basically, this is where hooks for commands would go.
   def alert(event)
   end
diff --git a/lib/aethyr/core/objects/traits/expires.rb b/lib/aethyr/core/objects/traits/expires.rb
index 529747e..9c8abf6 100644
--- a/lib/aethyr/core/objects/traits/expires.rb
+++ b/lib/aethyr/core/objects/traits/expires.rb
@@ -18,6 +18,6 @@ module Expires
   private
 
   def expire
-    add_event Event.new(:Mobiles, :action => :expire, :player => self)
+    raise "expire is not yet properly implemented"
   end
 end
diff --git a/lib/aethyr/core/objects/traits/location.rb b/lib/aethyr/core/objects/traits/location.rb
index cdb679d..8045891 100644
--- a/lib/aethyr/core/objects/traits/location.rb
+++ b/lib/aethyr/core/objects/traits/location.rb
@@ -4,7 +4,6 @@ require 'aethyr/core/util/log'
 require 'aethyr/core/objects/inventory'
 require 'aethyr/core/objects/traits/pronoun'
 require 'aethyr/core/util/guid'
-require 'observer'
 require 'aethyr/core/objects/info/info'
 
 module Location
@@ -17,12 +16,12 @@ module Location
       info.terrain.type = terrain_type
     end
   end
-  
+
   def area
     return self if self.is_a? Area
     self.parent_area
   end
-  
+
   def parent_area
     return nil if $manager.nil?
     parent_id = @container
@@ -33,17 +32,17 @@ module Location
     end
     nil
   end
-  
+
   def flags
     collected_flags = self.parent_area.flags unless self.parent_area.nil?
     return info.flags.dup if collected_flags.nil?
-    
+
     self.info.flags.values.each do |f|
       f.negate_flags(collected_flags)
     end
     collected_flags.merge! self.info.flags
   end
-  
+
   def terrain_type
     return info.terrain.type unless info.terrain.type.nil?
     return self.parent_area.terrain_type unless self.parent_area.nil?
diff --git a/lib/aethyr/core/objects/traits/reacts.rb b/lib/aethyr/core/objects/traits/reacts.rb
index 529d71a..716b243 100644
--- a/lib/aethyr/core/objects/traits/reacts.rb
+++ b/lib/aethyr/core/objects/traits/reacts.rb
@@ -64,7 +64,8 @@ module Reacts
         unless action.nil?
           log "I am doing an action...", Logger::Ultimate
           changed
-          notify_observers(action)
+          #notify_observers(action)
+          raise "This used to notify observers, not sure how this worked so need to fix this, most likely this will be rewritten before it becomes an issue."
         else
           log "Action did not parse: #{reaction}", Logger::Medium
         end
@@ -118,7 +119,8 @@ module Reacts
     event = CommandParser.parse(self, command)
     return false if event.nil? #failed to parse
 
-    add_event event unless delay
+    raise "removed events this class no longer works, will probably be rewritten"
+    #add_event event unless delay
     event
   end
 
@@ -273,7 +275,8 @@ module Reacts
 
   def teleport item, destination, options = {}
     event = Event.new :Mobiles, {:action => :teleport, :player => self, :object => item, :in => destination}.merge(options)
-    add_event event
+    raise "re removed events this class no longer works and will probably be rewritten"
+    #    add_event event
   end
 
   def follow object, message = nil
diff --git a/lib/aethyr/core/objects/traits/respawns.rb b/lib/aethyr/core/objects/traits/respawns.rb
index 078afc5..98c211a 100644
--- a/lib/aethyr/core/objects/traits/respawns.rb
+++ b/lib/aethyr/core/objects/traits/respawns.rb
@@ -59,6 +59,7 @@ module Respawns
       return
     end
 
-    add_event Event.new(:Mobiles, :player => self, :action => :respawn, :room => room)
+    raise "respawn no longer works, removed events, will likely be rewritten"
+    #add_event Event.new(:Mobiles, :player => self, :action => :respawn, :room => room)
   end
 end
-- 
GitLab