2018-10-21 13:57:23 +02:00
|
|
|
package wat
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/go-irc/irc"
|
|
|
|
"crypto/tls"
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type WatBot struct {
|
|
|
|
client *irc.Client
|
|
|
|
conn *tls.Conn
|
|
|
|
game *WatGame
|
|
|
|
Db *WatDb
|
|
|
|
Nick string
|
|
|
|
}
|
|
|
|
|
2018-10-23 01:15:28 +02:00
|
|
|
var allowedChannels = []string {
|
|
|
|
"##wat",
|
|
|
|
"##test",
|
|
|
|
"##sweden",
|
|
|
|
}
|
|
|
|
|
2018-10-21 13:57:23 +02:00
|
|
|
func NewWatBot(config *irc.ClientConfig, serverConn *tls.Conn) *WatBot {
|
|
|
|
wat := WatBot{conn:serverConn, Nick:config.Nick}
|
|
|
|
wat.Db = NewWatDb()
|
|
|
|
wat.game = NewWatGame(&wat, wat.Db)
|
|
|
|
config.Handler = irc.HandlerFunc(wat.HandleIrcMsg)
|
|
|
|
wat.client = irc.NewClient(wat.conn, *config)
|
|
|
|
return &wat
|
|
|
|
}
|
|
|
|
|
|
|
|
func CleanNick(nick string) string {
|
|
|
|
return string(nick[0])+"\u200c"+nick[1:]
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w *WatBot) HandleIrcMsg(c *irc.Client, m *irc.Message) {
|
|
|
|
switch cmd := m.Command; cmd {
|
|
|
|
case "PING":
|
|
|
|
w.write("PONG", m.Params[0])
|
|
|
|
case "PRIVMSG":
|
|
|
|
w.Msg(m)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-21 14:14:08 +02:00
|
|
|
func (w *WatBot) Admin(m *irc.Message) bool {
|
|
|
|
return m.Prefix.Host == "tripsit/operator/hibs"
|
|
|
|
}
|
|
|
|
|
2018-10-23 01:15:28 +02:00
|
|
|
func (w *WatBot) AllowedChannel(c string) bool {
|
|
|
|
for _, allowed := range allowedChannels {
|
|
|
|
if c == allowed {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2018-10-21 13:57:23 +02:00
|
|
|
func (w *WatBot) Msg(m *irc.Message) {
|
2018-10-23 03:36:02 +02:00
|
|
|
// bail out if you're not yves, if you're not tripsit or if you're not in an allowed channel
|
|
|
|
// but if you're an admin you can do whatever
|
|
|
|
if m.Prefix.Host == "tripsit/user/Yves" || !strings.Contains(m.Prefix.Host, "tripsit") || (!w.AllowedChannel(m.Params[0]) && !w.Admin(m)) {
|
2018-10-21 14:14:08 +02:00
|
|
|
return
|
2018-10-21 13:57:23 +02:00
|
|
|
}
|
2018-10-21 14:14:08 +02:00
|
|
|
|
2018-10-25 02:04:35 +02:00
|
|
|
// make sure there's actually some text to process
|
2018-10-23 03:36:02 +02:00
|
|
|
if len(m.Params[1]) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-10-25 02:04:35 +02:00
|
|
|
// fieldsfunc allows you to obtain rune separated fields/args
|
2018-10-21 14:14:08 +02:00
|
|
|
args := strings.FieldsFunc(m.Params[1], func(c rune) bool {return c == ' '})
|
|
|
|
|
2018-10-23 03:36:02 +02:00
|
|
|
if len(args) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-10-21 14:14:08 +02:00
|
|
|
if w.Admin(m) {
|
2018-10-25 02:04:35 +02:00
|
|
|
// allow impersonation of the robot from anywhere
|
2018-10-23 03:36:02 +02:00
|
|
|
if args[0] == "imp" && len(args) > 2 {
|
2018-10-25 02:04:35 +02:00
|
|
|
if args[1] == "PRIVMSG" {
|
|
|
|
w.write(args[1], strings.Join(args[2:], " "))
|
|
|
|
} else {
|
|
|
|
w.write(args[1], args[2:]...)
|
|
|
|
}
|
2018-10-23 03:36:02 +02:00
|
|
|
return
|
2018-10-21 13:57:23 +02:00
|
|
|
}
|
|
|
|
}
|
2018-10-21 14:14:08 +02:00
|
|
|
|
2018-10-23 03:36:02 +02:00
|
|
|
// strip offline message prefix from znc for handling offline buffer
|
|
|
|
if args[0][0] == '[' && len(args) > 1 {
|
|
|
|
args = args[1:]
|
|
|
|
}
|
|
|
|
|
|
|
|
// check if command char (or something weird) is present
|
|
|
|
if args[0] != "wat" && args[0][0] != '#' {
|
2018-10-21 14:14:08 +02:00
|
|
|
return
|
|
|
|
}
|
2018-10-23 03:36:02 +02:00
|
|
|
|
|
|
|
|
|
|
|
// clean input
|
2018-10-21 14:14:08 +02:00
|
|
|
if args[0][0] == '#' {
|
|
|
|
args[0] = args[0][1:]
|
|
|
|
}
|
2018-10-23 03:36:02 +02:00
|
|
|
|
2018-10-21 14:14:08 +02:00
|
|
|
user := strings.ToLower(m.Prefix.Name)
|
|
|
|
player := w.Db.User(user, m.Prefix.Host, true)
|
|
|
|
w.game.Msg(m, &player, args)
|
2018-10-21 13:57:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (w *WatBot) Run() {
|
|
|
|
defer w.conn.Close()
|
|
|
|
err := w.client.Run()
|
|
|
|
if err != nil {
|
2018-10-25 02:04:35 +02:00
|
|
|
fmt.Println("Error returned while running client: " + err.Error())
|
2018-10-21 13:57:23 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w *WatBot) say(dest, msg string) {
|
|
|
|
if len(msg) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
fmt.Printf("MSG %s: %s\n", dest, msg)
|
|
|
|
w.write("PRIVMSG", dest, msg)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w *WatBot) reply(s *irc.Message, r string) {
|
|
|
|
sender := s.Params[0]
|
|
|
|
if sender == w.Nick {
|
|
|
|
sender = s.Prefix.Name
|
|
|
|
}
|
|
|
|
w.say(sender, r)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w *WatBot) write(cmd string, params ...string) {
|
|
|
|
w.client.WriteMessage(&irc.Message{
|
|
|
|
Command: cmd,
|
|
|
|
Params: params,
|
|
|
|
})
|
|
|
|
}
|