X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fcore%2Fbasics.rb;h=832cbb25e73bf79ff1a080ab29a65ad5857ced4f;hb=783ffa4235330029d661752b1023db635b26f2b3;hp=4cbdaab6cf9c590e61744336deabad60f4162dac;hpb=a4ff366eea4c88083be8a3d30cc6395f17b55fe2;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/core/basics.rb b/lib/rbot/core/basics.rb index 4cbdaab6..832cbb25 100644 --- a/lib/rbot/core/basics.rb +++ b/lib/rbot/core/basics.rb @@ -1,186 +1,214 @@ -#-- vim:sw=2:et -#++ - - -class BasicsModule < CoreBotModule - - def listen(m) - return unless m.kind_of?(PrivMessage) - if(m.private? && m.message =~ /^\001PING\s+(.+)\001/) - @bot.notice m.sourcenick, "\001PING #$1\001" - @bot.irclog "@ #{m.sourcenick} pinged me" - return - end - end - - def bot_join(m, param) - if param[:pass] - @bot.join param[:chan], param[:pass] - else - @bot.join param[:chan] - end - end - - def bot_part(m, param) - if param[:chan] - @bot.part param[:chan] - else - @bot.part m.target if m.public? - end - end - - def bot_quit(m, param) - @bot.quit(param[:msg] ? param[:msg].join(" ") : nil) - end - - def bot_restart(m, param) - @bot.restart(param[:msg] ? param[:msg].join(" ") : nil) - end - - def bot_hide(m, param) - @bot.join 0 - end - - def bot_say(m, param) - @bot.say param[:where], param[:what].join(" ") - end - - def bot_action(m, param) - @bot.action param[:where], param[:what].join(" ") - end - - def bot_mode(m, param) - @bot.mode param[:where], param[:what], param[:who].join(" ") - end - - def bot_ping(m, param) - m.reply "pong" - end - - def bot_quiet(m, param) - if param.has_key?(:where) - @bot.set_quiet param[:where].sub(/^here$/, m.target) - else - @bot.set_quiet - end - end - - def bot_talk(m, param) - if param.has_key?(:where) - @bot.reset_quiet param[:where].sub(/^here$/, m.target) - else - @bot.reset_quiet - end - end - - def bot_help(m, param) - m.reply @bot.help(param[:topic].join(" ")) - end - - #TODO move these to a "chatback" plugin - # when (/^(botsnack|ciggie)$/i) - # @bot.say m.replyto, @lang.get("thanks_X") % m.sourcenick if(m.public?) - # @bot.say m.replyto, @lang.get("thanks") if(m.private?) - # when (/^(hello|howdy|hola|salut|bonjour|sup|niihau|hey|hi(\W|$)|yo(\W|$)).*/i) - # @bot.say m.replyto, @lang.get("hello_X") % m.sourcenick if(m.public?) - # @bot.say m.replyto, @lang.get("hello") if(m.private?) - # when (/^\s*(hello|howdy|hola|salut|bonjour|sup|niihau|hey|hi|yo(\W|$))[\s,-.]+#{Regexp.escape(@bot.nick)}$/i) - # @bot.say m.replyto, @lang.get("hello_X") % m.sourcenick - # when (/^#{Regexp.escape(@bot.nick)}!*$/) - # @bot.say m.replyto, @lang.get("hello_X") % m.sourcenick - - # handle help requests for "core" topics - def help(plugin, topic="") - case topic - when "quit" - return "quit [] => quit IRC with message " - when "restart" - return "restart => completely stop and restart the bot (including reconnect)" - when "join" - return "join [] => join channel with secret key if specified. #{myself} also responds to invites if you have the required access level" - when "part" - return "part => part channel " - when "hide" - return "hide => part all channels" - when "save" - return "save => save current dynamic data and configuration" - when "rescan" - return "rescan => reload modules and static facts" - when "nick" - return "nick => attempt to change nick to " - when "say" - return "say | => say to or in private message to " - when "action" - return "action | => does a /me to or in private message to " - when "quiet" - return "quiet [in here|] => with no arguments, stop speaking in all channels, if \"in here\", stop speaking in this channel, or stop speaking in " - when "talk" - return "talk [in here|] => with no arguments, resume speaking in all channels, if \"in here\", resume speaking in this channel, or resume speaking in " - when "version" - return "version => describes software version" - # when "botsnack" - # return "botsnack => reward #{myself} for being good" - # when "hello" - # return "hello|hi|hey|yo [#{myself}] => greet the bot" - else - return "#{name}: quit, restart, join, part, hide, save, rescan, nick, say, action, topic, quiet, talk, version"#, botsnack, hello" - end - end -end - -basics = BasicsModule.new - -basics.map "quit *msg", - :action => 'bot_quit', - :defaults => { :msg => nil }, - :auth_path => 'quit' -basics.map "restart *msg", - :action => 'bot_restart', - :defaults => { :msg => nil }, - :auth_path => 'quit' - -basics.map "quiet", - :action => 'bot_quiet', - :auth_path => 'talk::set' -basics.map "quiet in :chan", - :action => 'bot_quiet', - :auth_path => 'talk::set' -basics.map "talk", - :action => 'bot_talk', - :auth_path => 'talk::set' -basics.map "quiet in :chan", - :action => 'bot_quiet', - :auth_path => 'talk::set' - -basics.map "say :where *what", - :action => 'bot_say', - :auth_path => 'talk::do' -basics.map "action :where *what", - :action => 'bot_action', - :auth_path => 'talk::do' -basics.map "mode :where :what *who", - :action => 'bot_mode', - :auth_path => 'talk::do' - -basics.map "join :chan :pass", - :action => 'bot_join', - :defaults => {:pass => nil}, - :auth_path => 'move' -basics.map "part :chan", - :action => 'bot_part', - :defaults => {:chan => nil}, - :auth_path => 'move' -basics.map "hide", - :action => 'bot_hide', - :auth_path => 'move' - -basics.map "ping", - :action => 'bot_ping', - :auth_path => '!ping!' -basics.map "help *topic", - :action => 'bot_help', - :defaults => { :topic => [""] }, - :auth_path => '!help!' - -basics.default_auth('*', false) - +#-- vim:sw=2:et +#++ +# +# :title: rbot basic management from IRC +# +# Author:: Giuseppe "Oblomov" Bilotta + +class BasicsModule < CoreBotModule + + Config.register Config::BooleanValue.new('irc.join_after_identify', + :default => false, :wizard => true, :requires_restart => true, + :desc => "Should the bot wait until its identification is confirmed before joining any channels?") + + def join_channels + @bot.config['irc.join_channels'].each { |c| + debug "autojoining channel #{c}" + if(c =~ /^(\S+)\s+(\S+)$/i) + @bot.join $1, $2 + else + @bot.join c if(c) + end + } + end + + def identified + join_channels + end + + # on connect, we join the default channels unless we have to wait for + # identification. Observe that this means the bot may not connect any channels + # until the 'identified' method gets delegated + def connect + join_channels unless @bot.config['irc.join_after_identify'] + end + + def ctcp_listen(m) + who = m.private? ? "me" : m.target + case m.ctcp.intern + when :PING + m.ctcp_reply m.message + when :TIME + m.ctcp_reply Time.now.to_s + end + end + + def bot_join(m, param) + if param[:pass] + @bot.join param[:chan], param[:pass] + else + @bot.join param[:chan] + end + end + + def invite(m) + if @bot.auth.allow?(:"basics::move::join", m.source, m.source) + @bot.join m.channel + end + end + + def bot_part(m, param) + if param[:chan] + @bot.part param[:chan] + else + @bot.part m.target if m.public? + end + end + + def bot_quit(m, param) + @bot.quit param[:msg].to_s + end + + def bot_restart(m, param) + @bot.restart param[:msg].to_s + end + + def bot_hide(m, param) + @bot.join 0 + end + + def bot_say(m, param) + @bot.say param[:where], param[:what].to_s + end + + def bot_action(m, param) + @bot.action param[:where], param[:what].to_s + end + + def bot_mode(m, param) + @bot.mode param[:where], param[:what], param[:who].join(" ") + end + + def bot_ping(m, param) + m.reply "pong" + end + + def bot_quiet(m, param) + if param.has_key?(:where) + @bot.set_quiet param[:where].sub(/^here$/, m.target.downcase) + else + @bot.set_quiet + end + # Make sense when the commmand is given in private or in a non-quieted + # channel + m.okay + end + + def bot_talk(m, param) + if param.has_key?(:where) + @bot.reset_quiet param[:where].sub(/^here$/, m.target.downcase) + else + @bot.reset_quiet + end + # Make sense when the commmand is given in private or in a non-quieted + # channel + m.okay + end + + def bot_help(m, param) + m.reply @bot.help(param[:topic].join(" ")) + end + + #TODO move these to a "chatback" plugin + # when (/^(botsnack|ciggie)$/i) + # @bot.say m.replyto, @lang.get("thanks_X") % m.sourcenick if(m.public?) + # @bot.say m.replyto, @lang.get("thanks") if(m.private?) + # when (/^#{Regexp.escape(@bot.nick)}!*$/) + # @bot.say m.replyto, @lang.get("hello_X") % m.sourcenick + + # handle help requests for "core" topics + def help(cmd, topic="") + case cmd + when "quit" + _("quit [] => quit IRC with message ") + when "restart" + _("restart => completely stop and restart the bot (including reconnect)") + when "join" + _("join [] => join channel with secret key if specified. #{@bot.myself} also responds to invites if you have the required access level") + when "part" + _("part => part channel ") + when "hide" + _("hide => part all channels") + when "say" + _("say | => say to or in private message to ") + when "action" + _("action | => does a /me to or in private message to ") + when "quiet" + _("quiet [in here|] => with no arguments, stop speaking in all channels, if \"in here\", stop speaking in this channel, or stop speaking in ") + when "talk" + _("talk [in here|] => with no arguments, resume speaking in all channels, if \"in here\", resume speaking in this channel, or resume speaking in ") + when "ping" + _("ping => replies with a pong") + when "mode" + _("mode => set channel modes for on to ") + # when "botsnack" + # return "botsnack => reward #{@bot.myself} for being good" + # when "hello" + # return "hello|hi|hey|yo [#{@bot.myself}] => greet the bot" + else + _("%{name}: quit, restart, join, part, hide, save, say, action, topic, quiet, talk, ping, mode") % {:name=>name} + #, botsnack, hello + end + end +end + +basics = BasicsModule.new + +basics.map "quit *msg", + :action => 'bot_quit', + :defaults => { :msg => nil }, + :auth_path => 'quit' +basics.map "restart *msg", + :action => 'bot_restart', + :defaults => { :msg => nil }, + :auth_path => 'quit' + +basics.map "quiet [in] [:where]", + :action => 'bot_quiet', + :auth_path => 'talk::set' +basics.map "talk [in] [:where]", + :action => 'bot_talk', + :auth_path => 'talk::set' + +basics.map "say :where *what", + :action => 'bot_say', + :auth_path => 'talk::do' +basics.map "action :where *what", + :action => 'bot_action', + :auth_path => 'talk::do' +basics.map "mode :where :what *who", + :action => 'bot_mode', + :auth_path => 'talk::do' + +basics.map "join :chan :pass", + :action => 'bot_join', + :defaults => {:pass => nil}, + :auth_path => 'move' +basics.map "part :chan", + :action => 'bot_part', + :defaults => {:chan => nil}, + :auth_path => 'move' +basics.map "hide", + :action => 'bot_hide', + :auth_path => 'move' + +basics.map "ping", + :action => 'bot_ping', + :auth_path => '!ping!' +basics.map "help *topic", + :action => 'bot_help', + :defaults => { :topic => [""] }, + :auth_path => '!help!' + +basics.default_auth('*', false) +