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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +3 -3
  4. data/Gemfile +12 -1
  5. data/README.md +16 -8
  6. data/bin/hipbot +5 -0
  7. data/hipbot.gemspec +2 -1
  8. data/lib/hipbot.rb +7 -10
  9. data/lib/hipbot/adaptable.rb +60 -0
  10. data/lib/hipbot/adapter.rb +6 -6
  11. data/lib/hipbot/adapters/hipchat.rb +5 -48
  12. data/lib/hipbot/adapters/hipchat/client.rb +8 -0
  13. data/lib/hipbot/adapters/shell.rb +2 -9
  14. data/lib/hipbot/adapters/slack.rb +10 -0
  15. data/lib/hipbot/adapters/slack/client.rb +47 -0
  16. data/lib/hipbot/adapters/telnet.rb +2 -9
  17. data/lib/hipbot/adapters/xmpp.rb +59 -0
  18. data/lib/hipbot/adapters/{hipchat/initializer.rb → xmpp/client.rb} +35 -21
  19. data/lib/hipbot/bot.rb +5 -1
  20. data/lib/hipbot/callbacks/base.rb +20 -2
  21. data/lib/hipbot/callbacks/lobby_presence.rb +2 -1
  22. data/lib/hipbot/callbacks/presence.rb +1 -5
  23. data/lib/hipbot/callbacks/room_invite.rb +13 -0
  24. data/lib/hipbot/callbacks/room_message.rb +3 -9
  25. data/lib/hipbot/callbacks/room_presence.rb +10 -8
  26. data/lib/hipbot/callbacks/room_topic.rb +18 -0
  27. data/lib/hipbot/configuration.rb +11 -6
  28. data/lib/hipbot/helpers.rb +2 -0
  29. data/lib/hipbot/{http.rb → helpers/http.rb} +11 -7
  30. data/lib/hipbot/message.rb +2 -2
  31. data/lib/hipbot/presence.rb +0 -6
  32. data/lib/hipbot/reaction.rb +9 -7
  33. data/lib/hipbot/response.rb +1 -1
  34. data/lib/hipbot/room.rb +1 -1
  35. data/lib/hipbot/storages/hash.rb +5 -5
  36. data/lib/hipbot/storages/mongoid.rb +1 -1
  37. data/lib/hipbot/user.rb +4 -0
  38. data/lib/hipbot/{cache.rb → utilities/cache.rb} +0 -0
  39. data/lib/hipbot/{logger.rb → utilities/logger.rb} +0 -0
  40. data/lib/hipbot/version.rb +1 -1
  41. data/spec/integration/my_hipbot_spec.rb +1 -1
  42. data/spec/spec_helper.rb +7 -2
  43. data/spec/unit/match_spec.rb +7 -7
  44. data/spec/unit/message_spec.rb +2 -2
  45. data/spec/unit/reaction_spec.rb +14 -14
  46. metadata +28 -8
  47. data/lib/hipbot/callbacks/invite.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ef69ec3d9ca84e1a5bf80f9e15d107b9e4bd2ec4
4
- data.tar.gz: a875ec05d94328a7fb6a7c7f0dfbd3c207b4f6d9
3
+ metadata.gz: 8ed63b11aa526d641c3b097eeea4899339798434
4
+ data.tar.gz: 229a421ee5b0ca9be639bb015a52d43e06d8bab4
5
5
  SHA512:
6
- metadata.gz: d003c361dee535be8929fc219e16523ee02030383a9c607a119d4dad7fca9530feece39073119f32a0359d55b5ac67a7594dcfda44d8481a42d7d3371b1874eb
7
- data.tar.gz: e5bf6173b705a247963f67c77e6b6d67d7c352cc1aee8c4f4d00ce709d7121d7d93b01422701509e6b6eb2fd7d603c7087b3b36f5cd87ed8cf8f753a030da184
6
+ metadata.gz: 4fead2592a00027404cf18c6547014e8a58969b33958f1f6034fb16a37b6c2078f6f48ec221ce151b3b931148e0ba57bfbe7fba7b6ebd1f2d0b3977c879b2515
7
+ data.tar.gz: 556422b51b8a2c7d7172cd9b830ec0f98c8ce30f3cd0f6c30112a67d156cd6032334ab4db610b6a3f88525ee68222e2c0fbf88c527c691747d8b03c4562a1c65
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  coverage/*
3
3
  .bundle
4
4
  Gemfile.lock
5
+ .ruby-version
@@ -1,11 +1,11 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.2
4
3
  - 1.9.3
5
4
  - 2.0.0
6
- - 2.1.0
5
+ - 2.1.6
6
+ - 2.2.2
7
7
  - jruby-19mode
8
- - rbx-19mode
8
+ - rbx-2.1.1
9
9
  - jruby-head
10
10
  matrix:
11
11
  allow_failures:
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
- gem 'coveralls', require: false
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.2, 1.9.3 and 2.0.0
14
+ * Ruby 1.9.3, 2.0.0 and 2.1.0
15
15
  * JRuby 1.9 mode
16
- * Rubinus 1.9 mode
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 :archived, type: Boolean
614
- field :guest_url, type: String
615
- field :hipchat_id, type: String
616
- field :privacy, type: String
617
- field :topic, type: String
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
@@ -2,6 +2,11 @@
2
2
 
3
3
  require 'daemons'
4
4
 
5
+ Signal.trap('INT') do
6
+ puts("Quitting...")
7
+ abort
8
+ end
9
+
5
10
  HIPBOT_FILE = 'bot.rb'
6
11
 
7
12
  if File.exists?(HIPBOT_FILE)
@@ -1,4 +1,4 @@
1
- # -*- encoding: utf-8 -*-
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
@@ -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/invite'
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
@@ -17,27 +17,27 @@ module Hipbot
17
17
  end
18
18
 
19
19
  def join_room(room)
20
- logger.info("JOINING #{room}")
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 #{room}")
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 #{room}: #{users}")
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 #{room}: #{users}")
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 #{room}")
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 #{room} to '#{topic}'")
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
- attr_accessor :client
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
@@ -0,0 +1,8 @@
1
+ module Hipbot
2
+ module Adapters
3
+ class Hipchat < XMPP
4
+ class Client < XMPP::Client
5
+ end
6
+ end
7
+ end
8
+ 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,10 @@
1
+ require 'hipbot/adapters/xmpp'
2
+ require 'hipbot/adapters/slack/client'
3
+
4
+ module Hipbot
5
+ module Adapters
6
+ class Slack < XMPP
7
+ add_config_options :slack_api_token
8
+ end
9
+ end
10
+ end
@@ -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