package robot import ( "bytes" "encoding/json" "fmt" "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 user *pb.Cache_UserData } 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(r.opts.Account) } else { 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 "user": r.handleUserMsg(msg) case "friend": r.handleFriendMsg(msg) case "pack": r.handlePackMsg(msg) default: log.Fatal("module route no exist") } } //在这里添加玩家成功登录以后的测试方法 func (r *Robot) onUserLoaded() { //user // r.CreateUser("乐谷4") //friend // r.FriendApply("629f147e3d276120561bfa18") // r.FriendAgree([]string{}) // r.FriendRefuse([]string{}) // r.FriendApplyList() // r.FriendList() // r.FriendBlacklist() // r.FriendAddBlack() // r.FriendDelBlack("") // r.FriendSearch("乐谷5") //pack // r.QueryUserPack() } func (r *Robot) SendToClient(msg *pb.UserMessage, rsp proto.Message) error { if comm.ProtoEncode(rsp, msg) { data, _ := proto.Marshal(msg) return r.ws.WriteMessage(websocket.BinaryMessage, data) } return nil } //注册账号 func (r *Robot) AccountRegister(account string) { if account == "" { log.Fatal("account value is empty") } //http regReq := &pb.UserRegisterReq{Account: account} 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 { //注册成功 fmt.Printf("account:%s 注册成功", regRsp.Account) //登录 loginReg := &pb.UserLoginReq{ Sec: r.BuildSecStr(), } head := &pb.UserMessage{ MainType: "user", SubType: "login", } err = r.SendToClient(head, loginReg) if err != nil { log.Fatal(err) } } } //打印响应 func printReply(msg *pb.UserMessage, rsp interface{}) { log.Printf("rsp [%s.%s] [%d] [%v]", msg.MainType, msg.SubType, msg.Code, rsp) } //方法参数跟踪 func traceFunc(module string, funcName string, uid string, funcArgs interface{}) { log.Printf("req [%s.%s] [%s] [%v]", module, funcName, uid, funcArgs) }