You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
3.4 KiB
Go
152 lines
3.4 KiB
Go
package testclient
|
|
|
|
import (
|
|
"bufio"
|
|
"flag"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"math/rand"
|
|
"net/http"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
var chatAddress = "localhost:8000"
|
|
var loginAddress = "localhost:8001"
|
|
var rate = 1000
|
|
var wordPerMessage = 3
|
|
var refresh = 240
|
|
var listen bool
|
|
var autoSend bool
|
|
var stdinSend bool
|
|
var LoadMessages bool
|
|
var debug bool
|
|
var serverName string
|
|
var test bool
|
|
|
|
var wordsSource = "https://gist.githubusercontent.com/deekayen/4148741/raw/98d35708fa344717d8eee15d11987de6c8e26d7d/1-1000.txt"
|
|
var wordsList []string
|
|
var rng *rand.Rand
|
|
|
|
var Username string
|
|
var token string
|
|
var session string
|
|
|
|
var Done chan (struct{})
|
|
var Line chan string
|
|
|
|
func debugPrint(args ...any) {
|
|
if debug {
|
|
fmt.Print("DEBUG: ")
|
|
fmt.Println(args...)
|
|
fmt.Println() // spacer
|
|
}
|
|
}
|
|
|
|
func Initialise() error {
|
|
parseArgs()
|
|
|
|
if test {
|
|
listen, autoSend, LoadMessages, debug = true, true, true, true
|
|
}
|
|
|
|
if list, err := buildWordsList(wordsSource); err != nil {
|
|
return err
|
|
} else {
|
|
wordsList = list
|
|
}
|
|
|
|
rng = rand.New(rand.NewSource(time.Now().Unix()))
|
|
generateUsername()
|
|
|
|
if stdinSend {
|
|
go sendFromStdin()
|
|
}
|
|
|
|
go manageToken()
|
|
return nil
|
|
}
|
|
|
|
func generateUsername() {
|
|
Username = wordsList[rng.Intn(len(wordsList))] + "_" + wordsList[rng.Intn(len(wordsList))]
|
|
}
|
|
|
|
func parseArgs() {
|
|
flag.StringVar(&chatAddress, "chataddr", chatAddress, "address for chat server")
|
|
flag.StringVar(&loginAddress, "loginaddr", loginAddress, "address for login server")
|
|
flag.StringVar(&serverName, "server", serverName, "server name (blank for main)")
|
|
flag.IntVar(&rate, "rate", rate, "time in ms between messages")
|
|
flag.IntVar(&wordPerMessage, "wpm", wordPerMessage, "words per message")
|
|
flag.BoolVar(&listen, "listen", listen, "listen and echo every message received")
|
|
flag.BoolVar(&autoSend, "autosend", autoSend, "auto generate and send messages of length and rate specified")
|
|
flag.BoolVar(&LoadMessages, "load", LoadMessages, "load most recent messages when connecting to chat")
|
|
flag.BoolVar(&debug, "debug", debug, "print additional debug messages e.g. http responses, auth token")
|
|
flag.IntVar(&refresh, "refresh", refresh, "auth token refresh rate in seconds")
|
|
flag.BoolVar(&stdinSend, "send", stdinSend, "send messages from CLI")
|
|
flag.BoolVar(&test, "test", test, "test all functionality (implies -listen, -autosend, -load, -debug)")
|
|
|
|
flag.Parse()
|
|
}
|
|
|
|
func createMessage() (message string) {
|
|
for i := 0; i < wordPerMessage; i++ {
|
|
message += wordsList[rng.Intn(len(wordsList))] + " "
|
|
}
|
|
return
|
|
}
|
|
|
|
func buildWordsList(url string) (wordsList []string, err error) {
|
|
res, err := http.Get(url)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, err.Error())
|
|
return
|
|
}
|
|
wordsList = make([]string, 0)
|
|
body, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "error reading response body:", err)
|
|
}
|
|
|
|
var word []byte
|
|
for _, char := range body {
|
|
if char == '\r' {
|
|
continue
|
|
}
|
|
if char == '\n' {
|
|
wordsList = append(wordsList, string(word))
|
|
word = make([]byte, 0)
|
|
} else {
|
|
word = append(word, char)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func sendFromStdin() {
|
|
defer func() {
|
|
fmt.Println("stopped reading from stdin")
|
|
}()
|
|
|
|
Line = make(chan string)
|
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
for {
|
|
l, _, err := reader.ReadLine()
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return
|
|
}
|
|
Line <- string(l)
|
|
}
|
|
}
|
|
|
|
func manageToken() {
|
|
ticker := time.NewTicker(time.Second * time.Duration(refresh))
|
|
|
|
for {
|
|
<-ticker.C
|
|
refreshToken()
|
|
}
|
|
}
|