TestClient.go 2.81 KB
package service

import (
	"fmt"
	"github.com/golang/protobuf/proto"
	"pro2d/cmd/test/action"
	"pro2d/common"
	"pro2d/common/components"
	"pro2d/common/logger"
	"pro2d/models"
	"pro2d/pb"
	"sync/atomic"
)

type TestClient struct {
	components.IConnector

	Token              string
	RoleTest           *models.RoleTestModel
	lastHeartCheckTime int64
}

func NewTestClient() *TestClient {
	options := []components.ConnectorOption{
		components.WithCtorCount(common.GlobalConf.TestClient.Count),
		components.WithCtorSplitter(components.NewPBSplitter(nil)),
	}

	client := components.NewConnector(common.GlobalConf.TestClient.Ip, common.GlobalConf.TestClient.Port, options...)
	if err := client.Connect(); err != nil {
		logger.Error(err)
		return nil
	}
	t := &TestClient{IConnector: client}

	client.GetConn().SetConnectionCallback(t.OnConn)
	client.GetConn().SetMessageCallback(t.OnMessage)
	client.GetConn().SetCloseCallback(t.OnClose)
	client.GetConn().SetTimerCallback(t.OnTimer)
	client.GetConn().Start()
	return t
}

func (t *TestClient) OnConn(conn components.IConnection) {
}

func (t *TestClient) OnLoginQuery(msg components.IMessage) {
	errCode := msg.GetHeader().GetErrCode()
	if errCode != 0 {
		logger.Error("Login errcode: %d", errCode)

		if errCode == 2 {
			req := &pb.CreateRar{
				Token:  t.Token,
				Device: "test-create",
			}
			r, _ := proto.Marshal(req)
			t.GetConn().SendSuccess(uint32(pb.ProtoCode_CreateRpc), r, 0)
			return
		}
	}

	req := pb.LoginRsp{}
	if err := proto.Unmarshal(msg.GetData(), &req); err != nil {
		logger.Error("loginRpc err: %v", err)
		return
	}

	t.RoleTest = models.NewRoleTestModel(req)
}

func (t *TestClient) OnMessage(msg components.IMessage) {
	atomic.StoreInt64(&t.lastHeartCheckTime, common.Timex())
	logger.Debug("rsp errCode:%d, protocolID: %d", msg.GetHeader().GetErrCode(), msg.GetHeader().GetMsgID())

	//login rsp
	if msg.GetHeader().GetMsgID() == uint32(pb.ProtoCode_LoginRpc) {
		t.OnLoginQuery(msg)
		return
	}

	errCode := msg.GetHeader().GetErrCode()
	if errCode != 0 {
		logger.Error("protocolID: %d, errCode %d", msg.GetHeader().GetMsgID(), errCode)
		return
	}

	//get handler by msgid
	md, ok := action.GetTestActionMap()[msg.GetHeader().GetMsgID()]
	if !ok {
		fmt.Errorf("cmd: %d, handler is nil", msg.GetHeader().GetMsgID())
		return
	}

	//调用协议号对应的逻辑函数
	f := md.(func(role *models.RoleTestModel, msg components.IMessage))
	f(t.RoleTest, msg)
}

func (t *TestClient) OnClose(conn components.IConnection) {
	conn.Stop()
}
func (t *TestClient) OnTimer(conn components.IConnection) {
}

func (t *TestClient) Login(token string) {
	t.Token = token
	head := &components.PBHead{
		Length:   0,
		Cmd:      uint32(2),
		ErrCode:  0,
		PreField: 0,
	}
	loginReq := &pb.LoginReq{
		Token:  token,
		Device: "test-login",
	}
	l, _ := proto.Marshal(loginReq)
	t.Send(head.Cmd, l, 0)
}