hipbot 1.0.3 → 1.0.4

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