97 lines
2.1 KiB
Go
97 lines
2.1 KiB
Go
package xmpp
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"strings"
|
|
|
|
xmpp "dev.sum7.eu/genofire/yaja/xmpp"
|
|
"dev.sum7.eu/genofire/yaja/xmpp/base"
|
|
"dev.sum7.eu/genofire/yaja/xmpp/x/muc"
|
|
"github.com/bdlm/log"
|
|
|
|
"dev.sum7.eu/genofire/logmania/database"
|
|
)
|
|
|
|
func (out *Output) Join(to string) {
|
|
toJID := xmppbase.NewJID(to)
|
|
toJID.Resource = nickname
|
|
err := out.client.Send(&xmpp.PresenceClient{
|
|
To: toJID,
|
|
MUC: &xmuc.Base{
|
|
History: &xmuc.History{
|
|
MaxChars: &historyMaxChars,
|
|
},
|
|
},
|
|
})
|
|
if err != nil {
|
|
logger.Error("xmpp could not join ", toJID.String(), " error:", err)
|
|
} else {
|
|
out.channels[to] = true
|
|
}
|
|
}
|
|
|
|
func (out *Output) sender() {
|
|
// priority of bot higher: https://groups.google.com/forum/#!topic/golang-nuts/M2xjN_yWBiQ
|
|
for {
|
|
select {
|
|
case el := <-out.botOut:
|
|
out.client.Send(el)
|
|
default:
|
|
select {
|
|
case el := <-out.logOut:
|
|
out.client.Send(el)
|
|
default:
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func (out *Output) Send(e *log.Entry, to *database.Notify) bool {
|
|
html, text := formatLog(e)
|
|
if html == "" || text == "" {
|
|
logger.Error("during format notify")
|
|
return false
|
|
}
|
|
html = strings.TrimRight(to.RunReplace(html), "\n")
|
|
var body xmpp.XMLElement
|
|
xml.Unmarshal([]byte(html), &body)
|
|
|
|
text = strings.TrimRight(to.RunReplace(text), "\n")
|
|
|
|
if to.Protocol == protoGroup {
|
|
if _, ok := out.channels[to.To]; ok {
|
|
toJID := xmppbase.NewJID(to.To)
|
|
toJID.Resource = nickname
|
|
err := out.client.Send(&xmpp.PresenceClient{
|
|
To: toJID,
|
|
MUC: &xmuc.Base{
|
|
History: &xmuc.History{
|
|
MaxChars: &historyMaxChars,
|
|
},
|
|
},
|
|
})
|
|
if err != nil {
|
|
logger.Error("xmpp could not join ", toJID.String(), " error:", err)
|
|
} else {
|
|
out.channels[to.To] = true
|
|
}
|
|
}
|
|
out.logOut <- &xmpp.MessageClient{
|
|
Type: xmpp.MessageTypeGroupchat,
|
|
To: xmppbase.NewJID(to.To),
|
|
Body: text,
|
|
HTML: &xmpp.HTML{Body: xmpp.HTMLBody{Body: body}},
|
|
}
|
|
return true
|
|
}
|
|
if to.Protocol == proto {
|
|
out.logOut <- &xmpp.MessageClient{
|
|
Type: xmpp.MessageTypeChat,
|
|
To: xmppbase.NewJID(to.To),
|
|
Body: text,
|
|
HTML: &xmpp.HTML{Body: xmpp.HTMLBody{Body: body}},
|
|
}
|
|
return true
|
|
}
|
|
return false
|
|
}
|