Skip to content

Commit

Permalink
implement logger
Browse files Browse the repository at this point in the history
Signed-off-by: David A. Cuadrado <krawek@gmail.com>
  • Loading branch information
dcu committed Feb 10, 2011
1 parent 95f5b19 commit 5b9c0d8
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 0 deletions.
14 changes: 14 additions & 0 deletions models/channel.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ class Channel

key :_id, String
has_many :users
has_many :logs

def self.get_user(name, nick, create = true)
name = name.downcase
Expand All @@ -16,4 +17,17 @@ def self.get_user(name, nick, create = true)

user
end

def self.add_log_message(name, message)
channel = Channel.find(name)

log = Log.first(:channel_id => channel.id, :order => "created_at desc", :select => %w[messages_count channel_id])
if log.nil? || log.messages_count >= 100
log = Log.create(:channel_id => channel.id)
end

Log.push({:_id => log.id}, {:messages => message})
Log.increment({:_id => log.id},{:messages_count => 1})
end
end

29 changes: 29 additions & 0 deletions models/log.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
class Log
include MongoMapper::Document

timestamps!

key :_id, String
key :_type, String

key :channel_id, String
belongs_to :channel

key :messages, Array
key :messages_count, Integer, :default => 0


def self.format_message(msg)
if msg["type"] == "normal"
"[#{msg["date"]}] <#{msg["nick"]}> #{msg["text"]}"
elsif msg["type"] == "action"
"[#{msg["date"]}] * #{msg["nick"]} #{msg["text"]}"
elsif msg["type"] == "join"
"[#{msg["date"]}] JOIN #{msg["nick"]}"
elsif msg["type"] == "part"
"[#{msg["date"]}] PART #{msg["nick"]}"
elsif msg["type"] == "ctcp"
"[#{msg["date"]}] CTCP #{msg["nick"]} #{msg["text"]}"
end
end
end
69 changes: 69 additions & 0 deletions plugins/logger.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
class LoggerPlugin
include NinjaPlugin

match /grep (.+)/, :method => :grep

listen_to :channel, :method => :log_channel
listen_to :join, :method => :log_channel
listen_to :part, :method => :log_channel

def log_channel(m)
return if !m.channel?

message = m.message
nick = m.user.nick
type = "normal"
if m.events.include?(:notice)
type = "notice"
elsif m.events.include?(:ctcp)
type = "ctcp"
message = m.ctcp_message

if message =~ /^ACTION /
type = "action"
message.gsub!(/^ACTION /, "")
end
elsif m.events.include?(:join)
type = "join"
message = ""
elsif m.events.include?(:part)
type = "part"
end

data = {
:nick => nick,
:date => Time.now,
:type => type
}
if !message.empty?
data[:text] = message
end

Channel.add_log_message(m.channel.name, data)
end

def grep(m, query)
if m.channel?
regexp = Regexp.new(query) rescue Regexp.new(Regexp.escape(query))
matches = []
count = 0
Log.find_each(:"messages.text" => regexp, :channel_id => m.channel.name, :limit => 5, :order => "created_at desc") do |log|
if count >= 10
m.user.send ">>>> TOO MANY RESULTS<<<<<"
break
end

log.messages.each do |message|
if message["text"] =~ regexp && message["text"] !~ /^\!grep\s/
m.user.send Log.format_message(message)

count += 1
end
end
end

end
end
end

register_plugin LoggerPlugin

0 comments on commit 5b9c0d8

Please sign in to comment.