2 # Salutations plugin: respond to salutations
\r
4 unless Array.respond_to?(:pick_one)
\r
5 debug "Defining the pick_one method for Array"
\r
8 return nil if self.empty?
\r
9 self[rand(self.length)]
\r
15 class SalutPlugin < Plugin
\r
16 BotConfig.register BotConfigBooleanValue.new('salut.all_languages',
\r
18 :desc => "Check for a salutation in all languages and not just in the one defined by core.language",
\r
19 :on_change => Proc.new {|bot, v| bot.plugins['salut'].reload}
\r
21 BotConfig.register BotConfigBooleanValue.new('salut.address_only',
\r
23 :desc => "When set to true, the bot will only reply to salutations directed at him",
\r
24 :on_change => Proc.new {|bot, v| bot.plugins['salut'].reload}
\r
29 @salutations = Hash.new
\r
31 @main_lang_str = nil
\r
38 def set_language(what)
\r
47 @salutations.each { |lang, hash|
\r
48 hash.each { |situation, array|
\r
59 @match[:in] = Regexp.new("\\b(?:" + ar_in.uniq.map { |txt|
\r
61 }.join('|') + ")\\b", Regexp::IGNORECASE) unless ar_in.empty?
\r
62 @match[:out] = Regexp.new("\\b(?:" + ar_out.uniq.map { |txt|
\r
64 }.join('|') + ")\\b", Regexp::IGNORECASE) unless ar_out.empty?
\r
65 @match[:both] = Regexp.new("\\b(?:" + ar_both.uniq.map { |txt|
\r
67 }.join('|') + ")\\b", Regexp::IGNORECASE) unless ar_both.empty?
\r
68 debug "Matches: #{@match.inspect}"
\r
72 if @bot.config['salut.address_only']
\r
73 return unless m.address? or m.message =~ /#{Regexp.escape(@bot.nick)}/
\r
76 [:both, :in, :out].each { |k|
\r
77 next unless @match[k]
\r
78 debug "Checking salutations #{k} (#{@match[k].inspect})"
\r
79 if m.message =~ /^#{@match[k]}/
\r
88 salut_reply(m, salut, :morning)
\r
90 salut_reply(m, salut, :afternoon)
\r
92 salut_reply(m, salut, :evening)
\r
96 def salut_reply(m, k, time)
\r
97 debug "Replying to #{k} in the #{time}"
\r
104 debug "Building array ..."
\r
106 rep_ar += @salutations[@main_lang].fetch("#{time}#{sfx}".to_sym, [])
\r
107 rep_ar += @salutations[@main_lang].fetch("#{time}".to_sym, []) unless sfx.empty?
\r
108 rep_ar += @salutations[@main_lang].fetch("generic#{sfx}".to_sym, [])
\r
109 rep_ar += @salutations[@main_lang].fetch("generic".to_sym, []) unless sfx.empty?
\r
110 debug "Choosing reply in #{rep_ar.inspect} ..."
\r
112 if m.public? and (m.address? or m =~ /#{Regexp.escape(@bot.nick)}/)
\r
113 choice = @bot.lang.get("hello_X") % m.sourcenick
\r
115 choice = @bot.lang.get("hello") % m.sourcenick
\r
118 choice = rep_ar.pick_one
\r
119 if m.public? and (m.address? or m.message =~ /#{Regexp.escape(@bot.nick)}/)
\r
120 choice += "#{[',',''].pick_one} #{m.sourcenick}"
\r
121 choice += [" :)", " :D", "!", "", "", ""].pick_one
\r
124 debug "Replying #{choice}"
\r
125 m.plainreply choice
\r
130 @main_lang_str = @bot.config['core.language']
\r
131 @main_lang = @main_lang_str.to_sym
\r
132 @all_langs = @bot.config['salut.all_languages']
\r
134 # Get all available languages
\r
135 langs = Dir.new("#{@bot.botclass}/salut").collect {|f|
\r
136 f =~ /salut-([^.]+)/ ? $1 : nil
\r
138 langs.each { |lang|
\r
139 @salutations[lang.to_sym] = load_lang(lang)
\r
143 @salutations[@main_lang] = load_lang(@main_lang_str)
\r
148 def load_lang(lang)
\r
149 dir = "#{@bot.botclass}/salut"
\r
150 if not File.exist?(dir)
\r
153 file = "#{@bot.botclass}/salut/salut-#{lang}"
\r
154 if File.exist?(file)
\r
156 salutations = Hash.new
\r
157 content = YAML::load_file(file)
\r
158 content.each { |key, val|
\r
159 salutations[key.to_sym] = val
\r
163 error "failed to read salutations in #{lang}: #{$!}"
\r
170 return if @salutations.empty?
\r
171 @salutations.each { |lang, val|
\r
173 save_lang(lang, val)
\r
177 def save_lang(lang, val)
\r
178 file = "#{@bot.botclass}/salut/salut-#{lang}"
\r
179 Utils.safe_save(file) { |file|
\r
180 file.puts val.to_yaml
\r
186 plugin = SalutPlugin.new
\r