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)
}
}
|