diff --git a/Dockerfile b/Dockerfile index 83f06cc..4df88d1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.3.3 +FROM golang:1.4 MAINTAINER Alvin Lai RUN apt-get update diff --git a/client.go b/client.go index 639b5e4..5063736 100644 --- a/client.go +++ b/client.go @@ -22,6 +22,7 @@ const HELP_TEXT string = SYSTEM_MESSAGE_FORMAT + `-> Available commands: /nick $NAME - Rename yourself to a new name. /whois $NAME - Display information about another connected user. /msg $NAME $MESSAGE - Sends a private message to a user. + /motd - Prints the Message of the Day ` + RESET const OP_HELP_TEXT string = SYSTEM_MESSAGE_FORMAT + `-> Available operator commands: @@ -33,6 +34,7 @@ const OP_HELP_TEXT string = SYSTEM_MESSAGE_FORMAT + `-> Available operator comma /kick $NAME - Kick em' out. /op $NAME - Promote a user to server operator. /silence $NAME - Revoke a user's ability to speak. + /motd $MESSAGE - Sets the Message of the Day ` + RESET const ABOUT_TEXT string = SYSTEM_MESSAGE_FORMAT + `-> ssh-chat is made by @shazow. @@ -319,6 +321,21 @@ func (c *Client) handleShell(channel ssh.Channel) { if err := c.Server.Privmsg(parts[1], parts[2], c); nil != err { c.Msg <- fmt.Sprintf("Unable to send message to %v: %v", parts[1], err) } + case "/motd": /* print motd */ + if !c.Server.IsOp(c) { + c.Server.MotdUnicast(c) + } else if len(parts) < 2 { + c.Server.MotdUnicast(c) + } else { + var newmotd string + if (len(parts) == 2) { + newmotd = parts[1] + } else { + newmotd = parts[1] + " " + parts[2] + } + c.Server.SetMotd(c, newmotd) + c.Server.MotdBroadcast(c) + } default: c.SysMsg("Invalid command: %s", line) diff --git a/server.go b/server.go index a542212..fed40eb 100644 --- a/server.go +++ b/server.go @@ -30,6 +30,7 @@ type Server struct { lock sync.Mutex count int history *History + motd string admins map[string]struct{} // fingerprint lookup bannedPk map[string]*time.Time // fingerprint lookup bannedIp map[net.Addr]*time.Time @@ -47,6 +48,7 @@ func NewServer(privateKey []byte) (*Server, error) { clients: Clients{}, count: 0, history: NewHistory(HISTORY_LEN), + motd: "Message of the Day! Modify with /motd", admins: map[string]struct{}{}, bannedPk: map[string]*time.Time{}, bannedIp: map[net.Addr]*time.Time{}, @@ -115,8 +117,26 @@ func (s *Server) Privmsg(nick, message string, sender *Client) error { return nil } +func (s *Server) SetMotd(client *Client, motd string) { + s.lock.Lock() + s.motd = motd + s.lock.Unlock() +} + +func (s *Server) MotdUnicast(client *Client) { + client.SysMsg("/** MOTD") + client.SysMsg(" * " + ColorString("36", s.motd)) /* a nice cyan color */ + client.SysMsg(" **/") +} + +func (s *Server) MotdBroadcast(client *Client) { + s.Broadcast(ContinuousFormat(SYSTEM_MESSAGE_FORMAT, fmt.Sprintf(" * New MOTD set by %s.", client.ColoredName())), client) + s.Broadcast(" /**\r\n" + " * " + ColorString("36", s.motd) + "\r\n **/", client) +} + func (s *Server) Add(client *Client) { go func() { + s.MotdUnicast(client) client.SendLines(s.history.Get(10)) client.SysMsg("Welcome to ssh-chat. Enter /help for more.") }()