add typing support
This commit is contained in:
parent
a4ebf7dc12
commit
878ebe2398
|
@ -1,4 +1,4 @@
|
||||||
[submodule "vendor/gosrc.io/xmpp"]
|
[submodule "vendor/gosrc.io/xmpp"]
|
||||||
path = vendor/gosrc.io/xmpp
|
path = vendor/gosrc.io/xmpp
|
||||||
url = https://github.com/genofire/go-xmpp
|
url = https://github.com/genofire/go-xmpp
|
||||||
branch = msg_extension
|
branch = all
|
||||||
|
|
|
@ -9,6 +9,7 @@ type Config struct {
|
||||||
Host string
|
Host string
|
||||||
Connection string
|
Connection string
|
||||||
Secret string
|
Secret string
|
||||||
|
XMPPLog bool `toml:"xmpp_log"`
|
||||||
Special map[string]interface{}
|
Special map[string]interface{}
|
||||||
|
|
||||||
xmpp *xmpp.Component
|
xmpp *xmpp.Component
|
||||||
|
|
|
@ -55,6 +55,7 @@ func (c *Config) receiving(packet xmpp.Packet) (xmpp.Packet, bool) {
|
||||||
{Var: xmpp.NSDiscoItems},
|
{Var: xmpp.NSDiscoItems},
|
||||||
{Var: xmpp.NSMsgReceipts},
|
{Var: xmpp.NSMsgReceipts},
|
||||||
{Var: xmpp.NSMsgChatMarkers},
|
{Var: xmpp.NSMsgChatMarkers},
|
||||||
|
{Var: xmpp.NSMsgChatStateNotifications},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
iq.AddPayload(&payload)
|
iq.AddPayload(&payload)
|
||||||
|
@ -90,12 +91,13 @@ func (c *Config) receiving(packet xmpp.Packet) (xmpp.Packet, bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
case xmpp.Message:
|
case xmpp.Message:
|
||||||
|
if c.XMPPLog {
|
||||||
logger.WithFields(map[string]interface{}{
|
logger.WithFields(map[string]interface{}{
|
||||||
"from": p.PacketAttrs.From,
|
"from": p.PacketAttrs.From,
|
||||||
"to": p.PacketAttrs.To,
|
"to": p.PacketAttrs.To,
|
||||||
"id": p.PacketAttrs.Id,
|
"id": p.PacketAttrs.Id,
|
||||||
}).Debug(p.XMPPFormat())
|
}).Debug(p.XMPPFormat())
|
||||||
|
}
|
||||||
return packet, false
|
return packet, false
|
||||||
|
|
||||||
case xmpp.Presence:
|
case xmpp.Presence:
|
||||||
|
|
|
@ -22,11 +22,13 @@ func (c *Config) sending(packet xmpp.Packet) xmpp.Packet {
|
||||||
} else {
|
} else {
|
||||||
p.PacketAttrs.From += "@" + c.Host
|
p.PacketAttrs.From += "@" + c.Host
|
||||||
}
|
}
|
||||||
|
if c.XMPPLog {
|
||||||
logger.WithFields(map[string]interface{}{
|
logger.WithFields(map[string]interface{}{
|
||||||
"from": p.PacketAttrs.From,
|
"from": p.PacketAttrs.From,
|
||||||
"to": p.PacketAttrs.To,
|
"to": p.PacketAttrs.To,
|
||||||
"id": p.PacketAttrs.Id,
|
"id": p.PacketAttrs.Id,
|
||||||
}).Debug(p.XMPPFormat())
|
}).Debug(p.XMPPFormat())
|
||||||
|
}
|
||||||
return p
|
return p
|
||||||
default:
|
default:
|
||||||
log.Warn("ignoring packet:", packet)
|
log.Warn("ignoring packet:", packet)
|
||||||
|
|
|
@ -23,7 +23,7 @@ func (a *Account) receiver(out chan<- xmpp.Packet) {
|
||||||
if string(a.TID) == sender {
|
if string(a.TID) == sender {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if p, err := a.receiving(receivedMessage); err != nil {
|
if p, err := a.receiving(receivedMessage.Msg); err != nil {
|
||||||
xMSG := xmpp.NewMessage("chat", sender, a.XMPP.String(), "", "en")
|
xMSG := xmpp.NewMessage("chat", sender, a.XMPP.String(), "", "en")
|
||||||
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.Serialize())
|
||||||
out <- xMSG
|
out <- xMSG
|
||||||
|
@ -36,15 +36,21 @@ func (a *Account) receiver(out chan<- xmpp.Packet) {
|
||||||
func requestExtensions(xMSG *xmpp.Message) {
|
func requestExtensions(xMSG *xmpp.Message) {
|
||||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ReceiptRequest{})
|
xMSG.Extensions = append(xMSG.Extensions, xmpp.ReceiptRequest{})
|
||||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.Markable{})
|
xMSG.Extensions = append(xMSG.Extensions, xmpp.Markable{})
|
||||||
|
xMSG.Extensions = append(xMSG.Extensions, xmpp.StateActive{})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Account) receiving(receivedMessage o3.ReceivedMsg) (xmpp.Packet, error) {
|
func (a *Account) receiving(receivedMessage o3.Message) (xmpp.Packet, error) {
|
||||||
switch msg := receivedMessage.Msg.(type) {
|
logger := log.WithFields(map[string]interface{}{
|
||||||
|
"from": receivedMessage.Sender().String(),
|
||||||
|
"to": a.XMPP.String(),
|
||||||
|
})
|
||||||
|
switch msg := receivedMessage.(type) {
|
||||||
case o3.TextMessage:
|
case o3.TextMessage:
|
||||||
sender := msg.Sender().String()
|
sender := msg.Sender().String()
|
||||||
xMSG := xmpp.NewMessage("chat", sender, a.XMPP.String(), strconv.FormatUint(msg.ID(), 10), "en")
|
xMSG := xmpp.NewMessage("chat", sender, a.XMPP.String(), strconv.FormatUint(msg.ID(), 10), "en")
|
||||||
xMSG.Body = msg.Text()
|
xMSG.Body = msg.Text()
|
||||||
requestExtensions(&xMSG)
|
requestExtensions(&xMSG)
|
||||||
|
logger.WithField("text", xMSG.Body).Debug("send text")
|
||||||
return xMSG, nil
|
return xMSG, nil
|
||||||
|
|
||||||
case o3.AudioMessage:
|
case o3.AudioMessage:
|
||||||
|
@ -53,16 +59,17 @@ func (a *Account) receiving(receivedMessage o3.ReceivedMsg) (xmpp.Packet, error)
|
||||||
}
|
}
|
||||||
data, err := msg.GetAudioData(a.Session)
|
data, err := msg.GetAudioData(a.Session)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.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(msg.Sender().String(), msg.ID(), "mp3", data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.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
|
||||||
}
|
}
|
||||||
xMSG.Type = "chat"
|
xMSG.Type = "chat"
|
||||||
requestExtensions(&xMSG)
|
requestExtensions(&xMSG)
|
||||||
|
logger.WithField("url", xMSG.Body).Debug("send audio")
|
||||||
return xMSG, nil
|
return xMSG, nil
|
||||||
|
|
||||||
case o3.ImageMessage:
|
case o3.ImageMessage:
|
||||||
|
@ -71,44 +78,59 @@ func (a *Account) receiving(receivedMessage o3.ReceivedMsg) (xmpp.Packet, error)
|
||||||
}
|
}
|
||||||
data, err := msg.GetImageData(a.Session)
|
data, err := msg.GetImageData(a.Session)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.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(msg.Sender().String(), msg.ID(), "jpg", data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.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
|
||||||
}
|
}
|
||||||
xMSG.Type = "chat"
|
xMSG.Type = "chat"
|
||||||
requestExtensions(&xMSG)
|
requestExtensions(&xMSG)
|
||||||
|
logger.WithField("url", xMSG.Body).Debug("send image")
|
||||||
return xMSG, nil
|
return xMSG, nil
|
||||||
|
|
||||||
case o3.DeliveryReceiptMessage:
|
case o3.DeliveryReceiptMessage:
|
||||||
msgID := msg.MsgID()
|
msgID := msg.MsgID()
|
||||||
xMSG := xmpp.NewMessage("chat", msg.Sender().String(), a.XMPP.String(), "", "en")
|
xMSG := xmpp.NewMessage("chat", msg.Sender().String(), a.XMPP.String(), "", "en")
|
||||||
|
state := ""
|
||||||
|
|
||||||
if msg.Status() == o3.MSGDELIVERED {
|
if msg.Status() == o3.MSGDELIVERED {
|
||||||
|
state = "delivered"
|
||||||
if id, ok := a.deliveredMSG[msgID]; ok {
|
if id, ok := a.deliveredMSG[msgID]; ok {
|
||||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.ReceiptReceived{ID: id})
|
xMSG.Extensions = append(xMSG.Extensions, xmpp.ReceiptReceived{ID: id})
|
||||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.MarkReceived{ID: id})
|
xMSG.Extensions = append(xMSG.Extensions, xmpp.MarkReceived{ID: id})
|
||||||
delete(a.deliveredMSG, msgID)
|
delete(a.deliveredMSG, msgID)
|
||||||
} else {
|
} else {
|
||||||
log.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"
|
||||||
if id, ok := a.readedMSG[msgID]; ok {
|
if id, ok := a.readedMSG[msgID]; ok {
|
||||||
xMSG.Extensions = append(xMSG.Extensions, xmpp.MarkDisplayed{ID: id})
|
xMSG.Extensions = append(xMSG.Extensions, xmpp.MarkDisplayed{ID: id})
|
||||||
delete(a.readedMSG, msgID)
|
delete(a.readedMSG, msgID)
|
||||||
} else {
|
} else {
|
||||||
log.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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(xMSG.Extensions) > 0 {
|
if len(xMSG.Extensions) > 0 {
|
||||||
|
logger.WithField("state", state).Debug("send state")
|
||||||
return xMSG, nil
|
return xMSG, nil
|
||||||
}
|
}
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
case o3.TypingNotificationMessage:
|
||||||
|
xMSG := xmpp.NewMessage("chat", msg.Sender().String(), a.XMPP.String(), strconv.FormatUint(msg.ID(), 10), "en")
|
||||||
|
if msg.OnOff != 0 {
|
||||||
|
logger.Debug("composing")
|
||||||
|
xMSG.Extensions = append(xMSG.Extensions, xmpp.StateComposing{})
|
||||||
|
} else {
|
||||||
|
logger.Debug("inactive")
|
||||||
|
xMSG.Extensions = append(xMSG.Extensions, xmpp.StateInactive{})
|
||||||
|
}
|
||||||
|
return xMSG, nil
|
||||||
}
|
}
|
||||||
return nil, errors.New("not known data format")
|
return nil, errors.New("not known data format")
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,8 +22,19 @@ func (a *Account) sending(to string, msg xmpp.Message) (o3.Message, error) {
|
||||||
// handle delivered / readed
|
// handle delivered / readed
|
||||||
msgID := ""
|
msgID := ""
|
||||||
readed := false
|
readed := false
|
||||||
|
composing := false
|
||||||
|
state := false
|
||||||
for _, el := range msg.Extensions {
|
for _, el := range msg.Extensions {
|
||||||
switch ex := el.(type) {
|
switch ex := el.(type) {
|
||||||
|
case xmpp.StateComposing:
|
||||||
|
composing = true
|
||||||
|
state = true
|
||||||
|
case xmpp.StateInactive:
|
||||||
|
state = true
|
||||||
|
case xmpp.StateActive:
|
||||||
|
state = true
|
||||||
|
case xmpp.StateGone:
|
||||||
|
state = true
|
||||||
case xmpp.ReceiptReceived:
|
case xmpp.ReceiptReceived:
|
||||||
msgID = ex.ID
|
msgID = ex.ID
|
||||||
case xmpp.MarkReceived:
|
case xmpp.MarkReceived:
|
||||||
|
@ -33,6 +44,12 @@ func (a *Account) sending(to string, msg xmpp.Message) (o3.Message, error) {
|
||||||
msgID = ex.ID
|
msgID = ex.ID
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if composing {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
if state && msg.Body == "" {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
if msgID != "" {
|
if msgID != "" {
|
||||||
id, err := strconv.ParseUint(msgID, 10, 64)
|
id, err := strconv.ParseUint(msgID, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -5,6 +5,7 @@ type = "threema"
|
||||||
host = "threema.chat.sum7.eu"
|
host = "threema.chat.sum7.eu"
|
||||||
connection = "localhost:5347"
|
connection = "localhost:5347"
|
||||||
secret = "change_me"
|
secret = "change_me"
|
||||||
|
xmpp_log = false
|
||||||
|
|
||||||
[component.special]
|
[component.special]
|
||||||
http_upload_url = "https://example.org/upload/threema"
|
http_upload_url = "https://example.org/upload/threema"
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 5477997a38b217c86c462c8bfa8d96c3b925c1f5
|
Subproject commit 1df9d46212f2d8cac64a52cc0c3779d3b774a8d6
|
Reference in New Issue