Commit 3da81c4

mo <mo.khan@gmail.com>
2018-04-27 20:54:57
build jabber client.
1 parent 600f05a
Changed files (4)
exe/del
@@ -1,3 +1,5 @@
 #!/usr/bin/env ruby
 
 require "del"
+
+Del.start
lib/del/robot.rb
@@ -0,0 +1,94 @@
+require 'xmpp4r'
+require 'xmpp4r/roster/helper/roster'
+require 'xmpp4r/muc/helper/simplemucclient'
+require 'xmpp4r/muc/helper/mucbrowser'
+
+module Del
+  class User
+    def initialize(attributes)
+      @attributes = attributes
+    end
+  end
+
+  class UserRepository
+    def initialize
+      @users = Set.new
+    end
+
+    def create(item)
+      @users << User.new(item.attributes)
+    end
+  end
+
+  class RoomRepository
+    def initialize
+      @rooms = Set.new
+    end
+
+    def upsert(room)
+      @rooms << room
+    end
+  end
+
+  class Robot
+    attr_reader :configuration, :users, :rooms
+
+    def initialize(configuration:)
+      @configuration = configuration
+      @users = UserRepository.new
+      @rooms = RoomRepository.new
+    end
+
+    def run
+      client.on_exception do |error, connection, error_source|
+        puts error.inspect
+        shut_down
+      end
+      client.connect(configuration[:host])
+      sleep 0.0001 until client.is_connected?
+      client.auth(configuration[:password])
+      roster = Jabber::Roster::Helper.new(client, false)
+      roster.add_update_callback do |old_item, item|
+        users.create(item) if item
+      end
+      roster.get_roster
+      roster.wait_for_roster
+      @mention_name = roster[jid].attributes['mention_name']
+
+      client.add_message_callback do |message|
+        next if message.type == :error || message.body.nil?
+        puts message.inspect
+      end
+      client.send(Jabber::Presence.new(:chat))
+      list_rooms(configuration[:muc_domain]).each do |room|
+        rooms.upsert(room)
+      end
+      sleep
+    rescue Interrupt
+      shut_down
+    end
+
+    private
+
+    def list_rooms(muc_domain)
+      Jabber::MUC::MUCBrowser.new(client).muc_rooms(muc_domain).map do |jid, name|
+        jid.to_s
+      end
+    end
+
+    def client
+      @client ||= Jabber::Client.new(jid)
+    end
+
+    def jid
+      jid = Jabber::JID.new(configuration[:jid])
+      jid.resource = "bot"
+      jid
+    end
+
+    def shut_down
+      puts "byte me!"
+      client.close
+    end
+  end
+end
lib/del.rb
@@ -1,5 +1,17 @@
+require "del/robot"
 require "del/version"
+require 'dotenv'
 
 module Del
-  # Your code goes here...
+  def self.start
+    Dotenv.load(".env.local", Pathname.new(Dir.home).join(".delrc").to_s)
+
+    del = Robot.new(configuration: {
+      host: ENV['DEL_HOST'],
+      jid: ENV['DEL_JID'],
+      muc_domain: ENV['DEL_MUC_DOMAIN'],
+      password: ENV['DEL_PASSWORD'],
+    })
+    del.run
+  end
 end
del.gemspec
@@ -21,6 +21,8 @@ Gem::Specification.new do |spec|
   spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
   spec.require_paths = ["lib"]
 
+  spec.add_dependency "dotenv", "~> 2.4"
+  spec.add_dependency "xmpp4r", "~> 0.5"
   spec.add_development_dependency "bundler", "~> 1.16"
   spec.add_development_dependency "rake", "~> 10.0"
   spec.add_development_dependency "rspec", "~> 3.0"