Merge branch 'fix/chatchannel-api' of https://github.com/special/go-ricochet-protocol into special-fix/chatchannel-api

This commit is contained in:
Sarah Jamie Lewis 2017-11-02 15:45:09 -07:00
commit 8fe7b84fc9
6 changed files with 32 additions and 23 deletions

View File

@ -60,7 +60,7 @@ func (rai *RicochetApplicationInstance) ChatMessage(messageID uint32, when time.
return true return true
} }
func (rai *RicochetApplicationInstance) ChatMessageAck(messageID uint32) { func (rai *RicochetApplicationInstance) ChatMessageAck(messageID uint32, accepted bool) {
rai.ChatMessageAckHandler(rai, messageID) rai.ChatMessageAckHandler(rai, messageID)
} }

View File

@ -35,22 +35,34 @@ type ChatChannelHandler interface {
// the message successfully, and false to NACK and refuse the message. // the message successfully, and false to NACK and refuse the message.
ChatMessage(messageID uint32, when time.Time, message string) bool ChatMessage(messageID uint32, when time.Time, message string) bool
// ChatMessageAck is called when an acknowledgement of a sent message is received. // 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 // SendMessage sends a given message using this channel, and returns the
func (cc *ChatChannel) SendMessage(message string) { // 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) messageBuilder := new(utils.MessageBuilder)
//TODO Implement Chat Number messageID := cc.lastMessageID
data := messageBuilder.ChatMessage(message, cc.lastMessageID)
cc.lastMessageID++ cc.lastMessageID++
data := messageBuilder.ChatMessage(message, messageID, int64(delta))
cc.channel.SendMessage(data) cc.channel.SendMessage(data)
return messageID
} }
// Acknowledge indicates the given messageID was received // Acknowledge indicates that the given messageID was received, and whether
func (cc *ChatChannel) Acknowledge(messageID uint32) { // it was accepted.
func (cc *ChatChannel) Acknowledge(messageID uint32, accepted bool) {
messageBuilder := new(utils.MessageBuilder) 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". // 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 err == nil {
if res.GetChatMessage() != nil { if res.GetChatMessage() != nil {
ack := cc.Handler.ChatMessage(res.GetChatMessage().GetMessageId(), time.Now(), res.GetChatMessage().GetMessageText()) ack := cc.Handler.ChatMessage(res.GetChatMessage().GetMessageId(), time.Now(), res.GetChatMessage().GetMessageText())
if ack { cc.Acknowledge(res.GetChatMessage().GetMessageId(), ack)
cc.Acknowledge(res.GetChatMessage().GetMessageId()) } else if ack := res.GetChatAcknowledge(); ack != nil {
} else { cc.Handler.ChatMessageAck(ack.GetMessageId(), ack.GetAccepted())
//XXX
}
} else if res.GetChatAcknowledge() != nil {
cc.Handler.ChatMessageAck(res.GetChatMessage().GetMessageId())
} }
// XXX? // XXX?
} }

View File

@ -76,7 +76,7 @@ func (tcch *TestChatChannelHandler) ChatMessage(messageID uint32, when time.Time
return true return true
} }
func (tcch *TestChatChannelHandler) ChatMessageAck(messageID uint32) { func (tcch *TestChatChannelHandler) ChatMessageAck(messageID uint32, accepted bool) {
} }
@ -116,7 +116,7 @@ func TestChatChannelOperations(t *testing.T) {
t.Errorf("After Successful Result ChatChannel Is Still Pending") t.Errorf("After Successful Result ChatChannel Is Still Pending")
} }
chat := messageBuilder.ChatMessage("message text", 0) chat := messageBuilder.ChatMessage("message text", 0, 0)
chatChannel.Packet(chat) chatChannel.Packet(chat)
chatChannel.SendMessage("hello") chatChannel.SendMessage("hello")

View File

@ -32,7 +32,7 @@ func (echobot *RicochetEchoBot) ChatMessage(messageID uint32, when time.Time, me
return true return true
} }
func (echobot *RicochetEchoBot) ChatMessageAck(messageID uint32) { func (echobot *RicochetEchoBot) ChatMessageAck(messageID uint32, accepted bool) {
} }

View File

@ -195,10 +195,11 @@ func (mb *MessageBuilder) AuthResult(accepted bool, isKnownContact bool) []byte
} }
// ChatMessage constructs a chat message with the given content. // 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{ cm := &Protocol_Data_Chat.ChatMessage{
MessageId: proto.Uint32(messageID), MessageId: proto.Uint32(messageID),
MessageText: proto.String(message), MessageText: proto.String(message),
TimeDelta: proto.Int64(timeDelta),
} }
chatPacket := &Protocol_Data_Chat.Packet{ chatPacket := &Protocol_Data_Chat.Packet{
ChatMessage: cm, ChatMessage: cm,
@ -209,10 +210,10 @@ func (mb *MessageBuilder) ChatMessage(message string, messageID uint32) []byte {
} }
// AckChatMessage constructs a chat message acknowledgement. // 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{ cr := &Protocol_Data_Chat.ChatAcknowledge{
MessageId: proto.Uint32(messageID), MessageId: proto.Uint32(messageID),
Accepted: proto.Bool(true), Accepted: proto.Bool(accepted),
} }
pc := &Protocol_Data_Chat.Packet{ pc := &Protocol_Data_Chat.Packet{
ChatAcknowledge: cr, ChatAcknowledge: cr,

View File

@ -26,7 +26,7 @@ func TestOpenAuthenticationChannel(t *testing.T) {
func TestChatMessage(t *testing.T) { func TestChatMessage(t *testing.T) {
messageBuilder := new(MessageBuilder) messageBuilder := new(MessageBuilder)
messageBuilder.ChatMessage("Hello World", 0) messageBuilder.ChatMessage("Hello World", 0, 0)
// TODO: More Indepth Test Of Output // TODO: More Indepth Test Of Output
} }