lita-default-handlers 0.1.0
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 +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +8 -0
- data/Gemfile +5 -0
- data/LICENSE +19 -0
- data/README.md +25 -0
- data/Rakefile +6 -0
- data/lib/lita-default-handlers.rb +11 -0
- data/lib/lita/handlers/authorization.rb +127 -0
- data/lib/lita/handlers/help.rb +71 -0
- data/lib/lita/handlers/info.rb +62 -0
- data/lib/lita/handlers/room.rb +34 -0
- data/lib/lita/handlers/users.rb +35 -0
- data/lita-default-handlers.gemspec +24 -0
- data/locales/en.yml +41 -0
- data/spec/lita/handlers/authorization_spec.rb +109 -0
- data/spec/lita/handlers/help_spec.rb +59 -0
- data/spec/lita/handlers/info_spec.rb +65 -0
- data/spec/lita/handlers/room_spec.rb +22 -0
- data/spec/lita/handlers/users_spec.rb +33 -0
- data/spec/spec_helper.rb +14 -0
- data/templates/.gitkeep +0 -0
- metadata +170 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5f1b1a5bfb8fdadbbdebe5527f1ee37c323eb3e3
|
4
|
+
data.tar.gz: 321c892420efece5552b903c567430b0d2f81c4b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e6aca24f50bb044d5ec3460cac57ab7f14d244b7c6b229759cff47232715df1c77c881fcb43bc6cf8003d19acf293e9cc2a922bf14e3a5423f08cb74e2a0d790
|
7
|
+
data.tar.gz: b49b1e936bd0e781b4d508dc2082457636ad7d28bf12c3d09009e71d126e3e1293718790aca59e1d7ec8a3ae421acf8cb9cace3a8ff0064317d3816da9dcd242
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2013-2015 Jimmy Cuadra
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# lita-default-handlers
|
2
|
+
|
3
|
+
[](http://badge.fury.io/rb/lita-default-handlers)
|
4
|
+
|
5
|
+
Provides the default set of handlers that ship with Lita itself. The handlers are:
|
6
|
+
|
7
|
+
* Authorization, for managing authorization groups
|
8
|
+
* Help, for listing help strings for other handler routes
|
9
|
+
* Info, for basic information about the running robot
|
10
|
+
* Room, for making the robot join and part from rooms
|
11
|
+
* Users, for finding a user's Lita user ID
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
In Lita 5, this gem is a hard dependency of the lita gem itself, so it's not necessary to do anything to install it.
|
16
|
+
|
17
|
+
In Lita 6:
|
18
|
+
|
19
|
+
This gem must be included in the Lita project's Gemfile in order to be included, like any other plugin.
|
20
|
+
New Lita projects created by `lita new` using Lita 5 or later will include the entry for it in the Gemfile automatically.
|
21
|
+
To remove the default handlers, simply remove that line from the Gemfile.
|
22
|
+
|
23
|
+
## License
|
24
|
+
|
25
|
+
[MIT](http://opensource.org/licenses/MIT)
|
data/Rakefile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require "lita"
|
2
|
+
|
3
|
+
Lita.load_locales Dir[File.expand_path(
|
4
|
+
File.join("..", "..", "locales", "*.yml"), __FILE__
|
5
|
+
)]
|
6
|
+
|
7
|
+
require "lita/handlers/authorization"
|
8
|
+
require "lita/handlers/help"
|
9
|
+
require "lita/handlers/info"
|
10
|
+
require "lita/handlers/room"
|
11
|
+
require "lita/handlers/users"
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module Lita
|
2
|
+
# A namespace to hold all subclasses of {Handler}.
|
3
|
+
module Handlers
|
4
|
+
# Provides a chat interface for administering authorization groups.
|
5
|
+
class Authorization
|
6
|
+
extend Handler::ChatRouter
|
7
|
+
|
8
|
+
route(
|
9
|
+
/^auth\s+add/,
|
10
|
+
:add,
|
11
|
+
command: true,
|
12
|
+
restrict_to: :admins,
|
13
|
+
help: { t("help.add_key") => t("help.add_value") }
|
14
|
+
)
|
15
|
+
route(
|
16
|
+
/^auth\s+remove/,
|
17
|
+
:remove,
|
18
|
+
command: true,
|
19
|
+
restrict_to: :admins,
|
20
|
+
help: { t("help.remove_key") => t("help.remove_value") }
|
21
|
+
)
|
22
|
+
route(/^auth\s+list/, :list, command: true, restrict_to: :admins, help: {
|
23
|
+
t("help.list_key") => t("help.list_value")
|
24
|
+
})
|
25
|
+
|
26
|
+
# Adds a user to an authorization group.
|
27
|
+
# @param response [Response] The response object.
|
28
|
+
# @return [void]
|
29
|
+
def add(response)
|
30
|
+
toggle_membership(response, :add_user_to_group, "user_added", "user_already_in")
|
31
|
+
end
|
32
|
+
|
33
|
+
# Removes a user from an authorization group.
|
34
|
+
# @param response [Response] The response object.
|
35
|
+
# @return [void]
|
36
|
+
def remove(response)
|
37
|
+
toggle_membership(response, :remove_user_from_group, "user_removed", "user_not_in")
|
38
|
+
end
|
39
|
+
|
40
|
+
# Lists all authorization groups (or only the specified group) and the
|
41
|
+
# names of their members.
|
42
|
+
# @param response [Response] The response object.
|
43
|
+
# @return [void]
|
44
|
+
def list(response)
|
45
|
+
requested_group = response.args[1]
|
46
|
+
output = get_groups_list(response.args[1])
|
47
|
+
if output.empty?
|
48
|
+
response.reply(empty_state_for_list(requested_group))
|
49
|
+
else
|
50
|
+
response.reply(output.join("\n"))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def empty_state_for_list(requested_group)
|
57
|
+
if requested_group
|
58
|
+
t("empty_state_group", group: requested_group)
|
59
|
+
else
|
60
|
+
t("empty_state")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_groups_list(requested_group)
|
65
|
+
groups_with_users = robot.auth.groups_with_users
|
66
|
+
if requested_group
|
67
|
+
requested_group = requested_group.downcase.strip.to_sym
|
68
|
+
groups_with_users.select! { |group, _| group == requested_group }
|
69
|
+
end
|
70
|
+
groups_with_users.map do |group, users|
|
71
|
+
user_names = users.map(&:name).join(", ")
|
72
|
+
"#{group}: #{user_names}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def toggle_membership(response, method_name, success_key, failure_key)
|
77
|
+
return unless valid_message?(response)
|
78
|
+
|
79
|
+
if robot.auth.public_send(method_name, response.user, @user, @group)
|
80
|
+
response.reply t(success_key, user: @user.name, group: @group)
|
81
|
+
else
|
82
|
+
response.reply t(failure_key, user: @user.name, group: @group)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def valid_group?(response, identifier)
|
87
|
+
unless identifier && @group
|
88
|
+
response.reply "#{t('format')}: #{robot.name} auth add USER GROUP"
|
89
|
+
return
|
90
|
+
end
|
91
|
+
|
92
|
+
if @group.downcase.strip == "admins"
|
93
|
+
response.reply t("admin_management")
|
94
|
+
return
|
95
|
+
end
|
96
|
+
|
97
|
+
true
|
98
|
+
end
|
99
|
+
|
100
|
+
# Validates that incoming messages have the right format and a valid user.
|
101
|
+
# Also assigns the user and group to instance variables for the main
|
102
|
+
# methods to use later.
|
103
|
+
def valid_message?(response)
|
104
|
+
_command, identifier, @group = response.args
|
105
|
+
|
106
|
+
return unless valid_group?(response, identifier)
|
107
|
+
|
108
|
+
return unless valid_user?(response, identifier)
|
109
|
+
|
110
|
+
true
|
111
|
+
end
|
112
|
+
|
113
|
+
def valid_user?(response, identifier)
|
114
|
+
@user = User.fuzzy_find(identifier)
|
115
|
+
|
116
|
+
if @user
|
117
|
+
true
|
118
|
+
else
|
119
|
+
response.reply t("no_user_found", identifier: identifier)
|
120
|
+
return
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
Lita.register_handler(Authorization)
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Lita
|
2
|
+
# A namespace to hold all subclasses of {Handler}.
|
3
|
+
module Handlers
|
4
|
+
# Provides online help about Lita commands for users.
|
5
|
+
class Help
|
6
|
+
extend Handler::ChatRouter
|
7
|
+
|
8
|
+
route(/^help\s*(.+)?/, :help, command: true, help: {
|
9
|
+
"help" => t("help.help_value"),
|
10
|
+
t("help.help_command_key") => t("help.help_command_value")
|
11
|
+
})
|
12
|
+
|
13
|
+
# Outputs help information about Lita commands.
|
14
|
+
# @param response [Response] The response object.
|
15
|
+
# @return [void]
|
16
|
+
def help(response)
|
17
|
+
output = build_help(response)
|
18
|
+
output = filter_help(output, response)
|
19
|
+
response.reply_privately output.join("\n")
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
# Checks if the user is authorized to at least one of the given groups.
|
25
|
+
def authorized?(user, required_groups)
|
26
|
+
required_groups.nil? || required_groups.any? do |group|
|
27
|
+
robot.auth.user_in_group?(user, group)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Creates an array of help info for all registered routes.
|
32
|
+
def build_help(response)
|
33
|
+
robot.handlers.map do |handler|
|
34
|
+
next unless handler.respond_to?(:routes)
|
35
|
+
|
36
|
+
handler.routes.map do |route|
|
37
|
+
route.help.map do |command, description|
|
38
|
+
if authorized?(response.user, route.required_groups)
|
39
|
+
help_command(route, command, description)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end.flatten.compact
|
44
|
+
end
|
45
|
+
|
46
|
+
# Filters the help output by an optional command.
|
47
|
+
def filter_help(output, response)
|
48
|
+
filter = response.matches[0][0]
|
49
|
+
|
50
|
+
if filter
|
51
|
+
output.select { |line| /(?:@?#{name}[:,]?)?#{filter}/i === line }
|
52
|
+
else
|
53
|
+
output
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Formats an individual command's help message.
|
58
|
+
def help_command(route, command, description)
|
59
|
+
command = "#{name}: #{command}" if route.command?
|
60
|
+
"#{command} - #{description}"
|
61
|
+
end
|
62
|
+
|
63
|
+
# The way the bot should be addressed in order to trigger a command.
|
64
|
+
def name
|
65
|
+
robot.config.robot.mention_name || robot.config.robot.name
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
Lita.register_handler(Help)
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Lita
|
2
|
+
# A namespace to hold all subclasses of {Handler}.
|
3
|
+
module Handlers
|
4
|
+
# Provides information about the currently running robot.
|
5
|
+
class Info
|
6
|
+
extend Handler::ChatRouter
|
7
|
+
extend Handler::HTTPRouter
|
8
|
+
|
9
|
+
route(/^info$/i, :chat, command: true, help: {
|
10
|
+
"info" => t("help.info_value")
|
11
|
+
})
|
12
|
+
|
13
|
+
http.get "/lita/info", :web
|
14
|
+
|
15
|
+
# Replies with the current version of Lita, the current version of Redis,
|
16
|
+
# and Redis memory usage.
|
17
|
+
# @param response [Response] The response object.
|
18
|
+
# @return [void]
|
19
|
+
# @since 3.0.0
|
20
|
+
def chat(response)
|
21
|
+
response.reply(
|
22
|
+
%(Lita #{Lita::VERSION} - https://www.lita.io/),
|
23
|
+
%(Redis #{redis_version} - Memory used: #{redis_memory_usage})
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns JSON with basic information about the robot.
|
28
|
+
# @param _request [Rack::Request] The HTTP request.
|
29
|
+
# @param response [Rack::Response] The HTTP response.
|
30
|
+
# @return [void]
|
31
|
+
def web(_request, response)
|
32
|
+
response.headers["Content-Type"] = "application/json"
|
33
|
+
json = MultiJson.dump(
|
34
|
+
adapter: robot.config.robot.adapter,
|
35
|
+
lita_version: Lita::VERSION,
|
36
|
+
redis_memory_usage: redis_memory_usage,
|
37
|
+
redis_version: redis_version,
|
38
|
+
robot_mention_name: robot.mention_name,
|
39
|
+
robot_name: robot.name
|
40
|
+
)
|
41
|
+
response.write(json)
|
42
|
+
end
|
43
|
+
|
44
|
+
# A hash of information about Redis.
|
45
|
+
def redis_info
|
46
|
+
@redis_info ||= redis.info
|
47
|
+
end
|
48
|
+
|
49
|
+
# The current version of Redis.
|
50
|
+
def redis_version
|
51
|
+
redis_info["redis_version"]
|
52
|
+
end
|
53
|
+
|
54
|
+
# The amount of memory Redis is using.
|
55
|
+
def redis_memory_usage
|
56
|
+
redis_info["used_memory_human"]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
Lita.register_handler(Info)
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Lita
|
2
|
+
# A namespace to hold all subclasses of {Handler}.
|
3
|
+
module Handlers
|
4
|
+
# Allows administrators to make Lita join and part from rooms.
|
5
|
+
# @since 3.0.0
|
6
|
+
class Room
|
7
|
+
extend Handler::ChatRouter
|
8
|
+
|
9
|
+
route(/^join\s+(.+)$/i, :join, command: true, restrict_to: :admins, help: {
|
10
|
+
t("help.join_key") => t("help.join_value")
|
11
|
+
})
|
12
|
+
|
13
|
+
route(/^part\s+(.+)$/i, :part, command: true, restrict_to: :admins, help: {
|
14
|
+
t("help.part_key") => t("help.part_value")
|
15
|
+
})
|
16
|
+
|
17
|
+
# Joins the room with the specified ID.
|
18
|
+
# @param response [Response] The response object.
|
19
|
+
# @return [void]
|
20
|
+
def join(response)
|
21
|
+
robot.join(response.args[0])
|
22
|
+
end
|
23
|
+
|
24
|
+
# Parts from the room with the specified ID.
|
25
|
+
# @param response [Response] The response object.
|
26
|
+
# @return [void]
|
27
|
+
def part(response)
|
28
|
+
robot.part(response.args[0])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Lita.register_handler(Room)
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Lita
|
2
|
+
module Handlers
|
3
|
+
# Provides information on Lita users.
|
4
|
+
# @since 4.1.0
|
5
|
+
class Users
|
6
|
+
extend Handler::ChatRouter
|
7
|
+
|
8
|
+
route(/^users\s+find\s+(.+)/i, :find, command: true, help: {
|
9
|
+
t("help.find_key") => t("help.find_value")
|
10
|
+
})
|
11
|
+
|
12
|
+
# Outputs the name, ID, and mention name of a user matching the search query.
|
13
|
+
# @param response [Response] The response object.
|
14
|
+
# @return [void]
|
15
|
+
def find(response)
|
16
|
+
user = User.fuzzy_find(response.args[1])
|
17
|
+
|
18
|
+
if user
|
19
|
+
response.reply(formatted_user(user))
|
20
|
+
else
|
21
|
+
response.reply(t("find_empty_state"))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# Extract and label the relevant user information.
|
28
|
+
def formatted_user(user)
|
29
|
+
"#{user.name} (ID: #{user.id}, Mention name: #{user.mention_name})"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Lita.register_handler(Users)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = "lita-default-handlers"
|
3
|
+
spec.version = "0.1.0"
|
4
|
+
spec.authors = ["Jimmy Cuadra"]
|
5
|
+
spec.email = ["jimmy@jimmycuadra.com"]
|
6
|
+
spec.description = "A set of handlers included by default in Lita."
|
7
|
+
spec.summary = "A set of handlers included by default in Lita."
|
8
|
+
spec.homepage = "https://github.com/litaio/lita-default-handlers"
|
9
|
+
spec.license = "MIT"
|
10
|
+
spec.metadata = { "lita_plugin_type" => "handler" }
|
11
|
+
|
12
|
+
spec.files = `git ls-files`.split($/)
|
13
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
14
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
|
+
spec.require_paths = ["lib"]
|
16
|
+
|
17
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
18
|
+
spec.add_development_dependency "pry-byebug"
|
19
|
+
spec.add_development_dependency "rake"
|
20
|
+
spec.add_development_dependency "rack-test"
|
21
|
+
spec.add_development_dependency "rspec", ">= 3.0.0"
|
22
|
+
spec.add_development_dependency "simplecov"
|
23
|
+
spec.add_development_dependency "coveralls"
|
24
|
+
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
en:
|
2
|
+
lita:
|
3
|
+
handlers:
|
4
|
+
authorization:
|
5
|
+
help:
|
6
|
+
add_key: auth add USER GROUP
|
7
|
+
add_value: Add USER to authorization group GROUP. Requires admin privileges.
|
8
|
+
remove_key: auth remove USER GROUP
|
9
|
+
remove_value: Remove USER from authorization group GROUP. Requires admin privileges.
|
10
|
+
list_key: "auth list [GROUP]"
|
11
|
+
list_value: >-
|
12
|
+
List authorization groups and the users in them. If GROUP is supplied,
|
13
|
+
only lists that group.
|
14
|
+
user_added: "%{user} was added to %{group}."
|
15
|
+
user_already_in: "%{user} was already in %{group}."
|
16
|
+
user_removed: "%{user} was removed from %{group}."
|
17
|
+
user_not_in: "%{user} was not in %{group}."
|
18
|
+
empty_state: There are no authorization groups yet.
|
19
|
+
empty_state_group: "There is no authorization group named %{group}."
|
20
|
+
format: "Format"
|
21
|
+
admin_management: Administrators can only be managed via Lita config.
|
22
|
+
no_user_found: 'No user was found with the identifier "%{identifier}".'
|
23
|
+
help:
|
24
|
+
help:
|
25
|
+
help_value: Lists help information for terms and command the robot will respond to.
|
26
|
+
help_command_key: help COMMAND
|
27
|
+
help_command_value: Lists help information for terms or commands that begin with COMMAND.
|
28
|
+
info:
|
29
|
+
help:
|
30
|
+
info_value: Replies with the current version of Lita.
|
31
|
+
room:
|
32
|
+
help:
|
33
|
+
join_key: join ROOM_ID
|
34
|
+
join_value: Makes the robot join the room with room ID ROOM_ID.
|
35
|
+
part_key: part ROOM_ID
|
36
|
+
part_value: Makes the robot part from the room with room ID ROOM_ID.
|
37
|
+
users:
|
38
|
+
find_empty_state: No matching users found.
|
39
|
+
help:
|
40
|
+
find_key: users find SEARCH_TERM
|
41
|
+
find_value: Find a Lita user by ID, name, or mention name.
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Lita::Handlers::Authorization, lita_handler: true do
|
4
|
+
before do
|
5
|
+
allow(robot.auth).to receive(:user_is_admin?).with(user).and_return(true)
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:target_user) { instance_double("Lita::User", id: "1", name: "Carl") }
|
9
|
+
|
10
|
+
it { is_expected.to route_command("auth add foo bar").to(:add) }
|
11
|
+
it { is_expected.to route_command("auth add foo@bar.com baz").to(:add) }
|
12
|
+
it { is_expected.to route_command("auth remove foo bar").to(:remove) }
|
13
|
+
it { is_expected.to route_command("auth remove foo@bar.com baz").to(:remove) }
|
14
|
+
it { is_expected.to route_command("auth list").to(:list) }
|
15
|
+
it { is_expected.to route_command("auth list foo").to(:list) }
|
16
|
+
|
17
|
+
describe "#add" do
|
18
|
+
it "replies with the proper format if the require commands are missing" do
|
19
|
+
send_command("auth add foo")
|
20
|
+
expect(replies.last).to match(/^Format:/)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "replies with a warning if target user is not known" do
|
24
|
+
send_command("auth add foo bar")
|
25
|
+
expect(replies.last).to match(/No user was found/)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "replies with success if a valid user and group were supplied" do
|
29
|
+
allow(Lita::User).to receive(:find_by_id).and_return(target_user)
|
30
|
+
send_command("auth add foo bar")
|
31
|
+
expect(replies.last).to eq("#{target_user.name} was added to bar.")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "replies with a warning if the user was already in the group" do
|
35
|
+
allow(Lita::User).to receive(:find_by_id).and_return(target_user)
|
36
|
+
send_command("auth add foo bar")
|
37
|
+
send_command("auth add foo bar")
|
38
|
+
expect(replies.last).to eq("#{target_user.name} was already in bar.")
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'replies with a warning if the group was "admins"' do
|
42
|
+
send_command("auth add foo admins")
|
43
|
+
expect(replies.last).to match(/Administrators can only be managed/)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#remove" do
|
48
|
+
before do
|
49
|
+
allow(Lita::User).to receive(:find_by_id).and_return(target_user)
|
50
|
+
send_command("auth add foo bar")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "replies with success if a valid user and group were supplied" do
|
54
|
+
send_command("auth remove foo bar")
|
55
|
+
expect(replies.last).to eq("#{target_user.name} was removed from bar.")
|
56
|
+
end
|
57
|
+
|
58
|
+
it "replies with a warning if the user was already in the group" do
|
59
|
+
send_command("auth remove foo bar")
|
60
|
+
send_command("auth remove foo bar")
|
61
|
+
expect(replies.last).to eq("#{target_user.name} was not in bar.")
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'replies with a warning if the group was "admins"' do
|
65
|
+
send_command("auth add foo admins")
|
66
|
+
expect(replies.last).to match(/Administrators can only be managed/)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#list" do
|
71
|
+
context "when there are populated groups" do
|
72
|
+
let(:groups) { %i(foo bar) }
|
73
|
+
let(:user1) { Lita::User.create(3, name: "Bongo") }
|
74
|
+
let(:user2) { Lita::User.create(4, name: "Carl") }
|
75
|
+
|
76
|
+
before do
|
77
|
+
groups.each do |group|
|
78
|
+
subject.robot.auth.add_user_to_group(user, user1, group)
|
79
|
+
subject.robot.auth.add_user_to_group(user, user2, group)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it "lists all authorization groups and their members" do
|
84
|
+
send_command("auth list")
|
85
|
+
groups.each do |group|
|
86
|
+
expect(replies.last).to include(
|
87
|
+
"#{group}: #{user1.name}, #{user2.name}"
|
88
|
+
)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
it "lists only the requested group" do
|
93
|
+
send_command("auth list foo")
|
94
|
+
expect(replies.last).to include("foo")
|
95
|
+
expect(replies.last).not_to include("bar")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
it "replies that there are no groups" do
|
100
|
+
send_command("auth list")
|
101
|
+
expect(replies.last).to include("no authorization groups yet")
|
102
|
+
end
|
103
|
+
|
104
|
+
it "replies that the specified group doesn't exist" do
|
105
|
+
send_command("auth list nothing")
|
106
|
+
expect(replies.last).to include("no authorization group named nothing")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Lita::Handlers::Help, lita_handler: true do
|
4
|
+
it { is_expected.to route_command("help").to(:help) }
|
5
|
+
it { is_expected.to route_command("help foo").to(:help) }
|
6
|
+
|
7
|
+
describe "#help" do
|
8
|
+
let(:secret_handler_class) do
|
9
|
+
Class.new(Lita::Handler) do
|
10
|
+
route(/secret/, :secret, restrict_to: :the_nobodies, help: {
|
11
|
+
"secret" => "no one should ever see this help message"
|
12
|
+
})
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "sends help information for all commands" do
|
17
|
+
send_command("help")
|
18
|
+
expect(replies.last).to match(
|
19
|
+
/#{robot.mention_name}: help.+#{robot.mention_name}: help COMMAND/m
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "sends help information for commands starting with COMMAND" do
|
24
|
+
send_command("help help COMMAND")
|
25
|
+
expect(replies.last).to match(/help COMMAND - Lists/)
|
26
|
+
expect(replies.last).not_to match(/help - Lists/)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "doesn't crash if a handler doesn't have routes" do
|
30
|
+
event_handler = Class.new do
|
31
|
+
extend Lita::Handler::EventRouter
|
32
|
+
end
|
33
|
+
|
34
|
+
registry.register_handler(event_handler)
|
35
|
+
|
36
|
+
expect { send_command("help") }.not_to raise_error
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "restricted routes" do
|
40
|
+
let(:authorized_user) do
|
41
|
+
user = Lita::User.create(2, name: "Authorized User")
|
42
|
+
Lita::Authorization.new(robot).add_user_to_group!(user, :the_nobodies)
|
43
|
+
user
|
44
|
+
end
|
45
|
+
|
46
|
+
before { registry.register_handler(secret_handler_class) }
|
47
|
+
|
48
|
+
it "doesn't show help for commands the user doesn't have access to" do
|
49
|
+
send_command("help")
|
50
|
+
expect(replies.last).not_to include("secret")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "shows help for restricted routes if the user has access" do
|
54
|
+
send_command("help", as: authorized_user)
|
55
|
+
expect(replies.last).to include("secret")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Lita::Handlers::Info, lita_handler: true do
|
4
|
+
it { is_expected.to route_command("info").to(:chat) }
|
5
|
+
it { is_expected.to route_http(:get, "/lita/info").to(:web) }
|
6
|
+
|
7
|
+
let(:request) { double("Rack::Request") }
|
8
|
+
let(:response) { Rack::Response.new }
|
9
|
+
|
10
|
+
describe "#chat" do
|
11
|
+
it "responds with the current version of Lita" do
|
12
|
+
send_command("info")
|
13
|
+
expect(replies.first).to include(Lita::VERSION)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "responds with a link to the website" do
|
17
|
+
send_command("info")
|
18
|
+
expect(replies.first).to include("lita.io")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "responds with the Redis version and memory usage" do
|
22
|
+
send_command("info")
|
23
|
+
expect(replies.last).to match(/Redis [\d\.]+ - Memory used: [\d\.]+[BKMG]/)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#web" do
|
28
|
+
let(:json) { MultiJson.load(response.body.join) }
|
29
|
+
|
30
|
+
it "returns JSON" do
|
31
|
+
subject.web(request, response)
|
32
|
+
expect(response.headers["Content-Type"]).to eq("application/json")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "includes the current version of Lita" do
|
36
|
+
subject.web(request, response)
|
37
|
+
expect(json).to include("lita_version" => Lita::VERSION)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "includes the adapter being used" do
|
41
|
+
subject.web(request, response)
|
42
|
+
expect(json).to include("adapter" => registry.config.robot.adapter.to_s)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "includes the robot's name" do
|
46
|
+
subject.web(request, response)
|
47
|
+
expect(json).to include("robot_name" => robot.name)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "includes the robot's mention name" do
|
51
|
+
subject.web(request, response)
|
52
|
+
expect(json).to include("robot_mention_name" => robot.mention_name)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "includes the Redis version" do
|
56
|
+
subject.web(request, response)
|
57
|
+
expect(json).to have_key("redis_version")
|
58
|
+
end
|
59
|
+
|
60
|
+
it "includes the Redis memory usage" do
|
61
|
+
subject.web(request, response)
|
62
|
+
expect(json).to have_key("redis_memory_usage")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Lita::Handlers::Room, lita_handler: true do
|
4
|
+
it { is_expected.to route_command("join #lita.io").to(:join) }
|
5
|
+
it { is_expected.to route_command("part #lita.io").to(:part) }
|
6
|
+
|
7
|
+
before { allow(robot.auth).to receive(:user_is_admin?).with(user).and_return(true) }
|
8
|
+
|
9
|
+
describe "#join" do
|
10
|
+
it "calls Robot#join with the provided ID" do
|
11
|
+
expect(robot).to receive(:join).with("#lita.io")
|
12
|
+
send_command("join #lita.io")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#part" do
|
17
|
+
it "calls Robot#part with the provided ID" do
|
18
|
+
expect(robot).to receive(:part).with("#lita.io")
|
19
|
+
send_command("part #lita.io")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Lita::Handlers::Users, lita_handler: true do
|
4
|
+
it { is_expected.to route_command("users find carl").to(:find) }
|
5
|
+
|
6
|
+
describe "#find" do
|
7
|
+
it "finds users by ID" do
|
8
|
+
send_command("users find 1")
|
9
|
+
|
10
|
+
expect(replies.first).to eq("Test User (ID: 1, Mention name: Test User)")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "finds users by name" do
|
14
|
+
send_command("users find 'Test User'")
|
15
|
+
|
16
|
+
expect(replies.first).to eq("Test User (ID: 1, Mention name: Test User)")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "finds users by mention name" do
|
20
|
+
Lita::User.create(2, name: "Mr. Pug", mention_name: "carl")
|
21
|
+
|
22
|
+
send_command("users find carl")
|
23
|
+
|
24
|
+
expect(replies.first).to eq("Mr. Pug (ID: 2, Mention name: carl)")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "replies with a message when no matches are found" do
|
28
|
+
send_command("users find nobody")
|
29
|
+
|
30
|
+
expect(replies.first).to eq("No matching users found.")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "simplecov"
|
2
|
+
require "coveralls"
|
3
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
4
|
+
SimpleCov::Formatter::HTMLFormatter,
|
5
|
+
Coveralls::SimpleCov::Formatter
|
6
|
+
])
|
7
|
+
SimpleCov.start { add_filter "/spec/" }
|
8
|
+
|
9
|
+
require "lita-default-handlers"
|
10
|
+
require "lita/rspec"
|
11
|
+
|
12
|
+
# A compatibility mode is provided for older plugins upgrading from Lita 3. Since this plugin
|
13
|
+
# was generated with Lita 4, the compatibility mode should be left disabled.
|
14
|
+
Lita.version_3_compatibility_mode = false
|
data/templates/.gitkeep
ADDED
File without changes
|
metadata
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lita-default-handlers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jimmy Cuadra
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry-byebug
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rack-test
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.0.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.0.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: coveralls
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: A set of handlers included by default in Lita.
|
112
|
+
email:
|
113
|
+
- jimmy@jimmycuadra.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- ".gitignore"
|
119
|
+
- ".travis.yml"
|
120
|
+
- Gemfile
|
121
|
+
- LICENSE
|
122
|
+
- README.md
|
123
|
+
- Rakefile
|
124
|
+
- lib/lita-default-handlers.rb
|
125
|
+
- lib/lita/handlers/authorization.rb
|
126
|
+
- lib/lita/handlers/help.rb
|
127
|
+
- lib/lita/handlers/info.rb
|
128
|
+
- lib/lita/handlers/room.rb
|
129
|
+
- lib/lita/handlers/users.rb
|
130
|
+
- lita-default-handlers.gemspec
|
131
|
+
- locales/en.yml
|
132
|
+
- spec/lita/handlers/authorization_spec.rb
|
133
|
+
- spec/lita/handlers/help_spec.rb
|
134
|
+
- spec/lita/handlers/info_spec.rb
|
135
|
+
- spec/lita/handlers/room_spec.rb
|
136
|
+
- spec/lita/handlers/users_spec.rb
|
137
|
+
- spec/spec_helper.rb
|
138
|
+
- templates/.gitkeep
|
139
|
+
homepage: https://github.com/litaio/lita-default-handlers
|
140
|
+
licenses:
|
141
|
+
- MIT
|
142
|
+
metadata:
|
143
|
+
lita_plugin_type: handler
|
144
|
+
post_install_message:
|
145
|
+
rdoc_options: []
|
146
|
+
require_paths:
|
147
|
+
- lib
|
148
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
requirements: []
|
159
|
+
rubyforge_project:
|
160
|
+
rubygems_version: 2.5.1
|
161
|
+
signing_key:
|
162
|
+
specification_version: 4
|
163
|
+
summary: A set of handlers included by default in Lita.
|
164
|
+
test_files:
|
165
|
+
- spec/lita/handlers/authorization_spec.rb
|
166
|
+
- spec/lita/handlers/help_spec.rb
|
167
|
+
- spec/lita/handlers/info_spec.rb
|
168
|
+
- spec/lita/handlers/room_spec.rb
|
169
|
+
- spec/lita/handlers/users_spec.rb
|
170
|
+
- spec/spec_helper.rb
|