From 90656f4203a0a989b6fb110d4a07598dd186b84c Mon Sep 17 00:00:00 2001 From: Matthias Hecker Date: Mon, 13 Apr 2020 20:40:11 +0200 Subject: [PATCH] plugin(points): new message parser, see #34 --- data/rbot/plugins/points.rb | 64 +++++++++++++++---------------------- test/plugins/test_points.rb | 19 ++++++++++- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/data/rbot/plugins/points.rb b/data/rbot/plugins/points.rb index 34af9b50..976594ee 100644 --- a/data/rbot/plugins/points.rb +++ b/data/rbot/plugins/points.rb @@ -73,49 +73,35 @@ class PointsPlugin < Plugin 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| - # ignore preceeding +/- - if op && arg.nil? - op = nil - end - tok.sub!(/[:,]$/, '') if i == 0 - catch :me_if_you_can do - if m.channel.users[tok].nil? - if tok =~ /^(.*[^-].*)(?:--)$/ - op, arg = '--', $1 - next - elsif tok =~ /^(.*[^+].*)(?:\+\+)$/ - op, arg = '++', $1 - next - end - end + return unless m.public? and m.message.match(/\+\+|--/) - if (tok =~ /^--+$/) || (tok =~ /^\+\++$/) - op = tok.slice(0, 2) - else - arg = tok - end - end # catch + votes = Hash.new { |h,k| h[k] = 0 } # defaulting to zero + m.message.split(' ').each do |token| + # remove any color codes from the token + token = token.gsub(FormattingRx, '') - if op && arg - ac[arg] ||= 0 - ac[arg] += (op == '--' ? -1 : 1) unless arg.downcase == m.sourcenick.downcase - op = arg = nil - end + # each token must end with ++ or -- + next unless token.match(/^(.*)(\+\+|--)$/) + token = $1 # strip ++/-- from token + flag = $2 # remember ++/-- + + # each token must include at least one alphanumerical character + next unless token.match /[[:alnum:]]/ + + # ignore assigning points to oneself + next if token.downcase == m.sourcenick.downcase + + votes[token] += flag == '++' ? 1 : -1 end - ac.each do |k, v| - next if v == 0 or /--|\+\+/.match(k) - # strip invisible formatting characters like bold or color codes - k = k.gsub(FormattingRx, '') - next if k.downcase == m.sourcenick.downcase - @registry[k] += (v > 0 ? 1 : -1) - m.reply @bot.lang.get("thanks") if k == @bot.nick && v > 0 - m.reply "#{k} now has #{@registry[k]} points!" + votes.each do |token, points| + @registry[token] += points + + if token == @bot.nick and points > 0 + m.thanks + end + + m.reply "#{token} now has #{@registry[token]} points!" end end end diff --git a/test/plugins/test_points.rb b/test/plugins/test_points.rb index 83018e2e..d29b6174 100644 --- a/test/plugins/test_points.rb +++ b/test/plugins/test_points.rb @@ -49,6 +49,13 @@ class PointsPluginTest < Test::Unit::TestCase @plugin.message(m) assert_equal('alice now has 1 points!', m.replies.first) + # assign to multiple things + m = MockMessage.new('hello linux++ hello torvalds++', 'user') + @plugin.message(m) + assert_equal(m.replies.length, 2) + assert_equal('linux now has 3 points!', m.replies[0]) + assert_equal('torvalds now has 1 points!', m.replies[1]) + ignored = [ '++alice', '--alice', @@ -56,6 +63,16 @@ class PointsPluginTest < Test::Unit::TestCase 'ls --sort time', '-- foo', '++ foo', + 'test ++', + 'test --', + '<-- pointing', + 'pointing -->', + '&++', + ' ++', + ' --', + '++ --', + '-- ++', + 'https://linux.slashdot.org/story/20/04/12/2138205/how-red-hats-new-ceo-handles-life-under-ibm----and-a-global-pandemic' ] ignored.each do |ignore| m = MockMessage.new(ignore, 'user') @@ -69,6 +86,6 @@ class PointsPluginTest < Test::Unit::TestCase m = MockMessage.new('bot++', 'user') @plugin.message(m) - assert_include(MockBot.new.lang.strings['thanks'], m.replies.first) + assert_equal('thanks :)', m.replies.first) end end -- 2.39.2