summaryrefslogtreecommitdiff
path: root/data/rbot/plugins/fortune.rb
blob: adb6a839a656a0897387508d6792ed63792b222d (plain)
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
#-- vim:sw=2:et
#++
#
# :title: Fortune plugin

class FortunePlugin < Plugin
  Config.register Config::StringValue.new('fortune.path',
    :default => '',
    :desc => "Full path to the fortune executable")

  def help(plugin, topic="")
    "fortune [<category>] => get a (short) fortune, optionally specifying fortune category || fortune categories => show categories"
  end


  ## Pick a fortune
  def fortune(m, params)
    db = params[:db]
    fortune = @bot.config['fortune.path']
    if fortune.empty?
      ["/usr/bin/fortune",
       "/usr/share/bin/fortune",
       "/usr/games/fortune",
       "/usr/local/games/fortune",
       "/usr/local/bin/fortune"].each do |f|
          if FileTest.executable? f
            fortune = f

            # Try setting the config entry
            config_par = {:key => 'fortune.path', :value => [f], :silent => true }
	    debug "Setting fortune.path to #{f}"
            set_path = @bot.plugins['config'].handle_set(m, config_par)
            if set_path
              debug "fortune.path set to #{@bot.config['fortune.path']}"
            else
              debug "couldn't set fortune.path"
            end

            break
          end
        end
    end
    m.reply "fortune executable not found (try setting the 'fortune.path' variable)" unless fortune

    begin
      ret = Utils.safe_exec(fortune, "-n", "350", "-s", db)

      ## cleanup ret
      ret = ret.split(/\n+/).map do |l|
        # check if this is a "  -- Some Dood" line
        if l =~ /^\s+-{1,3}\s+\w/
          # turn "-" into "--"
          l.gsub!(/^\s+-\s/, '-- ')
          # extra space
          " " + l.strip
        else
          # just remove leading and trailing whitespace
          l.strip
        end
      end.join(" ")

    rescue
      ret = "failed to execute fortune"
      # TODO reset fortune.path when execution fails
    end

    m.reply ret
  end


  # Print the fortune categories
  def categories(m, params)
    ## list all fortune files in /usr/share/games/fortune
    categories = Dir["/usr/share/games/fortune/*"].select{ |f|
      File.split(f).last.match(/^\w+$/)
    }.select{ |f|
      File.file?(f)
    }.map{ |p|
      File.split(p).last
    }.sort
    ## say 'em!
    m.reply "Fortune categories: #{categories.join ', '}"
  end
 
end
plugin = FortunePlugin.new
plugin.map 'fortune categories', :action => "categories"
plugin.map 'fortune list', :action => "categories"
plugin.map 'fortune :db', :defaults => {:db => ''},
                          :requirements => {:db => /^[^-][\w-]+$/}