diff options
author | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2008-04-08 15:51:07 +0200 |
---|---|---|
committer | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2008-04-08 16:07:49 +0200 |
commit | 6661440096cce02c0afbc304ed0d84d3697c87d1 (patch) | |
tree | 2e3e40fdc811608d3521334c94a423e1b8fdd0ad | |
parent | d85d16e74edfa268bb8f3dc0e93fe85a47b3b224 (diff) |
extends: BotModule#fake_message() to simplify creation of fake messages
-rw-r--r-- | lib/rbot/core/utils/extends.rb | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/rbot/core/utils/extends.rb b/lib/rbot/core/utils/extends.rb index f0b713ba..e9581bc0 100644 --- a/lib/rbot/core/utils/extends.rb +++ b/lib/rbot/core/utils/extends.rb @@ -339,5 +339,67 @@ module ::Irc end }.uniq end + + # The recurse depth of a message, for fake messages. 0 means an original + # message + def recurse_depth + unless defined? @recurse_depth + @recurse_depth = 0 + end + @recurse_depth + end + + # Set the recurse depth of a message, for fake messages. 0 should only + # be used by original messages + def recurse_depth=(val) + @recurse_depth = val + end + end + + class Bot + module Plugins + + # Maximum fake message recursion + MAX_RECURSE_DEPTH = 10 + + class RecurseTooDeep < RuntimeError + end + + class BotModule + # Sometimes plugins need to create a new fake message based on an existing + # message: for example, this is done by alias, linkbot, reaction and remotectl. + # + # This method simplifies the message creation, including a recursion depth + # check. + # + # In the options you can specify the :bot, the :server, the :source, + # the :target, the message :class and whether or not to :delegate. To + # initialize these entries from an existing message, you can use :from + # + # If you don't specify a :from you should specify a :source. + # + def fake_message(string, opts={}) + if from = opts[:from] + o = { + :bot => from.bot, :server => from.server, :source => from.source, + :target => from.target, :class => from.class, :delegate => true, + :depth => from.recurse_depth + 1 + }.merge(opts) + else + o = { + :bot => @bot, :server => @bot.server, :target => @bot.myself, + :class => PrivMessage, :delegate => true, :depth => 1 + }.merge(opts) + end + raise RecurseTooDeep if o[:depth] > MAX_RECURSE_DEPTH + new_m = o[:class].new(o[:bot], o[:server], o[:source], o[:target], string) + new_m.recurse_depth = o[:depth] + return new_m unless o[:delegate] + method = o[:class].to_s.gsub(/^Irc::|Message$/,'').downcase + method = 'privmsg' if method == 'priv' + o[:bot].plugins.irc_delegate(method, new_m) + end + end + end end end |