mpp-client-go/test.go

308 lines
5.9 KiB
Go
Raw Normal View History

2024-07-09 05:36:45 +02:00
package mppclientgo
2024-04-18 13:45:29 +02:00
import (
"encoding/json"
"flag"
"fmt"
"log"
"net/url"
"os"
"os/signal"
"strings"
"time"
2024-07-09 05:36:45 +02:00
"github.com/Hri7566/mpp-client-go/events"
2024-04-20 11:27:00 +02:00
"github.com/Hri7566/mpp-client-go/mpp"
2024-04-18 13:45:29 +02:00
"github.com/gorilla/websocket"
2024-07-09 04:04:01 +02:00
v8 "rogchap.com/v8go"
2024-04-18 13:45:29 +02:00
)
var addr = flag.String("addr", "mppclone.com:8443", "websocket address")
var token string
2024-07-09 04:04:01 +02:00
var ctx *v8.Context
2024-04-18 13:45:29 +02:00
func main() {
2024-07-09 05:36:45 +02:00
evt := events.NewEventEmitter()
2024-07-09 04:04:01 +02:00
2024-07-09 05:36:45 +02:00
log := func(args ...any) {
fmt.Println(args[0])
2024-04-18 13:45:29 +02:00
}
2024-07-09 05:36:45 +02:00
evt.On("log", log)
evt.Emit("log", "hello, world")
/*
ctx = v8.NewContext()
helpCommands = commands
flag.Parse()
log.SetFlags(0)
err := godotenv.Load()
if err != nil {
log.Fatal(err)
}
token = os.Getenv("MPPNET_TOKEN")
2024-04-18 13:45:29 +02:00
2024-07-09 05:36:45 +02:00
StartSocket(addr)
*/
2024-04-18 13:45:29 +02:00
}
func StartSocket(address *string) {
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)
url := url.URL{Scheme: "wss", Host: *addr}
ws, _, err := websocket.DefaultDialer.Dial(url.String(), nil)
if err != nil {
log.Fatal("dial:", err)
}
defer ws.Close()
done := make(chan struct{})
serverTicker := time.NewTicker(15 * time.Second)
serverTickerQuit := make(chan struct{})
go func() {
for {
select {
2024-04-20 11:27:00 +02:00
case <-serverTicker.C:
2024-04-18 13:45:29 +02:00
SendTimeMessage(ws)
2024-04-20 11:27:00 +02:00
case <-serverTickerQuit:
2024-04-18 13:45:29 +02:00
serverTicker.Stop()
}
}
}()
go func() {
defer close(done)
for {
_, message, err := ws.ReadMessage()
if err != nil {
log.Println("read:", err)
return
}
// log.Printf("recv: %s", message)
go ReceiveMessage(ws, message)
// if (!sentHi) {
// // histr := "[{\"m\":\"hi\"},{\"m\":\"ch\",\"_id\":\"✧𝓓𝓔𝓥 𝓡𝓸𝓸𝓶✧\"}]"
// histr := "[{\"m\":\"hi\",\"token\":\"" + *token + "\"}]"
// println("Sending hi message: " + histr)
// err := ws.WriteMessage(1, []byte(histr))
// if err != nil {
// log.Println(err)
// }
// SendTimeMessage(ws)
// sentHi = true
// }
}
}()
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for {
select {
case <-done:
return
case <-interrupt:
log.Println("interrupt")
err := ws.WriteMessage(
websocket.CloseMessage,
websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""),
)
if err != nil {
log.Println("write close:", err)
return
}
select {
case <-done:
case <-time.After(time.Second):
}
return
}
}
}
func ReceiveMessage(ws *websocket.Conn, data []byte) {
var tmp []json.RawMessage
err := json.Unmarshal(data, &tmp)
if err != nil {
log.Fatal(err)
return
}
var header struct {
Type string `json:"m"`
}
for _, raw := range tmp {
_ = json.Unmarshal(raw, &header)
switch header.Type {
case "hi":
2024-04-20 11:27:00 +02:00
msg := mpp.HiMppMessage{}
2024-04-18 13:45:29 +02:00
_ = json.Unmarshal(raw, &msg)
ReceiveHiMessage(ws, &msg)
case "nq":
2024-04-20 11:27:00 +02:00
msg := mpp.NoteQuotaMppMessage{}
2024-04-18 13:45:29 +02:00
_ = json.Unmarshal(raw, &msg)
ReceiveNqMessage(&msg)
case "t":
2024-04-20 11:27:00 +02:00
msg := mpp.TimeMppMessage{}
2024-04-18 13:45:29 +02:00
_ = json.Unmarshal(raw, &msg)
case "a":
2024-04-20 11:27:00 +02:00
msg := mpp.ChatMppMessage{}
2024-04-18 13:45:29 +02:00
_ = json.Unmarshal(raw, &msg)
ReceiveChatMessage(ws, &msg)
case "b":
2024-04-20 21:41:10 +02:00
SendHandshake(ws)
2024-04-18 13:45:29 +02:00
default:
return
}
}
// println("Correctly deserialized JSON")
// spew.Dump(tmp)
// for _, msg := range msgs {
// println(msg.Type)
// }
}
2024-04-20 11:27:00 +02:00
func ReceiveNqMessage(msg *mpp.NoteQuotaMppMessage) {
2024-04-18 13:45:29 +02:00
// println(msg.MaxHistLen)
}
2024-04-20 11:27:00 +02:00
func ReceiveHiMessage(ws *websocket.Conn, msg *mpp.HiMppMessage) {
2024-04-18 13:45:29 +02:00
println("I am " + msg.User.Name)
2024-07-09 04:04:01 +02:00
chid := "{command-test}"
chstr := "[{\"m\":\"ch\",\"_id\":\"" + chid + "\"}]"
2024-04-18 13:45:29 +02:00
// println("Sending ch message: " + chstr)
err2 := ws.WriteMessage(1, []byte(chstr))
if err2 != nil {
log.Println(err2)
}
}
2024-04-20 21:41:10 +02:00
func SendHandshake(ws *websocket.Conn) {
// histr := "[{\"m\":\"hi\"},{\"m\":\"ch\",\"_id\":\"✧𝓓𝓔𝓥 𝓡𝓸𝓸𝓶✧\"}]"
histr := "[{\"m\":\"hi\",\"token\":\"" + token + "\"}]"
// println("Sending hi message: " + histr)
err := ws.WriteMessage(1, []byte(histr))
if err != nil {
log.Println(err)
}
SendTimeMessage(ws)
// sentHi = true
}
2024-04-18 13:45:29 +02:00
type CommandData struct {
2024-04-20 11:27:00 +02:00
mpp.ChatMppMessage
2024-04-18 13:45:29 +02:00
Args []string
2024-04-20 11:27:00 +02:00
Cmd string
2024-04-18 13:45:29 +02:00
}
type Command struct {
2024-04-20 11:27:00 +02:00
Id string
2024-04-18 13:45:29 +02:00
Callback func(ws *websocket.Conn, data *CommandData) string
}
var helpCommands []Command
var commands []Command = []Command{
{
Id: "help",
2024-04-20 11:27:00 +02:00
Callback: func(ws *websocket.Conn, data *CommandData) string {
2024-04-18 13:45:29 +02:00
output := "Commands: "
2024-04-20 11:27:00 +02:00
2024-04-18 13:45:29 +02:00
for _, cmd := range helpCommands {
output += cmd.Id + ", "
}
2024-04-20 11:27:00 +02:00
return strings.Trim(output[:len(output)-2], " ")
2024-04-18 13:45:29 +02:00
},
},
{
Id: "about",
2024-04-20 11:27:00 +02:00
Callback: func(ws *websocket.Conn, data *CommandData) string {
2024-07-09 04:04:01 +02:00
return "compiled with go version go1.22.3 linux/amd64"
2024-04-18 13:45:29 +02:00
},
},
{
2024-07-09 04:04:01 +02:00
Id: "js",
2024-04-18 13:45:29 +02:00
Callback: func(ws *websocket.Conn, data *CommandData) string {
2024-07-09 04:04:01 +02:00
argcat := data.Args[1:]
ctx = v8.NewContext()
val, err := ctx.RunScript(strings.Join(argcat, " "), "script.js")
2024-04-20 11:27:00 +02:00
2024-04-18 13:45:29 +02:00
if err != nil {
2024-07-09 04:04:01 +02:00
out := fmt.Sprintf("%v", err)
return "Error: " + out
} else {
out := fmt.Sprintf("%v", val)
return "Output: " + out
2024-04-18 13:45:29 +02:00
}
2024-04-20 11:27:00 +02:00
},
},
2024-04-18 13:45:29 +02:00
}
var botPrefix string = "g"
2024-04-20 11:27:00 +02:00
func ReceiveChatMessage(ws *websocket.Conn, msg *mpp.ChatMppMessage) {
2024-04-18 13:45:29 +02:00
log.Println(msg.Part.Uid[0:6] + " <" + msg.Part.Name + ">: " + msg.Message)
if strings.HasPrefix(msg.Message, botPrefix) {
args := strings.Split(msg.Message, " ")
cmd := args[0][1:]
var data CommandData = CommandData{
2024-04-20 11:27:00 +02:00
ChatMppMessage: *msg,
Args: args,
Cmd: cmd,
2024-04-18 13:45:29 +02:00
}
for _, command := range commands {
if data.Cmd == command.Id {
message := command.Callback(ws, &data)
if message != "" {
SendChat(ws, message)
}
break
}
}
// switch data.Cmd {
// case "help":
// SendChat(ws, "golang test");
// }
}
}
func SendTimeMessage(ws *websocket.Conn) {
unixtime := fmt.Sprintf("%d", time.Now().Unix())
tstr := "[{\"m\": \"t\", \"t\": " + unixtime + "}]"
// println("Sending t message: " + tstr)
ws.WriteMessage(1, []byte(tstr))
}
func SendChat(ws *websocket.Conn, message string) {
2024-04-20 11:27:00 +02:00
ws.WriteMessage(1, []byte("[{\"m\":\"a\",\"message\":\"\u034f"+message+"\"}]"))
2024-04-18 13:45:29 +02:00
}