sum7
/
yaja
Archived
1
0
Fork 0
This repository has been archived on 2020-09-27. You can view files and clone it, but cannot push or open issues or pull requests.
yaja/bot/main.go

90 lines
1.8 KiB
Go

package bot
import (
log "github.com/sirupsen/logrus"
"dev.sum7.eu/genofire/yaja/client"
"dev.sum7.eu/genofire/yaja/xmpp"
"dev.sum7.eu/genofire/yaja/xmpp/base"
)
type Bot struct {
AutoSubscribe bool
Logging *log.Entry
Handlers []Handler
client *client.Client
jid *xmppbase.JID
password string
}
func NewBot(jid *xmppbase.JID, password string) *Bot {
bot := Bot{
jid: jid,
password: password,
Logging: log.WithField("jid", jid.String()),
}
bot.Handlers = append(bot.Handlers, &SubscribeHander{Disabled: &bot.AutoSubscribe})
return &bot
}
func (bot *Bot) Start() {
if bot.client == nil {
bot.client = &client.Client{
JID: bot.jid,
Logging: bot.Logging,
}
if bot.client.Connect(bot.password) != nil {
bot.Logging.Fatal("was not able to connect")
}
go func() {
if err := bot.client.Start(); err != nil {
bot.Logging.Fatal("was not able to reconnect")
}
}()
}
bot.run()
}
func (bot *Bot) run() {
for {
element, more := bot.client.Recv()
if !more {
bot.Logging.Info("could not recv msg, closed")
return
}
handled := false
switch element.(type) {
case *xmpp.PresenceClient:
pres := element.(*xmpp.PresenceClient)
for _, f := range bot.Handlers {
if f.Presence(bot, pres) {
handled = true
break
}
}
case *xmpp.MessageClient:
msg := element.(*xmpp.MessageClient)
for _, f := range bot.Handlers {
if f.Message(bot, msg) {
handled = true
break
}
}
case *xmpp.IQClient:
iq := element.(*xmpp.IQClient)
for _, f := range bot.Handlers {
if f.IQ(bot, iq) {
handled = true
break
}
}
}
if handled {
bot.Logging.Debugf("recv handled: %v", element)
} else {
bot.Logging.Infof("recv unhandled: %v", element)
}
}
}