go_dreamfactory/cmd/robot/robot.go
2022-06-06 19:33:51 +08:00

124 lines
2.2 KiB
Go

package robot
import (
"bytes"
"encoding/json"
"go_dreamfactory/comm"
"go_dreamfactory/pb"
"io/ioutil"
"log"
"net/http"
"github.com/golang/protobuf/proto"
"github.com/gorilla/websocket"
jsoniter "github.com/json-iterator/go"
)
type Robot struct {
ws *websocket.Conn
Opts *Options
}
func NewRobot(opts *Options) *Robot {
ws, _, err := websocket.DefaultDialer.Dial(opts.WsUrl, nil)
if err != nil {
log.Fatal(err)
}
r := &Robot{
ws: ws,
Opts: opts,
}
return r
}
func (r *Robot) Run() {
log.Print("Robot running...")
log.Printf("websocket %s \n", r.Opts.WsUrl)
if r.Opts.Create { //创建新用户
r.AccountRegister()
} else {
//login user
r.AccountLogin()
}
//处理响应
go func() {
for {
var msg *pb.UserMessage = &pb.UserMessage{}
_, data, err := r.ws.ReadMessage()
if err != nil {
log.Println(err)
}
if err = proto.Unmarshal(data, msg); err != nil {
log.Fatal(err)
}
r.handleMsg(msg)
}
}()
select {}
}
func (r *Robot) handleMsg(msg *pb.UserMessage) {
switch msg.MainType {
case "login":
r.handleLogin(msg)
case "user":
r.handleUserMsg(msg)
default:
log.Fatal("module route no exist")
}
}
func (r *Robot) onUserLoaded() {
}
func (r *Robot) SendToClient(data []byte) error {
return r.ws.WriteMessage(websocket.BinaryMessage, data)
}
//注册账号
func (r *Robot) AccountRegister() {
//http
regReq := &pb.UserRegisterReq{}
jsonByte, _ := json.Marshal(regReq)
req, err := http.NewRequest("POST", r.Opts.RegUrl, bytes.NewReader(jsonByte))
if err != nil {
log.Fatalf("account register err %v", err)
}
req.Header.Set("Content-Type", "application/json;charset=UTF-8")
httpClient := &http.Client{}
rsp, err := httpClient.Do(req)
if err != nil {
panic(err)
}
defer rsp.Body.Close()
body, _ := ioutil.ReadAll(rsp.Body)
regRsp := &pb.UserRegisterRsp{}
err = jsoniter.Unmarshal(body, regRsp)
if regRsp.Code == pb.ErrorCode_Success { //注册成功
//登录
loginReg := &pb.UserLoginReq{
Name: regReq.Account,
}
head := &pb.UserMessage{
MainType: "login",
SubType: "login",
}
if comm.ProtoEncode(loginReg, head) {
err = r.SendToClient(head.Data)
if err != nil {
log.Fatal(err)
}
}
}
}