package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"time"
|
|
|
|
"github.com/chzyer/readline"
|
|
)
|
|
import "log"
|
|
|
|
func main() {
|
|
rl, err := readline.NewEx(&readline.Config{
|
|
UniqueEditLine: true,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer rl.Close()
|
|
|
|
rl.SetPrompt("username: ")
|
|
username, err := rl.Readline()
|
|
if err != nil {
|
|
return
|
|
}
|
|
rl.ResetHistory()
|
|
log.SetOutput(rl.Stderr())
|
|
|
|
fmt.Fprintln(rl, "Hi,", username+"! My name is Dave.")
|
|
rl.SetPrompt(username + "> ")
|
|
|
|
done := make(chan struct{})
|
|
go func() {
|
|
rand.Seed(time.Now().Unix())
|
|
loop:
|
|
for {
|
|
select {
|
|
case <-time.After(time.Duration(rand.Intn(20)) * 100 * time.Millisecond):
|
|
case <-done:
|
|
break loop
|
|
}
|
|
log.Println("Dave:", "hello")
|
|
}
|
|
log.Println("Dave:", "bye")
|
|
done <- struct{}{}
|
|
}()
|
|
|
|
for {
|
|
ln := rl.Line()
|
|
if ln.CanContinue() {
|
|
continue
|
|
} else if ln.CanBreak() {
|
|
break
|
|
}
|
|
log.Println(username+":", ln.Line)
|
|
}
|
|
rl.Clean()
|
|
done <- struct{}{}
|
|
<-done
|
|
}
|