diff --git a/component/main.go b/component/main.go index 0919671..9013bee 100644 --- a/component/main.go +++ b/component/main.go @@ -31,6 +31,10 @@ func Load(configs []Config) { log.WithField("type", config.Type).Panic(err) } config.comp = comp + err = config.Start() + if err != nil { + log.WithField("type", config.Type).Panic(err) + } log.WithField("type", config.Type).Infof("component for %s started", config.Host) } } diff --git a/component/threema/main.go b/component/threema/main.go index 0616aac..349e215 100644 --- a/component/threema/main.go +++ b/component/threema/main.go @@ -1,6 +1,9 @@ package threema -import "dev.sum7.eu/genofire/thrempp/component" +import ( + "dev.sum7.eu/genofire/thrempp/component" + "gosrc.io/xmpp" +) type Threema struct { component.Component @@ -10,6 +13,11 @@ func NewThreema(config map[string]interface{}) (component.Component, error) { return &Threema{}, nil } +func (t *Threema) Connect() (chan xmpp.Packet, error) { + c := make(chan xmpp.Packet) + return c, nil +} + func init() { component.AddComponent("threema", NewThreema) } diff --git a/component/xmpp.go b/component/xmpp.go index 02a4ca6..1edf43c 100644 --- a/component/xmpp.go +++ b/component/xmpp.go @@ -1,6 +1,7 @@ package component import ( + "github.com/bdlm/log" "gosrc.io/xmpp" ) @@ -35,4 +36,80 @@ func (c *Config) Start() error { func (c *Config) recieve(chan xmpp.Packet) { } func (c *Config) sender() { + logger := log.WithField("type", c.Type) + for { + logger.Debug("wait fo recieve") + packet, err := c.xmpp.ReadPacket() + if err != nil { + logger.Panicf("connection closed%s", err) + return + } + logger.Debug("recieve") + + switch p := packet.(type) { + case xmpp.IQ: + attrs := p.PacketAttrs + + switch inner := p.Payload[0].(type) { + case *xmpp.DiscoInfo: + logger.Debug("Disco Info") + if p.Type == "get" { + iq := xmpp.NewIQ("result", attrs.To, attrs.From, attrs.Id, "en") + var identity xmpp.Identity + if inner.Node == "" { + identity = xmpp.Identity{ + Name: c.Type, + Category: "gateway", + Type: "service", + } + } + + payload := xmpp.DiscoInfo{ + Identity: identity, + Features: []xmpp.Feature{ + {Var: "http://jabber.org/protocol/disco#info"}, + {Var: "http://jabber.org/protocol/disco#item"}, + }, + } + iq.AddPayload(&payload) + + _ = c.xmpp.Send(iq) + } + case *xmpp.DiscoItems: + logger.Debug("DiscoItems") + if p.Type == "get" { + iq := xmpp.NewIQ("result", attrs.To, attrs.From, attrs.Id, "en") + + var payload xmpp.DiscoItems + if inner.Node == "" { + payload = xmpp.DiscoItems{ + Items: []xmpp.DiscoItem{ + {Name: c.Type, JID: c.Host, Node: "node1"}, + }, + } + } + iq.AddPayload(&payload) + _ = c.xmpp.Send(iq) + } + default: + logger.Warn("ignoring iq packet", inner) + xError := xmpp.Err{ + Code: 501, + Reason: "feature-not-implemented", + Type: "cancel", + } + reply := p.MakeError(xError) + _ = c.xmpp.Send(&reply) + } + + case xmpp.Message: + logger.Info("Received message:", p.Body) + + case xmpp.Presence: + logger.Info("Received presence:", p.Type) + + default: + logger.Warn("ignoring packet:", packet) + } + } }