]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/karma.rb
quiz: stop quizzes and timers on cleanup
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / karma.rb
index 43b3f2dc160f3a761fc48b83e2ba7215b55afaa8..93d2118996eb787343e3159687baef268b0cc988 100644 (file)
@@ -14,18 +14,18 @@ class KarmaPlugin < Plugin
     @registry.set_default(0)
 
     # import if old file format found
-    if(File.exist?("#{@bot.botclass}/karma.rbot"))
+    oldkarma = @bot.path 'karma.rbot'
+    if File.exist? oldkarma
       log "importing old karma data"
-      IO.foreach("#{@bot.botclass}/karma.rbot") do |line|
+      IO.foreach(oldkarma) do |line|
         if(line =~ /^(\S+)<=>([\d-]+)$/)
           item = $1
           karma = $2.to_i
           @registry[item] = karma
         end
       end
-      File.delete("#{@bot.botclass}/karma.rbot")
+      File.delete oldkarma
     end
-
   end
 
   def stats(m, params)
@@ -49,41 +49,62 @@ class KarmaPlugin < Plugin
       m.reply "#{thing} has neutral karma"
     end
   end
-  
-  
+
+  def setkarma(m, params)
+    thing = (params[:key] || m.sourcenick).to_s
+    @registry[thing] = params[:val].to_i
+    karma(m, params)
+  end
+
   def help(plugin, topic="")
     "karma module: Listens to everyone's chat. <thing>++/<thing>-- => increase/decrease karma for <thing>, karma for <thing>? => show karma for <thing>, karmastats => show stats. Karma is a community rating system - only in-channel messages can affect karma and you cannot adjust your own."
   end
-  def listen(m)
-    return unless m.kind_of?(PrivMessage) && m.public?
-    # in channel message, the kind we are interested in
-    if(m.message =~ /(\+\+|--)/)
-      string = m.message.sub(/\W(--|\+\+)(\(.*?\)|[^(++)(\-\-)\s]+)/, "\2\1")
-      seen = Hash.new
-      while(string.sub!(/(\(.*?\)|[^(++)(\-\-)\s]+)(\+\+|--)/, ""))
-        key = $1
-        change = $2
-        next if seen[key]
-        seen[key] = true
 
-        key.sub!(/^\((.*)\)$/, "\1")
-        key.gsub!(/\s+/, " ")
-        next unless(key.length > 0)
-        next if(key.downcase == m.sourcenick.downcase)
-        if(change == "++")
-          @registry[key] += 1
-          if key =~ /^#{@bot.nick}$/i
-            @bot.say m.replyto, @bot.lang.get("thanks")
+  def message(m)
+    return unless m.public? && m.message.match(/\+\+|--/)
+    arg = nil
+    op = nil
+    ac = Hash.new
+    m.message.split.each_with_index do |tok, i|
+      tok.sub!(/[:,]$/, '') if i == 0
+      catch :me_if_you_can do
+        if m.channel.users[tok].nil?
+          if (tok =~ /^(?:--)(.*[^-].*)$/) || (tok =~ /^(.*[^-].*)(?:--)$/)
+            op, arg = '--', $1
+            next
+          elsif (tok =~ /^(?:\+\+)(.*[^+].*)$/)||(tok =~ /^(.*[^+].*)(?:\+\+)$/)
+            op, arg = '++', $1
+            next
           end
-        elsif(change == "--")
-          @registry[key] -= 1
         end
+
+        if (tok =~ /^--+$/) || (tok =~ /^\+\++$/)
+          op = tok.slice(0, 2)
+        else
+          arg = tok
+        end
+      end # catch
+
+      if op && arg
+        ac[arg] ||= 0
+        ac[arg] += (op == '--' ? -1 : 1) unless arg.downcase == m.sourcenick.downcase
+        op = arg = nil
       end
     end
+
+    ac.each do |k, v|
+      next if v == 0
+      @registry[k] += (v > 0 ? 1 : -1)
+      m.reply @bot.lang.get("thanks") if k == @bot.nick && v > 0
+    end
   end
 end
 
 plugin = KarmaPlugin.new
+
+plugin.default_auth( 'edit', false )
+
 plugin.map 'karmastats', :action => 'stats'
 plugin.map 'karma :key', :defaults => {:key => false}
+plugin.map 'setkarma :key :val', :defaults => {:key => false}, :requirements => {:val => /^-?\d+$/}, :auth_path => 'edit::set!'
 plugin.map 'karma for :key'