#-- vim:sw=2:et #++ # # :title: Figlet plugin class FigletPlugin < Plugin MAX_WIDTH=68 Config.register Config::StringValue.new('figlet.path', :default => 'figlet', :desc => _('Path to the figlet program'), :on_change => Proc.new { |bot, v| bot.plugins['figlet'].test_figlet }) Config.register Config::StringValue.new('figlet.font', :default => 'smslant', :desc => _('figlet font to use'), :validate => Proc.new { |v| v !~ /\s|`/ }, :on_change => Proc.new { |bot, v| bot.plugins['figlet'].test_figlet }) Config.register Config::StringValue.new('toilet.path', :default => 'toilet', :desc => _('Path to the toilet program'), :on_change => Proc.new { |bot, v| bot.plugins['figlet'].test_toilet }) Config.register Config::StringValue.new('toilet.font', :default => 'smslant', :desc => _('toilet font to use'), :validate => Proc.new { |v| v !~ /\s|`/ }, :on_change => Proc.new { |bot, v| bot.plugins['figlet'].test_toilet }) Config.register Config::ArrayValue.new('toilet.filters', :default => [], :desc => _('toilet filters to use (e.g. gay, metal)'), :validate => Proc.new { |v| v !~ /\s|`/ }, :on_change => Proc.new { |bot, v| bot.plugins['figlet'].test_toilet }) def figlet_path @bot.config['figlet.path'] end def toilet_path @bot.config['toilet.path'] end def figlet_font @bot.config['figlet.font'] end def toilet_font @bot.config['toilet.font'] end def toilet_filters @bot.config['toilet.filters'] end attr_reader :has, :params def test_figlet #check that figlet is present @has[:figlet] = Utils.try_exec("#{figlet_path} -v") # check that figlet actually has the font installed @has[:figlet_font] = Utils.try_exec("#{figlet_path} -f #{figlet_font} test test test") # set the commandline params @params[:figlet] = ['-k', '-w', MAX_WIDTH.to_s, '-C', 'utf8'] # add the font from DEFAULT_FONTS to the cmdline (if figlet has that font) @params[:figlet] += ['-f', figlet_font] if @has[:figlet_font] end def test_toilet #check that toilet is present @has[:toilet] = Utils.try_exec("#{toilet_path} -v") # check that toilet actually has the font installed @has[:toilet_font] = Utils.try_exec("#{toilet_path} -f #{toilet_font} test test test") # set the commandline params @params[:toilet] = ['-k', '-w', MAX_WIDTH.to_s, '-E', 'utf8', '--irc'] # add the font from DEFAULT_FONTS to the cmdline (if toilet has that font) @params[:toilet] += ['-f', toilet_font] if @has[:toilet_font] # add the filters, if any toilet_filters.each { |f| @params[:toilet] += ['-F', f.dup] } end def initialize super @has = {} @params = {} # test for figlet and font presence test_figlet # ditto for toilet test_toilet end def help(plugin, topic="") "figlet|toilet => print using figlet or toilet" end def figlet(m, params) key = params[:plugin] || m.plugin.intern unless @has[key] m.reply("%{cmd} couldn't be found. if it's installed, you should set the %{cmd}.path config key to its path" % { :cmd => key }) return end message = params[:message].to_s if message =~ /^-/ m.reply "the message can't start with a - sign" return end # collect the parameters to pass to safe_exec exec_params = [send(:"#{key}_path")] + @params[key] + [message] # run the program m.reply strip_first_last_empty_line(Utils.safe_exec(*exec_params)), :max_lines => 0, :nick => false end alias :toilet :figlet private def strip_first_last_empty_line(txt) txt.gsub(/\A(?:^\s*\r?\n)+/m,'').rstrip end end plugin = FigletPlugin.new plugin.map "figlet *message" plugin.map "toilet *message"