From ff6d7e5d043da99b2da36f628d52b7b5df47119d Mon Sep 17 00:00:00 2001 From: Matthias Hecker Date: Wed, 15 Apr 2020 20:26:54 +0200 Subject: [PATCH] refactor: wordlist shouldn't use bot singleton #35 also related to #41 and #6 --- data/rbot/plugins/games/azgame.rb | 6 +++--- data/rbot/plugins/games/hangman.rb | 2 +- data/rbot/plugins/games/shiritori.rb | 5 ++--- lib/rbot/core/utils/wordlist.rb | 19 +++++++++---------- lib/rbot/core/wordlist_ui.rb | 8 +++++--- 5 files changed, 20 insertions(+), 20 deletions(-) mode change 100755 => 100644 lib/rbot/core/utils/wordlist.rb diff --git a/data/rbot/plugins/games/azgame.rb b/data/rbot/plugins/games/azgame.rb index ca67881c..b4dbabc1 100644 --- a/data/rbot/plugins/games/azgame.rb +++ b/data/rbot/plugins/games/azgame.rb @@ -157,9 +157,9 @@ class AzGamePlugin < Plugin lang = params[:lang] addlang = params[:addlang] autoadd = @autoadd_base + addlang.to_s - if Wordlist.exist?(lang) + if Wordlist.exist?(@bot, lang) # wordlists are assumed to be UTF-8, but we need to strip the BOM, if present - words = Wordlist.get(lang) + words = Wordlist.get(@bot, lang) if addlang and File.exist?(autoadd) word += File.readlines(autoadd).map {|line| line.sub("\xef\xbb\xbf",'').strip} end @@ -600,7 +600,7 @@ class AzGamePlugin < Plugin return _("az => start a game if none is running, show the current word range otherwise; you can say 'az ' if you want to play in a language different from the current bot default") end langs = @rules.keys - wls = Wordlist.list + wls = Wordlist.list(@bot) return [ _("az topics: play, rules, cancel, manage, check"), _("available languages: %{langs}") % { :langs => langs.join(", ") }, diff --git a/data/rbot/plugins/games/hangman.rb b/data/rbot/plugins/games/hangman.rb index 0177a348..890f821a 100644 --- a/data/rbot/plugins/games/hangman.rb +++ b/data/rbot/plugins/games/hangman.rb @@ -253,7 +253,7 @@ class HangmanPlugin < Plugin params[:word].join(" ") elsif params[:wordlist] begin - wordlist = Wordlist.get(params[:wordlist].join("/"), :spaces => true) + wordlist = Wordlist.get(@bot, params[:wordlist].join("/"), :spaces => true) rescue raise _("no such wordlist") end diff --git a/data/rbot/plugins/games/shiritori.rb b/data/rbot/plugins/games/shiritori.rb index 3cb3c7b5..9ca23f9a 100644 --- a/data/rbot/plugins/games/shiritori.rb +++ b/data/rbot/plugins/games/shiritori.rb @@ -389,9 +389,8 @@ class ShiritoriPlugin < Plugin unless ruleset.has_key?(:words) if ruleset.has_key?(:wordlist_file) begin - ruleset[:words] = - File.new(datafile(ruleset[:wordlist_file])).grep( - ruleset[:listen]) {|l| ruleset[:normalize].call l.chomp} + ruleset[:words] = Wordlist.get(@bot, ruleset[:wordlist_file], :spaces => true) + .grep(ruleset[:listen]) {|l| ruleset[:normalize].call l.chomp} rescue raise "unable to load word list" end diff --git a/lib/rbot/core/utils/wordlist.rb b/lib/rbot/core/utils/wordlist.rb old mode 100755 new mode 100644 index 81d7d775..339a3219 --- a/lib/rbot/core/utils/wordlist.rb +++ b/lib/rbot/core/utils/wordlist.rb @@ -10,11 +10,8 @@ require "find" module ::Irc class Bot class Wordlist - def self.wordlist_base - @@wordlist_base ||= Utils.bot.path 'wordlists' - end - - def self.get(where, options={}) + def self.get(bot, where, options={}) + wordlist_base = bot.path('wordlists') opts = { :spaces => false }.merge(options) wordlist_path = File.join(wordlist_base, where) @@ -44,21 +41,23 @@ class Wordlist # Return an array with the list of available wordlists. # Available options: # pattern:: pattern that should be matched by the wordlist filename - def self.list(options={}) + def self.list(bot, options={}) + wordlist_base = bot.path('wordlists') pattern = options[:pattern] || "**" # refuse patterns that contain ../ return [] if pattern =~ /\.\.\// - striplen = self.wordlist_base.length+1 - Dir.glob(File.join(self.wordlist_base, pattern)).map { |name| + striplen = wordlist_base.length+1 + Dir.glob(File.join(wordlist_base, pattern)).map { |name| name[striplen..-1] } end - def self.exist?(path) + def self.exist?(bot, path) + wordlist_base = bot.path('wordlists') fn = path.to_s # refuse to check outside of the wordlist base directory return false if fn =~ /\.\.\// - File.exist?(File.join(self.wordlist_base, fn)) + File.exist?(File.join(wordlist_base, fn)) end end diff --git a/lib/rbot/core/wordlist_ui.rb b/lib/rbot/core/wordlist_ui.rb index 20ccc228..8042089a 100644 --- a/lib/rbot/core/wordlist_ui.rb +++ b/lib/rbot/core/wordlist_ui.rb @@ -11,12 +11,14 @@ class WordlistModule < CoreBotModule end def do_list(m, p) - found = Wordlist.list(p) + found = Wordlist.list(@bot, p) if found.empty? - m.reply _("no wordlist found") + m.reply _("no wordlists found in %{path}") % { + path: @bot.path('wordlists') + } else m.reply _("Wordlists: %{found}") % { - :found => found.sort.join(', ') + found: found.sort.join(', ') } end end -- 2.32.0.93.g670b81a890