package robot import ( "bytes" "encoding/json" "go_dreamfactory/comm" "go_dreamfactory/pb" "go_dreamfactory/utils" "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() } for { var msg *pb.UserMessage = &pb.UserMessage{} _, data, err := r.ws.ReadMessage() if err != nil { log.Fatal(err) } if err = proto.Unmarshal(data, msg); err != nil { log.Fatal(err) } r.handleMsg(msg) } } func (r *Robot) handleMsg(msg *pb.UserMessage) { m, f, ok := utils.ParseP(msg.ServiceMethod) if !ok { log.Fatal("route error") } switch m { case "login": r.handleLogin(f) default: log.Fatal("module route no exist") } } 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 == int32(pb.ErrorCode_Success) { //注册成功 //登录 loginReg := &pb.UserLoginReq{ Name: regReq.Account, } head := &pb.UserMessage{ ServiceMethod: "login.login", } if comm.ProtoEncode(loginReg, head) { err = r.SendToClient(head.Data) if err != nil { log.Fatal(err) } } } } //登录认证 func (r *Robot) AccountLogin() { //登录 loginReg := &pb.UserLoginReq{ Name: r.Opts.Account, } head := &pb.UserMessage{ ServiceMethod: "login.login", } if comm.ProtoEncode(loginReg, head) { err := r.SendToClient(head.Data) if err != nil { log.Fatal(err) } } }