Logging and reading outq

This commit is contained in:
Neale Pickett 2014-07-21 05:03:53 +00:00
parent 3ef3cf3b0b
commit 5c178b38f9
1 changed files with 66 additions and 14 deletions

58
irc.go
View File

@ -9,8 +9,11 @@ import (
"net" "net"
"os" "os"
"strings" "strings"
"time"
) )
var running bool = true
type Message struct { type Message struct {
Command string Command string
FullSender string FullSender string
@ -26,6 +29,10 @@ func (m Message) String() string {
return fmt.Sprintf("%s %s %s %s %s", m.Command, m.Sender, m.Forum, args, m.Text) return fmt.Sprintf("%s %s %s %s %s", m.Command, m.Sender, m.Forum, args, m.Text)
} }
func Log(m Message) {
fmt.Printf("%d %s\n", time.Now().Unix(), m.String())
}
func nuhost(s string) (string, string, string) { func nuhost(s string) (string, string, string) {
var parts []string var parts []string
@ -98,7 +105,7 @@ func parse(v string) (Message, error) {
} }
m.Command = strings.ToUpper(parts[0]) m.Command = strings.ToUpper(parts[0])
switch (m.Command) { switch m.Command {
case "PRIVMSG", "NOTICE": case "PRIVMSG", "NOTICE":
n, u, _ := nuhost(parts[1]) n, u, _ := nuhost(parts[1])
if u == "" { if u == "" {
@ -131,20 +138,56 @@ func parse(v string) (Message, error) {
} }
func dispatch(outq chan<- string, m Message) { func dispatch(outq chan<- string, m Message) {
log.Print(m.String()) Log(m)
switch (m.Command) { switch m.Command {
case "PING": case "PING":
outq <- "PONG :" + m.Text outq <- "PONG :" + m.Text
} }
} }
func handleInfile(path string, outq chan<- string) {
f, err := os.Open(path)
if (err != nil) {
return
}
defer f.Close()
os.Remove(path)
inf := bufio.NewScanner(f)
for inf.Scan() {
outq <- inf.Text()
}
}
func monitorDirectory(dirname string, dir *os.File, outq chan<- string) {
latest := time.Unix(0, 0)
for running {
fi, err := dir.Stat()
if err != nil {
break
}
current := fi.ModTime()
if current.After(latest) {
latest = current
dn, _ := dir.Readdirnames(0)
for _, fn := range dn {
path := dirname + string(os.PathSeparator) + fn
handleInfile(path, outq)
}
_, _ = dir.Seek(0, 0)
}
time.Sleep(500 * time.Millisecond)
}
}
func usage() { func usage() {
fmt.Fprintf(os.Stderr, "Usage: %s [OPTIONS] HOST:PORT\n", os.Args[0]) fmt.Fprintf(os.Stderr, "Usage: %s [OPTIONS] HOST:PORT\n", os.Args[0])
flag.PrintDefaults() flag.PrintDefaults()
} }
func main() { func main() {
log.SetFlags(log.LstdFlags | log.Lshortfile)
dotls := flag.Bool("notls", true, "Disable TLS security") dotls := flag.Bool("notls", true, "Disable TLS security")
outqdir := flag.String("outq", "outq", "Output queue directory")
flag.Parse() flag.Parse()
if flag.NArg() != 1 { if flag.NArg() != 1 {
@ -152,6 +195,12 @@ func main() {
os.Exit(69) os.Exit(69)
} }
dir, err := os.Open(*outqdir)
if err != nil {
log.Fatal(err)
}
defer dir.Close()
conn, err := connect(flag.Arg(0), *dotls) conn, err := connect(flag.Arg(0), *dotls)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@ -161,6 +210,7 @@ func main() {
outq := make(chan string) outq := make(chan string)
go readLoop(conn, inq) go readLoop(conn, inq)
go writeLoop(conn, outq) go writeLoop(conn, outq)
go monitorDirectory(*outqdir, dir, outq)
outq <- "NICK neale" outq <- "NICK neale"
outq <- "USER neale neale neale :neale" outq <- "USER neale neale neale :neale"
@ -172,5 +222,7 @@ func main() {
dispatch(outq, p) dispatch(outq, p)
} }
running = false
close(outq) close(outq)
} }