165 lines
3.3 KiB
Go
165 lines
3.3 KiB
Go
package robot
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/pb"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/websocket"
|
|
jsoniter "github.com/json-iterator/go"
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
type Robot struct {
|
|
ws *websocket.Conn
|
|
opts *Options
|
|
user *pb.DB_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, int32(r.opts.ServerId))
|
|
} else {
|
|
if r.opts.Account == "" {
|
|
log.Fatal("WARNNING: account is required !!!")
|
|
}
|
|
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("乐谷616")
|
|
|
|
//friend
|
|
// r.FriendApply("1_62aa8f30d25fb8c1a7d90b50")
|
|
// r.FriendAgree([]string{"0_62a9afd994fe03b7aaee6773"})
|
|
// r.FriendRefuse([]string{"0_62aa9427e2979698b080ec78"})
|
|
// 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.ProtoMarshal(rsp, msg) {
|
|
data, _ := proto.Marshal(msg)
|
|
return r.ws.WriteMessage(websocket.BinaryMessage, data)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
//注册账号
|
|
func (r *Robot) AccountRegister(account string, sid int32) {
|
|
if account == "" {
|
|
log.Fatal("account value is empty")
|
|
}
|
|
//http
|
|
regReq := &pb.UserRegisterReq{Account: account, Sid: sid}
|
|
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] [%v]", msg.MainType, msg.SubType, rsp)
|
|
}
|
|
|
|
//方法参数跟踪
|
|
func traceFunc(module string, funcName string, uid string, funcArgs interface{}) {
|
|
log.Printf("req [%s.%s] [%s] [%v]", module, funcName, uid, funcArgs)
|
|
}
|