/
auth.go
43 lines (40 loc) · 1.01 KB
/
auth.go
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
package main
import (
"crypto/md5"
"fmt"
irc "github.com/fluffle/goirc/client"
"strings"
)
func Auth(conn *irc.Conn, channel, secret string) {
conn.AddHandler("353", func(c *irc.Conn, l *irc.Line) { // NAMES
if l.Args[2] != channel {
return
}
for _, nick := range strings.Split(l.Args[3], " ", -1) {
if !strings.HasPrefix(nick, "@") {
continue
}
nick = nick[1:]
hash := makeHash(channel, c.Me.Nick, nick, secret)
c.Privmsg(nick, ".authop "+channel+" "+hash)
}
})
conn.AddHandler("PRIVMSG", func(c *irc.Conn, l *irc.Line) {
if strings.HasPrefix(l.Args[0], "#") {
return
}
p := strings.Split(l.Args[1], " ", -1)
if len(p) != 3 || p[0] != ".authop" || p[1] != channel {
return
}
if p[2] != makeHash(channel, l.Nick, c.Me.Nick, secret) {
return
}
c.Mode(channel, l.Nick+" +o")
})
}
func makeHash(channel, requester, requestee, secret string) string {
h := md5.New()
fmt.Fprintf(h, "%s-%s-%s-%s", channel, requester, requestee, secret)
return fmt.Sprintf("%x", h.Sum())
}