URL:     https://linuxfr.org/forums/programmation-ruby/posts/systeme-de-plugins
Title:   Système de plugins
Authors: Foo
Date:    2013-08-17T13:57:49+02:00
License: CC By-SA
Tags:    
Score:   0


Bonjour à tous,

Je m'amuse à faire un bot IRC (pas très original, je sais).
Le but c'est de le faire le plus simple possible et pouvoir 
lui ajouter des fonctionnalités avec des scripts/plugins.

Je sais pas trop comment faire le lien entre le bot et ses plugins
Je dois pouvoir faire 2 choses:
1. associer des méthodes à un événement (type du message provenant du serveur)
2. ajouter des commandes pour contrôler le bot.

J'ai cherché mais pas trouvé grand chose, pour le moment je fais çà:

```ruby
class Plugin
  @@registered = []
  def self.registered
    @@registered
  end

  def self.inherited(subclass)
    @@registered << subclass.new
  end
end

class Test < Plugin
  # répond au ping
  def onPing(bot, msg)
    bot.pong(msg.params[0])
  end

  # Exemple d'une commande
  # là je pense qu'il faudrait que j'utilise OptionParser
  # ou un module équivalent pour pouvoir executer des
  # commandes avec paramètres plus facilement.
  def doHelp(bot, msg)
    if msg.params.last =~ /^!help (\S+)/
      ...
    end
  end
end

class Bot
  def run
    # lit sur la socket
    # parse les données reçues
    msg = Message.parse(data)
    event = "on#{msg.command.capitalize}"
    Plugin.registered.each do |pl|
      # parcours toutes les instances de Plugin
      # et vérifie si une méthode on<Event> existe
      if pl.respond_to?(event)
        pl.send(event, self, msg)
      end
    end
    if msg.command == "PRIVMSG"
      # message reçu sur un channel ou en privé
      # vérifier si c'est une commande du bot
      # préfixée par un '!' ou adressée directement au bot.
      ...
    end
  end
end 
```

ou bien, juste utiliser un hash avec comme clé le type d'événement et comme valeur, la méthode associée.
mais un événement peut avoir plusieurs méthodes à appeler.
puis certaines prendront plus de temps que d'autres et devront être exécutées dans un thread ?

bref je suis un peu paumé, si vous avez quelques conseils, liens qui pourraient m'aider pour faire çà proprement.

