class ProtonBot::Log

Log - for colored logging. @!attribute [rw] levels

@return [Hash<String>] Colorscheme

@!attribute [rw] logging

@return [Bool] If false, does not write messages.

Constants

DEFAULT_SCHEME

Default colorcheme

Attributes

levels[RW]
logging[RW]

Public Class Methods

new() click to toggle source
# File lib/protonbot/log.rb, line 9
def initialize
  @pastel = Pastel.new

  @queue = Queue.new

  @fmt  = '[:date|:time] :name ▷ :lvl ▶ :text'
  @dfmt = '%d.%m.%Y'
  @tfmt = '%H:%M:%S'
  @levels = DEFAULT_SCHEME

  @logging = true

  @stop = false

  lloop
end

Public Instance Methods

crash(msg, code = 1, nam = 'log') click to toggle source

@param msg [String] @param code [Integer] @param nam [String] Name

# File lib/protonbot/log.rb, line 70
def crash(msg, code = 1, nam = 'log')
  dat = gsub(msg.to_s, :crash, nam)
  @queue << dat
  @pastel.strip(dat)
  exit code
end
debug(msg, nam = 'log') click to toggle source

@param msg [String] @param nam [String] Name

# File lib/protonbot/log.rb, line 45
def debug(msg, nam = 'log')
  dat = gsub(msg.to_s, :debug, nam)
  @queue << dat
  @pastel.strip(dat)
end
error(msg, nam = 'log') click to toggle source

@param msg [String] @param nam [String] Name

# File lib/protonbot/log.rb, line 61
def error(msg, nam = 'log')
  dat = gsub(msg.to_s, :error, nam)
  @queue << dat
  @pastel.strip(dat)
end
info(msg, nam = 'log') click to toggle source

@!group Logging @param msg [String] @param nam [String] Name

# File lib/protonbot/log.rb, line 37
def info(msg, nam = 'log')
  dat = gsub(msg.to_s, :info, nam)
  @queue << dat
  @pastel.strip(dat)
end
inspect() click to toggle source

@return [String] Output

# File lib/protonbot/log.rb, line 79
def inspect
  %(<#ProtonBot::Log:#{object_id.to_s(16)} @logging=#{@logging}>)
end
stop() click to toggle source

Stops log thread

# File lib/protonbot/log.rb, line 84
def stop
  @stop = true
  @thr.join
end
warn(msg, nam = 'log') click to toggle source

@param msg [String] @param nam [String] Name

# File lib/protonbot/log.rb, line 53
def warn(msg, nam = 'log')
  dat = gsub(msg.to_s, :warning, nam)
  @queue << dat
  @pastel.strip(dat)
end
wrap(name) click to toggle source

Use it to get rid of appending name on each log-method-call @param name [String] @return [LogWrapper] wrapper @see ProtonBot::LogWrapper

# File lib/protonbot/log.rb, line 30
def wrap(name)
  ProtonBot::LogWrapper.new(self, name)
end

Private Instance Methods

gsub(msg, sname, nam) click to toggle source

Formats message @param msg [String] @param sname [Symbol] Color-Scheme name @param nam [String] Log-Name

# File lib/protonbot/log.rb, line 95
def gsub(msg, sname, nam)
  dt = DateTime.now

  date = dt.strftime(@dfmt)
  time = dt.strftime(@tfmt)

  dates = @pastel.decorate(date, *@levels[sname][:fmt][:datetime])
  times = @pastel.decorate(time, *@levels[sname][:fmt][:datetime])

  name = @pastel.decorate(nam, *@levels[sname][:fmt][:name])

  lvl = @pastel.decorate(*@levels[sname][:chars],
                         *@levels[sname][:fmt][:lvl])

  @fmt
    .gsub(':date', dates)
    .gsub(':time', times)
    .gsub(':name', name)
    .gsub(':lvl',  lvl)
    .gsub(':text', msg)
    .gsub('▷', @pastel.decorate('▷', *@levels[sname][:fmt][:arrows]))
    .gsub('▶', @pastel.decorate('▶', *@levels[sname][:fmt][:arrows]))
end
lloop() click to toggle source

Log-loop - reads messages from queue and writes them to STDOUT

# File lib/protonbot/log.rb, line 120
def lloop
  @thr = Thread.new do
    loop do
      break if @stop
      d = begin
            @queue.pop
          rescue
            nil
          end
      print("#{d}\n") if @logging && d
    end
  end
end