package main /* Connect to an XMPP server using XEP 114 protocol, perform a discovery query on the server and print the response */ import ( "context" "fmt" "log" "time" "gosrc.io/xmpp" "gosrc.io/xmpp/stanza" ) const ( domain = "mycomponent.localhost" address = "build.vpn.p1:8888" ) // Init and return a component func makeComponent() *xmpp.Component { opts := xmpp.ComponentOptions{ TransportConfiguration: xmpp.TransportConfiguration{ Address: address, Domain: domain, }, Domain: domain, Secret: "secret", } router := xmpp.NewRouter() c, err := xmpp.NewComponent(opts, router, handleError) if err != nil { panic(err) } return c } func handleError(err error) { fmt.Println(err.Error()) } func main() { c := makeComponent() // Connect Component to the server fmt.Printf("Connecting to %v\n", address) err := c.Connect() if err != nil { panic(err) } // make a disco iq iqReq, err := stanza.NewIQ(stanza.Attrs{Type: stanza.IQTypeGet, From: domain, To: "localhost", Id: "my-iq1"}) if err != nil { log.Fatalf("failed to create IQ: %v", err) } disco := iqReq.DiscoInfo() iqReq.Payload = disco // res is the channel used to receive the result iq ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) res, _ := c.SendIQ(ctx, iqReq) select { case iqResponse := <-res: // Got response from server fmt.Print(iqResponse.Payload) case <-time.After(100 * time.Millisecond): cancel() panic("No iq response was received in time") } }