irc-webhooks/src/bot.go

104 lines
2.2 KiB
Go

package main
import (
"bufio"
"github.com/goshuirc/irc-go/ircmsg"
"log"
"os"
)
type Bot struct {
Nick string
Ident string
Realname string
Server Server
ChansToJoin []string
NSPasswd string
NSNick string
Logger log.Logger
MsgChan chan string
}
type BotConfig struct {
Nick string
Ident string
Realname string
ChansToJoin []string
NSNick string
NSPasswd string
MsgChan chan string
}
func newBot(config BotConfig, host, port, connectionName string, ssl bool) *Bot {
logger := *log.New(os.Stdout, "", log.LstdFlags)
return &Bot{
Nick: config.Nick,
Ident: config.Ident,
Realname: config.Realname,
NSPasswd: config.NSPasswd,
NSNick: config.NSNick,
ChansToJoin: config.ChansToJoin,
Server: *NewServer(host, port, connectionName, ssl, logger),
Logger: logger,
MsgChan: config.MsgChan,
}
}
func (b *Bot) run() {
err := b.Server.Connect()
if err != nil {
b.Logger.Fatal(err)
}
go b.sendLoop()
b.sendRaw(MakeMessage("NICK", b.Nick))
b.sendRaw(MakeMessage("USER", b.Ident, "0", "0", b.Realname))
b.readLoop()
}
func (b *Bot) send(message string) {
b.MsgChan <- message
}
func (b *Bot) sendRaw(message ircmsg.IrcMessage) {
line, err := message.LineBytes()
if err != nil {
b.Logger.Printf("could not convert IrcMessage to string: %v", err)
return
}
b.Logger.Printf(">> %s", line)
b.Server.Conn.Write(line)
}
func (b *Bot) readLoop() {
scanner := bufio.NewScanner(b.Server.Conn)
for scanner.Scan() {
b.HandleLine(scanner.Text())
}
}
func (b *Bot) joinChannel(channelName string) {
b.sendRaw(MakeMessage("JOIN", channelName))
}
func (b *Bot) sendPrivMessage(target, message string) {
b.sendRaw(MakeMessage("PRIVMSG", target, message))
}
func (b *Bot) fanOutMsg(message string) {
for _, c := range b.ChansToJoin {
b.sendPrivMessage(c, message)
}
}
func (b *Bot) sendLoop() {
for {
select {
case msg := <- b.MsgChan:
b.fanOutMsg(msg)
}
}
}