commandrb 0.4.0 → 0.4.8
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 +5 -5
- data/lib/commandrb.rb +202 -170
- data/lib/helper.rb +34 -0
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 89f754aad75f12c277404a9411affd57fa77f44b191b6be620db935c95ee40d7
|
4
|
+
data.tar.gz: fba97e0c044f0357c40d38e40786ef95d86f96711f64722df02c794130541e63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b448742362cc9fb63fa98b9be809fbe25df58b937f0c72047a575e11d7e99a898c44fa240abd18cb9c67ad3ceebc576ae55758d13e6a4c8fd746aa8970b08d4c
|
7
|
+
data.tar.gz: 349cc028596ef2e133d651a4e33aee55e84bf9b87ee1de0361dc637f22191f2a4caf062d3d623d6d8be90f13def3bd734c93fe41b582f2626acfc6abd132b463
|
data/lib/commandrb.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'helper'
|
2
4
|
|
3
5
|
class CommandrbBot
|
4
|
-
|
5
|
-
|
6
|
-
|
6
|
+
@debug_mode = ENV['COMMANDRB_MODE'] == 'debug'
|
7
|
+
@debug_mode = true
|
7
8
|
# Be able to adjust the config on the fly.
|
8
9
|
attr_accessor :config
|
9
10
|
|
@@ -16,7 +17,6 @@ class CommandrbBot
|
|
16
17
|
# Lets you change global prefixes while the bot is running (Not recommended!)
|
17
18
|
attr_accessor :prefixes
|
18
19
|
|
19
|
-
|
20
20
|
def add_command(name, attributes = {})
|
21
21
|
@commands[name.to_sym] = attributes
|
22
22
|
end
|
@@ -24,14 +24,21 @@ class CommandrbBot
|
|
24
24
|
def remove_command(name)
|
25
25
|
begin
|
26
26
|
@commands.delete(name)
|
27
|
-
rescue
|
27
|
+
rescue StandardError
|
28
28
|
return false
|
29
29
|
end
|
30
30
|
true
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
# By defining this seperately. we allow you to overwrite it and use your own owner list.
|
34
|
+
# Your checks will instead be run by commandrb and allow you to use :owner_only as normal.
|
35
|
+
def owner?(id)
|
36
|
+
@config[:owners].include?(id)
|
37
|
+
end
|
38
|
+
|
39
|
+
alias is_owner? owner?
|
34
40
|
|
41
|
+
def initialize(init_hash)
|
35
42
|
# Setup the variables for first use.
|
36
43
|
@commands = {}
|
37
44
|
@prefixes = []
|
@@ -41,22 +48,20 @@ class CommandrbBot
|
|
41
48
|
|
42
49
|
# @config[:prefix_type] = 'rescue' if @config[:prefix_type].nil?
|
43
50
|
@config[:typing_default] = false if @config[:typing_default].nil?
|
44
|
-
@config[:selfbot] =
|
51
|
+
@config[:selfbot] = false if @config[:selfbot].nil?
|
45
52
|
@config[:delete_activators] = false if @config[:delete_activators].nil?
|
46
53
|
|
47
|
-
if @config[:token].nil?
|
48
|
-
raise 'No token supplied in init hash!'
|
49
|
-
return false
|
50
|
-
end
|
54
|
+
raise 'No token supplied in init hash!' if @config[:token].nil? || (init_hash[:token] == '')
|
51
55
|
|
52
|
-
init_parse_self =
|
56
|
+
init_parse_self = begin
|
57
|
+
init_hash[:parse_self]
|
58
|
+
rescue StandardError
|
59
|
+
nil
|
60
|
+
end
|
53
61
|
init_type = @config[:type]
|
54
62
|
|
55
63
|
if init_type == :bot
|
56
|
-
if init_hash[:client_id].nil?
|
57
|
-
raise 'No client ID or invalid client ID supplied in init hash!'
|
58
|
-
return false
|
59
|
-
end
|
64
|
+
raise 'No client ID or invalid client ID supplied in init hash!' if init_hash[:client_id].nil?
|
60
65
|
end
|
61
66
|
|
62
67
|
@config[:owners] = init_hash[:owners]
|
@@ -65,10 +70,10 @@ class CommandrbBot
|
|
65
70
|
@prefixes = init_hash[:prefixes]
|
66
71
|
|
67
72
|
@bot = Discordrb::Bot.new(
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
73
|
+
token: @config[:token],
|
74
|
+
client_id: @config[:client_id],
|
75
|
+
parse_self: init_parse_self,
|
76
|
+
type: @config[:type]
|
72
77
|
)
|
73
78
|
|
74
79
|
unless init_hash[:ready].nil?
|
@@ -78,93 +83,80 @@ class CommandrbBot
|
|
78
83
|
end
|
79
84
|
end
|
80
85
|
|
81
|
-
|
82
86
|
# Command processing
|
83
87
|
@bot.message do |event|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
@
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
@chosen = @activator
|
125
|
-
end
|
126
|
-
end
|
127
|
-
}
|
128
|
-
|
129
|
-
puts "Result: #{@chosen}" if @debug_mode
|
130
|
-
|
131
|
-
next if !@continue
|
132
|
-
puts "Final esult: #{@chosen}" if @debug_mode
|
133
|
-
|
134
|
-
break if @config[:selfbot] && event.user.id != @bot.profile.id
|
135
|
-
|
136
|
-
# Command flag defaults
|
137
|
-
command[:catch_errors] = @config[:catch_errors] if command[:catch_errors].nil?
|
138
|
-
command[:owners_only] = false if command[:owners_only].nil?
|
139
|
-
command[:max_args] = 2000 if command[:max_args].nil?
|
140
|
-
command[:server_only] = false if command[:server_only].nil?
|
141
|
-
command[:typing] = @config[:typing_default] if command[:typing_default].nil?
|
142
|
-
command[:delete_activator] = @config[:delete_activators] if command[:delete_activator].nil?
|
143
|
-
|
144
|
-
# If the command is set to owners only and the user is not the owner, show error and abort.
|
145
|
-
puts "[DEBUG] Command being processed: '#{command}'" if @debug_mode
|
146
|
-
puts "[DEBUG] Owners only? #{command[:owners_only]}" if @debug_mode
|
147
|
-
if command[:owners_only]
|
148
|
-
if !@config[:owners].include?(event.user.id)
|
149
|
-
event.channel.send_message('', false,
|
150
|
-
Helper.error_embed(
|
151
|
-
error: "You don't have permission for that!\nOnly owners are allowed to access this command.",
|
152
|
-
footer: "Command: `#{event.message.content}`",
|
153
|
-
colour: 0xFA0E30,
|
154
|
-
code_error: false
|
155
|
-
)
|
156
|
-
)
|
157
|
-
puts 'Were returning!'
|
158
|
-
@finished = true
|
88
|
+
finished = false
|
89
|
+
chosen = nil
|
90
|
+
args = nil
|
91
|
+
rawargs = nil
|
92
|
+
continue = false
|
93
|
+
failed = false
|
94
|
+
@prefixes.each do |prefix|
|
95
|
+
break if finished
|
96
|
+
|
97
|
+
next unless event.message.content.start_with?(prefix)
|
98
|
+
|
99
|
+
@commands.each do |key, command|
|
100
|
+
break if finished
|
101
|
+
|
102
|
+
puts ":: Considering #{key}" if @debug_mode == true
|
103
|
+
triggers = command[:triggers].nil? ? [key.to_s] : command[:triggers]
|
104
|
+
|
105
|
+
triggers.each do |trigger|
|
106
|
+
activator = prefix + trigger.to_s
|
107
|
+
puts activator if @debug_mode == true
|
108
|
+
activator = activator.downcase
|
109
|
+
next unless event.message.content.downcase.start_with?(activator)
|
110
|
+
|
111
|
+
puts "Prefix matched! #{activator}" if @debug_mode == true
|
112
|
+
|
113
|
+
# Continue only if you've already chosen a choice.
|
114
|
+
if chosen.nil?
|
115
|
+
puts 'First match obtained!' if @debug_mode == true
|
116
|
+
continue = true
|
117
|
+
chosen = activator
|
118
|
+
else
|
119
|
+
# If the new activator begins with the chosen one, then override it.
|
120
|
+
# Example: sh is chosen, shell is the new one.
|
121
|
+
# In this example, shell would override sh, preventing ugly bugs.
|
122
|
+
if activator.start_with?(chosen)
|
123
|
+
puts "#{activator} just overrode #{chosen}" if @debug_mode == true
|
124
|
+
chosen = activator
|
125
|
+
# Otherwhise, just give up.
|
126
|
+
else
|
127
|
+
puts 'Match failed...' if @debug_mode == true
|
159
128
|
next
|
160
129
|
end
|
130
|
+
# If you haven't chosen yet, get choosing!
|
161
131
|
end
|
132
|
+
end
|
133
|
+
|
134
|
+
puts "Result: #{chosen}" if @debug_mode == true
|
162
135
|
|
163
|
-
|
164
|
-
# I'm *hoping* this doesn't cause issues with argument extraction.
|
165
|
-
event.message.delete if command[:delete_activator]
|
136
|
+
next unless continue
|
166
137
|
|
167
|
-
|
138
|
+
puts "Final result: #{chosen}" if @debug_mode == true
|
139
|
+
|
140
|
+
break if @config[:selfbot] && event.user.id != @bot.profile.id
|
141
|
+
|
142
|
+
# Command flag defaults
|
143
|
+
command[:catch_errors] = @config[:catch_errors] if command[:catch_errors].nil?
|
144
|
+
command[:owners_only] = false if command[:owners_only].nil?
|
145
|
+
command[:max_args] = 2000 if command[:max_args].nil?
|
146
|
+
command[:min_args] = 0 if command[:min_args].nil?
|
147
|
+
command[:server_only] = false if command[:server_only].nil?
|
148
|
+
command[:typing] = @config[:typing_default] if command[:typing_default].nil?
|
149
|
+
if command[:delete_activator].nil?
|
150
|
+
command[:delete_activator] = @config[:delete_activators]
|
151
|
+
end
|
152
|
+
command[:owner_override] = false if command[:owner_override].nil?
|
153
|
+
|
154
|
+
# If the settings are to delete activating messages, then do that.
|
155
|
+
# I'm *hoping* this doesn't cause issues with argument extraction.
|
156
|
+
event.message.delete if command[:delete_activator]
|
157
|
+
|
158
|
+
# If the command is only for use in servers, display error and abort.
|
159
|
+
unless failed
|
168
160
|
if command[:server_only] && event.channel.private?
|
169
161
|
# For selfbots, a fancy embed will be used. WIP.
|
170
162
|
if @config[:selfbot]
|
@@ -179,88 +171,128 @@ class CommandrbBot
|
|
179
171
|
event.respond('❌ This command will only work in servers!')
|
180
172
|
end
|
181
173
|
# Abort!
|
182
|
-
|
174
|
+
finished = true
|
183
175
|
next
|
184
176
|
end
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
177
|
+
end
|
178
|
+
|
179
|
+
# If the user is a bot and the command is set to not pass bots OR the user is a bot and the global config is to not parse bots...
|
180
|
+
# ...then abort :3
|
181
|
+
if (event.user.bot_account? && command[:parse_bots] == false) || (event.user.bot_account? && @config[:parse_bots] == false)
|
182
|
+
# Abort!
|
183
|
+
finished = true
|
184
|
+
next
|
185
|
+
end
|
186
|
+
|
187
|
+
# If the config is setup to show typing messages, then do so.
|
188
|
+
event.channel.start_typing if command[:typing]
|
189
|
+
|
190
|
+
args = event.message.content.split(' ')
|
191
|
+
# Parse args if args exist !
|
192
|
+
begin
|
193
|
+
spaces = 1
|
194
|
+
# Prefixes with spaces are special and need to be parsed differently : )
|
195
|
+
if prefix.include? ' '
|
196
|
+
spaces += prefix.count(' ')
|
197
|
+
args = event.message.content.slice!(args[0].size + args[1].size + spaces, event.message.content.size)
|
198
|
+
else
|
199
|
+
args = event.message.content.slice!(args[0].size + spaces, event.message.content.size)
|
192
200
|
end
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
args =
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
args = args.split(/ /)
|
201
|
+
# Split the argmuents into an array for easy usage but keep the raw args !!
|
202
|
+
rawargs = args
|
203
|
+
args = args.split(/ /)
|
204
|
+
rescue NoMethodError # Not the most elegant solution but it'll do. TODO: Make a more elegant solution.
|
205
|
+
args = []
|
206
|
+
end
|
207
|
+
|
208
|
+
# Check the number of args for the command.
|
209
|
+
unless command[:max_args].nil? || failed
|
210
|
+
if command[:max_args] > 0 && args.length > command[:max_args]
|
211
|
+
send_error = Helper.error_embed(
|
212
|
+
error: "Too many arguments! \nMax arguments: `#{command[:max_args]}`",
|
213
|
+
footer: "Command: `#{event.message.content}`",
|
214
|
+
colour: 0xFA0E30,
|
215
|
+
code_error: false
|
216
|
+
)
|
217
|
+
failed = true
|
211
218
|
end
|
219
|
+
end
|
220
|
+
|
221
|
+
# Check the number of args for the command.
|
222
|
+
unless command[:min_args].nil? || failed
|
223
|
+
if command[:min_args] > 0 && args.length < command[:min_args]
|
224
|
+
send_error = Helper.error_embed(
|
225
|
+
error: "Too few arguments! \nMin arguments: `#{command[:min_args]}`",
|
226
|
+
footer: "Command: `#{event.message.content}`",
|
227
|
+
colour: 0xFA0E30,
|
228
|
+
code_error: false
|
229
|
+
)
|
230
|
+
failed = true
|
231
|
+
end
|
232
|
+
end
|
212
233
|
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
# May be replaced with an embed.
|
218
|
-
event.channel.send_message('', false,
|
219
|
-
Helper.error_embed(
|
220
|
-
error: "Too many arguments! \nMax arguments: `#{command[:max_args]}`",
|
221
|
-
footer: "Command: `#{event.message.content}`",
|
222
|
-
colour: 0xFA0E30,
|
223
|
-
code_error: false
|
224
|
-
)
|
225
|
-
)
|
226
|
-
break
|
234
|
+
unless command[:required_permissions].nil? || failed
|
235
|
+
command[:required_permissions].each do |x|
|
236
|
+
if event.user.on(event.server).permission?(x, event.channel) || (command[:owner_override] && @config[:owners].include?(event.user.id))
|
237
|
+
next
|
227
238
|
end
|
239
|
+
|
240
|
+
send_error = Helper.error_embed(
|
241
|
+
error: "You don't have permission for that!\nPermission required: `#{x}`",
|
242
|
+
footer: "Command: `#{event.message.content}`",
|
243
|
+
colour: 0xFA0E30,
|
244
|
+
code_error: false
|
245
|
+
)
|
246
|
+
failed = true
|
228
247
|
end
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
248
|
+
end
|
249
|
+
|
250
|
+
# If the command is set to owners only and the user is not the owner, show error and abort.
|
251
|
+
puts "[DEBUG] Command being processed: '#{command}'" if @debug_mode == true
|
252
|
+
puts "[DEBUG] Owners only? #{command[:owners_only]}" if @debug_mode == true
|
253
|
+
if command[:owners_only]
|
254
|
+
unless owner?(event.user.id)
|
255
|
+
|
256
|
+
send_error = Helper.error_embed(
|
257
|
+
error: "You don't have permission for that!\nOnly owners are allowed to access this command.",
|
258
|
+
footer: "Command: `#{event.message.content}`",
|
259
|
+
colour: 0xFA0E30,
|
260
|
+
code_error: false
|
261
|
+
)
|
262
|
+
failed = true
|
263
|
+
# next
|
241
264
|
end
|
265
|
+
end
|
242
266
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
267
|
+
unless finished
|
268
|
+
# If the command is configured to catch all errors, thy shall be done.
|
269
|
+
# Run the command code!
|
270
|
+
if failed
|
271
|
+
if command[:failcode].nil?
|
272
|
+
if send_error.nil?
|
273
|
+
event.respond(':x: An unknown error has occured!')
|
274
|
+
else
|
275
|
+
event.channel.send_message('', false, send_error)
|
249
276
|
end
|
250
|
-
|
277
|
+
else
|
278
|
+
command[:failcode]&.call(event, args, rawargs)
|
251
279
|
end
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
280
|
+
else
|
281
|
+
command[:code].call(event, args, rawargs)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
# All done here.
|
286
|
+
puts "Finished!! Executed command: #{chosen}" if @debug_mode == true
|
287
|
+
failed = false
|
288
|
+
command = command
|
289
|
+
event = event
|
290
|
+
args = args
|
291
|
+
rawargs = rawargs
|
292
|
+
finished = true
|
293
|
+
break
|
262
294
|
end
|
263
|
-
|
295
|
+
end
|
264
296
|
end
|
265
297
|
end
|
266
298
|
end
|
data/lib/helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class CommandrbBot
|
4
|
+
module Helper
|
5
|
+
def self.error_embed(error: nil, footer: nil, colour: nil, color: nil, code_error: true)
|
6
|
+
if error.nil? || footer.nil?
|
7
|
+
raise 'Invalid arguments for Helper.error_embed!'
|
8
|
+
else
|
9
|
+
colour = 0x22ef1f if color.nil? && colour.nil?
|
10
|
+
Discordrb::Webhooks::Embed.new(
|
11
|
+
title: '❌ An error has occured!',
|
12
|
+
description: code_error ? "```ruby\n#{error}```" : error,
|
13
|
+
colour: colour || color,
|
14
|
+
footer: Discordrb::Webhooks::EmbedFooter.new(text: footer)
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.avatar_embed(color: nil, colour: nil, url: nil, username: nil, time: Time.now.getutc.asctime)
|
20
|
+
if url.nil?
|
21
|
+
raise 'Invalid arguments for Helper.avatar_embed!'
|
22
|
+
else
|
23
|
+
colour = 0x22ef1f if color.nil? && colour.nil?
|
24
|
+
username = username.nil? ? 'Unknown User' : username
|
25
|
+
Discordrb::Webhooks::Embed.new(
|
26
|
+
colour: colour || color,
|
27
|
+
image: Discordrb::Webhooks::EmbedImage.new(url: url),
|
28
|
+
author: Discordrb::Webhooks::EmbedAuthor.new(name: "Avatar for #{username}", url: url),
|
29
|
+
footer: Discordrb::Webhooks::EmbedFooter.new(text: "Avatar correct as of #{time}")
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: commandrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Erisa
|
7
|
+
- Erisa A
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: discordrb
|
@@ -31,13 +31,14 @@ dependencies:
|
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 3.1.0
|
33
33
|
description: A customisable and easy to use Commands System for Discordrb.
|
34
|
-
email: seriel@
|
34
|
+
email: seriel@erisa.moe
|
35
35
|
executables: []
|
36
36
|
extensions: []
|
37
37
|
extra_rdoc_files: []
|
38
38
|
files:
|
39
39
|
- lib/commandrb.rb
|
40
|
-
|
40
|
+
- lib/helper.rb
|
41
|
+
homepage: https://github.com/Yuuki-Discord/commandrb
|
41
42
|
licenses:
|
42
43
|
- MIT
|
43
44
|
metadata: {}
|
@@ -49,15 +50,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
49
50
|
requirements:
|
50
51
|
- - ">="
|
51
52
|
- !ruby/object:Gem::Version
|
52
|
-
version: '2.
|
53
|
+
version: '2.4'
|
53
54
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
55
|
requirements:
|
55
56
|
- - ">="
|
56
57
|
- !ruby/object:Gem::Version
|
57
58
|
version: '0'
|
58
59
|
requirements: []
|
59
|
-
|
60
|
-
rubygems_version: 2.6.12
|
60
|
+
rubygems_version: 3.1.2
|
61
61
|
signing_key:
|
62
62
|
specification_version: 4
|
63
63
|
summary: Commandrb
|