Module: OnyxCord::Commands::CommandContainer
Overview
This module holds a collection of commands that can be easily added to by calling the #command function. Other containers can be included into it as well. This allows for modularization of command bots.
Instance Attribute Summary collapse
-
#commands ⇒ Hash<Symbol, Command, CommandAlias>
readonly
Hash of command names and commands this container has.
Instance Method Summary collapse
-
#command(name, attributes = {}) {|event| ... } ⇒ Command
Adds a new command to the container.
-
#group(group_name, attributes = {}) { ... } ⇒ self
Creates a command group.
-
#include!(container) ⇒ Object
Includes another container into this one.
-
#include_commands(container) ⇒ Object
Adds all commands from another container into this one.
-
#middleware(command_name, type = :before) {|event, args, result| ... } ⇒ self
Registers a before or after hook on an existing command.
-
#remove_command(name) ⇒ Object
Removes a specific command from this container.
-
#walk_commands {|name, cmd| ... } ⇒ self
Yields each command in this container, flattening subcommands.
Methods included from RateLimiter
#bucket, #clean, #include_buckets, #rate_limited?
Instance Attribute Details
#commands ⇒ Hash<Symbol, Command, CommandAlias> (readonly)
Returns hash of command names and commands this container has.
13 14 15 |
# File 'lib/onyxcord/commands/container.rb', line 13 def commands @commands end |
Instance Method Details
#command(name, attributes = {}) {|event| ... } ⇒ Command
LocalJumpErrors are rescued from internally, giving bots the opportunity to use return or break in
their blocks without propagating an exception.
Adds a new command to the container.
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/onyxcord/commands/container.rb', line 61 def command(name, attributes = {}, &block) @commands ||= {} # TODO: Remove in 4.0 if name.is_a?(Array) name, *aliases = name attributes[:aliases] = aliases if attributes[:aliases].nil? OnyxCord::LOGGER.warn("While registering command #{name.inspect}") OnyxCord::LOGGER.warn('Arrays for command aliases is removed. Please use `aliases` argument instead.') end new_command = Command.new(name, attributes, &block) new_command.attributes[:aliases].each do |aliased_name| @commands[aliased_name] = CommandAlias.new(aliased_name, new_command) end @commands[name] = new_command end |
#group(group_name, attributes = {}) { ... } ⇒ self
Creates a command group. Commands defined inside the block will be prefixed with the group name.
99 100 101 102 103 104 105 |
# File 'lib/onyxcord/commands/container.rb', line 99 def group(group_name, attributes = {}, &block) raise ArgumentError, 'Block required for group' unless block_given? proxy = GroupProxy.new(self, group_name, attributes) proxy.instance_exec(&block) self end |
#include!(container) ⇒ Object
Includes another container into this one.
153 154 155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/onyxcord/commands/container.rb', line 153 def include!(container) container_modules = container.singleton_class.included_modules # If the container is an EventContainer and we can include it, then do that include_events(container) if container_modules.include?(OnyxCord::EventContainer) && respond_to?(:include_events) if container_modules.include? OnyxCord::Commands::CommandContainer include_commands(container) include_buckets(container) elsif !container_modules.include? OnyxCord::EventContainer raise "Could not include! this particular container - ancestors: #{container_modules}" end end |
#include_commands(container) ⇒ Object
Adds all commands from another container into this one. Existing commands will be overwritten.
109 110 111 112 113 114 115 |
# File 'lib/onyxcord/commands/container.rb', line 109 def include_commands(container) handlers = container.instance_variable_get :@commands return unless handlers @commands ||= {} @commands.merge! handlers end |
#middleware(command_name, type = :before) {|event, args, result| ... } ⇒ self
Registers a before or after hook on an existing command.
139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/onyxcord/commands/container.rb', line 139 def middleware(command_name, type = :before, &hook) cmd = @commands&.fetch(command_name, nil) cmd = cmd.aliased_command if cmd.is_a?(CommandAlias) return self unless cmd.is_a?(Command) case type when :before then cmd.before(&hook) when :after then cmd.after(&hook) end self end |
#remove_command(name) ⇒ Object
Removes a specific command from this container.
81 82 83 84 |
# File 'lib/onyxcord/commands/container.rb', line 81 def remove_command(name) @commands ||= {} @commands.delete name end |
#walk_commands {|name, cmd| ... } ⇒ self
Yields each command in this container, flattening subcommands.
121 122 123 124 125 126 127 128 129 130 |
# File 'lib/onyxcord/commands/container.rb', line 121 def walk_commands return self unless block_given? @commands&.each do |name, cmd| next if cmd.is_a?(CommandAlias) yield name, cmd end self end |