cli: Count unread messages and handle message updates

This commit is contained in:
John Brooks 2016-10-26 15:17:40 -06:00
parent e7a9f991f9
commit 60cdd16311
2 changed files with 61 additions and 11 deletions

View File

@ -236,13 +236,6 @@ func (c *Client) onContactEvent(event *ricochet.ContactEvent) {
} }
func (c *Client) onConversationEvent(event *ricochet.ConversationEvent) { func (c *Client) onConversationEvent(event *ricochet.ConversationEvent) {
// XXX Ignoring updates, errors, etc
if event.Type != ricochet.ConversationEvent_RECEIVE &&
event.Type != ricochet.ConversationEvent_SEND &&
event.Type != ricochet.ConversationEvent_POPULATE {
return
}
message := event.Msg message := event.Msg
if event.Type == ricochet.ConversationEvent_POPULATE && message == nil { if event.Type == ricochet.ConversationEvent_POPULATE && message == nil {
@ -251,7 +244,8 @@ func (c *Client) onConversationEvent(event *ricochet.ConversationEvent) {
return return
} }
if message == nil || message.Recipient == nil || message.Sender == nil { if message == nil || message.Recipient == nil || message.Sender == nil ||
(message.Sender.IsSelf && message.Recipient.IsSelf) {
log.Printf("Ignoring invalid conversation event: %v", event) log.Printf("Ignoring invalid conversation event: %v", event)
return return
} }
@ -269,8 +263,21 @@ func (c *Client) onConversationEvent(event *ricochet.ConversationEvent) {
return return
} }
remoteContact.Conversation.AddMessage(message, switch event.Type {
event.Type == ricochet.ConversationEvent_POPULATE) case ricochet.ConversationEvent_POPULATE:
fallthrough
case ricochet.ConversationEvent_RECEIVE:
fallthrough
case ricochet.ConversationEvent_SEND:
remoteContact.Conversation.AddMessage(message,
event.Type == ricochet.ConversationEvent_POPULATE)
case ricochet.ConversationEvent_UPDATE:
remoteContact.Conversation.UpdateMessage(message)
default:
log.Printf("Ignoring conversation event with unknown type: %v", event)
}
} }
func (c *Client) NetworkControlStatus() ricochet.TorControlStatus { func (c *Client) NetworkControlStatus() ricochet.TorControlStatus {

View File

@ -26,7 +26,8 @@ type Conversation struct {
Client *Client Client *Client
Contact *Contact Contact *Contact
messages []*ricochet.Message messages []*ricochet.Message
numUnread int
} }
// Send an outbound message to the contact and add that message into the // Send an outbound message to the contact and add that message into the
@ -62,6 +63,9 @@ func (c *Conversation) AddMessage(msg *ricochet.Message, populating bool) {
} }
c.messages = append(c.messages, msg) c.messages = append(c.messages, msg)
if msg.Status == ricochet.Message_UNREAD {
c.numUnread++
}
c.trimBacklog() c.trimBacklog()
if !populating { if !populating {
// XXX Need to do mark-as-read when displaying received messages in // XXX Need to do mark-as-read when displaying received messages in
@ -72,6 +76,31 @@ func (c *Conversation) AddMessage(msg *ricochet.Message, populating bool) {
} }
} }
func (c *Conversation) UpdateMessage(updatedMsg *ricochet.Message) {
if err := c.validateMessage(updatedMsg); err != nil {
log.Printf("Rejected conversation message update: %v", err)
return
}
for i := len(c.messages) - 1; i >= 0; i-- {
msg := c.messages[i]
if msg.Sender.IsSelf != updatedMsg.Sender.IsSelf ||
msg.Identifier != updatedMsg.Identifier {
continue
}
if msg.Status == ricochet.Message_UNREAD &&
updatedMsg.Status != ricochet.Message_UNREAD {
c.numUnread--
}
c.messages[i] = updatedMsg
return
}
log.Printf("Ignoring message update for unknown message: %v", updatedMsg)
}
// XXX // XXX
func (c *Conversation) AddStatusMessage(text string, backlog bool) { func (c *Conversation) AddStatusMessage(text string, backlog bool) {
} }
@ -141,6 +170,7 @@ func (c *Conversation) PrintContext() {
func (c *Conversation) trimBacklog() { func (c *Conversation) trimBacklog() {
if len(c.messages) > backlogHardLimit { if len(c.messages) > backlogHardLimit {
c.messages = c.messages[len(c.messages)-backlogHardLimit:] c.messages = c.messages[len(c.messages)-backlogHardLimit:]
c.recountUnread()
} }
if len(c.messages) <= backlogSoftLimit { if len(c.messages) <= backlogSoftLimit {
return return
@ -230,3 +260,16 @@ func (c *Conversation) printMessage(msg *ricochet.Message) {
fmt.Fprintf(ui.Input.Stdout(), "\r\x1b[31m( \x1b[39mNew message from \x1b[31m%s\x1b[39m -- \x1b[1m/%d\x1b[0m to view \x1b[31m)\x1b[39m\n", contact.Data.Nickname, contact.Data.Id) fmt.Fprintf(ui.Input.Stdout(), "\r\x1b[31m( \x1b[39mNew message from \x1b[31m%s\x1b[39m -- \x1b[1m/%d\x1b[0m to view \x1b[31m)\x1b[39m\n", contact.Data.Nickname, contact.Data.Id)
*/ */
} }
func (c *Conversation) UnreadCount() int {
return c.numUnread
}
func (c *Conversation) recountUnread() {
c.numUnread = 0
for _, msg := range c.messages {
if msg.Status == ricochet.Message_UNREAD {
c.numUnread++
}
}
}