61 lines
953 B
Go
61 lines
953 B
Go
|
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
|
||
|
}
|