go_dreamfactory/cmd/robot/robot.go
2022-06-17 16:59:44 +08:00

169 lines
3.4 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)
case comm.MainType_Notify:
r.handleNotifyMsg(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{
Account: account,
Sid: sid,
}
head := &pb.UserMessage{
MainType: "user",
SubType: "login",
Sec: r.BuildSecStr(),
}
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)
}