hipbot 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|