imdb plugin: add country and director to movie info
[rbot] / data / rbot / plugins / lart.rb
1 #-- vim:sw=2:et
2 #++
3 #
4 # :title: lart/praise plugin for rbot
5 #
6 # Author::    Michael Brailsford  <brailsmt@yahoo.com> aka brailsmt
7 # Author::    Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
8 #
9 # Copyright:: (C) 2002 Michael Brailsford.  All rights reserved.
10 # Copyright:: (C) 2006 Giuseppe Bilotta.  All rights reserved.
11 #
12 # License::  This plugin is licensed under the BSD license.  The terms of
13 #            which follow.
14 #
15 # Redistribution and use in source and binary forms, with or without
16 # modification, are permitted provided that the following conditions
17 # are met:
18 #
19 # 1. Redistributions of source code must retain the above copyright notice,
20 #    this list of conditions and the following disclaimer.
21 #
22 # 2. Redistributions in binary form must reproduce the above copyright
23 #    notice, this list of conditions and the following disclaimer in the
24 #    documentation and/or other materials provided with the distribution.
25 #
26 # Purpose::   Provide for humorous larts and praises
27
28 class LartPlugin < Plugin
29
30   def initialize
31     @larts = Array.new
32     @praises = Array.new
33     @lartfile = ""
34     @praisefile = ""
35     @changed = false
36     super
37   end
38
39   def set_language(lang)
40     save
41
42     # We may be on an old installation, so on the first run read non-language-specific larts
43     unless defined?(@oldlart)
44       @oldlart = "#{@bot.botclass}/lart/larts"
45       @oldpraise = "#{@bot.botclass}/lart/praise"
46     end
47
48     @lartfile.replace "#{@bot.botclass}/lart/larts-#{lang}"
49     @praisefile.replace "#{@bot.botclass}/lart/praises-#{lang}"
50     @larts.clear
51     @praises.clear
52     if File.exists? @lartfile
53       IO.foreach(@lartfile) { |line|
54         @larts << line.chomp
55       }
56     elsif File.exists? @oldlart
57       IO.foreach(@oldlart) { |line|
58         @larts << line.chomp
59       }
60     end
61     if File.exists? @praisefile
62       IO.foreach(@praisefile) { |line|
63         @praises << line.chomp
64       }
65     elsif File.exists? @oldpraise
66       IO.foreach(@oldpraise) { |line|
67         @praises << line.chomp
68       }
69     end
70     @changed = false
71   end
72
73   def save
74     return unless @changed
75     Dir.mkdir("#{@bot.botclass}/lart") if not FileTest.directory? "#{@bot.botclass}/lart"
76     # TODO implement safe saving here too
77     Utils.safe_save(@lartfile) { |file|
78       file.puts @larts
79     }
80     Utils.safe_save(@praisefile) { |file|
81       file.puts @praises
82     }
83     @changed = false
84   end
85
86   def help(plugin, topic="")
87     "Lart: The lart plugin allows you to lart/praise someone in the channel. You can also add new larts and new praises as well as delete them. For the curious, LART is an acronym for Luser Attitude Readjustment Tool. Usage: lart <who> [<reason>] -- larts <who> for <reason>. praise <who> [<reason>] -- praises <who> for <reason>. [add|rm][lart|praise] -- Add or remove a lart or praise."
88   end
89
90   def handle_lart(m, params)
91     lart = @larts[get_msg_idx(@larts.length)]
92     if not lart
93       m.reply "I dunno any larts"
94       return
95     end
96     who = params[:who].to_s
97     reason = params[:why]
98     if who == @bot.nick
99       who = m.sourcenick
100       reason = "for trying to make me lart myself"
101     end
102     lart = replace_who lart, who
103     lart << " #{reason}" unless reason.empty?
104
105     m.act lart
106   end
107
108   def handle_praise(m, params)
109     praise = @praises[get_msg_idx(@praises.length)]
110     if not praise
111       m.reply "I dunno any praises"
112       return
113     end
114     who = params[:who].to_s
115     reason = params[:why]
116     if who == m.sourcenick
117       params[:why] = "for praising himself"
118       handle_lart(m, params)
119       return
120     end
121     praise = replace_who praise, who
122     praise << " #{reason}" unless reason.empty?
123
124     m.act praise
125   end
126
127   def handle_addlart(m, params)
128     @larts << params[:lart]
129     @changed = true
130     m.okay
131   end
132
133   def handle_rmlart(m, params)
134     @larts.delete params[:lart]
135     @changed = true
136     m.okay
137   end
138
139   def handle_addpraise(m, params)
140     @praises << params[:praise]
141     @changed = true
142     m.okay
143   end
144
145   def handle_rmpraise(m, params)
146     @praises.delete params[:praise]
147     @changed = true
148     m.okay
149   end
150
151   #  The following are utils for larts/praises
152   def replace_who(msg, nick)
153     msg.gsub(/<who>/i, "#{nick}")
154   end
155
156   def get_msg_idx(max)
157     idx = rand(max)
158   end
159
160 end
161
162 plugin = LartPlugin.new
163
164 plugin.map "lart *who [*why]", :requirements => { :why => /(?:for|because)\s+.*/ }, :action => :handle_lart
165 plugin.map "praise *who [*why]", :requirements => { :why => /(?:for|because)\s+.*/ }, :action => :handle_praise
166
167 plugin.map "addlart *lart", :action => :handle_addlart
168 plugin.map "addpraise *praise", :action => :handle_addpraise
169
170 plugin.map "rmlart *lart", :action => :handle_rmlart
171 plugin.map "rmpraise *praise", :action => :handle_rmpraise