Nephos/botpop

View on GitHub
plugins/iamalive.rb

Summary

Maintainability
A
1 hr
Test Coverage
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