|
|
|
@ -22,60 +22,76 @@ var cmd = &cobra.Command{
|
|
|
|
|
Use: "sendxmpp <recipient,> [message]",
|
|
|
|
|
Example: `sendxmpp to@chat.sum7.eu "Hello World!"`,
|
|
|
|
|
Args: cobra.ExactArgs(2),
|
|
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
|
|
receiver := strings.Split(args[0], ",")
|
|
|
|
|
msgText := args[1]
|
|
|
|
|
|
|
|
|
|
var err error
|
|
|
|
|
client, err := xmpp.NewClient(xmpp.Config{
|
|
|
|
|
Jid: viper.GetString("jid"),
|
|
|
|
|
Address: viper.GetString("addr"),
|
|
|
|
|
Password: viper.GetString("password"),
|
|
|
|
|
}, xmpp.NewRouter())
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorf("error when starting xmpp client: %s", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
Run: sendxmpp,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wg := sync.WaitGroup{}
|
|
|
|
|
wg.Add(1)
|
|
|
|
|
func sendxmpp(cmd *cobra.Command, args []string) {
|
|
|
|
|
receiver := strings.Split(args[0], ",")
|
|
|
|
|
msgText := args[1]
|
|
|
|
|
|
|
|
|
|
cm := xmpp.NewStreamManager(client, func(c xmpp.Sender) {
|
|
|
|
|
defer wg.Done()
|
|
|
|
|
var err error
|
|
|
|
|
client, err := xmpp.NewClient(xmpp.Config{
|
|
|
|
|
Jid: viper.GetString("jid"),
|
|
|
|
|
Address: viper.GetString("addr"),
|
|
|
|
|
Password: viper.GetString("password"),
|
|
|
|
|
}, xmpp.NewRouter())
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorf("error when starting xmpp client: %s", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.Info("client connected")
|
|
|
|
|
wg := sync.WaitGroup{}
|
|
|
|
|
wg.Add(1)
|
|
|
|
|
|
|
|
|
|
if isMUCRecipient {
|
|
|
|
|
for _, muc := range receiver {
|
|
|
|
|
joinMUC(c, muc, "sendxmpp")
|
|
|
|
|
// FIXME: Remove global variables
|
|
|
|
|
var mucsToLeave []*xmpp.Jid
|
|
|
|
|
|
|
|
|
|
cm := xmpp.NewStreamManager(client, func(c xmpp.Sender) {
|
|
|
|
|
defer wg.Done()
|
|
|
|
|
|
|
|
|
|
log.Info("client connected")
|
|
|
|
|
|
|
|
|
|
if isMUCRecipient {
|
|
|
|
|
for _, muc := range receiver {
|
|
|
|
|
jid, err := xmpp.NewJid(muc)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.WithField("muc", muc).Errorf("skipping invalid muc jid: %w", err)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
jid.Resource = "sendxmpp"
|
|
|
|
|
|
|
|
|
|
if msgText != "-" {
|
|
|
|
|
send(c, receiver, msgText)
|
|
|
|
|
return
|
|
|
|
|
if err := joinMUC(c, jid); err != nil {
|
|
|
|
|
log.WithField("muc", muc).Errorf("error joining muc: %w", err)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
mucsToLeave = append(mucsToLeave, jid)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
scanner := bufio.NewScanner(os.Stdin)
|
|
|
|
|
for scanner.Scan() {
|
|
|
|
|
send(c, receiver, scanner.Text())
|
|
|
|
|
}
|
|
|
|
|
if msgText != "-" {
|
|
|
|
|
send(c, receiver, msgText)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
|
|
|
log.Errorf("error on reading stdin: %s", err)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
go func() {
|
|
|
|
|
err := cm.Run()
|
|
|
|
|
log.Panic("closed connection:", err)
|
|
|
|
|
wg.Done()
|
|
|
|
|
}()
|
|
|
|
|
scanner := bufio.NewScanner(os.Stdin)
|
|
|
|
|
for scanner.Scan() {
|
|
|
|
|
send(c, receiver, scanner.Text())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
|
|
|
log.Errorf("error on reading stdin: %s", err)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
go func() {
|
|
|
|
|
err := cm.Run()
|
|
|
|
|
log.Panic("closed connection:", err)
|
|
|
|
|
wg.Done()
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
wg.Wait()
|
|
|
|
|
wg.Wait()
|
|
|
|
|
|
|
|
|
|
leaveMUCs(client)
|
|
|
|
|
},
|
|
|
|
|
leaveMUCs(client, mucsToLeave)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|