[TEST] refactory component threema receive
This commit is contained in:
parent
6531916ce9
commit
a3c134ccde
|
@ -2,11 +2,8 @@ package threema
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
|
||||
"github.com/bdlm/log"
|
||||
"github.com/o3ma/o3"
|
||||
"gosrc.io/xmpp"
|
||||
|
||||
"dev.sum7.eu/genofire/golang-lib/database"
|
||||
|
||||
|
@ -63,96 +60,3 @@ func (t *Threema) getAccount(jid *models.JID) (*Account, error) {
|
|||
t.accountJID[jid.String()] = a
|
||||
return a, nil
|
||||
}
|
||||
|
||||
func (a *Account) reciever(out chan<- xmpp.Packet) {
|
||||
for receivedMessage := range a.recieve {
|
||||
if receivedMessage.Err != nil {
|
||||
log.Warnf("Error Receiving Message: %s\n", receivedMessage.Err)
|
||||
continue
|
||||
}
|
||||
switch msg := receivedMessage.Msg.(type) {
|
||||
case o3.TextMessage:
|
||||
sender := msg.Sender().String()
|
||||
if string(a.TID) == sender {
|
||||
continue
|
||||
}
|
||||
xMSG := xmpp.NewMessage("chat", sender, a.XMPP.String(), strconv.FormatUint(msg.ID(), 10), "en")
|
||||
xMSG.Body = msg.Text()
|
||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ReceiptRequest{})
|
||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ChatMarkerMarkable{})
|
||||
out <- xMSG
|
||||
|
||||
case o3.DeliveryReceiptMessage:
|
||||
msgID := msg.MsgID()
|
||||
xMSG := xmpp.NewMessage("chat", msg.Sender().String(), a.XMPP.String(), "", "en")
|
||||
|
||||
if msg.Status() == o3.MSGDELIVERED {
|
||||
if id, ok := a.deliveredMSG[msgID]; ok {
|
||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ReceiptReceived{Id: id})
|
||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ChatMarkerReceived{Id: id})
|
||||
delete(a.deliveredMSG, msgID)
|
||||
} else {
|
||||
log.Warnf("found not id in cache to announce received on xmpp side")
|
||||
}
|
||||
}
|
||||
if msg.Status() == o3.MSGREAD {
|
||||
if id, ok := a.readedMSG[msgID]; ok {
|
||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ChatMarkerDisplayed{Id: id})
|
||||
delete(a.readedMSG, msgID)
|
||||
} else {
|
||||
log.Warnf("found not id in cache to announce readed on xmpp side")
|
||||
}
|
||||
}
|
||||
|
||||
if len(xMSG.Extensions) > 0 {
|
||||
out <- xMSG
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (a *Account) Send(to string, msg xmpp.Message) error {
|
||||
msgID := ""
|
||||
readed := false
|
||||
for _, el := range msg.Extensions {
|
||||
switch ex := el.(type) {
|
||||
case *xmpp.ReceiptReceived:
|
||||
msgID = ex.Id
|
||||
case *xmpp.ChatMarkerReceived:
|
||||
msgID = ex.Id
|
||||
case *xmpp.ChatMarkerDisplayed:
|
||||
readed = true
|
||||
msgID = ex.Id
|
||||
}
|
||||
}
|
||||
if msgID != "" {
|
||||
id, err := strconv.ParseUint(msgID, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
msgType := o3.MSGDELIVERED
|
||||
if readed {
|
||||
msgType = o3.MSGREAD
|
||||
}
|
||||
drm, err := o3.NewDeliveryReceiptMessage(&a.Session, to, id, msgType)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
a.send <- drm
|
||||
log.WithFields(map[string]interface{}{
|
||||
"tid": to,
|
||||
"msg_id": id,
|
||||
"type": msgType,
|
||||
}).Debug("update status of threema message")
|
||||
return nil
|
||||
}
|
||||
|
||||
msg3, err := o3.NewTextMessage(&a.Session, to, msg.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
a.deliveredMSG[msg3.ID()] = msg.Id
|
||||
a.readedMSG[msg3.ID()] = msg.Id
|
||||
a.send <- msg3
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
package threema
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"github.com/bdlm/log"
|
||||
"github.com/o3ma/o3"
|
||||
"gosrc.io/xmpp"
|
||||
)
|
||||
|
||||
func (a *Account) reciever(out chan<- xmpp.Packet) {
|
||||
for receivedMessage := range a.recieve {
|
||||
if p := a.handle(receivedMessage); p != nil {
|
||||
out <- p
|
||||
}
|
||||
}
|
||||
}
|
||||
func (a *Account) handle(receivedMessage o3.ReceivedMsg) xmpp.Packet {
|
||||
if receivedMessage.Err != nil {
|
||||
log.Warnf("Error Receiving Message: %s\n", receivedMessage.Err)
|
||||
return nil
|
||||
}
|
||||
switch msg := receivedMessage.Msg.(type) {
|
||||
case o3.TextMessage:
|
||||
sender := msg.Sender().String()
|
||||
if string(a.TID) == sender {
|
||||
return nil
|
||||
}
|
||||
xMSG := xmpp.NewMessage("chat", sender, a.XMPP.String(), strconv.FormatUint(msg.ID(), 10), "en")
|
||||
xMSG.Body = msg.Text()
|
||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ReceiptRequest{})
|
||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ChatMarkerMarkable{})
|
||||
return xMSG
|
||||
|
||||
case o3.DeliveryReceiptMessage:
|
||||
msgID := msg.MsgID()
|
||||
xMSG := xmpp.NewMessage("chat", msg.Sender().String(), a.XMPP.String(), "", "en")
|
||||
|
||||
if msg.Status() == o3.MSGDELIVERED {
|
||||
if id, ok := a.deliveredMSG[msgID]; ok {
|
||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ReceiptReceived{Id: id})
|
||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ChatMarkerReceived{Id: id})
|
||||
delete(a.deliveredMSG, msgID)
|
||||
} else {
|
||||
log.Warnf("found not id in cache to announce received on xmpp side")
|
||||
}
|
||||
}
|
||||
if msg.Status() == o3.MSGREAD {
|
||||
if id, ok := a.readedMSG[msgID]; ok {
|
||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ChatMarkerDisplayed{Id: id})
|
||||
delete(a.readedMSG, msgID)
|
||||
} else {
|
||||
log.Warnf("found not id in cache to announce readed on xmpp side")
|
||||
}
|
||||
}
|
||||
|
||||
if len(xMSG.Extensions) > 0 {
|
||||
return xMSG
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,131 @@
|
|||
package threema
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"github.com/o3ma/o3"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"gosrc.io/xmpp"
|
||||
)
|
||||
|
||||
const threemaID = "87654321"
|
||||
|
||||
var threemaIDByte o3.IDString
|
||||
|
||||
func init() {
|
||||
threemaIDByte = o3.NewIDString(threemaID)
|
||||
}
|
||||
|
||||
func createDummyAccount() Account {
|
||||
a := Account{
|
||||
deliveredMSG: make(map[uint64]string),
|
||||
readedMSG: make(map[uint64]string),
|
||||
}
|
||||
a.TID = make([]byte, len(threemaIDByte))
|
||||
copy(a.TID, threemaIDByte[:])
|
||||
|
||||
return a
|
||||
}
|
||||
|
||||
func TestRecieve(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
a := createDummyAccount()
|
||||
|
||||
// handle/skip error
|
||||
p := a.handle(o3.ReceivedMsg{
|
||||
Err: errors.New("dummy"),
|
||||
})
|
||||
assert.Nil(p)
|
||||
|
||||
// nothing to handle
|
||||
p = a.handle(o3.ReceivedMsg{})
|
||||
assert.Nil(p)
|
||||
}
|
||||
|
||||
func TestRecieveText(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
a := createDummyAccount()
|
||||
|
||||
// handle text
|
||||
session := o3.SessionContext{
|
||||
ID: o3.ThreemaID{
|
||||
ID: o3.NewIDString("12345678"),
|
||||
Nick: o3.NewPubNick("user"),
|
||||
},
|
||||
}
|
||||
txtMsg, err := o3.NewTextMessage(&session, threemaID, "Oojoh0Ah")
|
||||
assert.NoError(err)
|
||||
p := a.handle(o3.ReceivedMsg{
|
||||
Msg: txtMsg,
|
||||
})
|
||||
xMSG, ok := p.(xmpp.Message)
|
||||
assert.True(ok)
|
||||
assert.Equal("Oojoh0Ah", xMSG.Body)
|
||||
|
||||
// handle/skip text to own id
|
||||
session = o3.SessionContext{
|
||||
ID: o3.ThreemaID{
|
||||
ID: threemaIDByte,
|
||||
Nick: o3.NewPubNick("user"),
|
||||
},
|
||||
}
|
||||
txtMsg, err = o3.NewTextMessage(&session, threemaID, "Aesh8shu")
|
||||
assert.NoError(err)
|
||||
p = a.handle(o3.ReceivedMsg{
|
||||
Msg: txtMsg,
|
||||
})
|
||||
assert.Nil(p)
|
||||
}
|
||||
|
||||
func TestRecieveDeliveryReceipt(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
a := createDummyAccount()
|
||||
|
||||
// handle delivered
|
||||
session := o3.SessionContext{
|
||||
ID: o3.ThreemaID{
|
||||
ID: o3.NewIDString("12345678"),
|
||||
Nick: o3.NewPubNick("user"),
|
||||
},
|
||||
}
|
||||
msgID := o3.NewMsgID()
|
||||
a.deliveredMSG[msgID] = "im4aeseeh1IbaQui"
|
||||
a.readedMSG[msgID] = "im4aeseeh1IbaQui"
|
||||
|
||||
drm, err := o3.NewDeliveryReceiptMessage(&session, threemaID, msgID, o3.MSGDELIVERED)
|
||||
assert.NoError(err)
|
||||
p := a.handle(o3.ReceivedMsg{
|
||||
Msg: drm,
|
||||
})
|
||||
xMSG, ok := p.(xmpp.Message)
|
||||
assert.True(ok)
|
||||
rr := xMSG.Extensions[0].(xmpp.ReceiptReceived)
|
||||
assert.Equal("im4aeseeh1IbaQui", rr.Id)
|
||||
|
||||
// handle delivered -> not in cache
|
||||
p = a.handle(o3.ReceivedMsg{
|
||||
Msg: drm,
|
||||
})
|
||||
assert.Nil(p)
|
||||
|
||||
// handle readed
|
||||
drm, err = o3.NewDeliveryReceiptMessage(&session, threemaID, msgID, o3.MSGREAD)
|
||||
assert.NoError(err)
|
||||
p = a.handle(o3.ReceivedMsg{
|
||||
Msg: drm,
|
||||
})
|
||||
xMSG, ok = p.(xmpp.Message)
|
||||
assert.True(ok)
|
||||
cmdd := xMSG.Extensions[0].(xmpp.ChatMarkerDisplayed)
|
||||
assert.Equal("im4aeseeh1IbaQui", cmdd.Id)
|
||||
|
||||
// handle delivered -> not in cache
|
||||
p = a.handle(o3.ReceivedMsg{
|
||||
Msg: drm,
|
||||
})
|
||||
assert.Nil(p)
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
package threema
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"github.com/bdlm/log"
|
||||
"github.com/o3ma/o3"
|
||||
"gosrc.io/xmpp"
|
||||
)
|
||||
|
||||
func (a *Account) Send(to string, msg xmpp.Message) error {
|
||||
msgID := ""
|
||||
readed := false
|
||||
for _, el := range msg.Extensions {
|
||||
switch ex := el.(type) {
|
||||
case *xmpp.ReceiptReceived:
|
||||
msgID = ex.Id
|
||||
case *xmpp.ChatMarkerReceived:
|
||||
msgID = ex.Id
|
||||
case *xmpp.ChatMarkerDisplayed:
|
||||
readed = true
|
||||
msgID = ex.Id
|
||||
}
|
||||
}
|
||||
if msgID != "" {
|
||||
id, err := strconv.ParseUint(msgID, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
msgType := o3.MSGDELIVERED
|
||||
if readed {
|
||||
msgType = o3.MSGREAD
|
||||
}
|
||||
drm, err := o3.NewDeliveryReceiptMessage(&a.Session, to, id, msgType)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
a.send <- drm
|
||||
log.WithFields(map[string]interface{}{
|
||||
"tid": to,
|
||||
"msg_id": id,
|
||||
"type": msgType,
|
||||
}).Debug("update status of threema message")
|
||||
return nil
|
||||
}
|
||||
|
||||
msg3, err := o3.NewTextMessage(&a.Session, to, msg.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
a.deliveredMSG[msg3.ID()] = msg.Id
|
||||
a.readedMSG[msg3.ID()] = msg.Id
|
||||
a.send <- msg3
|
||||
return nil
|
||||
}
|
Reference in New Issue