• [^] # Re: Pour ma part, je ne passerais pas par des classes mais par des mixin

    Posté par . En réponse au message Système de plugins. Évalué à 2.

    Voilà ce que j'ai pu faire ce soir :

    #main.rb
    module BOT
     class Bot
     @@modules=[]
     def initialize(plugin_path)
     Dir.foreach(plugin_path) do |d| 
     if ((d != ".") and (d != "..")) then
     #puts "#{d}" 
     require "#{plugin_path}/#{d}"
     eval(%Q{@@modules << #{d.capitalize().sub(/.rb$/,"")}})
     end 
     end
     end
     def run
     # parsing
     # msg.command == "JOIN"
     # exécuter les méthodes "onJOIN" des plugins.
     onJoin()
     end
     def onJoin(*args)
     @@modules.each do |m|
     #puts("Module : #{m}")
     s=%Q{#{m}::onJoin(*args)}
     #puts(s)
     eval(s) 
     end
     end
     end
    end
    b=BOT::Bot.new("./plugins")
    b.run()
    #plugin3.rb
    module Plugin3
     def self.onJoin(*args)
     puts("Module Plugin3, event onJoin detected, arguments : #{args}")
     end
    end
    # plugin4.rb
    module Plugin4
     def self.onJoin(*args)
     puts("Module Plugin4, event onJoin detected, arguments : #{args}")
     end
    end
    

    Explications : tu mets le main dans un repertoire, et tu positionne les plugins dans un sous-répertoire plugins (ou celui que tu veux).

    Lorsque tu crées ton objet bot, tu lui passe le repertoire contenant les plugins. Il va aller alimenter le tableau @@modules=[] qui contiendra la liste de tous les plugins présents.

    Ensuite lorsque tu appeleras la méthode onJoin, elle ira appeler la méthode onJoin de chaque module référencé dans le tableau.

    On pourrait tester la pésence de la fonction onJoin pour chaque module (voir http://ruby-doc.org/core-1.9.3/Module.html#method-i-included_modules pour ruby 1.9.3)

    J'ai d'autres idées mais il est un peu tard ce soir, donc on verra plus tard si tu as besoin d'autres choses.