Add command architecture
This commit is contained in:
		
							parent
							
								
									be2b905ddb
								
							
						
					
					
						commit
						e59221b9ad
					
				
							
								
								
									
										4
									
								
								src/commands.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/commands.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | require_relative "commands/command" | ||||||
|  | require_relative "commands/help_command" | ||||||
|  | require_relative "commands/lesson_command" | ||||||
|  | require_relative "commands/stop_lesson_command" | ||||||
							
								
								
									
										47
									
								
								src/commands/command.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/commands/command.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | |||||||
|  | module Commands | ||||||
|  |   @@commands = [] | ||||||
|  | 
 | ||||||
|  |   def self.register_command(command_class) | ||||||
|  |     @@commands << command_class | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def self.registered_commands | ||||||
|  |     @@commands | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   class Command | ||||||
|  |     def self.inherited(klass) | ||||||
|  |       p klass | ||||||
|  |       Commands.register_command klass | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def self.for(ika, message) | ||||||
|  |       Commands.registered_commands.find do |command_class| | ||||||
|  |         command_class.matches? message.message.content | ||||||
|  |       end&.new(ika, message) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def self.matches?(message_text) | ||||||
|  |       message_text == "!#{command_string}" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def self.help | ||||||
|  |       "!#{command_string} - #{description}" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def self.description | ||||||
|  |       "blah blah blah" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     attr_reader :ika, :message | ||||||
|  | 
 | ||||||
|  |     def initialize(ika, message) | ||||||
|  |       @ika = ika | ||||||
|  |       @message = message | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def execute | ||||||
|  |       puts "This is a generic command! I can't execute anything!" | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
							
								
								
									
										16
									
								
								src/commands/help_command.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/commands/help_command.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | module Commands | ||||||
|  |   class Help < Command | ||||||
|  |     def self.command_string | ||||||
|  |       "help" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def self.description | ||||||
|  |       "Shows you a list of available commands" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def execute | ||||||
|  |       message.respond ["I'm Ika! Here are the commands I know:", | ||||||
|  |        *Commands.registered_commands.map(&:help)].join("\n") | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
							
								
								
									
										18
									
								
								src/commands/lesson_command.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/commands/lesson_command.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | module Commands | ||||||
|  |   class LessonCommand < Command | ||||||
|  |     def self.command_string | ||||||
|  |       "lesson" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def self.description | ||||||
|  |       "Starts timers for a lesson" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def execute | ||||||
|  |       return message.respond("There's already a lesson running!") if ika.current_lesson_running? | ||||||
|  | 
 | ||||||
|  |       message.respond("Starting a lesson now!") | ||||||
|  |       ika.start_lesson! message | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
							
								
								
									
										18
									
								
								src/commands/stop_lesson_command.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/commands/stop_lesson_command.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | module Commands | ||||||
|  |   class StopLessonCommand < Command | ||||||
|  |     def self.command_string | ||||||
|  |       "stoplesson" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def self.description | ||||||
|  |       "Stops the current lesson, if one is running" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def execute | ||||||
|  |       return message.respond("There's no lesson running") unless ika.current_lesson_running? | ||||||
|  | 
 | ||||||
|  |       message.respond("Ending the current lesson!") | ||||||
|  |       ika.stop_current_lesson! | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
							
								
								
									
										35
									
								
								src/ika.rb
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								src/ika.rb
									
									
									
									
									
								
							| @ -1,5 +1,6 @@ | |||||||
| require_relative './session' | require_relative './session' | ||||||
|  require_relative './lesson' | require_relative './lesson' | ||||||
|  | require_relative './commands' | ||||||
| 
 | 
 | ||||||
| class Ika | class Ika | ||||||
|   attr_reader :bot |   attr_reader :bot | ||||||
| @ -24,25 +25,33 @@ class Ika | |||||||
|     bot.run # you can run this in the background, idk |     bot.run # you can run this in the background, idk | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def end! |   def stop! | ||||||
|     bot.remove_handler @message_handler if @message_handler |     bot.remove_handler @message_handler if @message_handler | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def handle_message message |   def current_lesson_running? | ||||||
|  |     current_lesson.running? | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def start_lesson!(message) | ||||||
|  |     current_lesson.start!(message.channel) | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def stop_current_lesson! | ||||||
|  |     current_lesson.stop! | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def handle_message(message) | ||||||
|  |     if command = Commands::Command.for(self, message) | ||||||
|  |       command.execute | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     return current_session&.respond_to message | ||||||
|  | 
 | ||||||
|     if message.message.content == "!init" |     if message.message.content == "!init" | ||||||
|       return message.respond("There's already a session running") unless current_session.nil? |       return message.respond("There's already a session running") unless current_session.nil? | ||||||
| 
 | 
 | ||||||
|       return current_session = Session.new(message, event.message.author) |       return current_session = Session.new(message, event.message.author) | ||||||
|    elsif message.message.content == "!lesson" |  | ||||||
|      return message.respond("There's already a lesson running") if current_lesson.running? |  | ||||||
| 
 |  | ||||||
|      message.respond("Starting a lesson now!") |  | ||||||
|      return current_lesson.start!(message.channel) |  | ||||||
|    elsif message.message.content == "!stoplesson" |  | ||||||
|      return message.respond("There's no lesson running") unless current_lesson.running? |  | ||||||
| 
 |  | ||||||
|      message.respond("Ending the current lesson!") |  | ||||||
|      return current_lesson.stop! |  | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user