Commit 3da81c4
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"