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.
Files changed (4) hide show
  1. checksums.yaml +5 -5
  2. data/lib/commandrb.rb +202 -170
  3. data/lib/helper.rb +34 -0
  4. metadata +8 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8e157c31805af8a1a19398b332dd1e711acc6086
4
- data.tar.gz: d9811c8a83caac8570795fb1e4525d2585dd72cf
2
+ SHA256:
3
+ metadata.gz: 89f754aad75f12c277404a9411affd57fa77f44b191b6be620db935c95ee40d7
4
+ data.tar.gz: fba97e0c044f0357c40d38e40786ef95d86f96711f64722df02c794130541e63
5
5
  SHA512:
6
- metadata.gz: d4f15b5e1e82bb14df045c85e207737c29a4b43fa44fbfcbd15d4d8b877dafdb7ef52dac2a0b45efdb422e55f8cd6d323de35617917743e41ccceee0ea1eac01
7
- data.tar.gz: 9acb080178dd98a8c15eacdd1673fefc9006be37db103e574cf481a5dea5bffe0e0ff3f63b25ccfde97ff70129f497ed0aa5edce3e96c991aba6ae16d1bd2e50
6
+ metadata.gz: b448742362cc9fb63fa98b9be809fbe25df58b937f0c72047a575e11d7e99a898c44fa240abd18cb9c67ad3ceebc576ae55758d13e6a4c8fd746aa8970b08d4c
7
+ data.tar.gz: 349cc028596ef2e133d651a4e33aee55e84bf9b87ee1de0361dc637f22191f2a4caf062d3d623d6d8be90f13def3bd734c93fe41b582f2626acfc6abd132b463
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'helper'
2
4
 
3
5
  class CommandrbBot
4
-
5
- ENV['COMMANDRB_MODE'] == 'debug' ? @debug_mode = true : @debug_mode = false
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
- def initialize(init_hash)
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] = false if @config[:selfbot].nil?
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? or init_hash[:token] == ''
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 = init_hash[:parse_self] rescue nil
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
- token: @config[:token],
69
- client_id: @config[:client_id],
70
- parse_self: init_parse_self,
71
- type: @config[:type]
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
- @finished = false
85
- @command = nil
86
- @event = nil
87
- @chosen = nil
88
- @args = nil
89
- @rawargs = nil
90
- @continue = false
91
- @prefixes.each { |prefix|
92
- break if @finished
93
- if event.message.content.start_with?(prefix)
94
-
95
- @commands.each { | key, command |
96
- break if @finished
97
- puts ":: Considering #{key.to_s}" if @debug_mode
98
- triggers = command[:triggers].nil? ? [key.to_s] : command[:triggers]
99
-
100
- triggers.each { |trigger|
101
- @activator = prefix + trigger.to_s
102
- puts @activator if @debug_mode
103
- @activator = @activator.downcase
104
- if event.message.content.downcase.start_with?(@activator)
105
- puts "Prefix matched! #{@activator}" if @debug_mode
106
-
107
- # Continue only if you've already chosen a choice.
108
- unless @chosen.nil?
109
- # If the new activator begins with the chosen one, then override it.
110
- # Example: sh is chosen, shell is the new one.
111
- # In this example, shell would override sh, preventing ugly bugs.
112
- if @activator.start_with?(@chosen)
113
- puts "#{@activator} just overrode #{@chosen}" if @debug_mode
114
- @chosen = @activator
115
- # Otherwhise, just give up.
116
- else
117
- puts "Match failed..." if @debug_mode
118
- next
119
- end
120
- # If you haven't chosen yet, get choosing!
121
- else
122
- puts "First match obtained!" if @debug_mode
123
- @continue = true
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
- # If the settings are to delete activating messages, then do that.
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
- # If the command is only for use in servers, display error and abort.
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
- @finished = true
174
+ finished = true
183
175
  next
184
176
  end
185
-
186
- # 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...
187
- # ...then abort :3
188
- if (event.user.bot_account? && command[:parse_bots] == false) || (event.user.bot_account? && @config[:parse_bots] == false)
189
- # Abort!
190
- @finished = true
191
- next
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
- # If the config is setup to show typing messages, then do so.
195
- event.channel.start_typing if command[:typing]
196
-
197
- args = event.message.content.split(' ')
198
- # Parse args if args exist !
199
- if args.length > 2
200
- spaces = 1
201
- # Prefixes with spaces are special and need to be parsed differently : )
202
- if prefix.include? " "
203
- spaces += prefix.count(' ')
204
- args = event.message.content.slice!(args[0].size + args[1].size + spaces, event.message.content.size)
205
- else
206
- args = event.message.content.slice!(args[0].size + spaces, event.message.content.size)
207
- end
208
- # Split the argmuents into an array for easy usage but keep the raw args !!
209
- rawargs = args
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
- # Check the number of args for the command.
215
- unless command[:max_args].nil?
216
- if command[:max_args] > 0 && args.length > command[:max_args]
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
- # If the command is configured to catch all errors, thy shall be done.
231
- if !command[:catch_errors] || @config['catch_errors']
232
- # Run the command code!
233
- command[:code].call(event, args, rawargs)
234
- else
235
- # Run the command code, but catch all errors and output accordingly.
236
- begin
237
- command[:code].call(event, args, rawargs)
238
- rescue Exception => e
239
- event.respond(" An error has occured!! ```ruby\n#{e}```Please contact the bot owner with the above message for assistance.")
240
- end
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
- unless command[:required_permissions].nil?
244
- command[:required_permissions].each { |x|
245
- if event.user.on(event.server).permission?(x,event.channel)
246
- event.respond('❌ You don\'t have permission for that!')
247
- @finished = true
248
- next
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
- # All done here.
254
- puts "Finished!! Executed command: #{@chosen}" if @debug_mode
255
- @command = command
256
- @event = event
257
- @args = args
258
- @rawargs = rawargs
259
- @finished = true
260
- break
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
@@ -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.0
4
+ version: 0.4.8
5
5
  platform: ruby
6
6
  authors:
7
- - Erisa Komuro (Seriel)
7
+ - Erisa A
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-31 00:00:00.000000000 Z
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@fl0.co
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
- homepage: https://github.com/Seriell/commandrb
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.1'
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
- rubyforge_project:
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