hipbot 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +3 -3
- data/Gemfile +12 -1
- data/README.md +16 -8
- data/bin/hipbot +5 -0
- data/hipbot.gemspec +2 -1
- data/lib/hipbot.rb +7 -10
- data/lib/hipbot/adaptable.rb +60 -0
- data/lib/hipbot/adapter.rb +6 -6
- data/lib/hipbot/adapters/hipchat.rb +5 -48
- data/lib/hipbot/adapters/hipchat/client.rb +8 -0
- data/lib/hipbot/adapters/shell.rb +2 -9
- data/lib/hipbot/adapters/slack.rb +10 -0
- data/lib/hipbot/adapters/slack/client.rb +47 -0
- data/lib/hipbot/adapters/telnet.rb +2 -9
- data/lib/hipbot/adapters/xmpp.rb +59 -0
- data/lib/hipbot/adapters/{hipchat/initializer.rb → xmpp/client.rb} +35 -21
- data/lib/hipbot/bot.rb +5 -1
- data/lib/hipbot/callbacks/base.rb +20 -2
- data/lib/hipbot/callbacks/lobby_presence.rb +2 -1
- data/lib/hipbot/callbacks/presence.rb +1 -5
- data/lib/hipbot/callbacks/room_invite.rb +13 -0
- data/lib/hipbot/callbacks/room_message.rb +3 -9
- data/lib/hipbot/callbacks/room_presence.rb +10 -8
- data/lib/hipbot/callbacks/room_topic.rb +18 -0
- data/lib/hipbot/configuration.rb +11 -6
- data/lib/hipbot/helpers.rb +2 -0
- data/lib/hipbot/{http.rb → helpers/http.rb} +11 -7
- data/lib/hipbot/message.rb +2 -2
- data/lib/hipbot/presence.rb +0 -6
- data/lib/hipbot/reaction.rb +9 -7
- data/lib/hipbot/response.rb +1 -1
- data/lib/hipbot/room.rb +1 -1
- data/lib/hipbot/storages/hash.rb +5 -5
- data/lib/hipbot/storages/mongoid.rb +1 -1
- data/lib/hipbot/user.rb +4 -0
- data/lib/hipbot/{cache.rb → utilities/cache.rb} +0 -0
- data/lib/hipbot/{logger.rb → utilities/logger.rb} +0 -0
- data/lib/hipbot/version.rb +1 -1
- data/spec/integration/my_hipbot_spec.rb +1 -1
- data/spec/spec_helper.rb +7 -2
- data/spec/unit/match_spec.rb +7 -7
- data/spec/unit/message_spec.rb +2 -2
- data/spec/unit/reaction_spec.rb +14 -14
- metadata +28 -8
- data/lib/hipbot/callbacks/invite.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ed63b11aa526d641c3b097eeea4899339798434
|
4
|
+
data.tar.gz: 229a421ee5b0ca9be639bb015a52d43e06d8bab4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fead2592a00027404cf18c6547014e8a58969b33958f1f6034fb16a37b6c2078f6f48ec221ce151b3b931148e0ba57bfbe7fba7b6ebd1f2d0b3977c879b2515
|
7
|
+
data.tar.gz: 556422b51b8a2c7d7172cd9b830ec0f98c8ce30f3cd0f6c30112a67d156cd6032334ab4db610b6a3f88525ee68222e2c0fbf88c527c691747d8b03c4562a1c65
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -2,5 +2,16 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
gem 'xmpp4r-hipchat', github: 'bartoszkopinski/xmpp4r-hipchat', branch: 'master'
|
5
|
+
gem 'slack-api'
|
5
6
|
|
6
|
-
|
7
|
+
platforms :rbx do
|
8
|
+
gem 'racc'
|
9
|
+
gem 'rubysl', '~> 2.0'
|
10
|
+
gem 'psych'
|
11
|
+
end
|
12
|
+
|
13
|
+
platforms :mri do
|
14
|
+
gem 'coveralls', require: false
|
15
|
+
end
|
16
|
+
|
17
|
+
gem 'pry'
|
data/README.md
CHANGED
@@ -11,9 +11,9 @@ Hipbot is a XMPP bot for HipChat, written in Ruby with EventMachine.
|
|
11
11
|
### Compatibility
|
12
12
|
Hipbot is tested on:
|
13
13
|
|
14
|
-
* Ruby 1.9.
|
14
|
+
* Ruby 1.9.3, 2.0.0 and 2.1.0
|
15
15
|
* JRuby 1.9 mode
|
16
|
-
* Rubinus
|
16
|
+
* Rubinus
|
17
17
|
|
18
18
|
### Dependencies
|
19
19
|
|
@@ -109,6 +109,12 @@ class MyBot < Hipbot::Bot
|
|
109
109
|
# Auto join criteria (default: :all)
|
110
110
|
# Accepted values: :all, :public, :private, :none, "room name"
|
111
111
|
c.join = :private
|
112
|
+
|
113
|
+
# Makes all reactions case insensitive (default: true)
|
114
|
+
c.case_insensitive = true
|
115
|
+
|
116
|
+
# Auto-join on invite (default: true)
|
117
|
+
c.join_on_invite = true
|
112
118
|
end
|
113
119
|
end
|
114
120
|
```
|
@@ -187,7 +193,7 @@ on /^where am I\?$/ do
|
|
187
193
|
"Users online: #{room.users.count}\n" +
|
188
194
|
"Privacy: #{room.privacy}\n" +
|
189
195
|
"Hipchat ID: #{room.hipchat_id}\n" +
|
190
|
-
"Archived?: #{room.archived ? 'yes' : 'no'}\n" +
|
196
|
+
"Archived?: #{room.archived? ? 'yes' : 'no'}\n" +
|
191
197
|
"Guest URL: #{room.guest_url}"
|
192
198
|
)
|
193
199
|
end
|
@@ -610,11 +616,11 @@ module Hipbot
|
|
610
616
|
|
611
617
|
has_and_belongs_to_many :users, class_name: 'Hipbot::User', inverse_of: :rooms
|
612
618
|
|
613
|
-
field :
|
614
|
-
field :guest_url,
|
615
|
-
field :hipchat_id,
|
616
|
-
field :privacy,
|
617
|
-
field :topic,
|
619
|
+
field :is_archived, type: Boolean
|
620
|
+
field :guest_url, type: String
|
621
|
+
field :hipchat_id, type: String
|
622
|
+
field :privacy, type: String
|
623
|
+
field :topic, type: String
|
618
624
|
end
|
619
625
|
end
|
620
626
|
```
|
@@ -653,3 +659,5 @@ end
|
|
653
659
|
* ~~handle reconnecting after disconnect/failure~~
|
654
660
|
* ~~add support for multiple regexps for one response~~
|
655
661
|
* ~~add support for responses in particular room (`on //, room: ['public'] do ...`)~~
|
662
|
+
|
663
|
+
Read [the story behind creating HipBot](https://netguru.co/blog/posts/hipbot).
|
data/bin/hipbot
CHANGED
data/hipbot.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
2
|
require File.expand_path('../lib/hipbot/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
@@ -22,5 +22,6 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.add_runtime_dependency "em-http-request", ["~> 1.1"]
|
23
23
|
gem.add_development_dependency "rake"
|
24
24
|
gem.add_development_dependency "rspec"
|
25
|
+
gem.add_development_dependency "rspec-its"
|
25
26
|
gem.add_development_dependency "guard-rspec"
|
26
27
|
end
|
data/lib/hipbot.rb
CHANGED
@@ -7,34 +7,31 @@ require 'ostruct'
|
|
7
7
|
require 'json'
|
8
8
|
require 'eventmachine'
|
9
9
|
require 'em-http-request'
|
10
|
-
require 'xmpp4r-hipchat'
|
11
10
|
|
12
|
-
require 'hipbot/cache'
|
11
|
+
require 'hipbot/utilities/cache'
|
12
|
+
require 'hipbot/utilities/logger'
|
13
13
|
require 'hipbot/patches/encoding'
|
14
|
-
require 'hipbot/logger'
|
15
14
|
require 'hipbot/callbacks/base'
|
16
15
|
require 'hipbot/callbacks/message'
|
17
16
|
require 'hipbot/callbacks/private_message'
|
18
17
|
require 'hipbot/callbacks/room_message'
|
18
|
+
require 'hipbot/callbacks/room_topic'
|
19
19
|
require 'hipbot/callbacks/presence'
|
20
20
|
require 'hipbot/callbacks/lobby_presence'
|
21
21
|
require 'hipbot/callbacks/room_presence'
|
22
|
-
require 'hipbot/callbacks/
|
23
|
-
require 'hipbot/adapter'
|
24
|
-
require 'hipbot/adapters/hipchat/initializer'
|
25
|
-
require 'hipbot/adapters/hipchat'
|
26
|
-
require 'hipbot/adapters/telnet'
|
27
|
-
require 'hipbot/adapters/shell'
|
22
|
+
require 'hipbot/callbacks/room_invite'
|
28
23
|
require 'hipbot/reaction_factory'
|
29
24
|
require 'hipbot/reactable'
|
30
25
|
require 'hipbot/matchable'
|
31
26
|
require 'hipbot/configuration'
|
32
27
|
require 'hipbot/configurable'
|
28
|
+
require 'hipbot/adapter'
|
33
29
|
require 'hipbot/bot'
|
30
|
+
require 'hipbot/adaptable'
|
31
|
+
require 'hipbot/adapters/hipchat'
|
34
32
|
require 'hipbot/plugin'
|
35
33
|
require 'hipbot/storages/base'
|
36
34
|
require 'hipbot/storages/hash'
|
37
|
-
require 'hipbot/http'
|
38
35
|
require 'hipbot/helpers'
|
39
36
|
require 'hipbot/match'
|
40
37
|
require 'hipbot/message'
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Hipbot
|
2
|
+
module Adaptable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
extend ClassMethods
|
7
|
+
|
8
|
+
Hipbot.adapters.unshift(self)
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
attr_reader :options
|
13
|
+
|
14
|
+
def inherited child
|
15
|
+
Hipbot.adapters.unshift(child)
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_config_options *keys
|
19
|
+
@options ||= []
|
20
|
+
@options |= keys
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def start!
|
25
|
+
logger.error("NOT IMPLEMENTED")
|
26
|
+
end
|
27
|
+
|
28
|
+
def invite_to_room(*)
|
29
|
+
logger.error("NOT IMPLEMENTED")
|
30
|
+
end
|
31
|
+
|
32
|
+
def join_room(*)
|
33
|
+
logger.error("NOT IMPLEMENTED")
|
34
|
+
end
|
35
|
+
|
36
|
+
def kick_from_room(*)
|
37
|
+
logger.error("NOT IMPLEMENTED")
|
38
|
+
end
|
39
|
+
|
40
|
+
def leave_room(*)
|
41
|
+
logger.error("NOT IMPLEMENTED")
|
42
|
+
end
|
43
|
+
|
44
|
+
def restart!
|
45
|
+
logger.error("NOT IMPLEMENTED")
|
46
|
+
end
|
47
|
+
|
48
|
+
def send_to_room(*)
|
49
|
+
logger.error("NOT IMPLEMENTED")
|
50
|
+
end
|
51
|
+
|
52
|
+
def set_presence(*)
|
53
|
+
logger.error("NOT IMPLEMENTED")
|
54
|
+
end
|
55
|
+
|
56
|
+
def set_topic(*)
|
57
|
+
logger.error("NOT IMPLEMENTED")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/hipbot/adapter.rb
CHANGED
@@ -17,27 +17,27 @@ module Hipbot
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def join_room(room)
|
20
|
-
logger.info("JOINING
|
20
|
+
logger.info("JOINING ##{room}")
|
21
21
|
connection.join_room(room)
|
22
22
|
end
|
23
23
|
|
24
24
|
def leave_room(room)
|
25
|
-
logger.info("LEAVING
|
25
|
+
logger.info("LEAVING ##{room}")
|
26
26
|
connection.leave_room(room)
|
27
27
|
end
|
28
28
|
|
29
29
|
def invite_to_room(room, users)
|
30
|
-
logger.info("INVITING to
|
30
|
+
logger.info("INVITING to ##{room}: #{users}")
|
31
31
|
connection.invite_to_room(room, users)
|
32
32
|
end
|
33
33
|
|
34
34
|
def kick_from_room(room, users)
|
35
|
-
logger.info("KICKING from
|
35
|
+
logger.info("KICKING from ##{room}: #{users}")
|
36
36
|
connection.kick_from_room(room, users)
|
37
37
|
end
|
38
38
|
|
39
39
|
def send_to_room(room, message)
|
40
|
-
logger.info("REPLY in
|
40
|
+
logger.info("REPLY in ##{room}")
|
41
41
|
connection.send_to_room(room, message)
|
42
42
|
end
|
43
43
|
|
@@ -47,7 +47,7 @@ module Hipbot
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def set_topic(room, topic)
|
50
|
-
logger.info("TOPIC seting in
|
50
|
+
logger.info("TOPIC seting in ##{room} to '#{topic}'")
|
51
51
|
connection.set_topic(room, topic)
|
52
52
|
end
|
53
53
|
|
@@ -1,53 +1,10 @@
|
|
1
|
+
require 'hipbot/adapters/xmpp'
|
2
|
+
require 'hipbot/adapters/hipchat/client'
|
3
|
+
|
1
4
|
module Hipbot
|
2
5
|
module Adapters
|
3
|
-
class Hipchat
|
4
|
-
|
5
|
-
|
6
|
-
def start!
|
7
|
-
self.client = Initializer.new.client
|
8
|
-
end
|
9
|
-
|
10
|
-
def restart!
|
11
|
-
start!
|
12
|
-
end
|
13
|
-
|
14
|
-
def invite_to_room(room, users)
|
15
|
-
client.invite(user_ids(users), room.id)
|
16
|
-
end
|
17
|
-
|
18
|
-
def kick_from_room(room, users)
|
19
|
-
client.kick(user_ids(users), room.id)
|
20
|
-
end
|
21
|
-
|
22
|
-
def send_to_room(room, message)
|
23
|
-
client.send_message(:groupchat, room.id, message)
|
24
|
-
end
|
25
|
-
|
26
|
-
def send_to_user(user, message)
|
27
|
-
client.send_message(:chat, user.id, message)
|
28
|
-
end
|
29
|
-
|
30
|
-
def set_topic(room, topic)
|
31
|
-
client.send_message(:groupchat, room.id, nil, topic)
|
32
|
-
end
|
33
|
-
|
34
|
-
def set_presence(status, type)
|
35
|
-
client.set_presence(type, nil, status)
|
36
|
-
end
|
37
|
-
|
38
|
-
def join_room(room)
|
39
|
-
client.join(room.id)
|
40
|
-
end
|
41
|
-
|
42
|
-
def leave_room(room, reason = '')
|
43
|
-
client.exit(room.id, reason)
|
44
|
-
end
|
45
|
-
|
46
|
-
protected
|
47
|
-
|
48
|
-
def user_ids users
|
49
|
-
Array(users).map(&:id)
|
50
|
-
end
|
6
|
+
class Hipchat < XMPP
|
7
|
+
include Hipbot::Adaptable
|
51
8
|
end
|
52
9
|
end
|
53
10
|
end
|
@@ -1,21 +1,14 @@
|
|
1
1
|
module Hipbot
|
2
2
|
module Adapters
|
3
3
|
class Shell
|
4
|
+
include Hipbot::Adaptable
|
5
|
+
|
4
6
|
attr_accessor :connection
|
5
7
|
|
6
8
|
def start!
|
7
9
|
EM.open_keyboard(KeyboardHandler, self)
|
8
10
|
end
|
9
11
|
|
10
|
-
def invite_to_room(*); end
|
11
|
-
def join_room(*); end
|
12
|
-
def kick_from_room(*); end
|
13
|
-
def leave_room(*); end
|
14
|
-
def restart!; end
|
15
|
-
def send_to_room(*); end
|
16
|
-
def set_presence(*); end
|
17
|
-
def set_topic(*); end
|
18
|
-
|
19
12
|
module KeyboardHandler
|
20
13
|
include EM::Protocols::LineText2
|
21
14
|
include Cache
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "slack"
|
2
|
+
|
3
|
+
module Hipbot
|
4
|
+
module Adapters
|
5
|
+
class Slack < XMPP
|
6
|
+
class Client < XMPP::Client
|
7
|
+
def initialize
|
8
|
+
::Slack.configure do |config|
|
9
|
+
config.token = Hipbot.configuration.slack_api_token
|
10
|
+
end
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def initialize_rooms
|
17
|
+
room_ids = ::Slack.client.channels_list["channels"].map do |channel|
|
18
|
+
room = Room.find_or_create_by(id: channel["name"])
|
19
|
+
room.update_attributes(name: channel["name"])
|
20
|
+
room.id
|
21
|
+
end
|
22
|
+
|
23
|
+
clean_other_objects(Room, room_ids) if room_ids.any?
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize_users
|
27
|
+
user_ids = ::Slack.client.users_list["members"].map do |user_data|
|
28
|
+
user = User.find_or_create_by(id: user_data["name"])
|
29
|
+
profile_data = user_data["profile"]
|
30
|
+
|
31
|
+
user.update_attributes(
|
32
|
+
name: user_data["real_name"],
|
33
|
+
mention: user_data["name"],
|
34
|
+
email: profile_data["email"],
|
35
|
+
title: profile_data["title"],
|
36
|
+
photo: profile_data["image_192"],
|
37
|
+
admin: profile_data["is_admin"],
|
38
|
+
)
|
39
|
+
user.id
|
40
|
+
end
|
41
|
+
|
42
|
+
clean_other_objects(User, user_ids) if user_ids.any?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Hipbot
|
2
2
|
module Adapters
|
3
3
|
class Telnet
|
4
|
+
include Hipbot::Adaptable
|
5
|
+
|
4
6
|
attr_accessor :connection
|
5
7
|
|
6
8
|
def start!
|
@@ -11,15 +13,6 @@ module Hipbot
|
|
11
13
|
connection.send_data("#{self}:#{user}:#{message}\n")
|
12
14
|
end
|
13
15
|
|
14
|
-
def invite_to_room(*); end
|
15
|
-
def join_room(*); end
|
16
|
-
def kick_from_room(*); end
|
17
|
-
def leave_room(*); end
|
18
|
-
def restart!; end
|
19
|
-
def send_to_room(*); end
|
20
|
-
def set_presence(*); end
|
21
|
-
def set_topic(*); end
|
22
|
-
|
23
16
|
class Connection < EM::Connection
|
24
17
|
include Cache
|
25
18
|
|