From 5bb0c8278d9c8a2075fc2cc11569b3d2f509112b Mon Sep 17 00:00:00 2001 From: Alex Bramley Date: Fri, 27 Sep 2013 22:19:40 +0100 Subject: [PATCH] Minimally invasive change to put logging behind a user-replaceable interface. This could probably be done better, and there are probably awful caveats and hidden gotchas with this approach. I REGRET NOTHING. --- client/connection.go | 14 ++++++++----- client/connection_test.go | 2 -- client/dispatch.go | 2 +- client/mocknetconn_test.go | 4 ++-- client/state_handlers.go | 2 +- logging/logging.go | 43 ++++++++++++++++++++++++++++++++++++++ state/channel.go | 2 +- state/nick.go | 2 +- state/tracker.go | 2 +- state/tracker_test.go | 2 +- 10 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 logging/logging.go diff --git a/client/connection.go b/client/connection.go index d988a4e..c5ccc7b 100644 --- a/client/connection.go +++ b/client/connection.go @@ -4,8 +4,8 @@ import ( "bufio" "crypto/tls" "fmt" + "github.com/fluffle/goirc/logging" "github.com/fluffle/goirc/state" - "github.com/fluffle/golog/logging" "io" "net" "strings" @@ -107,9 +107,13 @@ func SimpleClient(nick string, args ...string) *Conn { } func Client(cfg *Config) *Conn { - logging.InitFromFlags() - if cfg == nil || cfg.Me == nil || cfg.Me.Nick == "" || cfg.Me.Ident == "" { - logging.Fatal("irc.Client(): Both cfg.Nick and cfg.Ident must be non-empty.") + if cfg == nil { + cfg = NewConfig("__idiot__") + } + if cfg.Me == nil || cfg.Me.Nick == "" || cfg.Me.Ident == "" { + cfg.Me = state.NewNick("__idiot__") + cfg.Me.Ident = "goirc" + cfg.Me.Name = "Powered by GoIRC" } conn := &Conn{ cfg: cfg, @@ -309,7 +313,7 @@ func (conn *Conn) write(line string) { if !conn.cfg.Flood { if t := conn.rateLimit(len(line)); t != 0 { // sleep for the current line's time value before sending it - logging.Debug("irc.rateLimit(): Flood! Sleeping for %.2f secs.", + logging.Info("irc.rateLimit(): Flood! Sleeping for %.2f secs.", t.Seconds()) <-time.After(t) } diff --git a/client/connection_test.go b/client/connection_test.go index 832b6b0..03f6102 100644 --- a/client/connection_test.go +++ b/client/connection_test.go @@ -3,7 +3,6 @@ package client import ( "code.google.com/p/gomock/gomock" "github.com/fluffle/goirc/state" - "github.com/fluffle/golog/logging" "strings" "testing" "time" @@ -22,7 +21,6 @@ func setUp(t *testing.T, start ...bool) (*Conn, *testState) { st := state.NewMockTracker(ctrl) nc := MockNetConn(t) c := SimpleClient("test", "test", "Testing IRC") - logging.SetLogLevel(logging.LogFatal) c.st = st c.sock = nc diff --git a/client/dispatch.go b/client/dispatch.go index 1af35fb..844383f 100644 --- a/client/dispatch.go +++ b/client/dispatch.go @@ -1,7 +1,7 @@ package client import ( - "github.com/fluffle/golog/logging" + "github.com/fluffle/goirc/logging" "runtime" "strings" "sync" diff --git a/client/mocknetconn_test.go b/client/mocknetconn_test.go index 1159268..06f1393 100644 --- a/client/mocknetconn_test.go +++ b/client/mocknetconn_test.go @@ -136,11 +136,11 @@ func (m *mockNetConn) Close() error { } func (m *mockNetConn) LocalAddr() net.Addr { - return &net.IPAddr{net.IPv4(127, 0, 0, 1)} + return &net.IPAddr{net.IPv4(127, 0, 0, 1), ""} } func (m *mockNetConn) RemoteAddr() net.Addr { - return &net.IPAddr{net.IPv4(127, 0, 0, 1)} + return &net.IPAddr{net.IPv4(127, 0, 0, 1), ""} } func (m *mockNetConn) SetDeadline(t time.Time) error { diff --git a/client/state_handlers.go b/client/state_handlers.go index 7a21e9a..4c99083 100644 --- a/client/state_handlers.go +++ b/client/state_handlers.go @@ -4,7 +4,7 @@ package client // to manage tracking state for an IRC connection import ( - "github.com/fluffle/golog/logging" + "github.com/fluffle/goirc/logging" "strings" ) diff --git a/logging/logging.go b/logging/logging.go new file mode 100644 index 0000000..bd54416 --- /dev/null +++ b/logging/logging.go @@ -0,0 +1,43 @@ +package logging + +// The IRC client will log things using these methods +type Logger interface { + // Debug logging of raw socket comms to/from server. + Debug(format string, args ...interface{}) + // Informational logging about client behaviour. + Info(format string, args ...interface{}) + // Warnings of inconsistent or unexpected data, mostly + // related to state tracking of IRC nicks/chans. + Warn(format string, args ...interface{}) + // Errors, mostly to do with network communication. + Error(format string, args ...interface{}) +} + +// By default we do no logging. Logging is enabled or disabled +// at the package level, since I'm lazy and re-re-reorganising +// my code to pass a per-client-struct Logger around to all the +// state objects is a pain in the arse. +var logger Logger = nullLogger{} + +// SetLogger sets the internal goirc Logger to l. If l is nil, +// a dummy logger that does nothing is installed instead. +func SetLogger(l Logger) { + if l == nil { + logger = nullLogger{} + } else { + logger = l + } +} + +// A nullLogger does nothing while fulfilling Logger. +type nullLogger struct{} +func (nl nullLogger) Debug(f string, a ...interface{}) {} +func (nl nullLogger) Info(f string, a ...interface{}) {} +func (nl nullLogger) Warn(f string, a ...interface{}) {} +func (nl nullLogger) Error(f string, a ...interface{}) {} + +// Shim functions so that the package can be used directly +func Debug(f string, a ...interface{}) { logger.Debug(f, a...) } +func Info(f string, a ...interface{}) { logger.Info(f, a...) } +func Warn(f string, a ...interface{}) { logger.Warn(f, a...) } +func Error(f string, a ...interface{}) { logger.Error(f, a...) } diff --git a/state/channel.go b/state/channel.go index 5067348..55d5a6b 100644 --- a/state/channel.go +++ b/state/channel.go @@ -2,7 +2,7 @@ package state import ( "fmt" - "github.com/fluffle/golog/logging" + "github.com/fluffle/goirc/logging" "reflect" "strconv" ) diff --git a/state/nick.go b/state/nick.go index 96a0b48..b70f612 100644 --- a/state/nick.go +++ b/state/nick.go @@ -1,7 +1,7 @@ package state import ( - "github.com/fluffle/golog/logging" + "github.com/fluffle/goirc/logging" "reflect" ) diff --git a/state/tracker.go b/state/tracker.go index 893b68d..b666dfd 100644 --- a/state/tracker.go +++ b/state/tracker.go @@ -1,7 +1,7 @@ package state import ( - "github.com/fluffle/golog/logging" + "github.com/fluffle/goirc/logging" ) // The state manager interface diff --git a/state/tracker_test.go b/state/tracker_test.go index e6f3584..633f0aa 100644 --- a/state/tracker_test.go +++ b/state/tracker_test.go @@ -1,7 +1,7 @@ package state import ( - "github.com/fluffle/golog/logging" + "github.com/fluffle/goirc/logging" "testing" )