New plugin: suggestions
[dcbot.git] / plugin.rb
blob2030a5417eacbc22ab8616160d59f2f1be12d9bd
1 require 'activerecord'
3 class PluginBase
4   @@plugins = []
5   @@pluginWrapper = nil
6   CMD_PREFIX = "!"
7   
8   def self.inherited(subclass)
9     @@plugins << subclass
10   end
11   
12   def self.cmd_prefix=(new_prefix)
13     CMD_PREFIX.replace(new_prefix)
14   end
15   
16   def self.commands
17     @@plugins.map { |plugin| plugin.methods.grep(/^cmd_[a-zA-Z]+$/).map { |cmd| cmd.sub(/^cmd_/, "") } }.flatten
18   end
19   
20   def self.has_command?(cmd)
21     self.commands.include? cmd
22   end
23   
24   def self.has_command_help?(cmd)
25     @@plugins.any? { |plugin| plugin.methods.include? "cmd_#{cmd}_help"}
26   end
27   
28   def self.command_help(cmd)
29     @@plugins.each do |plugin|
30       meth = plugin.methods.grep("cmd_#{cmd}_help").first
31       return plugin.method(meth) unless meth.nil?
32     end
33   end
34   
35   def self.dispatch(socket, cmd, sender, isprivate, args)
36     @@plugins.each do |plugin|
37       if plugin.methods.include? "cmd_#{cmd}" then
38         begin
39           plugin.method("cmd_#{cmd}").call(socket, sender, isprivate, args)
40         rescue StandardError => e
41           STDERR.puts "Exception raised executing cmd_#{cmd}:\n#{e.to_s}"
42           # try one more time
43           socket.sendPrivateMessage(sender, "An error occurred executing your command. Retrying...")
44           self.initdb
45           plugin.method("cmd_#{cmd}").call(socket, sender, isprivate, args)
46         end
47       end
48     end
49   end
50   
51   def self.loadPlugins
52     @@plugins = []
53     @@pluginWrapper = Module.new
54     Dir["plugins/*"].each do |file|
55       begin
56         @@pluginWrapper.class_eval File.read(file), file
57       rescue StandardError, ScriptError => e
58         STDERR.puts "Error loading plugin `#{file}': #{e.to_s}"
59       end
60     end
61   end
62   
63   def self.initdb
64     ActiveRecord::Base.establish_connection(
65       :adapter => "mysql",
66       :host => "localhost",
67       :username => "dcbot",
68       :database => "40thieves")
69   end
70 end
72 PluginBase.initdb
73 PluginBase.loadPlugins