1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
class KarmaPlugin < Plugin
def initialize
super
# this plugin only wants to store ints!
class << @registry
def store(val)
val.to_i
end
def restore(val)
val.to_i
end
end
@registry.set_default(0)
# import if old file format found
oldkarma = @bot.path 'karma.rbot'
if File.exist? oldkarma
log "importing old karma data"
IO.foreach(oldkarma) do |line|
if(line =~ /^(\S+)<=>([\d-]+)$/)
item = $1
karma = $2.to_i
@registry[item] = karma
end
end
File.delete oldkarma
end
end
def stats(m, params)
if (@registry.length)
max = @registry.values.max
min = @registry.values.min
best = @registry.to_hash.index(max)
worst = @registry.to_hash.index(min)
m.reply "#{@registry.length} items. Best: #{best} (#{max}); Worst: #{worst} (#{min})"
end
end
def karma(m, params)
thing = params[:key]
thing = m.sourcenick unless thing
thing = thing.to_s
karma = @registry[thing]
if(karma != 0)
m.reply "karma for #{thing}: #{@registry[thing]}"
else
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 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
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'
|