handle xmpp message

This commit is contained in:
Martin/Geno 2019-05-31 14:36:18 +02:00
parent 3787c86fbf
commit 587e0b1e15
No known key found for this signature in database
GPG Key ID: 9D7D3C6BFF600C6A
3 changed files with 73 additions and 9 deletions

View File

@ -0,0 +1,18 @@
package threema
import "errors"
type ThreemaAccount struct {
ID string
}
func (t *Threema) getAccount(jid string) *ThreemaAccount {
return &ThreemaAccount{}
}
func (a *ThreemaAccount) Send(to string, msg string) error {
if a.ID == "" {
return errors.New("It was not possible to send, becaouse we have no account for you.\nPlease generate one, by sending `generate` to gateway")
}
return nil
}

View File

@ -1,12 +1,17 @@
package threema package threema
import ( import (
"dev.sum7.eu/genofire/thrempp/component" "strings"
"github.com/bdlm/log"
"gosrc.io/xmpp" "gosrc.io/xmpp"
"dev.sum7.eu/genofire/thrempp/component"
) )
type Threema struct { type Threema struct {
component.Component component.Component
out chan xmpp.Packet
} }
func NewThreema(config map[string]interface{}) (component.Component, error) { func NewThreema(config map[string]interface{}) (component.Component, error) {
@ -14,8 +19,28 @@ func NewThreema(config map[string]interface{}) (component.Component, error) {
} }
func (t *Threema) Connect() (chan xmpp.Packet, error) { func (t *Threema) Connect() (chan xmpp.Packet, error) {
c := make(chan xmpp.Packet) t.out = make(chan xmpp.Packet)
return c, nil return t.out, nil
}
func (t *Threema) Send(packet xmpp.Packet) {
switch p := packet.(type) {
case xmpp.Message:
attrs := p.PacketAttrs
account := t.getAccount(attrs.From)
log.WithFields(map[string]interface{}{
"from": attrs.From,
"to": attrs.To,
}).Debug(p.Body)
threemaID := strings.ToUpper(strings.Split(attrs.To, "@")[0])
err := account.Send(threemaID, p.Body)
if err != nil {
msg := xmpp.NewMessage("chat", "", attrs.From, "", "en")
msg.Body = err.Error()
t.out <- msg
}
default:
log.Warnf("unkown package%v", p)
}
} }
func init() { func init() {

View File

@ -33,26 +33,47 @@ func (c *Config) Start() error {
return nil return nil
} }
func (c *Config) recieve(chan xmpp.Packet) { func (c *Config) recieve(packets chan xmpp.Packet) {
logger := log.WithField("type", c.Type)
for packet := range packets {
switch p := packet.(type) {
case xmpp.Message:
if p.PacketAttrs.From == "" {
p.PacketAttrs.From = c.Host
} else {
p.PacketAttrs.From += "@" + c.Host
}
loggerMSG := logger.WithFields(map[string]interface{}{
"from": p.PacketAttrs.From,
"to": p.PacketAttrs.To,
})
loggerMSG.Debug(p.Body)
c.xmpp.Send(p)
default:
log.Warn("ignoring packet:", packet)
}
}
} }
func (c *Config) sender() { func (c *Config) sender() {
logger := log.WithField("type", c.Type) logger := log.WithField("type", c.Type)
for { for {
logger.Debug("wait fo recieve")
packet, err := c.xmpp.ReadPacket() packet, err := c.xmpp.ReadPacket()
if err != nil { if err != nil {
logger.Panicf("connection closed%s", err) logger.Panicf("connection closed%s", err)
return return
} }
logger.Debug("recieve")
switch p := packet.(type) { switch p := packet.(type) {
case xmpp.IQ: case xmpp.IQ:
attrs := p.PacketAttrs attrs := p.PacketAttrs
loggerIQ := logger.WithFields(map[string]interface{}{
"from": attrs.From,
"to": attrs.To,
})
switch inner := p.Payload[0].(type) { switch inner := p.Payload[0].(type) {
case *xmpp.DiscoInfo: case *xmpp.DiscoInfo:
logger.Debug("Disco Info") loggerIQ.Debug("Disco Info")
if p.Type == "get" { if p.Type == "get" {
iq := xmpp.NewIQ("result", attrs.To, attrs.From, attrs.Id, "en") iq := xmpp.NewIQ("result", attrs.To, attrs.From, attrs.Id, "en")
var identity xmpp.Identity var identity xmpp.Identity
@ -76,7 +97,7 @@ func (c *Config) sender() {
_ = c.xmpp.Send(iq) _ = c.xmpp.Send(iq)
} }
case *xmpp.DiscoItems: case *xmpp.DiscoItems:
logger.Debug("DiscoItems") loggerIQ.Debug("DiscoItems")
if p.Type == "get" { if p.Type == "get" {
iq := xmpp.NewIQ("result", attrs.To, attrs.From, attrs.Id, "en") iq := xmpp.NewIQ("result", attrs.To, attrs.From, attrs.Id, "en")
@ -103,7 +124,7 @@ func (c *Config) sender() {
} }
case xmpp.Message: case xmpp.Message:
logger.Info("Received message:", p.Body) c.comp.Send(packet)
case xmpp.Presence: case xmpp.Presence:
logger.Info("Received presence:", p.Type) logger.Info("Received presence:", p.Type)