Commit 6bf1f28

mo <mo.khan@gmail.com>
2018-04-28 04:45:08
implement simple route registration.
1 parent c58e146
lib/del/configuration.rb
@@ -0,0 +1,28 @@
+module Del
+  class Configuration
+    attr_accessor :default_rooms
+    attr_accessor :host
+    attr_accessor :jid
+    attr_accessor :jid
+    attr_accessor :logger
+    attr_accessor :muc_domain
+    attr_accessor :name
+    attr_accessor :password
+    attr_accessor :rooms
+    attr_accessor :router
+    attr_accessor :users
+
+    def initialize
+      @default_rooms = ENV.fetch("DEL_ROOMS", '').split(',')
+      @host = ENV.fetch("DEL_HOST", 'chat.hipchat.com')
+      @jid = ENV.fetch("DEL_JID")
+      @logger = Logger.new(STDOUT)
+      @muc_domain = ENV.fetch("DEL_MUC_DOMAIN", "conf.hipchat.com")
+      @name = ENV.fetch("DEL_FULL_NAME")
+      @password = ENV.fetch("DEL_PASSWORD")
+      @rooms = Repository.new
+      @router = DefaultRouter.new
+      @users = Repository.new
+    end
+  end
+end
lib/del/connection.rb
@@ -61,7 +61,7 @@ module Del
     end
 
     def disconnect
-      puts "byte me!"
+      Del.logger.info("byte me!")
       client.close
     rescue IOError, SystemCallError => error
       Del.logger.error(error)
lib/del/default_router.rb
@@ -1,9 +1,23 @@
 module Del
   class DefaultRouter
-    def route(message)
-      Del.logger.info(message.to_s)
+    attr_reader :logger
+
+    def initialize(logger = Del.logger)
+      @logger = logger
+      @routes = []
+    end
 
-      message.reply(message.text.reverse)
+    def register(pattern, &block)
+      @routes.push(pattern: pattern, command: block)
+    end
+
+    def route(message)
+      logger.info(message.to_s)
+      @routes.each do |route|
+        if route[:pattern].match(message.text)
+          route[:command].call(message)
+        end
+      end
     end
   end
 end
lib/del/robot.rb
@@ -15,6 +15,7 @@ module Del
 
     def get_funky!
       connection.connect(self)
+      Del.logger.info("It's fire! 🔥")
       sleep
     rescue Interrupt
       connection.disconnect
lib/del.rb
@@ -6,6 +6,7 @@ require "xmpp4r/muc/helper/simplemucclient"
 require "xmpp4r/roster/helper/roster"
 
 require "del/connection"
+require "del/configuration"
 require "del/default_router"
 require "del/message"
 require "del/repository"
@@ -18,7 +19,6 @@ module Del
   def self.start(dotenv_file:)
     puts "Loading... #{dotenv_file}"
     Dotenv.load(dotenv_file.to_s)
-    puts "It's fire! 🔥"
     Del.logger.level = Logger::INFO
     del = Robot.new(configuration: configuration)
     del.get_funky!
@@ -29,18 +29,7 @@ module Del
   end
 
   def self.configuration
-    @configuration ||= {
-      default_rooms: ENV.fetch("DEL_ROOMS", '').split(','),
-      host: ENV.fetch("DEL_HOST"),
-      jid: ENV.fetch("DEL_JID"),
-      logger: Logger.new(STDOUT),
-      muc_domain: ENV.fetch("DEL_MUC_DOMAIN"),
-      name: ENV.fetch("DEL_FULL_NAME"),
-      password: ENV.fetch("DEL_PASSWORD"),
-      rooms: Repository.new,
-      router: DefaultRouter.new,
-      users: Repository.new,
-    }
+    @configuration ||= Configuration.new
   end
 
   def self.logger
spec/default_router_spec.rb
@@ -0,0 +1,22 @@
+RSpec.describe Del::DefaultRouter do
+  subject { described_class.new(Logger.new(STDOUT)) }
+
+  describe "#route" do
+    let(:recorder) { [] }
+    before :each do
+      subject.register(/^Hello World!$/) do |message|
+        recorder.push(message.text)
+      end
+    end
+
+    it 'routes to the registered route' do
+      subject.route(double(text: 'Hello World!'))
+      expect(recorder).to include('Hello World!')
+    end
+
+    it 'does not route a route that does not match' do
+      subject.route(double(text: "What's good?"))
+      expect(recorder).to be_empty
+    end
+  end
+end