]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/lart.rb
plugin(lart): fix not save before load
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / lart.rb
index 54c335af74603a6cc27cdb68d060f2431370e521..17294055fecd56d3fc24b5e072141164cc8052d3 100644 (file)
-#  Author:     Michael Brailsford  <brailsmt@yahoo.com>
-#              aka brailsmt
-#  Purpose:       Provide for humorous larts and praises
-#  Copyright:  2002 Michael Brailsford.  All rights reserved.
-#  License:    This plugin is licensed under the BSD license.  The terms of
-#              which follow.
+#-- vim:sw=2:et
+#++
 #
-#  Redistribution and use in source and binary forms, with or without
-#  modification, are permitted provided that the following conditions
-#  are met:
+# :title: lart/praise plugin for rbot
 #
-#  1. Redistributions of source code must retain the above copyright notice,
-#     this list of conditions and the following disclaimer.
+# Author::    Michael Brailsford  <brailsmt@yahoo.com> aka brailsmt
+# Author::    Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
 #
-#  2. Redistributions in binary form must reproduce the above copyright
-#     notice, this list of conditions and the following disclaimer in the
-#     documentation and/or other materials provided with the distribution.
+# Copyright:: (C) 2002 Michael Brailsford.  All rights reserved.
+# Copyright:: (C) 2006 Giuseppe Bilotta.  All rights reserved.
+#
+# License::  This plugin is licensed under the BSD license.  The terms of
+#            which follow.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+#    this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# Purpose::   Provide for humorous larts and praises
 
 class LartPlugin < Plugin
 
-       # Keep a 1:1 relation between commands and handlers
-       @@handlers = {
-               "lart" => "handle_lart",
-               "praise" => "handle_praise",
-               "addlart" => "handle_addlart",
-               "rmlart" => "handle_rmlart",
-               "addpraise" => "handle_addpraise",
-               "rmpraise" => "handle_rmpraise"
-       }
-
-  def name
-    "lart"
-  end
-
-       #{{{
-       def initialize
-               super
-               @larts = Array.new
-               @praises = Array.new
-               #read in the lart and praise files
-               if File.exists? "#{@bot.botclass}/lart/larts"
-                       IO.foreach("#{@bot.botclass}/lart/larts") { |line|
-                               @larts << line.chomp
-                       }
-               end
-               if File.exists? "#{@bot.botclass}/lart/praises"
-                       IO.foreach("#{@bot.botclass}/lart/praises") { |line|
-                               @praises << line.chomp
-                       }
-               end
-       end
-       #}}}
-       #{{{
-       def cleanup
-       end
-       #}}}
-       #{{{
-       def save
-               Dir.mkdir("#{@bot.botclass}/lart") if not FileTest.directory? "#{@bot.botclass}/lart"
-               File.open("#{@bot.botclass}/lart/larts", "w") { |file|
-                       file.puts @larts
-               }
-               File.open("#{@bot.botclass}/lart/praises", "w") { |file|
-                       file.puts @praises
-               }
-       end
-       #}}}
-       #{{{
-       def privmsg(m)
-               if not m.params
-                       m.reply "What a crazy fool!  Did you mean |help stats?"
-                       return
-               end
-
-               meth = self.method(@@handlers[m.plugin])
-               meth.call(m) if(@bot.auth.allow?(m.plugin, m.source, m.replyto))
-       end
-       #}}}
-       #{{{
-       def help(plugin, topic="")
-               "Lart: The lart plugin allows you to punish/praise someone in the channel. You can also add new punishments and new praises as well as delete them. For the curious, LART is an acronym for Luser Attitude Readjustment Tool. Usage: punish/lart <nick> [<reason>] -- punishes <nick> for <reason>. praise <nick> [<reason>] -- praises <nick> for <reason>. [add|rm][lart|punish|praise] -- Add or remove a lart or praise."
-       end
-       #}}}
-       # The following are command handlers    {{{
-       #{{{
-       def handle_lart(m)
-               for_idx = m.params =~ /\s+\bfor\b/
-               if for_idx
-                       nick = m.params[0, for_idx]
-               else
-                       nick = m.params
-               end
-               lart = @larts[get_msg_idx(@larts.length)]
-               if lart == nil
-                       m.reply "I dunno any larts"
-                       return
-               end
-               if nick == @bot.nick
-                       lart = replace_who lart, m.sourcenick
-                       lart << " for trying to make me lart myself"
-               else
-                       lart = replace_who lart, nick
-                       lart << m.params[for_idx, m.params.length] if for_idx
-               end
-
-               @bot.action m.replyto, lart
-       end
-       #}}}
-       #{{{
-       def handle_praise(m)
-               for_idx = m.params =~ /\s+\bfor\b/
-               if for_idx
-                       nick = m.params[0, for_idx]
-               else
-                       nick = m.params
-               end
-               praise = @praises[get_msg_idx(@praises.length)]
-               if not praise
-                       m.reply "I dunno any praises"
-                       return
-               end
-
-               if nick == m.sourcenick
-                       praise = @larts[get_msg_idx(@larts.length)]
-                       praise = replace_who praise, nick
-               else
-                       praise = replace_who praise, nick
-                       praise << m.params.gsub(/#{nick}/, "")
-               end
-
-               @bot.action m.replyto, praise
-       end
-       #}}}
-       #{{{
-       def handle_addlart(m)
-               @larts << m.params
-               m.okay
-       end
-       #}}}
-       #{{{
-       def handle_rmlart(m)
-               @larts.delete m.params
-               m.okay
-       end
-       #}}}
-       #{{{
-       def handle_addpraise(m)
-               @praises << m.params
-               m.okay
-       end
-       #}}}
-       #{{{
-       def handle_rmpraise(m)
-               @praises.delete m.params
-               m.okay
-       end
-       #}}}
-       #}}}
-
-       #  The following are utils for larts/praises    {{{
-       #{{{
-       def replace_who(msg, nick)
-               msg.gsub(/<who>/i, "#{nick}")
-       end
-       #}}}
-       #{{{
-       def get_msg_idx(max)
-               idx = rand(max)
-       end
-       #}}}
-       #}}}
+  def initialize
+    @larts = nil
+    @praises = nil
+
+    super
+    # after intialization #set_language is called with the language set in the bot configuration
+    # this loads the larts/praises from the registry
+  end
+
+  def load_static_files(path, suffix)
+    entries = {}
+    Dir.glob("#{path}/#{suffix}-*").each { |filename|
+      language = filename[filename.rindex('-')+1..-1]
+      entries[language] = File.readlines(filename).map(&:chomp)
+    }
+    entries
+  end
+
+  def set_language(lang)
+    save
+
+    @lang = lang
+    @larts = @registry[:larts]
+    @praises = @registry[:praises]
+
+    # for migrations try to read lart from bot data first (this is usually in ~/.rbot/lart:
+    if (not @larts or not @praises) and Dir.exists? datafile
+      log "migrate existing larts or praises from #{datafile}"
+
+      @larts = load_static_files(datafile, 'larts')
+      @praises = load_static_files(datafile, 'praises')
+    end
+
+    # without migrations, the initial data files we load from is located in the plugin directory
+    # that is the directory in which the plugin file itself is located (.../data/rbot/plugins/ usually)
+    if not @larts or not @praises
+      log "load initial larts and praises from #{plugin_path}"
+
+      initial_path = File.join(plugin_path, 'lart')
+      @larts = load_static_files(initial_path, 'larts')
+      @praises = load_static_files(initial_path, 'praises')
+    end
+  end
+
+  def larts
+    @larts[@lang]
+  end
+
+  def praises
+    @praises[@lang]
+  end
+
+  def save
+    return unless @larts
+
+    @registry[:larts] = @larts
+    @registry[:praises] = @praises
+
+    @registry.flush
+  end
+
+  def help(plugin, topic="")
+    "Lart: The lart plugin allows you to lart/praise someone in the channel. You can also add new larts and new praises as well as delete them. For the curious, LART is an acronym for Luser Attitude Readjustment Tool. Usage: lart <who> [<reason>] -- larts <who> for <reason>. praise <who> [<reason>] -- praises <who> for <reason>. [add|rm][lart|praise] -- Add or remove a lart or praise."
+  end
+
+  def handle_lart(m, params)
+    lart = larts[get_msg_idx(larts.length)]
+    if not lart
+      m.reply "I dunno any larts"
+      return
+    end
+    who = params[:who].to_s
+    reason = params[:why]
+    if who == "me"
+      who = m.sourcenick
+    end
+    if who == @bot.nick
+      who = m.sourcenick
+      reason = "for trying to make me lart myself"
+    end
+    lart = replace_who lart, who
+    lart << " #{reason}" unless reason.empty?
+
+    m.act lart
+  end
+
+  def handle_praise(m, params)
+    praise = praises[get_msg_idx(praises.length)]
+    if not praise
+      m.reply "I dunno any praises"
+      return
+    end
+    who = params[:who].to_s
+    reason = params[:why]
+    if who == m.sourcenick || who == "me"
+      params[:who] = m.sourcenick
+      params[:why] = "for praising himself"
+      handle_lart(m, params)
+      return
+    end
+    praise = replace_who praise, who
+    praise << " #{reason}" unless reason.empty?
+
+    m.act praise
+  end
+
+  def handle_addlart(m, params)
+    @larts[@lang] << params[:lart].to_s
+    @changed = true
+    m.okay
+  end
+
+  def handle_rmlart(m, params)
+    @larts[@lang].delete params[:lart].to_s
+    @changed = true
+    m.okay
+  end
+
+  def handle_listlart(m, params)
+    rx = Regexp.new(params[:lart].to_s, true)
+    list = larts.grep(rx)
+    unless list.empty?
+      m.reply list.join(" | "), :split_at => /\s+\|\s+/
+    else
+      m.reply "no lart found matching #{params[:lart]}"
+    end
+  end
+
+  def handle_addpraise(m, params)
+    @praises[@lang] << params[:praise].to_s
+    @changed = true
+    m.okay
+  end
+
+  def handle_rmpraise(m, params)
+    @praises[@lang].delete params[:praise].to_s
+    @changed = true
+    m.okay
+  end
+
+  def handle_listpraise(m, params)
+    rx = Regexp.new(params[:praise].to_s, true)
+    list = praises.grep(rx)
+    unless list.empty?
+      m.reply list.join(" | "), :split_at => /\s+\|\s+/
+    else
+      m.reply "no praise found matching #{params[:praise]}"
+    end
+  end
+
+  #  The following are utils for larts/praises
+  def replace_who(msg, nick)
+    msg.gsub(/<who>/i, "#{nick}")
+  end
+
+  def get_msg_idx(max)
+    rand(max)
+  end
+
 end
+
 plugin = LartPlugin.new
-plugin.register("lart")
-plugin.register("praise")
 
-plugin.register("addlart")
-plugin.register("addpraise")
+plugin.map "lart *who [*why]", :requirements => { :why => /(?:for|because)\s+.*/ }, :action => :handle_lart
+plugin.map "praise *who [*why]", :requirements => { :why => /(?:for|because)\s+.*/ }, :action => :handle_praise
+
+plugin.map "addlart *lart", :action => :handle_addlart
+plugin.map "addpraise *praise", :action => :handle_addpraise
+
+plugin.map "rmlart *lart", :action => :handle_rmlart
+plugin.map "rmpraise *praise", :action => :handle_rmpraise
 
-plugin.register("rmlart")
-plugin.register("rmpraise")
+plugin.map "listlart *lart", :action => :handle_listlart
+plugin.map "listpraise *praise", :action => :handle_listpraise