diff --git a/chat/command.go b/chat/command.go index 5f84dad..536de69 100644 --- a/chat/command.go +++ b/chat/command.go @@ -461,26 +461,19 @@ func InitCommands(c *Commands) { c.Add(Command{ Prefix: "/away", - PrefixHelp: "[AWAY MESSAGE]", + PrefixHelp: "[REASON]", + Help: "Set away reason, or empty to unset.", Handler: func(room *Room, msg message.CommandMsg) error { awayMsg := strings.TrimSpace(strings.TrimLeft(msg.Body(), "/away")) isAway, _, _ := msg.From().GetAway() - if awayMsg == "" { - if isAway { - msg.From().SetActive() - room.Send(message.NewSystemMsg("You are marked as active, welcome back!", msg.From())) - room.Send(message.NewEmoteMsg("is back", msg.From())) - return nil - } - - room.Send(message.NewSystemMsg("Not away. Add an away message to set away.", msg.From())) - return nil - } - msg.From().SetAway(awayMsg) - room.Send(message.NewSystemMsg("You are marked as away, enjoy your excursion!", msg.From())) - - room.Send(message.NewEmoteMsg("has gone away: "+awayMsg, msg.From())) + if awayMsg != "" { + room.Send(message.NewEmoteMsg("has gone away: "+awayMsg, msg.From())) + } else if !isAway { + room.Send(message.NewSystemMsg("Not away. Append a reason message to set away.", msg.From())) + } else { + room.Send(message.NewEmoteMsg("is back.", msg.From())) + } return nil }, }) diff --git a/chat/message/user.go b/chat/message/user.go index d00fdb1..cdb0b29 100644 --- a/chat/message/user.go +++ b/chat/message/user.go @@ -33,13 +33,12 @@ type User struct { screen io.WriteCloser closeOnce sync.Once - mu sync.Mutex - config UserConfig - replyTo *User // Set when user gets a /msg, for replying. - - lastMsg time.Time // When the last message was rendered - awayStatus string // user's away status - awaySince time.Time + mu sync.Mutex + config UserConfig + replyTo *User // Set when user gets a /msg, for replying. + lastMsg time.Time // When the last message was rendered. + awayReason string // Away reason, "" when not away. + awaySince time.Time // When away was set, 0 when not away. } func NewUser(identity Identifier) *User { @@ -74,31 +73,24 @@ func (u *User) LastMsg() time.Time { return u.lastMsg } -// SetAway sets the users availablity state +// SetAway sets the users away reason and state. func (u *User) SetAway(msg string) { u.mu.Lock() defer u.mu.Unlock() - u.awayStatus = msg - if msg != "" { + u.awayReason = msg + if msg == "" { + u.awaySince = time.Time{} + } else { + // Reset away timer even if already away u.awaySince = time.Now() } } -// SetActive sets the users as active -func (u *User) SetActive() { - u.mu.Lock() - defer u.mu.Unlock() - u.awayStatus = "" -} - -// GetAway returns if the user is away, when they went away and if they set a message +// GetAway returns if the user is away, when they went away, and the reason. func (u *User) GetAway() (bool, time.Time, string) { u.mu.Lock() defer u.mu.Unlock() - if u.awayStatus == "" { - return false, time.Time{}, "" - } - return true, u.awaySince, u.awayStatus + return u.awayReason != "", u.awaySince, u.awayReason } func (u *User) Config() UserConfig { diff --git a/identity.go b/identity.go index 8dd02ea..7303377 100644 --- a/identity.go +++ b/identity.go @@ -63,11 +63,13 @@ func (i Identity) Whois(room *chat.Room) string { if i.PublicKey() != nil { fingerprint = sshd.Fingerprint(i.PublicKey()) } + // TODO: Rewrite this using strings.Builder like WhoisAdmin + awayMsg := "" if m, ok := room.MemberByID(i.ID()); ok { isAway, awaySince, awayMessage := m.GetAway() if isAway { - awayMsg = fmt.Sprintf("%s > away since: (%s) %s", message.Newline, humantime.Since(awaySince), awayMessage) + awayMsg = fmt.Sprintf("%s > away: (%s ago) %s", message.Newline, humantime.Since(awaySince), awayMessage) } } return "name: " + i.Name() + message.Newline +