class AliasDefinitionError < ArgumentError
end
- MAX_RECURSION_DEPTH = 10
-
def initialize
super
- @data_path = "#{@bot.botclass}/alias/"
- @data_file = "#{@data_path}/aliases.yaml"
- # hash of alias => command entries
- data = nil
- aliases = if File.exist?(@data_file) &&
- (data = YAML.load_file(@data_file)) &&
- data.respond_to?(:each_pair)
- data
- else
- warning _("Data file is not found or corrupt, reinitializing data")
- Hash.new
- end
- @aliases = Hash.new
- aliases.each_pair do |a, c|
- begin
- add_alias(a, c)
- rescue AliasDefinitionError
- warning _("Invalid alias entry %{alias} : %{command} in %{filename}: %{reason}") %
- {:alias => a, :command => c, :filename => @data_file, :reason => $1}
+ @aliases = @registry[:aliases]
+ unless @aliases
+ # attempt to load aliases from data file yaml
+ filename = File.join(datafile, 'aliases.yaml')
+ if File.exists? filename
+ begin
+ @aliases = {}
+ YAML.load_file(filename).each_pair do |a, c|
+ add_alias(a, c)
+ end
+ rescue
+ warning _("Data file is not found or corrupt, reinitializing data")
+ @aliases = {}
+ end
+ else
+ @aliases = {}
end
- end
- end
+ end
+ end
- def save
- FileUtils.mkdir_p(@data_path)
- Utils.safe_save(@data_file) {|f| f.write @aliases.to_yaml}
+ def save
+ @registry[:aliases] = @aliases
+ @registry.flush
end
def cmd_add(m, params)
command.scan(/<(\w+)>/).flatten.to_set ==
text.split.grep(/\A[:*](\w+)\Z/) {$1}.to_set or
raise AliasDefinitionError.new(_('The arguments in alias must match the substitutions in command, and vice versa'))
-
+
begin
map text, :action => :"alias_handle<#{text}>", :auth_path => 'run'
rescue
if name.to_s =~ /\Aalias_handle<(.+)>\Z/
text = $1
m, params = args
- # messages created by alias handler will have a depth method, which returns the
- # depth of "recursion" caused by the message
- current_depth = if m.respond_to?(:depth) then m.depth else 0 end
- if current_depth > MAX_RECURSION_DEPTH
- m.reply _('The alias seems to have caused infinite recursion. Please examine your alias definitions')
- return
- end
command = @aliases[text]
if command
- # create a fake message containing the intended command
- new_msg = PrivMessage.new(@bot, m.server, m.server.user(m.source), m.target,
- command.gsub(/<(\w+)>/) {|arg| params[:"#{$1}"].to_s})
- # tag incremented depth on the message
- class << new_msg
- self
- end.send(:define_method, :depth) {current_depth + 1}
-
- @bot.plugins.privmsg(new_msg)
+ begin
+ # create a fake message containing the intended command
+ @bot.plugins.privmsg fake_message(command.gsub(/<(\w+)>/) {|arg| params[:"#{$1}"].to_s}, :from => m, :delegate => false)
+ rescue RecurseTooDeep
+ m.reply _('The alias seems to have caused infinite recursion. Please examine your alias definitions')
+ return
+ end
else
m.reply(_("Error handling the alias, The alias %{text} is not defined or has beeen removed. I will stop responding to it after rescan,") %
{:text => text})