Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Bartosz Kopiński committed Apr 15, 2015
1 parent 8dc75a3 commit f59f3f7
Show file tree
Hide file tree
Showing 15 changed files with 180 additions and 31 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
coverage/*
.bundle
Gemfile.lock
.ruby-version
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@ end
platforms :mri do
gem 'coveralls', require: false
end

gem 'pry'
2 changes: 1 addition & 1 deletion hipbot.gemspec
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*-
# encoding: utf-8
require File.expand_path('../lib/hipbot/version', __FILE__)

Gem::Specification.new do |gem|
Expand Down
2 changes: 2 additions & 0 deletions lib/hipbot.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
require 'hipbot/callbacks/room_presence'
require 'hipbot/callbacks/invite'
require 'hipbot/adapter'
require 'hipbot/adapters/xmpp/initializer'
require 'hipbot/adapters/slack'
require 'hipbot/adapters/hipchat/initializer'
require 'hipbot/adapters/hipchat'
require 'hipbot/adapters/telnet'
Expand Down
2 changes: 1 addition & 1 deletion lib/hipbot/adapters/hipchat.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def set_topic(room, topic)
end

def set_presence(status, type)
client.set_presence(type, nil, status)
client.set_presence(status, type)
end

def join_room(room)
Expand Down
17 changes: 5 additions & 12 deletions lib/hipbot/adapters/hipchat/initializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,27 +27,20 @@ def initialize_client

def initialize_rooms
room_ids = client.get_rooms.map do |room_data|
room = Room.find_or_create_by(id: room_data[:item].jid.to_s)
room.update_attributes(
name: room_data[:item].iname,
topic: room_data[:details]['topic'],
privacy: room_data[:details]['privacy'],
hipchat_id: room_data[:details]['id'],
archived: room_data[:details].has_key?('is_archived'),
guest_url: room_data[:details]['guest_url'],
)
room = Room.find_or_create_by(id: room_data.jid)
room.update_attributes(room_data.attributes)
room.id
end
clean_other_objects(Room, room_ids) if room_ids.any?
end

def initialize_users
user_ids = client.get_users.map do |user_data|
user = User.find_or_create_by(id: user_data.delete(:jid))
user.update_attributes(user_data)
user = User.find_or_create_by(id: user_data.jid)
user.update_attributes(user_data.attributes)

if user.attributes['email'].nil?
user.update_attributes(client.get_user_details(user.id))
user.update_attributes(client.get_user_details(user.id).attributes)
end
user.id
end
Expand Down
53 changes: 53 additions & 0 deletions lib/hipbot/adapters/slack.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
module Hipbot
module Adapters
class Slack
attr_accessor :client

def start!
self.client = XMPP::Initializer.new.client
end

def restart!
start!
end

def invite_to_room(room, users)
client.invite(user_ids(users), room.id)
end

def kick_from_room(room, users)
client.kick(user_ids(users), room.id)
end

def send_to_room(room, message)
client.send_message(:groupchat, room.id, message)
end

def send_to_user(user, message)
client.send_message(:chat, user.id, message)
end

def set_topic(room, topic)
client.send_message(:groupchat, room.id, nil, topic)
end

def set_presence(status, type)
client.set_presence(status, type)
end

def join_room(room)
client.join(room.id)
end

def leave_room(room, reason = '')
client.exit(room.id, reason)
end

protected

def user_ids users
Array(users).map(&:id)
end
end
end
end
89 changes: 89 additions & 0 deletions lib/hipbot/adapters/xmpp/initializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
module Hipbot
module Adapters
class XMPP
class Initializer
attr_accessor :client

KEEP_ALIVE_INTERVAL = 60

def initialize
Jabber.debug = true
Jabber.logger = Hipbot.logger
initialize_client do
initialize_rooms
initialize_users
initialize_bot_user
initialize_callbacks
initialize_keep_alive
end
end

protected

def initialize_client
self.client = ::Jabber::MUC::HipchatClient.new(
Hipbot.jid,
Hipbot.conference_host,
)
yield if client.connect(Hipbot.password)
end

def initialize_rooms
room_ids = client.get_rooms.map do |room_data|
room = Room.find_or_create_by(id: room_data.jid)
room.update_attributes(room_data.attributes)
room.id
end
clean_other_objects(Room, room_ids) if room_ids.any?
end

def initialize_users
user_ids = client.get_users.map do |user_data|
user = User.find_or_create_by(id: user_data.jid)
user.update_attributes(user_data.attributes)

if user.attributes['email'].nil?
user.update_attributes(client.get_user_details(user.id).attributes)
end
user.id
end
clean_other_objects(User, user_ids) if user_ids.any?
end

def clean_other_objects klass, object_ids
klass.all.select{ |r| !object_ids.include?(r.id) }.each(&:destroy)
end

def initialize_bot_user
Hipbot.configuration.user = User.find_or_create_by(id: Hipbot.jid)
client.name = Hipbot.user.name
end

def initialize_callbacks
client.on_room_message{ |*args|
Callbacks::RoomMessage.new(*args)
}
client.on_private_message{ |*args|
Callbacks::PrivateMessage.new(*args)
}
client.on_invite{ |*args|
Callbacks::Invite.new(*args)
}
client.on_lobby_presence{ |*args|
Callbacks::LobbyPresence.new(*args)
}
client.on_room_presence{ |*args|
Callbacks::RoomPresence.new(*args)
}
client.activate_callbacks
end

def initialize_keep_alive
::EM::add_periodic_timer(KEEP_ALIVE_INTERVAL) do
client.keep_alive(Hipbot.password) unless client.nil?
end
end
end
end
end
end
4 changes: 2 additions & 2 deletions lib/hipbot/callbacks/presence.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ class Presence < Base
protected

def online_presence?
presence.empty?
presence == :available
end

def offline_presence?
presence == 'unavailable'
presence == :unavailable
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/hipbot/callbacks/room_presence.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module Callbacks
class RoomPresence < Presence
attr_accessor :room_id, :user_name

def initialize room_id, user_name, presence
def initialize room_id, user_name, presence, role
self.presence = presence
self.user_name = user_name
self.room_id = room_id
Expand Down
7 changes: 4 additions & 3 deletions lib/hipbot/configuration.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
module Hipbot
class Configuration
OPTIONS = [
:adapter, :exception_handler, :helpers, :jid, :join, :logger, :password,
:plugins, :preloader, :rooms, :status, :storage, :teams, :user
:adapter, :conference_host, :exception_handler, :helpers, :jid, :join,
:logger, :password, :plugins, :preloader, :rooms, :status, :storage, :teams, :user
]
attr_accessor *OPTIONS

def initialize
self.adapter = Adapters::Hipchat
self.adapter = Adapters::Hipchat
self.conference_host = nil
self.exception_handler = Proc.new do |e|
Hipbot.logger.error(e.message)
e.backtrace.each { |line| Hipbot.logger.error(line) }
Expand Down
14 changes: 9 additions & 5 deletions lib/hipbot/http.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
# encoding: utf-8
module Hipbot
module Http
class Request < Struct.new(:url, :query, :method)
class Request < Struct.new(:url, :params, :method)
DEFAULT_HEADERS = { 'accept-encoding' => 'gzip, compressed' }.freeze
CONNECTION_SETTINGS = { connect_timeout: 5, inactivity_timeout: 10 }.freeze
ERROR_CALLBACK = ->(error){ Hipbot.logger.error(error) }

def initialize *args
super
Hipbot.logger.info("HTTP-REQUEST: #{url} #{query}")
self.params ||= {}
self.params = params.has_key?(:query) ? params : { query: params }
self.params = { head: DEFAULT_HEADERS }.merge(params)
Hipbot.logger.info("HTTP-REQUEST: #{url} #{params}")
end

def call &success_block
Expand All @@ -25,12 +29,12 @@ def success
instance_exec(e, &Hipbot.exception_handler)
end

def http
@http ||= connection.send(method, query: query.merge(head: DEFAULT_HEADERS))
def http options = {}
@http ||= connection.send(method, params.merge(options))
end

def connection
EM::HttpRequest.new(url, CONNECTION_SETTINGS)
@connection ||= EM::HttpRequest.new(url, CONNECTION_SETTINGS)
end
end

Expand Down
2 changes: 1 addition & 1 deletion lib/hipbot/reaction.rb
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def to_private_message?
protected

def replace_symbols values, replacements_hash
Array(values).flat_map{ |v| replacements_hash[v] || v }.map(&:to_s)
Array(values).flat_map{ |v| replacements_hash[v] || v }.uniq
end
end
end
10 changes: 5 additions & 5 deletions lib/hipbot/storages/hash.rb
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,12 @@ def where param
end
end

protected
# protected

def method_missing name, *args, &block
return all.public_send(name, *args, &block) if Array.instance_methods.include?(name)
super
end
# def method_missing name, *args, &block
# return all.public_send(name, *args, &block) if Array.instance_methods.include?(name)
# super
# end
end
end
end
Expand Down
4 changes: 4 additions & 0 deletions lib/hipbot/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,9 @@ def first_name
def myself?
self == Hipbot.user
end

def guest?
attributes[:role] == 'visitor'
end
end
end

0 comments on commit f59f3f7

Please sign in to comment.