Added Commander mock support
This commit is contained in:
parent
234e7592c2
commit
605d61d892
104
service.go
104
service.go
|
@ -4,9 +4,13 @@ package mock
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/Pallinder/go-randomdata"
|
||||||
"github.com/diamondburned/cchat"
|
"github.com/diamondburned/cchat"
|
||||||
"github.com/diamondburned/cchat/services"
|
"github.com/diamondburned/cchat/services"
|
||||||
"github.com/diamondburned/cchat/text"
|
"github.com/diamondburned/cchat/text"
|
||||||
|
@ -126,10 +130,12 @@ type Session struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ cchat.Icon = (*Session)(nil)
|
_ cchat.Icon = (*Session)(nil)
|
||||||
_ cchat.Session = (*Session)(nil)
|
_ cchat.Session = (*Session)(nil)
|
||||||
_ cchat.ServerList = (*Session)(nil)
|
_ cchat.ServerList = (*Session)(nil)
|
||||||
_ cchat.SessionSaver = (*Session)(nil)
|
_ cchat.SessionSaver = (*Session)(nil)
|
||||||
|
_ cchat.Commander = (*Session)(nil)
|
||||||
|
_ cchat.CommandCompleter = (*Session)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
func newSession(username string) *Session {
|
func newSession(username string) *Session {
|
||||||
|
@ -172,3 +178,93 @@ func (s *Session) Save() (map[string]string, error) {
|
||||||
"username": s.username,
|
"username": s.username,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Session) RunCommand(cmds []string) (io.ReadCloser, error) {
|
||||||
|
var r, w = io.Pipe()
|
||||||
|
|
||||||
|
switch cmd := arg(cmds, 0); cmd {
|
||||||
|
case "ls":
|
||||||
|
go func() {
|
||||||
|
fmt.Fprintln(w, "Commands: ls, random")
|
||||||
|
w.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
case "random":
|
||||||
|
// callback used to generate stuff and stream into readcloser
|
||||||
|
var generator func() string
|
||||||
|
// number of times to generate the word
|
||||||
|
var times = 1
|
||||||
|
|
||||||
|
switch arg(cmds, 1) {
|
||||||
|
case "paragraph":
|
||||||
|
generator = randomdata.Paragraph
|
||||||
|
case "noun":
|
||||||
|
generator = randomdata.Noun
|
||||||
|
case "silly_name":
|
||||||
|
generator = randomdata.SillyName
|
||||||
|
default:
|
||||||
|
return nil, errors.New("Usage: random <paragraph|noun|silly_name> [repeat]")
|
||||||
|
}
|
||||||
|
|
||||||
|
if n := arg(cmds, 2); n != "" {
|
||||||
|
i, err := strconv.Atoi(n)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "Failed to parse repeat number")
|
||||||
|
}
|
||||||
|
times = i
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
defer w.Close()
|
||||||
|
|
||||||
|
for i := 0; i < times; i++ {
|
||||||
|
// Yes, we're simulating this even in something as trivial as a
|
||||||
|
// command prompt.
|
||||||
|
if err := simulateAustralianInternet(); err != nil {
|
||||||
|
fmt.Fprintln(w, "Error:", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintln(w, generator())
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("Unknown command: %s", cmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Session) CompleteCommand(words []string, i int) []string {
|
||||||
|
switch {
|
||||||
|
case strings.HasPrefix("ls", words[i]):
|
||||||
|
return []string{"ls"}
|
||||||
|
|
||||||
|
case strings.HasPrefix("random", words[i]):
|
||||||
|
return []string{
|
||||||
|
"random paragraph",
|
||||||
|
"random noun",
|
||||||
|
"random silly_name",
|
||||||
|
}
|
||||||
|
|
||||||
|
case lookbackCheck(words, i, "random", "paragraph"):
|
||||||
|
return []string{"paragraph"}
|
||||||
|
|
||||||
|
case lookbackCheck(words, i, "random", "noun"):
|
||||||
|
return []string{"noun"}
|
||||||
|
|
||||||
|
case lookbackCheck(words, i, "random", "silly_name"):
|
||||||
|
return []string{"silly_name"}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func arg(sl []string, i int) string {
|
||||||
|
if i >= len(sl) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return sl[i]
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue