lita-discord_oauth 1.0.0 → 1.1.0.alpha.100
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 +17 -17
- data/.travis.yml +23 -23
- data/Gemfile +3 -3
- data/LICENSE +619 -619
- data/README.md +44 -44
- data/Rakefile +6 -6
- data/lib/lita/adapters/discord_oauth.rb +99 -99
- data/lib/lita/handlers/discord_help.rb +169 -169
- data/lib/lita-discord_oauth.rb +7 -7
- data/lita-discord_oauth.gemspec +42 -27
- data/locales/en.yml +10 -10
- data/spec/lita/adapters/discord_oauth_spec.rb +4 -4
- data/spec/spec_helper.rb +6 -6
- metadata +12 -12
data/README.md
CHANGED
@@ -1,45 +1,45 @@
|
|
1
|
-
# lita-discord
|
2
|
-
|
3
|
-
[![Build Status][travis-img]][travis-url]
|
4
|
-
[![Gem Version][gem-img]][gem-url]
|
5
|
-
[![Gem Downloads][gem-dl-img]][gem-url]
|
6
|
-
[![Dependency status][gem-dep-img]][gem-dep-url]
|
7
|
-
[![Codacy Badge][codacy-img]][codacy-url]
|
8
|
-
|
9
|
-
Discord adapter for Lita, using OAuth tokens.
|
10
|
-
|
11
|
-
## Installation
|
12
|
-
|
13
|
-
Add lita-discord to your Lita instance's Gemfile:
|
14
|
-
|
15
|
-
``` ruby
|
16
|
-
gem "lita-discord_oauth"
|
17
|
-
```
|
18
|
-
|
19
|
-
## Configuration
|
20
|
-
|
21
|
-
The adapter exposes two configuration settings:
|
22
|
-
|
23
|
-
* `config.adapters.discord_oauth.token = ''`
|
24
|
-
Bot account token
|
25
|
-
* `config.adapters.discord_oauth.client = ''`
|
26
|
-
Bot client ID
|
27
|
-
|
28
|
-
You can get both these values from [this page](https://discordapp.com/developers/applications/me) - Make sure that the application is a bot user!
|
29
|
-
|
30
|
-

|
31
|
-
|
32
|
-
## Usage
|
33
|
-
|
34
|
-
This bot
|
35
|
-
|
36
|
-
|
37
|
-
[travis-img]: https://img.shields.io/travis/cascer1/lita-discord_oauth.svg
|
38
|
-
[travis-url]: https://travis-ci.org/cascer1/lita-discord_oauth
|
39
|
-
[gem-img]: https://img.shields.io/gem/v/lita-discord_oauth.svg
|
40
|
-
[gem-url]: https://badge.fury.io/rb/lita-discord_oauth
|
41
|
-
[gem-dl-img]: https://img.shields.io/gem/dv/lita-discord_oauth/stable.svg
|
42
|
-
[gem-dep-img]: https://img.shields.io/gemnasium/cascer1/lita-discord_oauth.svg
|
43
|
-
[gem-dep-url]: https://gemnasium.com/github.com/cascer1/lita-discord_oauth
|
44
|
-
[codacy-img]: https://img.shields.io/codacy/grade/a66b558f1d7a4fd89673e5514e437493.svg
|
1
|
+
# lita-discord
|
2
|
+
|
3
|
+
[![Build Status][travis-img]][travis-url]
|
4
|
+
[![Gem Version][gem-img]][gem-url]
|
5
|
+
[![Gem Downloads][gem-dl-img]][gem-url]
|
6
|
+
[![Dependency status][gem-dep-img]][gem-dep-url]
|
7
|
+
[![Codacy Badge][codacy-img]][codacy-url]
|
8
|
+
|
9
|
+
Discord adapter for Lita, using OAuth tokens.
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add lita-discord to your Lita instance's Gemfile:
|
14
|
+
|
15
|
+
``` ruby
|
16
|
+
gem "lita-discord_oauth"
|
17
|
+
```
|
18
|
+
|
19
|
+
## Configuration
|
20
|
+
|
21
|
+
The adapter exposes two configuration settings:
|
22
|
+
|
23
|
+
* `config.adapters.discord_oauth.token = ''`
|
24
|
+
Bot account token
|
25
|
+
* `config.adapters.discord_oauth.client = ''`
|
26
|
+
Bot client ID
|
27
|
+
|
28
|
+
You can get both these values from [this page](https://discordapp.com/developers/applications/me) - Make sure that the application is a bot user!
|
29
|
+
|
30
|
+

|
31
|
+
|
32
|
+
## Usage
|
33
|
+
|
34
|
+
This bot overrides the default help provider
|
35
|
+
|
36
|
+
|
37
|
+
[travis-img]: https://img.shields.io/travis/cascer1/lita-discord_oauth.svg
|
38
|
+
[travis-url]: https://travis-ci.org/cascer1/lita-discord_oauth
|
39
|
+
[gem-img]: https://img.shields.io/gem/v/lita-discord_oauth.svg
|
40
|
+
[gem-url]: https://badge.fury.io/rb/lita-discord_oauth
|
41
|
+
[gem-dl-img]: https://img.shields.io/gem/dv/lita-discord_oauth/stable.svg
|
42
|
+
[gem-dep-img]: https://img.shields.io/gemnasium/cascer1/lita-discord_oauth.svg
|
43
|
+
[gem-dep-url]: https://gemnasium.com/github.com/cascer1/lita-discord_oauth
|
44
|
+
[codacy-img]: https://img.shields.io/codacy/grade/a66b558f1d7a4fd89673e5514e437493.svg
|
45
45
|
[codacy-url]: https://www.codacy.com/app/cascer1/lita-discord_oauth?utm_source=github.com&utm_medium=referral&utm_content=cascer1/lita-discord_oauth&utm_campaign=Badge_Grade
|
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require 'bundler/gem_tasks'
|
2
|
-
require 'rspec/core/rake_task'
|
3
|
-
|
4
|
-
RSpec::Core::RakeTask.new(:spec)
|
5
|
-
|
6
|
-
task default: :spec
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
task default: :spec
|
@@ -1,99 +1,99 @@
|
|
1
|
-
require 'discordrb'
|
2
|
-
|
3
|
-
module Lita
|
4
|
-
module Adapters
|
5
|
-
class Discord_oauth < Adapter
|
6
|
-
config :token, type: String, required: true
|
7
|
-
config :client, type: String, required: true
|
8
|
-
|
9
|
-
def initialize(robot)
|
10
|
-
super
|
11
|
-
@client = ::Discordrb::Bot.new token: config.token, client_id: config.client
|
12
|
-
end
|
13
|
-
|
14
|
-
def run
|
15
|
-
Lita.logger.debug('Starting discord_oauth adapter')
|
16
|
-
@client.ready do |e|
|
17
|
-
robot.trigger(:connected)
|
18
|
-
|
19
|
-
version = Gem.loaded_specs['lita-discord_oauth'].version
|
20
|
-
|
21
|
-
@client.game = "Version #{version}"
|
22
|
-
|
23
|
-
@client.message do |event|
|
24
|
-
message = event.message
|
25
|
-
channel = event.channel.id.to_s
|
26
|
-
author_id = message.author.id.to_s
|
27
|
-
|
28
|
-
if event.channel.pm?
|
29
|
-
# We're dealing with a PM
|
30
|
-
author_name = message.author.username.to_s
|
31
|
-
else
|
32
|
-
# We're dealing with a regular (server) message
|
33
|
-
author_name = message.author.display_name.to_s
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
Lita.logger.debug("Received message from #{author_name}(#{author_id}): #{message.content}")
|
39
|
-
Lita.logger.debug("Finding user #{author_name}")
|
40
|
-
|
41
|
-
user = Lita::User.find_by_name(author_name)
|
42
|
-
|
43
|
-
if user == nil
|
44
|
-
Lita.logger.debug("User #{author_name} not found, trying ID #{author_id}")
|
45
|
-
user = Lita::User.find_by_id(author_id)
|
46
|
-
|
47
|
-
if user != nil
|
48
|
-
Lita.logger.debug("User #{author_id} found, updating name to #{author_name}")
|
49
|
-
user = Lita::User.create(author_id, {name: author_name})
|
50
|
-
end
|
51
|
-
|
52
|
-
Lita.logger.debug("User #{author_id} not found, creating now")
|
53
|
-
user = Lita::User.create(author_id, {name: author_name}) unless user
|
54
|
-
end
|
55
|
-
|
56
|
-
Lita.logger.debug('User ID: ' + user.id)
|
57
|
-
Lita.logger.debug('Channel ID: ' + channel)
|
58
|
-
|
59
|
-
source = Lita::Source.new(user: user, room: channel)
|
60
|
-
msg = Lita::Message.new(robot, message.content, source)
|
61
|
-
|
62
|
-
robot.receive(msg) unless message.from_bot?
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
|
-
@client.run
|
69
|
-
end
|
70
|
-
|
71
|
-
def shut_down
|
72
|
-
@client.stop
|
73
|
-
end
|
74
|
-
|
75
|
-
def send_messages(target, messages)
|
76
|
-
Lita.logger.debug("Sending message to user #{target.user.id} in channel #{target.room}")
|
77
|
-
|
78
|
-
mention = @client.user(target.user.id).mention
|
79
|
-
|
80
|
-
messages.each do |message|
|
81
|
-
if mention
|
82
|
-
no_mention = message.slice!('|||NOMENTION|||')
|
83
|
-
|
84
|
-
message = mention + ",\n" + message if no_mention != '|||NOMENTION|||'
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
Lita.logger.info('Message is too long') if message.length > 2000
|
89
|
-
|
90
|
-
@client.send_message(target.room, message)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
end
|
96
|
-
|
97
|
-
Lita.register_adapter(:discord_oauth, Discord_oauth)
|
98
|
-
end
|
99
|
-
end
|
1
|
+
require 'discordrb'
|
2
|
+
|
3
|
+
module Lita
|
4
|
+
module Adapters
|
5
|
+
class Discord_oauth < Adapter
|
6
|
+
config :token, type: String, required: true
|
7
|
+
config :client, type: String, required: true
|
8
|
+
|
9
|
+
def initialize(robot)
|
10
|
+
super
|
11
|
+
@client = ::Discordrb::Bot.new token: config.token, client_id: config.client
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
Lita.logger.debug('Starting discord_oauth adapter')
|
16
|
+
@client.ready do |e|
|
17
|
+
robot.trigger(:connected)
|
18
|
+
|
19
|
+
version = Gem.loaded_specs['lita-discord_oauth'].version
|
20
|
+
|
21
|
+
@client.game = "Version #{version}"
|
22
|
+
|
23
|
+
@client.message do |event|
|
24
|
+
message = event.message
|
25
|
+
channel = event.channel.id.to_s
|
26
|
+
author_id = message.author.id.to_s
|
27
|
+
|
28
|
+
if event.channel.pm?
|
29
|
+
# We're dealing with a PM
|
30
|
+
author_name = message.author.username.to_s
|
31
|
+
else
|
32
|
+
# We're dealing with a regular (server) message
|
33
|
+
author_name = message.author.display_name.to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
Lita.logger.debug("Received message from #{author_name}(#{author_id}): #{message.content}")
|
39
|
+
Lita.logger.debug("Finding user #{author_name}")
|
40
|
+
|
41
|
+
user = Lita::User.find_by_name(author_name)
|
42
|
+
|
43
|
+
if user == nil
|
44
|
+
Lita.logger.debug("User #{author_name} not found, trying ID #{author_id}")
|
45
|
+
user = Lita::User.find_by_id(author_id)
|
46
|
+
|
47
|
+
if user != nil
|
48
|
+
Lita.logger.debug("User #{author_id} found, updating name to #{author_name}")
|
49
|
+
user = Lita::User.create(author_id, {name: author_name})
|
50
|
+
end
|
51
|
+
|
52
|
+
Lita.logger.debug("User #{author_id} not found, creating now")
|
53
|
+
user = Lita::User.create(author_id, {name: author_name}) unless user
|
54
|
+
end
|
55
|
+
|
56
|
+
Lita.logger.debug('User ID: ' + user.id)
|
57
|
+
Lita.logger.debug('Channel ID: ' + channel)
|
58
|
+
|
59
|
+
source = Lita::Source.new(user: user, room: channel)
|
60
|
+
msg = Lita::Message.new(robot, message.content, source)
|
61
|
+
|
62
|
+
robot.receive(msg) unless message.from_bot?
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
@client.run
|
69
|
+
end
|
70
|
+
|
71
|
+
def shut_down
|
72
|
+
@client.stop
|
73
|
+
end
|
74
|
+
|
75
|
+
def send_messages(target, messages)
|
76
|
+
Lita.logger.debug("Sending message to user #{target.user.id} in channel #{target.room}")
|
77
|
+
|
78
|
+
mention = @client.user(target.user.id).mention
|
79
|
+
|
80
|
+
messages.each do |message|
|
81
|
+
if mention
|
82
|
+
no_mention = message.slice!('|||NOMENTION|||')
|
83
|
+
|
84
|
+
message = mention + ",\n" + message if no_mention != '|||NOMENTION|||'
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
Lita.logger.info('Message is too long') if message.length > 2000
|
89
|
+
|
90
|
+
@client.send_message(target.room, message)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
Lita.register_adapter(:discord_oauth, Discord_oauth)
|
98
|
+
end
|
99
|
+
end
|
@@ -1,169 +1,169 @@
|
|
1
|
-
require 'lita/handler/chat_router'
|
2
|
-
|
3
|
-
module Lita
|
4
|
-
# A namespace to hold all subclasses of {Handler}.
|
5
|
-
module Handlers
|
6
|
-
# Provides online help about Lita commands for users.
|
7
|
-
class DiscordHelp
|
8
|
-
extend Lita::Handler::ChatRouter
|
9
|
-
|
10
|
-
route(/^help\s*(.+)?/, :help, command: true, help: {
|
11
|
-
'help' => t('help.help_value'),
|
12
|
-
t('help.help_command_key') => t('help.help_command_value')
|
13
|
-
})
|
14
|
-
|
15
|
-
# Outputs help information about Lita commands.
|
16
|
-
# @param response [Lita::Response] The response object.
|
17
|
-
# @return [void]
|
18
|
-
def help(response)
|
19
|
-
output = build_help(response)
|
20
|
-
output = filter_help(output, response)
|
21
|
-
first_message = true
|
22
|
-
|
23
|
-
output = output.join("\n")
|
24
|
-
|
25
|
-
messages = split_message(output)
|
26
|
-
|
27
|
-
Lita.logger.debug(messages)
|
28
|
-
|
29
|
-
messages.each { |message|
|
30
|
-
if first_message
|
31
|
-
response.reply_privately("```\n#{message}\n```")
|
32
|
-
first_message = false
|
33
|
-
else
|
34
|
-
response.reply_privately("|||NOMENTION|||```\n#{message}\n```")
|
35
|
-
end
|
36
|
-
}
|
37
|
-
|
38
|
-
if messages.length > 1
|
39
|
-
response.reply_privately('Sorry for splitting that up in multiple messages, Discord doesn\'t allow me to send responses longer than 2000 characters :(')
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def split_message(message)
|
47
|
-
max_length = 2000 - 30 # Substract 25 for mention safety
|
48
|
-
messages = Array.new
|
49
|
-
|
50
|
-
if message.length < max_length
|
51
|
-
messages.push(message)
|
52
|
-
else
|
53
|
-
message_copy = message
|
54
|
-
|
55
|
-
loop do
|
56
|
-
Lita.logger.debug("Message copy: #{message_copy}")
|
57
|
-
# part = 'Lorem ipsum, dolor sit amet' # I don't know why we need this, but we do
|
58
|
-
|
59
|
-
part = get_message_part(message_copy, max_length)
|
60
|
-
|
61
|
-
Lita.logger.debug("Part: #{part}")
|
62
|
-
part = message_copy.slice!(part)
|
63
|
-
messages.push(part)
|
64
|
-
|
65
|
-
break if message_copy.length <= 0
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
messages
|
71
|
-
end
|
72
|
-
|
73
|
-
def get_message_part(message, limit)
|
74
|
-
Lita.logger.debug("Getting message part from #{message}")
|
75
|
-
|
76
|
-
Lita.logger.debug('Message was short enough, returning without modifications') if message.length <= limit
|
77
|
-
return message if message.length <= limit # No need to check anything if the message is short enough
|
78
|
-
|
79
|
-
part = message.to_s[0...limit - 1]
|
80
|
-
break_index = part.rindex("\n")
|
81
|
-
|
82
|
-
Lita.logger.debug("Break index: #{break_index}")
|
83
|
-
|
84
|
-
if break_index != nil && break_index != 0
|
85
|
-
message[0, break_index]
|
86
|
-
else
|
87
|
-
message
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def table_row(key, value)
|
92
|
-
key_width = 30
|
93
|
-
value_width = 107
|
94
|
-
|
95
|
-
key_text = key.ljust(key_width, ' ')
|
96
|
-
|
97
|
-
value_words = value.split(' ')
|
98
|
-
|
99
|
-
value_text = ''
|
100
|
-
value_line = ''
|
101
|
-
|
102
|
-
value_words.each do |word|
|
103
|
-
new_value_line = "#{value_line} #{word}"
|
104
|
-
|
105
|
-
if new_value_line.length > value_width
|
106
|
-
value_text += "#{value_line}\n" + ''.ljust(key_width + 1, ' ')
|
107
|
-
value_line = word
|
108
|
-
else
|
109
|
-
value_line = "#{value_line} #{word}"
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|
113
|
-
|
114
|
-
if value_line.length > 0
|
115
|
-
value_text = "#{value_text}\n" + ''.ljust(key_width + 1, ' ') + "#{value_line}"
|
116
|
-
end
|
117
|
-
|
118
|
-
key_text + value_text + "\n"
|
119
|
-
end
|
120
|
-
|
121
|
-
# Checks if the user is authorized to at least one of the given groups.
|
122
|
-
def authorized?(user, required_groups)
|
123
|
-
required_groups.nil? || required_groups.any? do |group|
|
124
|
-
robot.auth.user_in_group?(user, group)
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
# Creates an array of help info for all registered routes.
|
129
|
-
def build_help(response)
|
130
|
-
robot.handlers.map do |handler|
|
131
|
-
next unless handler.respond_to?(:routes)
|
132
|
-
|
133
|
-
handler.routes.map do |route|
|
134
|
-
route.help.map do |command, description|
|
135
|
-
if authorized?(response.user, route.required_groups)
|
136
|
-
help_command(route, command, description)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end.flatten.compact
|
141
|
-
end
|
142
|
-
|
143
|
-
# Filters the help output by an optional command.
|
144
|
-
def filter_help(output, response)
|
145
|
-
filter = response.matches[0][0]
|
146
|
-
|
147
|
-
if filter
|
148
|
-
output.select { |line| /(?:@?#{name}[:,]?)?#{filter}/i === line }
|
149
|
-
else
|
150
|
-
output
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
# Formats an individual command's help message.
|
155
|
-
def help_command(route, command, description)
|
156
|
-
command = "#{name}: #{command}" if route.command?
|
157
|
-
|
158
|
-
table_row(command, description)
|
159
|
-
end
|
160
|
-
|
161
|
-
# The way the bot should be addressed in order to trigger a command.
|
162
|
-
def name
|
163
|
-
robot.config.robot.mention_name || robot.config.robot.name
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
Lita.register_handler(DiscordHelp)
|
168
|
-
end
|
169
|
-
end
|
1
|
+
require 'lita/handler/chat_router'
|
2
|
+
|
3
|
+
module Lita
|
4
|
+
# A namespace to hold all subclasses of {Handler}.
|
5
|
+
module Handlers
|
6
|
+
# Provides online help about Lita commands for users.
|
7
|
+
class DiscordHelp
|
8
|
+
extend Lita::Handler::ChatRouter
|
9
|
+
|
10
|
+
route(/^help\s*(.+)?/, :help, command: true, help: {
|
11
|
+
'help' => t('help.help_value'),
|
12
|
+
t('help.help_command_key') => t('help.help_command_value')
|
13
|
+
})
|
14
|
+
|
15
|
+
# Outputs help information about Lita commands.
|
16
|
+
# @param response [Lita::Response] The response object.
|
17
|
+
# @return [void]
|
18
|
+
def help(response)
|
19
|
+
output = build_help(response)
|
20
|
+
output = filter_help(output, response)
|
21
|
+
first_message = true
|
22
|
+
|
23
|
+
output = output.join("\n")
|
24
|
+
|
25
|
+
messages = split_message(output)
|
26
|
+
|
27
|
+
Lita.logger.debug(messages)
|
28
|
+
|
29
|
+
messages.each { |message|
|
30
|
+
if first_message
|
31
|
+
response.reply_privately("```\n#{message}\n```")
|
32
|
+
first_message = false
|
33
|
+
else
|
34
|
+
response.reply_privately("|||NOMENTION|||```\n#{message}\n```")
|
35
|
+
end
|
36
|
+
}
|
37
|
+
|
38
|
+
if messages.length > 1
|
39
|
+
response.reply_privately('Sorry for splitting that up in multiple messages, Discord doesn\'t allow me to send responses longer than 2000 characters :(')
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def split_message(message)
|
47
|
+
max_length = 2000 - 30 # Substract 25 for mention safety
|
48
|
+
messages = Array.new
|
49
|
+
|
50
|
+
if message.length < max_length
|
51
|
+
messages.push(message)
|
52
|
+
else
|
53
|
+
message_copy = message
|
54
|
+
|
55
|
+
loop do
|
56
|
+
Lita.logger.debug("Message copy: #{message_copy}")
|
57
|
+
# part = 'Lorem ipsum, dolor sit amet' # I don't know why we need this, but we do
|
58
|
+
|
59
|
+
part = get_message_part(message_copy, max_length)
|
60
|
+
|
61
|
+
Lita.logger.debug("Part: #{part}")
|
62
|
+
part = message_copy.slice!(part)
|
63
|
+
messages.push(part)
|
64
|
+
|
65
|
+
break if message_copy.length <= 0
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
messages
|
71
|
+
end
|
72
|
+
|
73
|
+
def get_message_part(message, limit)
|
74
|
+
Lita.logger.debug("Getting message part from #{message}")
|
75
|
+
|
76
|
+
Lita.logger.debug('Message was short enough, returning without modifications') if message.length <= limit
|
77
|
+
return message if message.length <= limit # No need to check anything if the message is short enough
|
78
|
+
|
79
|
+
part = message.to_s[0...limit - 1]
|
80
|
+
break_index = part.rindex("\n")
|
81
|
+
|
82
|
+
Lita.logger.debug("Break index: #{break_index}")
|
83
|
+
|
84
|
+
if break_index != nil && break_index != 0
|
85
|
+
message[0, break_index]
|
86
|
+
else
|
87
|
+
message
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def table_row(key, value)
|
92
|
+
key_width = 30
|
93
|
+
value_width = 107
|
94
|
+
|
95
|
+
key_text = key.ljust(key_width, ' ')
|
96
|
+
|
97
|
+
value_words = value.split(' ')
|
98
|
+
|
99
|
+
value_text = ''
|
100
|
+
value_line = ''
|
101
|
+
|
102
|
+
value_words.each do |word|
|
103
|
+
new_value_line = "#{value_line} #{word}"
|
104
|
+
|
105
|
+
if new_value_line.length > value_width
|
106
|
+
value_text += "#{value_line}\n" + ''.ljust(key_width + 1, ' ')
|
107
|
+
value_line = word
|
108
|
+
else
|
109
|
+
value_line = "#{value_line} #{word}"
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
if value_line.length > 0
|
115
|
+
value_text = "#{value_text}\n" + ''.ljust(key_width + 1, ' ') + "#{value_line}"
|
116
|
+
end
|
117
|
+
|
118
|
+
key_text + value_text + "\n"
|
119
|
+
end
|
120
|
+
|
121
|
+
# Checks if the user is authorized to at least one of the given groups.
|
122
|
+
def authorized?(user, required_groups)
|
123
|
+
required_groups.nil? || required_groups.any? do |group|
|
124
|
+
robot.auth.user_in_group?(user, group)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# Creates an array of help info for all registered routes.
|
129
|
+
def build_help(response)
|
130
|
+
robot.handlers.map do |handler|
|
131
|
+
next unless handler.respond_to?(:routes)
|
132
|
+
|
133
|
+
handler.routes.map do |route|
|
134
|
+
route.help.map do |command, description|
|
135
|
+
if authorized?(response.user, route.required_groups)
|
136
|
+
help_command(route, command, description)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end.flatten.compact
|
141
|
+
end
|
142
|
+
|
143
|
+
# Filters the help output by an optional command.
|
144
|
+
def filter_help(output, response)
|
145
|
+
filter = response.matches[0][0]
|
146
|
+
|
147
|
+
if filter
|
148
|
+
output.select { |line| /(?:@?#{name}[:,]?)?#{filter}/i === line }
|
149
|
+
else
|
150
|
+
output
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# Formats an individual command's help message.
|
155
|
+
def help_command(route, command, description)
|
156
|
+
command = "#{name}: #{command}" if route.command?
|
157
|
+
|
158
|
+
table_row(command, description)
|
159
|
+
end
|
160
|
+
|
161
|
+
# The way the bot should be addressed in order to trigger a command.
|
162
|
+
def name
|
163
|
+
robot.config.robot.mention_name || robot.config.robot.name
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
Lita.register_handler(DiscordHelp)
|
168
|
+
end
|
169
|
+
end
|
data/lib/lita-discord_oauth.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'lita'
|
2
|
-
|
3
|
-
Lita.load_locales Dir[File.expand_path(
|
4
|
-
File.join('..', '..', 'locales', '*.yml'), __FILE__
|
5
|
-
)]
|
6
|
-
|
7
|
-
require 'lita/adapters/discord_oauth'
|
1
|
+
require 'lita'
|
2
|
+
|
3
|
+
Lita.load_locales Dir[File.expand_path(
|
4
|
+
File.join('..', '..', 'locales', '*.yml'), __FILE__
|
5
|
+
)]
|
6
|
+
|
7
|
+
require 'lita/adapters/discord_oauth'
|
8
8
|
require 'lita/handlers/discord_help'
|