From 7f3ac161495822303aa8369712ee9df3ee01dee9 Mon Sep 17 00:00:00 2001 From: "nedim.uka" Date: Wed, 15 Sep 2021 12:40:25 +0200 Subject: [PATCH] Added XMPP service to handle clients and configurations --- .vscode/settings.json | 4 ++ main.go | 88 ++++++++-------------------- services/xmppsService.go | 120 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 65 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 services/xmppsService.go diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0c9a7b3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "go.gopath": "/home/nedim/go", + "go.useLanguageServer": true +} \ No newline at end of file diff --git a/main.go b/main.go index 1b40273..1792c16 100644 --- a/main.go +++ b/main.go @@ -1,83 +1,41 @@ package main import ( - "crypto/tls" - "fmt" - "log" - "os" - "time" - appConfig "github.com/xmpploadtesting/config" - "gosrc.io/xmpp" - "gosrc.io/xmpp/stanza" + xmppService "github.com/xmpploadtesting/services" ) func main() { - var client *xmpp.Client - var err error - // LOAD APPLICATION CONFIGURATION appConfig.Load() - // Setup xmpp config - config := &xmpp.Config{ - TransportConfiguration: xmpp.TransportConfiguration{ - Address: appConfig.AppConfig.Service.Address + ":" + appConfig.AppConfig.Service.Port, - Domain: appConfig.AppConfig.Service.Domain, - TLSConfig: &tls.Config{InsecureSkipVerify: true}, - }, - Jid: "admin@localhost", - Credential: xmpp.Password("openadmin123"), - StreamLogger: os.Stdout, - Insecure: true, - } + xmppService.Init() + xmppServiceInstance := xmppService.Instance() + xmppService.SendOnlinePresenceStanza(xmppServiceInstance.XMPPClients[0].Client, xmppServiceInstance.XMPPClients[0].Config.Jid) - // Setup xmpp router - router := xmpp.NewRouter() - router.HandleFunc("message", handleMessage) - log.Printf("Adding message") + // // Setup new xmpp client + // if client, err = xmpp.NewClient(config, router, errorHandler); err != nil { + // log.Panicln(fmt.Sprintf("Could not create a new client ! %s", err)) + // } - // Setup new xmpp client - if client, err = xmpp.NewClient(config, router, errorHandler); err != nil { - log.Panicln(fmt.Sprintf("Could not create a new client ! %s", err)) - } + // // Client connection + // if err := client.Connect(); err != nil { + // msg := fmt.Sprintf("XMPP connection failed: %v", err) - // Client connection - if err := client.Connect(); err != nil { - msg := fmt.Sprintf("XMPP connection failed: %v", err) + // fmt.Printf("Failed to connect to server. Exiting... %v", msg) + // return + // } - fmt.Printf("Failed to connect to server. Exiting... %v", msg) - return - } + // onlinePresencePacket := stanza.NewPresence(stanza.Attrs{From: config.Jid, Type: stanza.StanzaType(stanza.PresenceShowChat)}) - onlinePresencePacket := stanza.NewPresence(stanza.Attrs{From: config.Jid, Type: stanza.StanzaType(stanza.PresenceShowAway)}) + // // Send onlinePresence packet indefiletly delayed by DelayBetweenMeassges from configuration + // for { - // Send onlinePresence packet indefiletly delayed by DelayBetweenMeassges from configuration - for { - - err = client.Send(onlinePresencePacket) - log.Printf("Sending online presence stanza: %v", err) - // Delay before sending another message - time.Sleep(time.Duration(appConfig.AppConfig.GeneralOptions.DelayBetweenMassages)) - } -} - -func handleMessage(s xmpp.Sender, p stanza.Packet) { - log.Printf("Handle message") - msg, ok := p.(stanza.Message) - if !ok { - log.Printf(" message not OK") - _, _ = fmt.Fprintf(os.Stdout, "Ignoring packet: %T\n", p) - return - } - - _, _ = fmt.Fprintf(os.Stdout, "Body = %s - from = %s\n", msg.Body, msg.From) - reply := stanza.Message{Attrs: stanza.Attrs{To: msg.From}, Body: msg.Body} - err := s.Send(reply) - log.Printf("Error sending message %v", err) -} - -func errorHandler(err error) { - fmt.Println(err.Error()) + // err = client.Send(onlinePresencePacket) + // log.Printf("Sending online presence stanza: %v", err) + // // Delay before sending another message + // time.Sleep(time.Duration(appConfig.AppConfig.GeneralOptions.DelayBetweenMassages)) + // } + // } diff --git a/services/xmppsService.go b/services/xmppsService.go new file mode 100644 index 0000000..0db6a7b --- /dev/null +++ b/services/xmppsService.go @@ -0,0 +1,120 @@ +package services + +import ( + "crypto/tls" + "fmt" + "log" + "os" + "time" + + appConfig "github.com/xmpploadtesting/config" + "gosrc.io/xmpp" + "gosrc.io/xmpp/stanza" +) + +// XMPPService - struct containing +type XMPPService struct { + Router *xmpp.Router + XMPPClients []XMPPClient +} + +// XMPPClient - struct containing client and client configuration +type XMPPClient struct { + Config xmpp.Config + Client *xmpp.Client +} + +// Instance - get instance of xmpp service +func Instance() *XMPPService { + return &xmppService +} + +var xmppService XMPPService + +// Init Initialise XMPP servie, and router +func Init() { + // TODO load configs and init clients from the config file + xmppService = XMPPService{ + Router: xmpp.NewRouter(), + // Configs: []xmpp.Config{ + // { + // TransportConfiguration: xmpp.TransportConfiguration{ + // Address: appConfig.AppConfig.Service.Address + ":" + appConfig.AppConfig.Service.Port, + // Domain: appConfig.AppConfig.Service.Domain, + // TLSConfig: &tls.Config{InsecureSkipVerify: true}, + // }, + // Jid: "admin@localhost", + // Credential: xmpp.Password("openadmin123"), + // StreamLogger: os.Stdout, + // Insecure: true, + // }, + // }, + } + xmppService.Router.HandleFunc("message", handleMessage) + + xmppService.XMPPClients = make([]XMPPClient, 0) + xmppClient := XMPPClient{ + Config: xmpp.Config{ + + TransportConfiguration: xmpp.TransportConfiguration{ + Address: appConfig.AppConfig.Service.Address + ":" + appConfig.AppConfig.Service.Port, + Domain: appConfig.AppConfig.Service.Domain, + TLSConfig: &tls.Config{InsecureSkipVerify: true}, + }, + Jid: "admin@localhost", + Credential: xmpp.Password("openadmin123"), + StreamLogger: os.Stdout, + Insecure: true, + }, + } + + client, err := xmpp.NewClient(&xmppClient.Config, xmppService.Router, errorHandler) + + // Client connection + if err := client.Connect(); err != nil { + msg := fmt.Sprintf("XMPP connection failed: %v", err) + + fmt.Printf("Failed to connect to server. Exiting... %v", msg) + return + } + + if err != nil { + log.Printf("Unable to initialise client for %v", xmppClient.Config.Jid) + } + xmppClient.Client = client + xmppService.XMPPClients = append(xmppService.XMPPClients, xmppClient) + +} + +// SendOnlinePresenceStanza - send online presence stnza with data, to server +func SendOnlinePresenceStanza(client *xmpp.Client, jid string) error { + onlinePresencePacket := stanza.NewPresence(stanza.Attrs{From: jid, Type: stanza.StanzaType(stanza.PresenceShowChat)}) + + //TODO All clients should send messages at once + for { + + err := client.Send(onlinePresencePacket) + log.Printf("Sending online presence stanza: %v", err) + // Delay before sending another message + time.Sleep(time.Duration(appConfig.AppConfig.GeneralOptions.DelayBetweenMassages)) + } +} + +func handleMessage(s xmpp.Sender, p stanza.Packet) { + log.Printf("Handle message") + msg, ok := p.(stanza.Message) + if !ok { + log.Printf(" message not OK") + _, _ = fmt.Fprintf(os.Stdout, "Ignoring packet: %T\n", p) + return + } + + _, _ = fmt.Fprintf(os.Stdout, "Body = %s - from = %s\n", msg.Body, msg.From) + reply := stanza.Message{Attrs: stanza.Attrs{To: msg.From}, Body: msg.Body} + err := s.Send(reply) + log.Printf("Error sending message %v", err) +} + +func errorHandler(err error) { + fmt.Println(err.Error()) +}