X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Falias.rb;h=89be0020434b81e1593a40d573aa77db6a80592e;hb=6cf365c49ce5fbe24c0a4ff0663550390b501fea;hp=289ef1ad69513bf48b5f04c082d30de17210e0f9;hpb=806e6c9a6b5c58997bacf7981ee3c797878b2e48;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/alias.rb b/data/rbot/plugins/alias.rb index 289ef1ad..89be0020 100644 --- a/data/rbot/plugins/alias.rb +++ b/data/rbot/plugins/alias.rb @@ -12,10 +12,10 @@ # exisitng rbot command and that is run. # # == Example Session -# < alias googlerbot *terms => google site:linuxbrit.co.uk/rbot/ +# < alias googlerbot *terms => google site:ruby-rbot.org # > okay # < googlerbot plugins -# > Results for site:linuxbrit.co.uk/rbot/ plugins: .... +# > Results for site:ruby-rbot.org plugins: .... # # == Security # By default, only the owner can define and remove aliases, while everyone else can @@ -36,12 +36,10 @@ class AliasPlugin < Plugin class AliasDefinitionError < ArgumentError end - MAX_RECURSION_DEPTH = 10 - def initialize super - @data_path = "#{@bot.botclass}/alias/" - @data_file = "#{@data_path}/aliases.yaml" + @data_path = datafile + @data_file = File.join(@data_path, 'aliases.yaml') # hash of alias => command entries data = nil aliases = if File.exist?(@data_file) && @@ -60,10 +58,10 @@ class AliasPlugin < Plugin warning _("Invalid alias entry %{alias} : %{command} in %{filename}: %{reason}") % {:alias => a, :command => c, :filename => @data_file, :reason => $1} end - end - end + end + end - def save + def save FileUtils.mkdir_p(@data_path) Utils.safe_save(@data_file) {|f| f.write @aliases.to_yaml} end @@ -109,12 +107,17 @@ class AliasPlugin < Plugin # each alias is implemented by adding a message map, whose handler creates a message # containing the aliased command - command.grep(/<(\w+)>/) {$1}.to_set == - text.grep(/(?:^|\s)[:*](\w+)(?:\s|$)/) {$1}.to_set or + 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 + raise AliasDefinitionError.new(_('Error mapping %{text} as command: %{error}') % + {:text => text, :error => $!}) + end @aliases[text] = command - map text, :action => :"alias_handle<#{text}>", :auth_path => 'run' end def respond_to?(name, include_private=false) @@ -123,28 +126,21 @@ class AliasPlugin < Plugin def method_missing(name, *args, &block) 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[$1] + 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 command is not defined") + 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}) end else super(name, *args, &block) @@ -164,7 +160,7 @@ class AliasPlugin < Plugin end.join ' | ' end when 'create' - _('"alias => " => add text as an alias of command. Text can contain placeholders marked with : or * for :words and *multiword arguments. The command can contain placeholders enclosed with < > which will be substituded with argument values. For example: alias googlerbot *terms => google site:linuxbrit.co.uk/rbot/ ') + _('"alias => " => add text as an alias of command. Text can contain placeholders marked with : or * for :words and *multiword arguments. The command can contain placeholders enclosed with < > which will be substituded with argument values. For example: alias googlerbot *terms => google site:ruby-rbot.org ') when 'commands' _('alias list => list defined aliases | alias whatis => show definition of the alias | alias remove => remove defined alias | see the "create" topic about adding aliases') end