forked from mischief/glenda
/
adventure.go
104 lines (82 loc) · 1.79 KB
/
adventure.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
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
package main
import (
"bufio"
"fmt"
"github.com/kballard/goirc/irc"
"io"
"log"
"os/exec"
"strings"
"time"
)
func init() {
RegisterModule("adventure", func() Module {
return &AdventureMod{}
})
}
type AdventureMod struct {
cmd *exec.Cmd
in io.WriteCloser
out *bufio.Scanner //io.ReadCloser
}
func (g *AdventureMod) Init(b *Bot, conn irc.SafeConn) error {
conf := b.Config.Search("mod", "adventure")
channel := conf.Search("channel")
go func() {
var err error
time.Sleep(5 * time.Second)
for err == nil {
if err = g.spawn(); err != nil {
log.Printf("adventure spawn error: %s", err)
break
}
for g.out.Scan() {
line := g.out.Text()
log.Printf("adventure: %s", line)
conn.Privmsg(channel, line)
}
if err := g.out.Err(); err != nil {
log.Printf("adventure read error: %s", err)
}
}
}()
conn.AddHandler("PRIVMSG", func(c *irc.Conn, l irc.Line) {
args := strings.Split(l.Args[1], " ")
if args[0] == ".a" {
line := strings.Join(args[1:], " ")
log.Printf("adventure: writing %q", line)
if _, err := fmt.Fprintf(g.in, "%s\n", line); err != nil {
log.Printf("adventure: error writing to subprocess: %s", err)
}
}
})
log.Printf("adventure module initialized with channel %s", channel)
return nil
}
func (g *AdventureMod) Reload() error {
return nil
}
func (g *AdventureMod) Call(args ...string) error {
return nil
}
func (g *AdventureMod) spawn() error {
g.cmd = exec.Command("unbuffer", "-p", "adventure")
out, err := g.cmd.StdoutPipe()
if err != nil {
return err
}
g.out = bufio.NewScanner(out)
g.in, err = g.cmd.StdinPipe()
if err != nil {
return err
}
if err = g.cmd.Start(); err != nil {
return err
}
// get rid of prompt
io.WriteString(g.in, "n\n")
g.out.Scan()
g.out.Scan()
g.out.Scan()
return nil
}