X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Flart.rb;h=17294055fecd56d3fc24b5e072141164cc8052d3;hb=0794897ba2e4b7f32b271bda7291999f313f99e7;hp=103becb18f96493c0594a84785031ec782723229;hpb=edd1cf77be07ae507014574141e920ad23eb164d;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/lart.rb b/data/rbot/plugins/lart.rb index 103becb1..17294055 100644 --- a/data/rbot/plugins/lart.rb +++ b/data/rbot/plugins/lart.rb @@ -28,59 +28,64 @@ class LartPlugin < Plugin def initialize - @larts = Array.new - @praises = Array.new - @lartfile = "" - @praisefile = "" - @changed = false + @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 - # We may be on an old installation, so on the first run read non-language-specific larts - unless defined?(@oldlart) - @oldlart = "#{@bot.botclass}/lart/larts" - @oldpraise = "#{@bot.botclass}/lart/praise" - end + @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}" - @lartfile.replace "#{@bot.botclass}/lart/larts-#{lang}" - @praisefile.replace "#{@bot.botclass}/lart/praises-#{lang}" - @larts.clear - @praises.clear - if File.exists? @lartfile - IO.foreach(@lartfile) { |line| - @larts << line.chomp - } - elsif File.exists? @oldlart - IO.foreach(@oldlart) { |line| - @larts << line.chomp - } + @larts = load_static_files(datafile, 'larts') + @praises = load_static_files(datafile, 'praises') end - if File.exists? @praisefile - IO.foreach(@praisefile) { |line| - @praises << line.chomp - } - elsif File.exists? @oldpraise - IO.foreach(@oldpraise) { |line| - @praises << line.chomp - } + + # 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 - @changed = false + end + + def larts + @larts[@lang] + end + + def praises + @praises[@lang] end def save - return unless @changed - Dir.mkdir("#{@bot.botclass}/lart") if not FileTest.directory? "#{@bot.botclass}/lart" - # TODO implement safe saving here too - Utils.safe_save(@lartfile) { |file| - file.puts @larts - } - Utils.safe_save(@praisefile) { |file| - file.puts @praises - } - @changed = false + return unless @larts + + @registry[:larts] = @larts + @registry[:praises] = @praises + + @registry.flush end def help(plugin, topic="") @@ -88,13 +93,16 @@ class LartPlugin < Plugin end def handle_lart(m, params) - lart = @larts[get_msg_idx(@larts.length)] + 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" @@ -106,14 +114,15 @@ class LartPlugin < Plugin end def handle_praise(m, params) - praise = @praises[get_msg_idx(@praises.length)] + 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 + if who == m.sourcenick || who == "me" + params[:who] = m.sourcenick params[:why] = "for praising himself" handle_lart(m, params) return @@ -125,36 +134,56 @@ class LartPlugin < Plugin end def handle_addlart(m, params) - @larts << params[:lart] + @larts[@lang] << params[:lart].to_s @changed = true m.okay end def handle_rmlart(m, params) - @larts.delete params[:lart] + @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 << params[:praise] + @praises[@lang] << params[:praise].to_s @changed = true m.okay end def handle_rmpraise(m, params) - @praises.delete params[:praise] + @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(//i, "#{nick}") end def get_msg_idx(max) - idx = rand(max) + rand(max) end end @@ -169,3 +198,6 @@ plugin.map "addpraise *praise", :action => :handle_addpraise plugin.map "rmlart *lart", :action => :handle_rmlart plugin.map "rmpraise *praise", :action => :handle_rmpraise + +plugin.map "listlart *lart", :action => :handle_listlart +plugin.map "listpraise *praise", :action => :handle_listpraise