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.

201 lines
4.7 KiB
Go

package testclient
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/http/cookiejar"
"net/url"
"os"
"time"
"github.com/gorilla/websocket"
)
type TokenObj struct {
Token string `json:"session"`
}
type SessionObj struct {
Session string `json:"session"`
}
var client *http.Client
var conn *websocket.Conn
func InitHttpClient() (err error) {
jar, err := cookiejar.New(nil)
if err != nil {
fmt.Fprintln(os.Stderr, "error initialising cookie jar", err.Error())
return err
}
client = &http.Client{
Jar: jar,
}
return
}
func Register() error {
postBody := []byte(`{"username":"` + Username + `","password":"Password1!"}`)
req, err := http.NewRequest("POST", "http://"+loginAddress+"/register", bytes.NewBuffer(postBody))
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
return err
}
res, err := client.Do(req)
if err != nil {
fmt.Fprintln(os.Stderr, "could not reach login server", err.Error())
os.Exit(1)
}
if res.StatusCode != http.StatusCreated {
fmt.Fprintln(os.Stderr, "Status code", res.StatusCode, "received")
os.Exit(1)
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Fprintln(os.Stderr, "error reading register body:", err)
os.Exit(1)
}
debugPrint("sent ", string(postBody), "received", res.StatusCode, "from", req.URL, "with response body", string(body))
type TokenObj struct {
Token string `json:"token"`
}
var tokenObj TokenObj
if err := json.Unmarshal(body, &tokenObj); err != nil {
fmt.Fprintln(os.Stderr, "error unmarshalling token:", err.Error())
return err
}
token = tokenObj.Token
debugPrint("initial token set to", token)
return nil
}
func WsConnect() {
u := url.URL{Scheme: "ws", Host: chatAddress, Path: "/connect", RawQuery: "name=" + serverName}
var err error
header := http.Header{}
header.Set("Token", token)
conn, _, err = websocket.DefaultDialer.Dial(u.String(), header)
if err != nil {
fmt.Fprintln(os.Stderr, "error connecting to ws: ", err.Error())
return
}
Done = make(chan struct{})
debugPrint("connected to websocket server", serverName, "(blank for root) at", u.String())
go func() {
defer conn.Close()
for {
_, mess, err := conn.ReadMessage()
if err != nil {
fmt.Println(err)
Done <- struct{}{}
return
}
if listen {
fmt.Println(string(mess))
}
}
}()
if autoSend {
go func() {
t := time.NewTicker(time.Millisecond * time.Duration(rate))
for {
<-t.C
SendMessage(createMessage())
}
}()
}
}
func SendMessage(message string) {
mess := []byte(`{"text":"` + message + `","user":"` + token + `"}`)
req, err := http.NewRequest("POST", "http://"+chatAddress+"/send?name="+serverName, bytes.NewBuffer(mess))
if err != nil {
fmt.Fprintln(os.Stderr, "creating post request error:", err.Error())
os.Exit(1)
}
req.Header.Set("Token", token)
res, err := client.Do(req)
if err != nil {
fmt.Fprintln(os.Stderr, "sending post request error:", err.Error())
}
if res.StatusCode != http.StatusOK {
fmt.Fprintln(os.Stderr, "received", res.StatusCode, "when sending message")
}
debugPrint("sent", message, "received", res.StatusCode)
}
func LoadDefaultMessages() {
req, err := http.NewRequest("GET", "http://"+chatAddress+"/messages?name="+serverName, nil)
if err != nil {
fmt.Fprintln(os.Stderr, "creating get request error:", err.Error())
os.Exit(1)
}
req.Header.Set("Token", token)
res, err := client.Do(req)
if err != nil {
fmt.Fprintln(os.Stderr, "sending get request error:", err.Error())
return
}
if res.StatusCode != http.StatusOK {
fmt.Fprintln(os.Stderr, "received", res.StatusCode, "when loading message")
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Fprintln(os.Stderr, "error reading response body:", err)
}
debugPrint("load messages: status", res.StatusCode, "body:", string(body))
}
func refreshToken() {
req, err := http.NewRequest("GET", "http://"+loginAddress+"/auth", nil)
if err != nil {
fmt.Fprintln(os.Stderr, "creating get request error:", err.Error())
os.Exit(1)
}
res, err := client.Do(req)
if err != nil {
fmt.Fprintln(os.Stderr, "could not reach login server", err.Error())
os.Exit(1)
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Fprintln(os.Stderr, "error reading auth response body:", err)
}
if res.StatusCode != http.StatusOK {
fmt.Fprintln(os.Stderr, "/auth received status code", res.StatusCode, "with body", string(body))
}
type TokenObj struct {
Token string `json:"token"`
}
var tokenObj TokenObj
if err := json.Unmarshal(body, &tokenObj); err != nil {
fmt.Fprintln(os.Stderr, "error unmarshalling token:", err.Error())
return
}
token = tokenObj.Token
debugPrint("refreshing token to", token)
}