]> Cypherpunks.ru repositories - goircd.git/commitdiff
Ability to show server's version
authorSergey Matveev <stargrave@stargrave.org>
Thu, 14 Aug 2014 10:31:34 +0000 (14:31 +0400)
committerSergey Matveev <stargrave@stargrave.org>
Thu, 14 Aug 2014 13:31:49 +0000 (17:31 +0400)
Makefile [new file with mode: 0644]
README
daemon.go
daemon_test.go
goircd.go
room_test.go

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..3a8e1ff
--- /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 852e4557c7d88877b3ebf87ab2357d5a3b78f97d..183e164b6cca06fd5b237cb1ff0975116a794ca8 100644 (file)
--- a/README
+++ b/README
@@ -40,7 +40,7 @@ SUPPORTED IRC COMMANDS
 * 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
index ffd2ef1ffb06c059c4e52e9f76c753a500bbda09..2bf696ce31229c86a744f0ee64d4c9f287894d32 100644 (file)
--- 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 @@ type Daemon struct {
        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 @@ func (daemon *Daemon) ClientRegister(client *Client, command string, cols []stri
                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 @@ func (daemon *Daemon) Processor(events <-chan ClientEvent) {
                                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")
                        }
index 9c9db3de436923a43540debbc7d582374db58a43..d049e42be2f38abe06aad2806b85ed659adddb22 100644 (file)
@@ -25,7 +25,7 @@ import (
 )
 
 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 @@ func TestMotd(t *testing.T) {
 
        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") {
index 984b47b94144c134e7bfc57158b52de13dddbf84..f70e11c68e9a21d31fb98460ea1d41451075aedd 100644 (file)
--- a/goircd.go
+++ b/goircd.go
@@ -32,6 +32,7 @@ import (
 )
 
 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 @@ func Run() {
        }
 
        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 @@ func Run() {
                        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()
index 9bfbc2380784a9addbb9fe7b00a60ee129c0dca7..0ad2cacc0364d5b6b410ee7b5f894184218b5a6c 100644 (file)
@@ -26,7 +26,7 @@ func notEnoughParams(t *testing.T, c *TestingConn) {
 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 TestTwoUsers(t *testing.T) {
 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()