threema refactory
This commit is contained in:
		
							parent
							
								
									39cd55266a
								
							
						
					
					
						commit
						b535a6f685
					
				| 
						 | 
					@ -19,13 +19,14 @@ func (a *Account) receiver(out chan<- stanza.Packet) {
 | 
				
			||||||
			out <- xMSG
 | 
								out <- xMSG
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		sender := receivedMessage.Msg.Sender().String()
 | 
							header := receivedMessage.Msg.Header()
 | 
				
			||||||
 | 
							sender := header.Sender.String()
 | 
				
			||||||
		if string(a.TID) == sender {
 | 
							if string(a.TID) == sender {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if p, err := a.receiving(receivedMessage.Msg); err != nil {
 | 
							if p, err := a.receiving(receivedMessage.Msg); err != nil {
 | 
				
			||||||
			xMSG := stanza.NewMessage(stanza.Attrs{Type: stanza.MessageTypeChat, From: sender, To: a.XMPP.String()})
 | 
								xMSG := stanza.NewMessage(stanza.Attrs{Type: stanza.MessageTypeChat, From: sender, To: a.XMPP.String()})
 | 
				
			||||||
			xMSG.Body = fmt.Sprintf("error on decoding message: %s\n%v", err, receivedMessage.Msg.Serialize())
 | 
								xMSG.Body = fmt.Sprintf("error on decoding message: %s\n%v", err, receivedMessage.Msg)
 | 
				
			||||||
			out <- xMSG
 | 
								out <- xMSG
 | 
				
			||||||
		} else if p != nil {
 | 
							} else if p != nil {
 | 
				
			||||||
			out <- p
 | 
								out <- p
 | 
				
			||||||
| 
						 | 
					@ -40,19 +41,20 @@ func requestExtensions(xMSG *stanza.Message) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *Account) receiving(receivedMessage o3.Message) (stanza.Packet, error) {
 | 
					func (a *Account) receiving(receivedMessage o3.Message) (stanza.Packet, error) {
 | 
				
			||||||
 | 
						header := receivedMessage.Header()
 | 
				
			||||||
 | 
						sender := header.Sender.String()
 | 
				
			||||||
	logger := log.WithFields(map[string]interface{}{
 | 
						logger := log.WithFields(map[string]interface{}{
 | 
				
			||||||
		"from": receivedMessage.Sender().String(),
 | 
							"from": header.Sender.String(),
 | 
				
			||||||
		"to":   a.XMPP.String(),
 | 
							"to":   a.XMPP.String(),
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	switch msg := receivedMessage.(type) {
 | 
						switch msg := receivedMessage.(type) {
 | 
				
			||||||
	case o3.TextMessage:
 | 
						case o3.TextMessage:
 | 
				
			||||||
		sender := msg.Sender().String()
 | 
							xMSG := stanza.NewMessage(stanza.Attrs{Type: stanza.MessageTypeChat, From: sender, To: a.XMPP.String(), Id: strconv.FormatUint(header.ID, 10)})
 | 
				
			||||||
		xMSG := stanza.NewMessage(stanza.Attrs{Type: stanza.MessageTypeChat, From: sender, To: a.XMPP.String(), Id: strconv.FormatUint(msg.ID(), 10)})
 | 
							xMSG.Body = msg.Body
 | 
				
			||||||
		xMSG.Body = msg.Text()
 | 
					 | 
				
			||||||
		requestExtensions(&xMSG)
 | 
							requestExtensions(&xMSG)
 | 
				
			||||||
		logger.WithField("text", xMSG.Body).Debug("send text")
 | 
							logger.WithField("text", xMSG.Body).Debug("send text")
 | 
				
			||||||
		return xMSG, nil
 | 
							return xMSG, nil
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
		case o3.AudioMessage:
 | 
							case o3.AudioMessage:
 | 
				
			||||||
			if a.threema.httpUploadPath == "" {
 | 
								if a.threema.httpUploadPath == "" {
 | 
				
			||||||
				return nil, errors.New("no place to store files at transport configurated")
 | 
									return nil, errors.New("no place to store files at transport configurated")
 | 
				
			||||||
| 
						 | 
					@ -62,7 +64,7 @@ func (a *Account) receiving(receivedMessage o3.Message) (stanza.Packet, error) {
 | 
				
			||||||
				logger.Warnf("unable to read data from message: %s", err)
 | 
									logger.Warnf("unable to read data from message: %s", err)
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		xMSG, err := a.FileToXMPP(msg.Sender().String(), msg.ID(), "mp3", data)
 | 
								xMSG, err := a.FileToXMPP(sender.String(), header.ID, "mp3", data)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				logger.Warnf("unable to create data from message: %s", err)
 | 
									logger.Warnf("unable to create data from message: %s", err)
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
| 
						 | 
					@ -81,7 +83,7 @@ func (a *Account) receiving(receivedMessage o3.Message) (stanza.Packet, error) {
 | 
				
			||||||
				logger.Warnf("unable to read data from message: %s", err)
 | 
									logger.Warnf("unable to read data from message: %s", err)
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		xMSG, err := a.FileToXMPP(msg.Sender().String(), msg.ID(), "jpg", data)
 | 
								xMSG, err := a.FileToXMPP(sender.String(), header.ID, "jpg", data)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				logger.Warnf("unable to create data from message: %s", err)
 | 
									logger.Warnf("unable to create data from message: %s", err)
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
| 
						 | 
					@ -90,27 +92,26 @@ func (a *Account) receiving(receivedMessage o3.Message) (stanza.Packet, error) {
 | 
				
			||||||
			requestExtensions(&xMSG)
 | 
								requestExtensions(&xMSG)
 | 
				
			||||||
			logger.WithField("url", xMSG.Body).Debug("send image")
 | 
								logger.WithField("url", xMSG.Body).Debug("send image")
 | 
				
			||||||
			return xMSG, nil
 | 
								return xMSG, nil
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
	case o3.DeliveryReceiptMessage:
 | 
						case o3.DeliveryReceiptMessage:
 | 
				
			||||||
		msgID := msg.MsgID()
 | 
							xMSG := stanza.NewMessage(stanza.Attrs{Type: stanza.MessageTypeChat, From: sender, To: a.XMPP.String()})
 | 
				
			||||||
		xMSG := stanza.NewMessage(stanza.Attrs{Type: stanza.MessageTypeChat, From: msg.Sender().String(), To: a.XMPP.String()})
 | 
					 | 
				
			||||||
		state := ""
 | 
							state := ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if msg.Status() == o3.MSGDELIVERED {
 | 
							if msg.Status == o3.MSGDELIVERED {
 | 
				
			||||||
			state = "delivered"
 | 
								state = "delivered"
 | 
				
			||||||
			if id, ok := a.deliveredMSG[msgID]; ok {
 | 
								if id, ok := a.deliveredMSG[msg.MessageID]; ok {
 | 
				
			||||||
				xMSG.Extensions = append(xMSG.Extensions, stanza.ReceiptReceived{ID: id})
 | 
									xMSG.Extensions = append(xMSG.Extensions, stanza.ReceiptReceived{ID: id})
 | 
				
			||||||
				xMSG.Extensions = append(xMSG.Extensions, stanza.MarkReceived{ID: id})
 | 
									xMSG.Extensions = append(xMSG.Extensions, stanza.MarkReceived{ID: id})
 | 
				
			||||||
				delete(a.deliveredMSG, msgID)
 | 
									delete(a.deliveredMSG, msg.MessageID)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				logger.Warnf("found not id in cache to announce received on xmpp side")
 | 
									logger.Warnf("found not id in cache to announce received on xmpp side")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if msg.Status() == o3.MSGREAD {
 | 
							if msg.Status == o3.MSGREAD {
 | 
				
			||||||
			state = "displayed"
 | 
								state = "displayed"
 | 
				
			||||||
			if id, ok := a.readedMSG[msgID]; ok {
 | 
								if id, ok := a.readedMSG[msg.MessageID]; ok {
 | 
				
			||||||
				xMSG.Extensions = append(xMSG.Extensions, stanza.MarkDisplayed{ID: id})
 | 
									xMSG.Extensions = append(xMSG.Extensions, stanza.MarkDisplayed{ID: id})
 | 
				
			||||||
				delete(a.readedMSG, msgID)
 | 
									delete(a.readedMSG, msg.MessageID)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				logger.Warnf("found not id in cache to announce readed on xmpp side")
 | 
									logger.Warnf("found not id in cache to announce readed on xmpp side")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -122,7 +123,7 @@ func (a *Account) receiving(receivedMessage o3.Message) (stanza.Packet, error) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return nil, nil
 | 
							return nil, nil
 | 
				
			||||||
	case o3.TypingNotificationMessage:
 | 
						case o3.TypingNotificationMessage:
 | 
				
			||||||
		xMSG := stanza.NewMessage(stanza.Attrs{Type: stanza.MessageTypeChat, From: msg.Sender().String(), To: a.XMPP.String(), Id: strconv.FormatUint(msg.ID(), 10)})
 | 
							xMSG := stanza.NewMessage(stanza.Attrs{Type: stanza.MessageTypeChat, From: sender, To: a.XMPP.String(), Id: strconv.FormatUint(header.ID, 10)})
 | 
				
			||||||
		if msg.OnOff != 0 {
 | 
							if msg.OnOff != 0 {
 | 
				
			||||||
			logger.Debug("composing")
 | 
								logger.Debug("composing")
 | 
				
			||||||
			xMSG.Extensions = append(xMSG.Extensions, stanza.StateComposing{})
 | 
								xMSG.Extensions = append(xMSG.Extensions, stanza.StateComposing{})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,12 +8,12 @@ import (
 | 
				
			||||||
	"gosrc.io/xmpp/stanza"
 | 
						"gosrc.io/xmpp/stanza"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const threemaID = "87654321"
 | 
					const threemaFromID = "87654321"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var threemaIDByte o3.IDString
 | 
					var threemaFromIDByte o3.IDString
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	threemaIDByte = o3.NewIDString(threemaID)
 | 
						threemaFromIDByte = o3.NewIDString(threemaFromID)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func createDummyAccount() Account {
 | 
					func createDummyAccount() Account {
 | 
				
			||||||
| 
						 | 
					@ -21,8 +21,8 @@ func createDummyAccount() Account {
 | 
				
			||||||
		deliveredMSG: make(map[uint64]string),
 | 
							deliveredMSG: make(map[uint64]string),
 | 
				
			||||||
		readedMSG:    make(map[uint64]string),
 | 
							readedMSG:    make(map[uint64]string),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	a.TID = make([]byte, len(threemaIDByte))
 | 
						a.TID = make([]byte, len(threemaFromIDByte))
 | 
				
			||||||
	copy(a.TID, threemaIDByte[:])
 | 
						copy(a.TID, threemaFromIDByte[:])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return a
 | 
						return a
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -45,35 +45,33 @@ func TestReceiveText(t *testing.T) {
 | 
				
			||||||
	a := createDummyAccount()
 | 
						a := createDummyAccount()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// receiving text
 | 
						// receiving text
 | 
				
			||||||
	session := o3.SessionContext{
 | 
						txtMsg := o3.TextMessage{
 | 
				
			||||||
		ID: o3.ThreemaID{
 | 
							MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
			ID:   o3.NewIDString("12345678"),
 | 
								Sender:    threemaFromIDByte,
 | 
				
			||||||
			Nick: o3.NewPubNick("user"),
 | 
								Recipient: o3.NewIDString("12345678"),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							Body: "Oojoh0Ah",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	txtMsg, err := o3.NewTextMessage(&session, threemaID, "Oojoh0Ah")
 | 
					 | 
				
			||||||
	assert.NoError(err)
 | 
					 | 
				
			||||||
	p, err := a.receiving(txtMsg)
 | 
						p, err := a.receiving(txtMsg)
 | 
				
			||||||
	assert.NoError(err)
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.NotNil(p)
 | 
				
			||||||
	xMSG, ok := p.(stanza.Message)
 | 
						xMSG, ok := p.(stanza.Message)
 | 
				
			||||||
	assert.True(ok)
 | 
						assert.True(ok)
 | 
				
			||||||
	assert.Equal("Oojoh0Ah", xMSG.Body)
 | 
						assert.Equal("Oojoh0Ah", xMSG.Body)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
func TestReceiveAudio(t *testing.T) {
 | 
					func TestReceiveAudio(t *testing.T) {
 | 
				
			||||||
	assert := assert.New(t)
 | 
						assert := assert.New(t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	a := createDummyAccount()
 | 
						a := createDummyAccount()
 | 
				
			||||||
	a.threema = &Threema{}
 | 
						a.threema = &Threema{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* receiving image
 | 
						dataMsg := o3.ImageMessage{
 | 
				
			||||||
	session := o3.SessionContext{
 | 
							MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
		ID: o3.ThreemaID{
 | 
								Sender: threemaFromIDByte,
 | 
				
			||||||
			ID:   o3.NewIDString("12345678"),
 | 
					 | 
				
			||||||
			Nick: o3.NewPubNick("user"),
 | 
					 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}*/
 | 
						}
 | 
				
			||||||
	dataMsg := o3.AudioMessage{}
 | 
					 | 
				
			||||||
	_, err := a.receiving(dataMsg)
 | 
						_, err := a.receiving(dataMsg)
 | 
				
			||||||
	assert.Error(err)
 | 
						assert.Error(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,22 +86,26 @@ func TestReceiveImage(t *testing.T) {
 | 
				
			||||||
	a := createDummyAccount()
 | 
						a := createDummyAccount()
 | 
				
			||||||
	a.threema = &Threema{}
 | 
						a.threema = &Threema{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* receiving image
 | 
						// receiving image
 | 
				
			||||||
	session := o3.SessionContext{
 | 
						dataMsg := o3.ImageMessage{
 | 
				
			||||||
		ID: o3.ThreemaID{
 | 
							MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
			ID:   o3.NewIDString("12345678"),
 | 
								Sender: threemaFromIDByte,
 | 
				
			||||||
			Nick: o3.NewPubNick("user"),
 | 
					 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}*/
 | 
						}
 | 
				
			||||||
	imgMsg := o3.ImageMessage{}
 | 
						_, err := a.receiving(dataMsg)
 | 
				
			||||||
	_, err := a.receiving(imgMsg)
 | 
					 | 
				
			||||||
	assert.Error(err)
 | 
						assert.Error(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	a.threema.httpUploadPath = "/tmp"
 | 
						a.threema.httpUploadPath = "/tmp"
 | 
				
			||||||
	imgMsg = o3.ImageMessage{}
 | 
						dataMsg := o3.ImageMessage{
 | 
				
			||||||
	_, err = a.receiving(imgMsg)
 | 
							MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
 | 
								Sender: threemaFromIDByte,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dataMsg = o3.ImageMessage{}
 | 
				
			||||||
 | 
						_, err = a.receiving(dataMsg)
 | 
				
			||||||
	assert.Error(err)
 | 
						assert.Error(err)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestReceiveDeliveryReceipt(t *testing.T) {
 | 
					func TestReceiveDeliveryReceipt(t *testing.T) {
 | 
				
			||||||
	assert := assert.New(t)
 | 
						assert := assert.New(t)
 | 
				
			||||||
| 
						 | 
					@ -111,20 +113,20 @@ func TestReceiveDeliveryReceipt(t *testing.T) {
 | 
				
			||||||
	a := createDummyAccount()
 | 
						a := createDummyAccount()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// receiving delivered
 | 
						// receiving delivered
 | 
				
			||||||
	session := o3.SessionContext{
 | 
					 | 
				
			||||||
		ID: o3.ThreemaID{
 | 
					 | 
				
			||||||
			ID:   o3.NewIDString("12345678"),
 | 
					 | 
				
			||||||
			Nick: o3.NewPubNick("user"),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	msgID := o3.NewMsgID()
 | 
						msgID := o3.NewMsgID()
 | 
				
			||||||
	a.deliveredMSG[msgID] = "im4aeseeh1IbaQui"
 | 
						a.deliveredMSG[msgID] = "im4aeseeh1IbaQui"
 | 
				
			||||||
	a.readedMSG[msgID] = "im4aeseeh1IbaQui"
 | 
						a.readedMSG[msgID] = "im4aeseeh1IbaQui"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	drm, err := o3.NewDeliveryReceiptMessage(&session, threemaID, msgID, o3.MSGDELIVERED)
 | 
						drm := o3.DeliveryReceiptMessage{
 | 
				
			||||||
	assert.NoError(err)
 | 
							MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
 | 
								Sender: threemaFromIDByte,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Status:    o3.MSGDELIVERED,
 | 
				
			||||||
 | 
							MessageID: msgID,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	p, err := a.receiving(drm)
 | 
						p, err := a.receiving(drm)
 | 
				
			||||||
	assert.NoError(err)
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.NotNil(p)
 | 
				
			||||||
	xMSG, ok := p.(stanza.Message)
 | 
						xMSG, ok := p.(stanza.Message)
 | 
				
			||||||
	assert.True(ok)
 | 
						assert.True(ok)
 | 
				
			||||||
	rr := xMSG.Extensions[0].(stanza.ReceiptReceived)
 | 
						rr := xMSG.Extensions[0].(stanza.ReceiptReceived)
 | 
				
			||||||
| 
						 | 
					@ -136,10 +138,16 @@ func TestReceiveDeliveryReceipt(t *testing.T) {
 | 
				
			||||||
	assert.Nil(p)
 | 
						assert.Nil(p)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// receiving readed
 | 
						// receiving readed
 | 
				
			||||||
	drm, err = o3.NewDeliveryReceiptMessage(&session, threemaID, msgID, o3.MSGREAD)
 | 
						drm = o3.DeliveryReceiptMessage{
 | 
				
			||||||
	assert.NoError(err)
 | 
							MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
 | 
								Sender: threemaFromIDByte,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							MessageID: msgID,
 | 
				
			||||||
 | 
							Status:    o3.MSGREAD,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	p, err = a.receiving(drm)
 | 
						p, err = a.receiving(drm)
 | 
				
			||||||
	assert.NoError(err)
 | 
						assert.NoError(err)
 | 
				
			||||||
 | 
						assert.NotNil(p)
 | 
				
			||||||
	xMSG, ok = p.(stanza.Message)
 | 
						xMSG, ok = p.(stanza.Message)
 | 
				
			||||||
	assert.True(ok)
 | 
						assert.True(ok)
 | 
				
			||||||
	cmdd := xMSG.Extensions[0].(stanza.MarkDisplayed)
 | 
						cmdd := xMSG.Extensions[0].(stanza.MarkDisplayed)
 | 
				
			||||||
| 
						 | 
					@ -156,17 +164,27 @@ func TestReceiveTyping(t *testing.T) {
 | 
				
			||||||
	a := createDummyAccount()
 | 
						a := createDummyAccount()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// receiving inactive
 | 
						// receiving inactive
 | 
				
			||||||
	tnm := o3.TypingNotificationMessage{}
 | 
						tnm := o3.TypingNotificationMessage{
 | 
				
			||||||
 | 
							MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
 | 
								Sender: threemaFromIDByte,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	p, err := a.receiving(tnm)
 | 
						p, err := a.receiving(tnm)
 | 
				
			||||||
 | 
						assert.NotNil(p)
 | 
				
			||||||
	assert.NoError(err)
 | 
						assert.NoError(err)
 | 
				
			||||||
	xMSG, ok := p.(stanza.Message)
 | 
						xMSG, ok := p.(stanza.Message)
 | 
				
			||||||
	assert.True(ok)
 | 
						assert.True(ok)
 | 
				
			||||||
	assert.IsType(stanza.StateInactive{}, xMSG.Extensions[0])
 | 
						assert.IsType(stanza.StateInactive{}, xMSG.Extensions[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// receiving composing
 | 
						// receiving composing
 | 
				
			||||||
	tnm = o3.TypingNotificationMessage{}
 | 
						tnm = o3.TypingNotificationMessage{
 | 
				
			||||||
	tnm.OnOff = 0x1
 | 
							MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
 | 
								Sender: threemaFromIDByte,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							OnOff: 0x1,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	p, err = a.receiving(tnm)
 | 
						p, err = a.receiving(tnm)
 | 
				
			||||||
 | 
						assert.NotNil(p)
 | 
				
			||||||
	assert.NoError(err)
 | 
						assert.NoError(err)
 | 
				
			||||||
	xMSG, ok = p.(stanza.Message)
 | 
						xMSG, ok = p.(stanza.Message)
 | 
				
			||||||
	assert.True(ok)
 | 
						assert.True(ok)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,8 @@ func (a *Account) sending(to string, msg stanza.Message) (o3.Message, error) {
 | 
				
			||||||
		"from": a.XMPP.String(),
 | 
							"from": a.XMPP.String(),
 | 
				
			||||||
		"to":   to,
 | 
							"to":   to,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
						msg3To := o3.NewIDString(to)
 | 
				
			||||||
 | 
						msg3From := o3.NewIDString(string(a.AccountThreema.TID))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	chatState := false
 | 
						chatState := false
 | 
				
			||||||
	chatStateComposing := false
 | 
						chatStateComposing := false
 | 
				
			||||||
| 
						 | 
					@ -61,22 +63,29 @@ func (a *Account) sending(to string, msg stanza.Message) (o3.Message, error) {
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			msgType := o3.MSGDELIVERED
 | 
								drm := o3.DeliveryReceiptMessage{
 | 
				
			||||||
			if msgStateRead {
 | 
									MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
				msgType = o3.MSGREAD
 | 
										Sender:    msg3From,
 | 
				
			||||||
 | 
										ID:        id,
 | 
				
			||||||
 | 
										Recipient: msg3To,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Status: o3.MSGDELIVERED,
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			drm, err := o3.NewDeliveryReceiptMessage(&a.Session, to, id, msgType)
 | 
								if msgStateRead {
 | 
				
			||||||
			if err != nil {
 | 
									drm.Status = o3.MSGREAD
 | 
				
			||||||
				return nil, err
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			logger.WithFields(map[string]interface{}{
 | 
								logger.WithFields(map[string]interface{}{
 | 
				
			||||||
				"msg_id": id,
 | 
									"msg_id": id,
 | 
				
			||||||
				"type":   msgType,
 | 
									"type":   drm.Status,
 | 
				
			||||||
			}).Debug("update status of threema message")
 | 
								}).Debug("update status of threema message")
 | 
				
			||||||
			return drm, nil
 | 
								return drm, nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if chatState {
 | 
							if chatState {
 | 
				
			||||||
			tnm := o3.TypingNotificationMessage{}
 | 
								tnm := o3.TypingNotificationMessage{
 | 
				
			||||||
 | 
									MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
 | 
										Sender: o3.NewIDString(string(a.AccountThreema.TID)),
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			if chatStateComposing {
 | 
								if chatStateComposing {
 | 
				
			||||||
				tnm.OnOff = 0x1
 | 
									tnm.OnOff = 0x1
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -86,17 +95,22 @@ func (a *Account) sending(to string, msg stanza.Message) (o3.Message, error) {
 | 
				
			||||||
			return nil, nil
 | 
								return nil, nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						msg3ID := o3.NewMsgID()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// send text message
 | 
						// send text message
 | 
				
			||||||
	msg3, err := o3.NewTextMessage(&a.Session, to, msg.Body)
 | 
						msg3 := o3.TextMessage{
 | 
				
			||||||
	if err != nil {
 | 
							MessageHeader: &o3.MessageHeader{
 | 
				
			||||||
		return nil, err
 | 
								Sender:    o3.NewIDString(string(a.AccountThreema.TID)),
 | 
				
			||||||
 | 
								ID:        msg3ID,
 | 
				
			||||||
 | 
								Recipient: msg3To,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Body: msg.Body,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	a.deliveredMSG[msg3.ID()] = msg.Id
 | 
						a.deliveredMSG[msg3ID] = msg.Id
 | 
				
			||||||
	a.readedMSG[msg3.ID()] = msg.Id
 | 
						a.readedMSG[msg3ID] = msg.Id
 | 
				
			||||||
	logger.WithFields(map[string]interface{}{
 | 
						logger.WithFields(map[string]interface{}{
 | 
				
			||||||
		"x_id": msg.Id,
 | 
							"x_id": msg.Id,
 | 
				
			||||||
		"t_id": msg3.ID(),
 | 
							"t_id": msg3ID,
 | 
				
			||||||
		"text": msg.Body,
 | 
							"text": msg.Body,
 | 
				
			||||||
	}).Debug("send text")
 | 
						}).Debug("send text")
 | 
				
			||||||
	return msg3, nil
 | 
						return msg3, nil
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@ func TestAccountSend(t *testing.T) {
 | 
				
			||||||
	p := <-send
 | 
						p := <-send
 | 
				
			||||||
	assert.NotNil(p)
 | 
						assert.NotNil(p)
 | 
				
			||||||
	msg := p.(o3.TextMessage)
 | 
						msg := p.(o3.TextMessage)
 | 
				
			||||||
	assert.Contains(msg.Text(), "ohz8kai0ohNgohth")
 | 
						assert.Contains(msg.Body, "ohz8kai0ohNgohth")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// test error
 | 
						// test error
 | 
				
			||||||
	err := a.Send("a", stanza.Message{
 | 
						err := a.Send("a", stanza.Message{
 | 
				
			||||||
| 
						 | 
					@ -67,7 +67,7 @@ func TestAccountSendingDeliviery(t *testing.T) {
 | 
				
			||||||
	assert.NoError(err)
 | 
						assert.NoError(err)
 | 
				
			||||||
	drm, ok := msg.(o3.DeliveryReceiptMessage)
 | 
						drm, ok := msg.(o3.DeliveryReceiptMessage)
 | 
				
			||||||
	assert.True(ok)
 | 
						assert.True(ok)
 | 
				
			||||||
	assert.Equal(o3.MSGDELIVERED, drm.Status())
 | 
						assert.Equal(o3.MSGDELIVERED, drm.Status)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// test read
 | 
						// test read
 | 
				
			||||||
	msg, err = a.sending("a", stanza.Message{
 | 
						msg, err = a.sending("a", stanza.Message{
 | 
				
			||||||
| 
						 | 
					@ -79,7 +79,7 @@ func TestAccountSendingDeliviery(t *testing.T) {
 | 
				
			||||||
	assert.NoError(err)
 | 
						assert.NoError(err)
 | 
				
			||||||
	drm, ok = msg.(o3.DeliveryReceiptMessage)
 | 
						drm, ok = msg.(o3.DeliveryReceiptMessage)
 | 
				
			||||||
	assert.True(ok)
 | 
						assert.True(ok)
 | 
				
			||||||
	assert.Equal(o3.MSGREAD, drm.Status())
 | 
						assert.Equal(o3.MSGREAD, drm.Status)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func TestSendTyping(t *testing.T) {
 | 
					func TestSendTyping(t *testing.T) {
 | 
				
			||||||
	assert := assert.New(t)
 | 
						assert := assert.New(t)
 | 
				
			||||||
| 
						 | 
					@ -128,5 +128,5 @@ func TestSendTyping(t *testing.T) {
 | 
				
			||||||
	assert.NoError(err)
 | 
						assert.NoError(err)
 | 
				
			||||||
	assert.NotNil(msg)
 | 
						assert.NotNil(msg)
 | 
				
			||||||
	o3msg := msg.(o3.TextMessage)
 | 
						o3msg := msg.(o3.TextMessage)
 | 
				
			||||||
	assert.Contains(o3msg.Text(), "hi")
 | 
						assert.Contains(o3msg.Body, "hi")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
Subproject commit 16684c5acfd9abe4d27d52478c7a6c6d5113d29c
 | 
					Subproject commit 0c0e14982ac6e2886901faef423ed731911b3b39
 | 
				
			||||||
		Reference in New Issue