diff --git a/core/conversation.go b/core/conversation.go index 7c28042..c91a7ec 100644 --- a/core/conversation.go +++ b/core/conversation.go @@ -136,9 +136,7 @@ func (c *Conversation) Send(text string) (*ricochet.Message, error) { message.Status = ricochet.Message_QUEUED } } else { - // XXX go-ricochet doesn't support message IDs & ack properly yet, so skip SENDING - //message.Status = ricochet.Message_SENDING - message.Status = ricochet.Message_DELIVERED + message.Status = ricochet.Message_SENDING } c.messages = append(c.messages, message) @@ -177,9 +175,7 @@ func (c *Conversation) SendQueuedMessages() int { break } } else { - // XXX go-ricochet doesn't support message IDs & ack properly yet, so skip SENDING - //message.Status = ricochet.Message_SENDING - message.Status = ricochet.Message_DELIVERED + message.Status = ricochet.Message_SENDING sent++ } @@ -229,11 +225,10 @@ func (c *Conversation) ChatMessage(messageID uint32, when time.Time, message str return true } -func (c *Conversation) ChatMessageAck(messageID uint32) { - // XXX no success field - log.Printf("chat ack: %d", messageID) +func (c *Conversation) ChatMessageAck(messageID uint32, accepted bool) { + log.Printf("chat ack: %d %v", messageID, accepted) - c.UpdateSentStatus(uint64(messageID), true) + c.UpdateSentStatus(uint64(messageID), accepted) } func (c *Conversation) sendMessageToConnection(message *ricochet.Message) (connected bool, err error) { @@ -259,8 +254,11 @@ func (c *Conversation) sendMessageToConnection(message *ricochet.Message) (conne return errors.New("invalid chat channel") } - // XXX message id and all of that - chat.SendMessage(message.Text) + // Set message.Timestamp now if unset + if message.Timestamp == 0 { + message.Timestamp = time.Now().Unix() + } + message.Identifier = uint64(chat.SendMessageWithTime(message.Text, time.Unix(message.Timestamp, 0))) return nil }) diff --git a/vendor/github.com/s-rah/go-ricochet/application/application.go b/vendor/github.com/s-rah/go-ricochet/application/application.go index 4338899..67ce40f 100644 --- a/vendor/github.com/s-rah/go-ricochet/application/application.go +++ b/vendor/github.com/s-rah/go-ricochet/application/application.go @@ -60,7 +60,7 @@ func (rai *RicochetApplicationInstance) ChatMessage(messageID uint32, when time. return true } -func (rai *RicochetApplicationInstance) ChatMessageAck(messageID uint32) { +func (rai *RicochetApplicationInstance) ChatMessageAck(messageID uint32, accepted bool) { rai.ChatMessageAckHandler(rai, messageID) } diff --git a/vendor/github.com/s-rah/go-ricochet/channels/chatchannel.go b/vendor/github.com/s-rah/go-ricochet/channels/chatchannel.go index c4e6e19..01ba01e 100644 --- a/vendor/github.com/s-rah/go-ricochet/channels/chatchannel.go +++ b/vendor/github.com/s-rah/go-ricochet/channels/chatchannel.go @@ -35,22 +35,34 @@ type ChatChannelHandler interface { // the message successfully, and false to NACK and refuse the message. ChatMessage(messageID uint32, when time.Time, message string) bool // ChatMessageAck is called when an acknowledgement of a sent message is received. - ChatMessageAck(messageID uint32) + ChatMessageAck(messageID uint32, accepted bool) } -// SendMessage sends a given message using this channe -func (cc *ChatChannel) SendMessage(message string) { +// SendMessage sends a given message using this channel, and returns the +// messageID, which will be used in ChatMessageAck when the peer acknowledges +// this message. +func (cc *ChatChannel) SendMessage(message string) uint32 { + return cc.SendMessageWithTime(message, time.Now()) +} + +// SendMessageWithTime is identical to SendMessage, but also sends the provided time.Time +// as a rough timestamp for when this message was originally sent. This should be used +// when retrying or sending queued messages. +func (cc *ChatChannel) SendMessageWithTime(message string, when time.Time) uint32 { + delta := time.Now().Sub(when) / time.Second messageBuilder := new(utils.MessageBuilder) - //TODO Implement Chat Number - data := messageBuilder.ChatMessage(message, cc.lastMessageID) + messageID := cc.lastMessageID cc.lastMessageID++ + data := messageBuilder.ChatMessage(message, messageID, int64(delta)) cc.channel.SendMessage(data) + return messageID } -// Acknowledge indicates the given messageID was received -func (cc *ChatChannel) Acknowledge(messageID uint32) { +// Acknowledge indicates that the given messageID was received, and whether +// it was accepted. +func (cc *ChatChannel) Acknowledge(messageID uint32, accepted bool) { messageBuilder := new(utils.MessageBuilder) - cc.channel.SendMessage(messageBuilder.AckChatMessage(messageID)) + cc.channel.SendMessage(messageBuilder.AckChatMessage(messageID, accepted)) } // Type returns the type string for this channel, e.g. "im.ricochet.chat". @@ -132,13 +144,9 @@ func (cc *ChatChannel) Packet(data []byte) { if err == nil { if res.GetChatMessage() != nil { ack := cc.Handler.ChatMessage(res.GetChatMessage().GetMessageId(), time.Now(), res.GetChatMessage().GetMessageText()) - if ack { - cc.Acknowledge(res.GetChatMessage().GetMessageId()) - } else { - //XXX - } - } else if res.GetChatAcknowledge() != nil { - cc.Handler.ChatMessageAck(res.GetChatMessage().GetMessageId()) + cc.Acknowledge(res.GetChatMessage().GetMessageId(), ack) + } else if ack := res.GetChatAcknowledge(); ack != nil { + cc.Handler.ChatMessageAck(ack.GetMessageId(), ack.GetAccepted()) } // XXX? } diff --git a/vendor/github.com/s-rah/go-ricochet/examples/echobot/main.go b/vendor/github.com/s-rah/go-ricochet/examples/echobot/main.go index d3a341f..362c3a5 100644 --- a/vendor/github.com/s-rah/go-ricochet/examples/echobot/main.go +++ b/vendor/github.com/s-rah/go-ricochet/examples/echobot/main.go @@ -32,7 +32,7 @@ func (echobot *RicochetEchoBot) ChatMessage(messageID uint32, when time.Time, me return true } -func (echobot *RicochetEchoBot) ChatMessageAck(messageID uint32) { +func (echobot *RicochetEchoBot) ChatMessageAck(messageID uint32, accepted bool) { } diff --git a/vendor/github.com/s-rah/go-ricochet/utils/messagebuilder.go b/vendor/github.com/s-rah/go-ricochet/utils/messagebuilder.go index bd5616f..9b932f1 100644 --- a/vendor/github.com/s-rah/go-ricochet/utils/messagebuilder.go +++ b/vendor/github.com/s-rah/go-ricochet/utils/messagebuilder.go @@ -195,10 +195,11 @@ func (mb *MessageBuilder) AuthResult(accepted bool, isKnownContact bool) []byte } // ChatMessage constructs a chat message with the given content. -func (mb *MessageBuilder) ChatMessage(message string, messageID uint32) []byte { +func (mb *MessageBuilder) ChatMessage(message string, messageID uint32, timeDelta int64) []byte { cm := &Protocol_Data_Chat.ChatMessage{ MessageId: proto.Uint32(messageID), MessageText: proto.String(message), + TimeDelta: proto.Int64(timeDelta), } chatPacket := &Protocol_Data_Chat.Packet{ ChatMessage: cm, @@ -209,10 +210,10 @@ func (mb *MessageBuilder) ChatMessage(message string, messageID uint32) []byte { } // AckChatMessage constructs a chat message acknowledgement. -func (mb *MessageBuilder) AckChatMessage(messageID uint32) []byte { +func (mb *MessageBuilder) AckChatMessage(messageID uint32, accepted bool) []byte { cr := &Protocol_Data_Chat.ChatAcknowledge{ MessageId: proto.Uint32(messageID), - Accepted: proto.Bool(true), + Accepted: proto.Bool(accepted), } pc := &Protocol_Data_Chat.Packet{ ChatAcknowledge: cr, diff --git a/vendor/manifest b/vendor/manifest index 2684816..d674609 100644 --- a/vendor/manifest +++ b/vendor/manifest @@ -63,7 +63,7 @@ "importpath": "github.com/s-rah/go-ricochet", "repository": "https://github.com/special/go-ricochet-protocol", "vcs": "git", - "revision": "5b54d50bf4611a36c23dd732bd1e9d0dad441980", + "revision": "e5211eec18a2b58d379e232088154925439a74c0", "branch": "api-rework-fixes", "notests": true },