all repos — paprika @ master

go rewrite of taigabot

main.go (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
package main

import (
	"crypto/tls"
	"errors"
	"io"
	"log"
	"net"
	"strings"

	"git.icyphox.sh/paprika/config"
	"git.icyphox.sh/paprika/database"
	"git.icyphox.sh/paprika/plugins"
	"gopkg.in/irc.v3"
)

func handleChatMessage(c *irc.Client, m *irc.Message, response string, err error) {
	if errors.Is(err, plugins.NoReply) {
		return
	}

	cmd := "PRIVMSG"
	if errors.Is(err, plugins.IsNotice) {
		err = nil
		cmd = "NOTICE"
	}

	target := m.Params[0]
	if serr, ok := err.(*plugins.IsPrivateNotice); ok {
		target = serr.To
		cmd = "NOTICE"
		err = nil
	}

	msg := irc.Message{Command: cmd}
	split := strings.Split(response, "\n")

	if errors.Is(err, plugins.IsRaw) {
		for _, line := range split {
			c.Write(line)
		}
	} else if err != nil {
		msg.Params = []string{target, response}
		c.WriteMessage(&msg)
		log.Printf("error: %v", err)
	} else {
		for _, line := range split {
			msg.Params = []string{target, line}
			c.WriteMessage(&msg)
		}
		return
	}
}

func ircHandler(c *irc.Client, m *irc.Message) {
	switch m.Command {
	case "001":
		c.Write(config.SplitChannelList(config.C.Channels))
	// TODO: Generalize this
	case "JOIN":
		err := plugins.SeenDoing(m)
		if err != nil && err != plugins.NoReply {
			log.Printf("error: %v", err)
		}
		response, err := plugins.GetIntro(m)
		handleChatMessage(c, m, response, err)
	case "PART", "QUIT":
		err := plugins.SeenDoing(m)
		if err != nil && err != plugins.NoReply {
			log.Printf("error: %v", err)
		}
	// TODO: Generalize this
	case "NOTICE":
		response, err := plugins.CTCPReply(m)
		handleChatMessage(c, m, response, err)
	case "PRIVMSG":
		// Trim leading and trailing spaces to not trip up our
		// plugins.
		m.Params[1] = strings.TrimSpace(m.Params[1])
		response, err := plugins.ProcessTrigger(m)
		handleChatMessage(c, m, response, err)
	// TODO: Generalize this
	case "401":
		response, err := plugins.NoSuchUser(m)
		handleChatMessage(c, m, response, err)
	}
}

func main() {
	var err error
	var conn io.ReadWriteCloser
	if !config.C.Tls {
		conn, err = net.Dial("tcp", config.C.Host)
	} else {
		conn, err = tls.Dial("tcp", config.C.Host, nil)
	}
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	ircConfig := irc.ClientConfig{
		Nick:    config.C.Nick,
		Pass:    config.C.Pass,
		User:    "paprikabot",
		Name:    config.C.Nick,
		Handler: irc.HandlerFunc(ircHandler),
	}

	database.DB.DB, err = database.Open()
	if err != nil {
		log.Fatal(err)
	}
	defer database.DB.Close()

	client := irc.NewClient(conn, ircConfig)
	err = client.Run()
	if err != nil {
		log.Fatal(err)
	}
}