]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/karma.rb
lart plugin: replace "me" with sourcenick
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / karma.rb
index 166a9df46a717e3afb4a0da0298e5f6633a35555..2bd5f9f71584cf1026cacab01b330ff0e55e3493 100644 (file)
@@ -25,7 +25,6 @@ class KarmaPlugin < Plugin
       end
       File.delete("#{@bot.botclass}/karma.rbot")
     end
-
   end
 
   def stats(m, params)
@@ -49,40 +48,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 == m.sourcenick)
-        if(change == "++")
-          @registry[key] += 1
-          if key =~ /^#{@bot.nick}$/i
-            @bot.say m.replyto, @bot.lang.get("thanks")
+  def listen(m)
+    return unless m.kind_of?(PrivMessage) && 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)
+        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'