From 07a397f63f0c7dc7f53830a57ce9048cfd9efb53 Mon Sep 17 00:00:00 2001 From: Matthias Hecker Date: Mon, 6 Apr 2020 21:08:55 +0200 Subject: [PATCH] plugin(points): +/- must come after, closes #34 This modifies the karma/points plugin to ignore increment/ decrement suffixes. `--SOMETHING` is more trouble than its worth, people will write --NAME as a signature, or paste a command line argument, e.g. `ls --sort time` which causes issues. I also added tests for the points plugin, the plan is to make the plugin testing easier more "rubionic" --- data/rbot/plugins/points.rb | 8 ++++++-- lib/rbot/language.rb | 3 +++ test/mock.rb | 5 +++-- test/plugins/test_points.rb | 30 ++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/data/rbot/plugins/points.rb b/data/rbot/plugins/points.rb index 21157f3d..58f24501 100644 --- a/data/rbot/plugins/points.rb +++ b/data/rbot/plugins/points.rb @@ -78,13 +78,17 @@ class PointsPlugin < Plugin 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 =~ /^(?:--)(.*[^-].*)$/) || (tok =~ /^(.*[^-].*)(?:--)$/) + if tok =~ /^(.*[^-].*)(?:--)$/ op, arg = '--', $1 next - elsif (tok =~ /^(?:\+\+)(.*[^+].*)$/)||(tok =~ /^(.*[^+].*)(?:\+\+)$/) + elsif tok =~ /^(.*[^+].*)(?:\+\+)$/ op, arg = '++', $1 next end diff --git a/lib/rbot/language.rb b/lib/rbot/language.rb index 7193c39e..8055ea0e 100644 --- a/lib/rbot/language.rb +++ b/lib/rbot/language.rb @@ -11,6 +11,9 @@ module Irc class Bot class Language + # Access needed for tests: + attr_reader :strings + # This constant hash holds the mapping # from long language names to the usual POSIX # locale specifications diff --git a/test/mock.rb b/test/mock.rb index f1ce92dd..511daaba 100644 --- a/test/mock.rb +++ b/test/mock.rb @@ -1,6 +1,7 @@ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib') $:.unshift File.join(File.dirname(__FILE__), '..') - +#require 'rbot/logger' +#Irc::Bot::LoggerManager.instance.set_level(5) module Irc class Bot @@ -55,7 +56,7 @@ class MockMessage def initialize(message='', source='user') @message = message @sourcenick = source - @channel = Irc::Channel.new('#test', '', [], server: nil) + @channel = Irc::Channel.new('#test', '', ['bob'], server: nil) @replies = [] end diff --git a/test/plugins/test_points.rb b/test/plugins/test_points.rb index f1a7479d..83018e2e 100644 --- a/test/plugins/test_points.rb +++ b/test/plugins/test_points.rb @@ -21,6 +21,10 @@ class PointsPluginTest < Test::Unit::TestCase assert_not_nil(@plugin) assert_not_empty(@plugin.help(nil)) + m = MockMessage.new('', 'user') + @plugin.points(m, key: 'linux') + assert_equal('linux has zero points', m.replies.first) + m = MockMessage.new('linux++', 'user') @plugin.message(m) assert_equal('linux now has 1 points!', m.replies.first) @@ -40,5 +44,31 @@ class PointsPluginTest < Test::Unit::TestCase m = MockMessage.new('', 'linux') @plugin.points(m, {}) assert_equal('points for linux: 2', m.replies.first) + + m = MockMessage.new('alice++', 'user') + @plugin.message(m) + assert_equal('alice now has 1 points!', m.replies.first) + + ignored = [ + '++alice', + '--alice', + 'something something --github', + 'ls --sort time', + '-- foo', + '++ foo', + ] + ignored.each do |ignore| + m = MockMessage.new(ignore, 'user') + @plugin.message(m) + assert_empty(m.replies, "message should've been ignored: #{ignore.inspect}") + end + + m = MockMessage.new('bob++', 'user') + @plugin.message(m) + assert_equal('bob now has 1 points!', m.replies.first) + + m = MockMessage.new('bot++', 'user') + @plugin.message(m) + assert_include(MockBot.new.lang.strings['thanks'], m.replies.first) end end -- 2.39.5