Makefile | 4 ++++ README | 2 +- daemon.go | 15 ++++++++++++--- daemon_test.go | 4 ++-- goircd.go | 5 +++-- room_test.go | 4 ++-- diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..b005951c41f4f5a53349da26ef75c9acccbfbe4566dff9020173ec5e4b12306c --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +LDFLAGS="-X main.version \"$(shell git describe --tags)\"" + +goircd: + go install -ldflags $(LDFLAGS) $(BUILD_FLAGS) diff --git a/README b/README index 33b8fcde1206fd213c2024f055f98e84518eac744f3bd7f0677ea8c61c04974d..33a9926718167c0658ef59343acba65ffc956e032f36d04705b682d2c05dbeda 100644 --- a/README +++ b/README @@ -40,7 +40,7 @@ * PASS/NICK/USER during registration workflow * PING/PONGs * NOTICE/PRIVMSG -* MOTD, LUSERS, WHO, WHOIS, QUIT +* MOTD, LUSERS, WHO, WHOIS, VERSION, QUIT * LIST, JOIN, TOPIC, +k/-k channel MODE USAGE diff --git a/daemon.go b/daemon.go index 5b49523716a178f2558a590a673b1e1d7196683bc33aa2ca45001908482b7d6a..8f58c6e0340e7ddefd68b22868260b6336741a8d720bb8e30355c14d163494fd 100644 --- a/daemon.go +++ b/daemon.go @@ -43,6 +43,7 @@ var passwordsRefreshLock sync.Mutex type Daemon struct { Verbose bool + version string hostname string motd string clients map[*Client]bool @@ -55,8 +56,8 @@ stateSink chan<- StateEvent passwords map[string]string } -func NewDaemon(hostname, motd string, logSink chan<- LogEvent, stateSink chan<- StateEvent) *Daemon { - daemon := Daemon{hostname: hostname, motd: motd} +func NewDaemon(version, hostname, motd string, logSink chan<- LogEvent, stateSink chan<- StateEvent) *Daemon { + daemon := Daemon{version: version, hostname: hostname, motd: motd} daemon.clients = make(map[*Client]bool) daemon.clientAliveness = make(map[*Client]*ClientAlivenessState) daemon.rooms = make(map[string]*Room) @@ -205,7 +206,7 @@ } passwordsRefreshLock.Unlock() client.registered = true client.ReplyNicknamed("001", "Hi, welcome to IRC") - client.ReplyNicknamed("002", "Your host is "+daemon.hostname+", running goircd") + client.ReplyNicknamed("002", "Your host is "+daemon.hostname+", running goircd "+daemon.version) client.ReplyNicknamed("003", "This server was created sometime") client.ReplyNicknamed("004", daemon.hostname+" goircd o o") daemon.SendLusers(client) @@ -458,6 +459,14 @@ } cols := strings.Split(cols[1], " ") nicknames := strings.Split(cols[len(cols)-1], ",") daemon.SendWhois(client, nicknames) + case "VERSION": + var debug string + if daemon.Verbose { + debug = "debug" + } else { + debug = "" + } + client.ReplyNicknamed("351", fmt.Sprintf("%s.%s %s :", daemon.version, debug, daemon.hostname)) default: client.ReplyNicknamed("421", command, "Unknown command") } diff --git a/daemon_test.go b/daemon_test.go index 001fd8daee715b38873af5da6d57aa13c75c74802e5b7c2e49f541c7507cf211..456b84862e973a574dc23bc5dbf6281d5c6822816e45189f0c841c8348c8585c 100644 --- a/daemon_test.go +++ b/daemon_test.go @@ -25,7 +25,7 @@ "testing" ) func TestRegistrationWorkflow(t *testing.T) { - daemon := NewDaemon("foohost", "", nil, nil) + daemon := NewDaemon("ver1", "foohost", "", nil, nil) events := make(chan ClientEvent) go daemon.Processor(events) conn := NewTestingConn() @@ -120,7 +120,7 @@ fd.WriteString("catched\n") conn := NewTestingConn() client := NewClient("foohost", conn) - daemon := NewDaemon("foohost", fd.Name(), nil, nil) + daemon := NewDaemon("ver1", "foohost", fd.Name(), nil, nil) daemon.SendMotd(client) if r := <-conn.outbound; !strings.HasPrefix(r, ":foohost 375") { diff --git a/goircd.go b/goircd.go index b1a7cfccfb03754c4d7f01965195fb6ade3ac505324e211d139309b06de210ce..74851f8e0b2831da80f745dcbf2c502249fedee4b376c86ead3c9c9fd39a9131 100644 --- a/goircd.go +++ b/goircd.go @@ -32,6 +32,7 @@ "syscall" ) var ( + version string hostname = flag.String("hostname", "localhost", "Hostname") bind = flag.String("bind", ":6667", "Address to bind to") motd = flag.String("motd", "", "Path to MOTD file") @@ -67,7 +68,7 @@ log.Println(*logdir, "logger initialized") } stateSink := make(chan StateEvent) - daemon := NewDaemon(*hostname, *motd, logSink, stateSink) + daemon := NewDaemon(version, *hostname, *motd, logSink, stateSink) daemon.Verbose = *verbose if *statedir == "" { // Dummy statekeeper @@ -120,7 +121,7 @@ if err != nil { log.Fatalf("Can not listen on %s: %v", *bind, err) } } - log.Println("Listening on", *bind) + log.Println("goircd "+daemon.version+" listening on", *bind) if *passwords != "" { daemon.PasswordsRefresh() diff --git a/room_test.go b/room_test.go index e4fcfbc7f5c4ee83264aca5c4c38fe7a4678138b86567f7fbd7be9be02739883..c06d6b18354a55acba3b8418b64ce6c6e00462c4978f854959b54cfcf1afc4e6 100644 --- a/room_test.go +++ b/room_test.go @@ -26,7 +26,7 @@ func TestTwoUsers(t *testing.T) { logSink := make(chan LogEvent, 8) stateSink := make(chan StateEvent, 8) - daemon := NewDaemon("foohost", "", logSink, stateSink) + daemon := NewDaemon("ver1", "foohost", "", logSink, stateSink) events := make(chan ClientEvent) go daemon.Processor(events) @@ -100,7 +100,7 @@ func TestJoin(t *testing.T) { logSink := make(chan LogEvent, 8) stateSink := make(chan StateEvent, 8) - daemon := NewDaemon("foohost", "", logSink, stateSink) + daemon := NewDaemon("ver1", "foohost", "", logSink, stateSink) events := make(chan ClientEvent) go daemon.Processor(events) conn := NewTestingConn()