From 7fccb49a1f5c180fcbf6a611c2796fbde7a987c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B7=E5=8B=87?= Date: Mon, 14 Aug 2023 16:24:13 +0800 Subject: [PATCH] code format, add login, add protoc --- bin/imserver/bin/robot.bat | 1 + server/imserver/app.go | 6 +- server/imserver/export.go | 12 +-- server/imserver/friendsmgr.go | 120 +++++++++++++++++++++++++++ server/imserver/mt/GameDb.go | 10 +-- server/imserver/mt/IMCluster.go | 1 + server/imserver/playermgr.go | 86 +++++++++++++++---- server/imserver/proto/cs_msgid.proto | 2 + server/imserver/proto/cs_proto.proto | 3 + server/imserver/proto/protoc-gen.bat | 1 - server/imserver/proto/ss_msgid.proto | 3 + server/imserver/proto/ss_proto.proto | 2 + 12 files changed, 217 insertions(+), 30 deletions(-) create mode 100644 server/imserver/friendsmgr.go diff --git a/bin/imserver/bin/robot.bat b/bin/imserver/bin/robot.bat index 77ecc701..3cd059b0 100644 --- a/bin/imserver/bin/robot.bat +++ b/bin/imserver/bin/robot.bat @@ -1 +1,2 @@ node ../../../tools/robot/app.js -hws://192.168.100.45:7801 -utest134345 -d../../../server/imserver/ +pause \ No newline at end of file diff --git a/server/imserver/app.go b/server/imserver/app.go index c3db7932..e9804a5a 100644 --- a/server/imserver/app.go +++ b/server/imserver/app.go @@ -1,10 +1,10 @@ package main import ( - "q5" - "f5" "cs" + "f5" "mt" + "q5" ) type App struct { @@ -39,7 +39,7 @@ func (this *App) Update() { hdr, ok := next.GetData().(*f5.MsgHdr) if ok { handler := cs.GetNetMsgHandler(hdr.MsgId) - if handler != nil && handler.HandlerId== PLAYER_MGR_HANDLER_ID { + if handler != nil && handler.HandlerId == PLAYER_MGR_HANDLER_ID { cs.DispatchMsg(handler, hdr, playerMgr) } } diff --git a/server/imserver/export.go b/server/imserver/export.go index a3e02caf..1d4388e0 100644 --- a/server/imserver/export.go +++ b/server/imserver/export.go @@ -1,7 +1,9 @@ package main -var app = new (App) -var wspListener = new (WSPListener) -var playerMgr = new (PlayerMgr) -var handlerMgr = new (HandlerMgr) -var httpListener = new (HttpListener) +var app = new(App) +var wspListener = new(WSPListener) +var playerMgr = new(PlayerMgr) +var handlerMgr = new(HandlerMgr) +var httpListener = new(HttpListener) + +//var friendMgr = new(FriendsMgr) diff --git a/server/imserver/friendsmgr.go b/server/imserver/friendsmgr.go new file mode 100644 index 00000000..397e7a67 --- /dev/null +++ b/server/imserver/friendsmgr.go @@ -0,0 +1,120 @@ +package main + +import ( + "cs" + "errors" + "mt" + "q5" + "strings" +) + +type User struct { + ID int + Username string +} + +// user1, user2 构成一个好友关系 +type Friendship struct { + User1 *User + User2 *User +} + +type FriendsMgr struct { + cs.MsgHandlerImpl + users map[int]*User + friendships map[int][]*Friendship + pendingReqs map[int]map[int]bool +} + +func (fm *FriendsMgr) init() { + conn := q5.NewMysql( + mt.Table.GameDb.GetById(0).GetHost(), + mt.Table.GameDb.GetById(0).GetPort(), + mt.Table.GameDb.GetById(0).GetUser(), + mt.Table.GameDb.GetById(0).GetPasswd(), + mt.Table.GameDb.GetById(0).GetDatabase(), + ) + conn.Open() + + // make members + fm.users = make(map[int]*User) + fm.friendships = make(map[int][]*Friendship) + fm.pendingReqs = make(map[int]map[int]bool) + + // 1. Load DB, + // 2. DB Data Map to Struct + // 3. RegisterUser +} + +func (fm *FriendsMgr) unInit() { + // 1. Loop struct data + // 2. Struct Data Persist to DB +} + +func (fm *FriendsMgr) RegisterUser(id int, username string) { + fm.users[id] = &User{ID: id, Username: username} +} + +func (fm *FriendsMgr) SearchFriends(query string) []*User { + var results []*User + lowercaseQuery := strings.ToLower(query) + for _, user := range fm.users { + if strings.Contains(strings.ToLower(user.Username), lowercaseQuery) { + results = append(results, user) + } + } + + return results +} + +// AddFriendRequest 发送好友请求 +func (fm *FriendsMgr) AddFriendRequest(user1ID, user2ID int) error { + //// Check if users exist + //user1, exists1 := fm.users[user1ID] + //user2, exists2 := fm.users[user2ID] + //if !exists1 || !exists2 { + // return errors.New("users not exist") + //} + // + //if fm.pendingReqs[user2ID] == nil { + // fm.pendingReqs[user2ID] = make(map[int]bool) + //} + //fm.pendingReqs[user2ID][user1ID] = true + // + return nil +} + +// AcceptFriendRequest 接受好友请求 +func (fm *FriendsMgr) AcceptFriendRequest(user1ID, user2ID int) error { + if !fm.pendingReqs[user1ID][user2ID] { + return errors.New("no pending friend request from user1 to user2") + } + + // Create a new friendship + friendship := &Friendship{ + User1: fm.users[user1ID], + User2: fm.users[user2ID], + } + fm.friendships[user1ID] = append(fm.friendships[user1ID], friendship) + fm.friendships[user2ID] = append(fm.friendships[user2ID], friendship) + + delete(fm.pendingReqs[user1ID], user2ID) + if len(fm.pendingReqs[user1ID]) == 0 { + delete(fm.pendingReqs, user1ID) + } + + return nil +} + +// GetFriends 我的好友列表 +func (fm *FriendsMgr) GetFriends(userID int) []*User { + var friends []*User + for _, friendship := range fm.friendships[userID] { + if friendship.User1.ID != userID { + friends = append(friends, friendship.User1) + } else { + friends = append(friends, friendship.User2) + } + } + return friends +} diff --git a/server/imserver/mt/GameDb.go b/server/imserver/mt/GameDb.go index 770a231f..ff9aa3f4 100644 --- a/server/imserver/mt/GameDb.go +++ b/server/imserver/mt/GameDb.go @@ -1,19 +1,17 @@ package mt import ( - "f5" - "mtb" + "f5" + "mtb" ) type GameDb struct { - mtb.GameDb + mtb.GameDb } type GameDbTable struct { - f5.IdMetaTable[GameDb] - selfConf *GameDb + f5.IdMetaTable[GameDb] } func (this *GameDb) Init1() { } - diff --git a/server/imserver/mt/IMCluster.go b/server/imserver/mt/IMCluster.go index a525b6ac..9873bb82 100644 --- a/server/imserver/mt/IMCluster.go +++ b/server/imserver/mt/IMCluster.go @@ -15,6 +15,7 @@ type IMClusterTable struct { } func (this *IMCluster) Init1() { + } func (this *IMClusterTable) GetListenPort() int32 { diff --git a/server/imserver/playermgr.go b/server/imserver/playermgr.go index 7e86b16c..9c7666e8 100644 --- a/server/imserver/playermgr.go +++ b/server/imserver/playermgr.go @@ -2,25 +2,26 @@ package main import ( "cs" - "q5" + "encoding/json" "f5" - "mt" "fmt" + "mt" + "q5" ) type PlayerMgr struct { cs.MsgHandlerImpl accountIdHash map[string]*Player - socketHash map[f5.WspCliConn]*Player + socketHash map[f5.WspCliConn]*Player } func (this *PlayerMgr) init() { f5.GetTimer().SetInterval( 1000, - func (e int32, args *q5.Args) { + func(e int32, args *q5.Args) { if e == q5.TIMER_EXEC_EVENT { mt.Table.MasterCluster.Traverse( - func (meta *mt.MasterCluster) bool { + func(meta *mt.MasterCluster) bool { this.reportServerState(meta.GetIp(), meta.GetListenPort()) return true }) @@ -55,28 +56,83 @@ func (this *PlayerMgr) unInit() { } func (this *PlayerMgr) CMLogin(hdr *f5.MsgHdr, msg *cs.CMLogin) { - serverInfo := "192.168.100.39:1000" + params := map[string]string{ + "c": "User", + "a": "info", + "account_id": msg.GetAccountId(), + "session_id": msg.GetSessionId(), + "target_id": msg.GetAccountId(), + } + url := fmt.Sprintf("%s/webapp/index.php", mt.Table.Config.GetById(0).GetGameapiUrl()) + f5.GetHttpCliMgr().SendJsStyleRequest( + url, + params, + func(rsp f5.HttpCliResponse) { + this.CMLoginResult(hdr, msg, rsp) + }) +} + +func (this *PlayerMgr) CMLoginResult(hdr *f5.MsgHdr, msg *cs.CMLogin, rsp f5.HttpCliResponse) { + resObj := struct { + Errcode int `json:"errcode"` + Errmsg string `json:"errmsg"` + Info struct { + Activated string `json:"activated"` + RenameCount string `json:"rename_count"` + AccountID string `json:"account_id"` + Name string `json:"name"` + } `json:"info"` + }{} + err := json.Unmarshal([]byte(rsp.GetRawData()), &resObj) + if err != nil { + f5.GetSysLog().Info("Api服务器JSON 解析错误:", err) + return + } + if resObj.Errcode != 0 { + f5.GetSysLog().Error("Api服务器errcode:%d", resObj.Errcode) + return + } + + player := Player{ + socket: hdr.GetSocket(), + accountId: msg.GetAccountId(), + sessionId: msg.GetAccountId(), + } + // Add to online user + this.addPlayer(&player) + this.addSocketHash(hdr.GetSocket(), &player) + + serverInfo := "192.168.100.39:2000" rspMsg := &cs.SMLogin{} rspMsg.ServerInfo = &serverInfo + rspMsg.AccountId = &resObj.Info.AccountID wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg) } func (this *PlayerMgr) reportServerState(masterIp string, masterPort int32) { - params := map[string]string { - "node_id": q5.ToString(f5.GetApp().GetNodeId()), + params := map[string]string{ + "node_id": q5.ToString(f5.GetApp().GetNodeId()), "instance_id": q5.ToString(f5.GetApp().GetInstanceId()), - "ip": "", - "port": q5.ToString(mt.Table.IMCluster.GetListenPort()), - "online_num": q5.ToString(0), - "room_num": q5.ToString(0), - "channel": q5.ToString(0), + "ip": "192.168.100.164", + "port": q5.ToString(mt.Table.IMCluster.GetListenPort()), + "online_num": q5.ToString(0), + "room_num": q5.ToString(0), + "channel": q5.ToString(0), "alive_count": q5.ToString(0), - "servicing": q5.ToString(1), + "servicing": q5.ToString(1), } f5.GetHttpCliMgr().SendQuickChannelJsStyleRequest( fmt.Sprintf("http://%s:%d/webapp/index.php?c=GS&a=report&", masterIp, masterPort), params, - func (rsp f5.HttpCliResponse) { + func(rsp f5.HttpCliResponse) { f5.GetSysLog().Info(rsp.GetRawData()) }) } + +func (this *PlayerMgr) addPlayer(p *Player) { + this.accountIdHash[p.accountId] = p +} + +func (this *PlayerMgr) addSocketHash(wsp f5.WspCliConn, p *Player) { + this.socketHash[wsp] = p +} diff --git a/server/imserver/proto/cs_msgid.proto b/server/imserver/proto/cs_msgid.proto index cc78bc69..df2f9237 100644 --- a/server/imserver/proto/cs_msgid.proto +++ b/server/imserver/proto/cs_msgid.proto @@ -1,4 +1,6 @@ +syntax = "proto2"; package cs; +option go_package = ".;cs"; //消息id定义 enum CMMessageId_e diff --git a/server/imserver/proto/cs_proto.proto b/server/imserver/proto/cs_proto.proto index 9d6d6947..a0dfdce9 100644 --- a/server/imserver/proto/cs_proto.proto +++ b/server/imserver/proto/cs_proto.proto @@ -1,4 +1,6 @@ +syntax = "proto2"; package cs; +option go_package = ".;cs"; /* 约定: @@ -95,6 +97,7 @@ message CMLogin message SMLogin { optional string server_info = 1; //服务器信息(重连时使用) + optional string account_id = 2; } //断线重连 diff --git a/server/imserver/proto/protoc-gen.bat b/server/imserver/proto/protoc-gen.bat index 507fe7e4..61b25a95 100644 --- a/server/imserver/proto/protoc-gen.bat +++ b/server/imserver/proto/protoc-gen.bat @@ -1,3 +1,2 @@ protoc --go_out=..\cs .\cs_*.proto protoc --go_out=..\ss .\ss_*.proto -protoc --go_out=..\mtb .\mt*.proto diff --git a/server/imserver/proto/ss_msgid.proto b/server/imserver/proto/ss_msgid.proto index 0595eb52..08a0dc6c 100644 --- a/server/imserver/proto/ss_msgid.proto +++ b/server/imserver/proto/ss_msgid.proto @@ -1,4 +1,7 @@ +syntax = "proto2"; package ss; +option go_package = ".;ss"; + //消息id定义 enum SSMessageId_e diff --git a/server/imserver/proto/ss_proto.proto b/server/imserver/proto/ss_proto.proto index be049059..64351816 100644 --- a/server/imserver/proto/ss_proto.proto +++ b/server/imserver/proto/ss_proto.proto @@ -1,4 +1,6 @@ +syntax = "proto2"; package ss; +option go_package = ".;ss"; message SS_Ping {