lib/cogbot.rb

Summary

Maintainability
A
2 hrs
Test Coverage
require 'cinch'
require 'eventmachine'
require 'evma_httpserver'
require 'nokogiri'
require 'net/http'
require 'daemons'
require 'thor'
require 'yajl'
require 'lib/cogbot/utils'
require 'lib/cogbot/server'

# main cogbot module
module Cogbot

  # cogbot cli parser and launcher
  class Bot < Thor

    desc 'start', 'start cogbot'
    # manages the start cli command
    def start

      # prepare config
      config = {}
      begin
        config = YAML::load_file(CONFIG_FILE)
      rescue Exception => e
        load 'lib/cogbot/setup.rb'
        config['main'] = Cogbot::Setup.init
      end

      # prepare daemon
      Daemons.daemonize(
        :app_name => 'cogbot',
        :dir_mode => :normal,
        :log_dir => LOG_DIR,
        :log_output => true,
        :dir => CONFIG_DIR
      )

      # checkout plugins
      plugins = []
      config['main']['plugins'].each do |p|
        if File.exists?(File.join(ROOT_DIR, 'plugins', "#{p}.rb"))
          require File.join(ROOT_DIR, 'plugins', p)
          plugins.push Cinch::Plugins.const_get(p.camelize)
        end
      end

      # create bot
      bot = Cinch::Bot.new do
        configure do |c|
          c.server = config['main']['server']
          c.ssl.use = ( config['main']['ssl'] == 'true' )
          c.nick = config['main']['nick']
          c.user = config['main']['nick']
          c.realname = config['main']['nick']
          c.channels = config['main']['channels']
          c.sasl.username = config['main']['sasl_user']
          c.sasl.password = config['main']['sasl_pass']
          c.options = { 'cogconf' => config }
          c.plugins.prefix = config['main']['prefix']
          c.plugins.plugins = plugins
        end
        on :message, 'hi' do |m|
          m.reply "Hello, #{m.user.nick}"
        end
      end
      bot.loggers.debug(plugins.inspect)

      Signal.trap('TERM') { EM.stop }

      EM.run do
        EM.defer { bot.start }
        if config['server']
          EM.add_timer(3) do
            EM.start_server(
              config['server']['ip'],
              config['server']['port'],
              Server,
              bot
            )
          end
        end
      end

      bot.quit
    end

    desc 'stop', 'stop cogbot'
    # manages the stop cli command
    def stop
      pid_file = File.join(CONFIG_DIR, 'cogbot.pid')
      pid = File.read(pid_file).to_i if File.exist?(pid_file)
      Process.kill('TERM', pid)
    end

    desc 'restart', 'restart cogbot'
    # manages the restart cli command, just stopping and startinbg in sequence
    def restart
      stop
      start
    end

  end
end