112 lines
3.2 KiB
Ruby
112 lines
3.2 KiB
Ruby
class IAmAlive < Botpop::Plugin
|
|
include Cinch::Plugin
|
|
include Botpop::Plugin::Database
|
|
|
|
match(/^[^!].*/, use_prefix: false, method: :register_entry)
|
|
match(/^[^!].*/, use_prefix: false, method: :react_on_entry)
|
|
match(/^!iaa reac(tivity)?$/, use_prefix: false, method: :get_reactivity)
|
|
match(/^!iaa reac(tivity)? \d{1,3}$/, use_prefix: false, method: :set_reactivity)
|
|
match(/^!iaa learn$/, use_prefix: false, method: :set_mode_learn)
|
|
match(/^!iaa live$/, use_prefix: false, method: :set_mode_live)
|
|
match(/^!iaa mode$/, use_prefix: false, method: :get_mode)
|
|
match(/^!iaa stats?$/, use_prefix: false, method: :get_stats)
|
|
match(/^!iaa forget( (\d+ )?(.+))?/, use_prefix: false, method: :forget)
|
|
match(/^!iaa last( \w+)?$/, use_prefix: false, method: :get_last)
|
|
|
|
CONFIG = config(:safe => true)
|
|
ENABLED = CONFIG['enable'] || false
|
|
HELP = ["!iaa reac", "!iaa reac P", "!iaa learn", "!iaa live", "!iaa mode",
|
|
"!iaa stats", "!iaa forget (Nx SENTENCE)", "!iaa last (nick)",
|
|
"!iaa user [add/remove/list]"]
|
|
|
|
@@mode = config['default_mode'].to_sym
|
|
@@reactivity = config['reactivity'] || 50
|
|
|
|
def cmd_allowed? m
|
|
return Base.cmd_allowed? m, ["iaa"]
|
|
end
|
|
|
|
if ENABLED
|
|
DB_CONFIG = self.db_config = CONFIG['database']
|
|
DB = self.db_connect!
|
|
require_relative 'iamalive/entry'
|
|
end
|
|
|
|
def register_entry m
|
|
Entry.create(user: (m.user.authname || m.user.nick), message: m.message, channel: m.channel.to_s)
|
|
forget_older! if rand(1..100) == 100
|
|
end
|
|
|
|
def react_on_entry m
|
|
return if @@mode != :live
|
|
e = Entry.where('LOWER(message) = LOWER(?)', m.message).select(:id).all.map(&:id).map{|x| x+1}
|
|
if @@reactivity > rand(1..100)
|
|
answer_to(m, e)
|
|
end
|
|
end
|
|
|
|
private
|
|
def answer_to m, e
|
|
a = Entry.where(id: e).to_a.sample
|
|
if not a.nil?
|
|
sleep(a.message.split.size.to_f / 10)
|
|
m.reply a.message
|
|
Entry.create(user: "self", message: a.message, channel: m.channel.to_s)
|
|
end
|
|
end
|
|
|
|
def forget_older!
|
|
log "Forget the older entry"
|
|
Entry.first.delete
|
|
end
|
|
public
|
|
|
|
def get_reactivity m
|
|
m.reply "Current reactivity: #{@@reactivity}"
|
|
end
|
|
|
|
def set_reactivity m
|
|
return if not cmd_allowed? m
|
|
@@reactivity = m.message.split[2].to_i
|
|
end
|
|
|
|
def set_mode_learn m
|
|
return if not cmd_allowed? m
|
|
@@mode = :learn
|
|
end
|
|
|
|
def set_mode_live m
|
|
return if not cmd_allowed? m
|
|
@@mode = :live
|
|
end
|
|
|
|
def get_mode m
|
|
m.reply "Current mode: #{@@mode}"
|
|
end
|
|
|
|
def get_stats m
|
|
m.reply "Registered sentences: #{Entry.count}"
|
|
end
|
|
|
|
def forget m, arguments, nb, what
|
|
return if not cmd_allowed? m
|
|
if arguments.nil?
|
|
last = Entry.where(channel: m.channel.to_s, user: "self").last
|
|
m.reply last ? "\"#{last.message}\" Forgotten" : "Nop"
|
|
last.delete
|
|
else
|
|
nb = nb.to_i if not nb.nil?
|
|
nb ||= Entry.where(message: what).count
|
|
n = Entry.where(message: what).order_by(:id).reverse.limit(nb).map(&:delete).size rescue 0
|
|
m.reply "(#{n}x) \"#{what}\" Forgotten"
|
|
end
|
|
end
|
|
|
|
def get_last m, user
|
|
user.strip! if user
|
|
last = Entry.where(channel: m.channel.to_s, user: (user || "self")).last
|
|
m.reply "#{user}: #{last ? last.message : 'no message found'}"
|
|
end
|
|
|
|
end
|