Skip to content

Commit 4edc6af

Browse files
committed
优化添加好友流程
1 parent 4492285 commit 4edc6af

23 files changed

+756
-739
lines changed

candy.go

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"strconv"
1313

1414
candy "github.com/dearcode/candy/client"
15+
"github.com/dearcode/candy/meta"
1516
"github.com/dearcode/candy/util/log"
1617
)
1718

@@ -30,6 +31,7 @@ func notice() {
3031
11. 根据用户ID获取用户信息
3132
12. 加载好友列表
3233
13. 更改用户密码
34+
13. 确认添加好友
3335
0. 退出
3436
-----------------------------------------------`
3537
fmt.Println(help)
@@ -220,16 +222,38 @@ func addFriend(c *candy.CandyClient, reader *bufio.Reader) {
220222
data, _, _ = reader.ReadLine()
221223
msg := string(data)
222224

223-
confirm, err := c.AddFriend(id, true, msg)
224-
if err != nil {
225+
if err = c.Friend(id, meta.Relation_ADD, msg); err != nil {
225226
e := candy.ErrorParse(err.Error())
226227
log.Errorf("addFriend code:%v error:%v", e.Code, e.Msg)
227228
return
228229
}
229230

230-
log.Debugf("addFriend confirm:%v, userID:%v", confirm, userID)
231+
log.Debugf("addFriend userID:%v", userID)
231232
}
232233

234+
func confirmFriend(c *candy.CandyClient, reader *bufio.Reader) {
235+
fmt.Println("----------------确认添加好友-----------------------")
236+
defer endSection()
237+
238+
fmt.Println("请输入用户ID:")
239+
data, _, _ := reader.ReadLine()
240+
userID := string(data)
241+
242+
id, err := strconv.ParseInt(userID, 10, 64)
243+
if err != nil {
244+
e := candy.ErrorParse(err.Error())
245+
log.Errorf("Parse int code:%v error:%v", e.Code, e.Msg)
246+
return
247+
}
248+
249+
if err = c.Friend(id, meta.Relation_CONFIRM, ""); err != nil {
250+
e := candy.ErrorParse(err.Error())
251+
log.Errorf("confirmFriend code:%v error:%v", e.Code, e.Msg)
252+
return
253+
}
254+
255+
log.Debugf("confirmFriend userID:%v", userID)
256+
}
233257
func newMessage(c *candy.CandyClient, reader *bufio.Reader) {
234258
fmt.Println("----------------发送消息-----------------------")
235259
defer endSection()
@@ -358,8 +382,8 @@ func updateUserPasswd(c *candy.CandyClient, reader *bufio.Reader) {
358382
type cmdClient struct{}
359383

360384
// OnRecv 这函数理论上是多线程调用,客户端需要注意下
361-
func (c *cmdClient) OnRecv(id int64, method int, group int64, from int64, to int64, body string) {
362-
log.Debugf("recv msg id:%d method:%d, group:%d, from:%d, to:%d, body:%s\n", id, method, group, from, to, body)
385+
func (c *cmdClient) OnRecv(event meta.Event, operate meta.Relation, id int64, group int64, from int64, to int64, body string) {
386+
log.Debugf("recv msg id:%d event:%v, operate:%v, group:%d, from:%d, to:%d, body:%s\n", id, event, operate, group, from, to, body)
363387
}
364388

365389
// OnError 连接被服务器断开,或其它错误
@@ -423,6 +447,8 @@ func main() {
423447
loadFriendList(c, reader)
424448
} else if command == "13" {
425449
updateUserPasswd(c, reader)
450+
} else if command == "14" {
451+
confirmFriend(c, reader)
426452
} else {
427453
log.Errorf("未知命令")
428454
}

client/candy.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const (
2020
// MessageHandler 接收服务器端推送来的消息
2121
type MessageHandler interface {
2222
// OnRecv 这函数理论上是多线程调用,客户端需要注意下
23-
OnRecv(id int64, method int, group int64, from int64, to int64, body string)
23+
OnRecv(event meta.Event, operate meta.Relation, id int64, group int64, from int64, to int64, body string)
2424

2525
// OnError 连接被服务器断开,或其它错误
2626
OnError(msg string)
@@ -222,15 +222,15 @@ func (c *CandyClient) getUserInfoByID(userID int64) (*UserInfo, error) {
222222
return userInfo, resp.Header.Error()
223223
}
224224

225-
// AddFriend 添加好友
226-
func (c *CandyClient) AddFriend(userID int64, confirm bool, msg string) (bool, error) {
227-
req := &meta.GateAddFriendRequest{UserID: userID, Confirm: confirm, Msg: msg}
228-
resp, err := c.api.AddFriend(context.Background(), req)
225+
// Friend 添加好友
226+
func (c *CandyClient) Friend(userID int64, operate meta.Relation, msg string) error {
227+
req := &meta.GateFriendRequest{UserID: userID, Operate: operate, Msg: msg}
228+
resp, err := c.api.Friend(context.Background(), req)
229229
if err != nil {
230-
return false, err
230+
return err
231231
}
232232

233-
return resp.Confirm, resp.Header.Error()
233+
return resp.Header.Error()
234234
}
235235

236236
// LoadFriendList 加载好友列表
@@ -328,7 +328,7 @@ func (c *CandyClient) FileDownload(key string) ([]byte, error) {
328328

329329
// SendMessage 向服务器发送消息.
330330
func (c *CandyClient) SendMessage(group, to int64, body string) (int64, error) {
331-
req := &meta.GateSendMessageRequest{Msg: &meta.Message{Group: group, User: to, Body: body}}
331+
req := &meta.GateSendMessageRequest{Msg: &meta.Message{Group: group, To: to, Body: body}}
332332
resp, err := c.api.SendMessage(context.Background(), req)
333333
if err != nil {
334334
return 0, err
@@ -341,15 +341,14 @@ func (c *CandyClient) loopRecvMessage() {
341341
log.Debugf("start loopRecvMessage")
342342

343343
for !c.stop {
344-
msg, err := c.stream.Recv()
345-
log.Debugf("recv:%v, err:%v", msg, err)
344+
pm, err := c.stream.Recv()
346345
if err != nil {
347346
// 这里不退出会死循环
348347
c.handler.OnError(err.Error())
349348
break
350349
}
351350

352-
c.handler.OnRecv(msg.ID, int(msg.Method), msg.Group, msg.From, msg.User, msg.Body)
351+
c.handler.OnRecv(pm.Event, pm.Operate, pm.Msg.ID, pm.Msg.Group, pm.Msg.From, pm.Msg.To, pm.Msg.Body)
353352
}
354353
}
355354

gate/server.go

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,6 @@ func (g *Gate) SendMessage(ctx context.Context, req *meta.GateSendMessageRequest
291291

292292
//防止乱写
293293
req.Msg.From = s.getID()
294-
req.Msg.Method = meta.Method_NONE
295294

296295
if err = g.store.newMessage(req.Msg); err != nil {
297296
return &meta.GateSendMessageResponse{Header: &meta.ResponseHeader{Code: util.ErrorNewMessage, Msg: err.Error()}}, nil
@@ -332,8 +331,8 @@ func (g *Gate) Heartbeat(ctx context.Context, req *meta.GateHeartbeatRequest) (*
332331
return &meta.GateHeartbeatResponse{}, nil
333332
}
334333

335-
// Notice recv Notice server Message, and send Message to client.
336-
func (g *Gate) Notice(ctx context.Context, req *meta.GateNoticeRequest) (*meta.GateNoticeResponse, error) {
334+
// Push recv Notice server Message, and send Message to client.
335+
func (g *Gate) Push(ctx context.Context, req *meta.GatePushRequest) (*meta.GatePushResponse, error) {
337336
log.Debugf("begin PushID:%v msg:%v", req.ID, req.Msg)
338337

339338
for _, id := range req.ID {
@@ -342,54 +341,35 @@ func (g *Gate) Notice(ctx context.Context, req *meta.GateNoticeRequest) (*meta.G
342341
log.Debugf("User:%d offline", id.User)
343342
continue
344343
}
345-
req.Msg.Before = id.Before
344+
req.Msg.Msg.Before = id.Before
346345
log.Debugf("will push user:%d, msg:%v", id.User, req.Msg)
347346
s.push <- req.Msg
348347
}
349348

350349
log.Debugf("end PushID:%v msg:%v ok", req.ID, req.Msg)
351350

352-
return &meta.GateNoticeResponse{}, nil
351+
return &meta.GatePushResponse{}, nil
353352
}
354353

355-
// AddFriend 添加好友或确认接受添加.
356-
func (g *Gate) AddFriend(ctx context.Context, req *meta.GateAddFriendRequest) (*meta.GateAddFriendResponse, error) {
354+
// Friend 添加好友或确认接受添加.
355+
func (g *Gate) Friend(ctx context.Context, req *meta.GateFriendRequest) (*meta.GateFriendResponse, error) {
357356
s, err := g.getOnlineSession(ctx)
358357
if err != nil {
359-
return &meta.GateAddFriendResponse{Header: &meta.ResponseHeader{Code: util.ErrorGetOnlineSession, Msg: err.Error()}}, nil
358+
return &meta.GateFriendResponse{Header: &meta.ResponseHeader{Code: util.ErrorGetOnlineSession, Msg: err.Error()}}, nil
360359
}
361360

362361
//自己要把自己添加成好友
363362
if req.UserID == s.id {
364363
log.Infof("%d add friend id:%d", s.id, req.UserID)
365-
return &meta.GateAddFriendResponse{Header: &meta.ResponseHeader{Code: util.ErrorFriendSelf, Msg: "Friend ID must not be Self ID"}}, nil
364+
return &meta.GateFriendResponse{Header: &meta.ResponseHeader{Code: util.ErrorFriendSelf, Msg: "Friend ID must not be Self ID"}}, nil
366365
}
367366

368-
// 主动添加对方为好友,更新自己本地信息
369-
state, err := g.store.addFriend(s.id, req.UserID, meta.FriendRelation_Active, req.Msg)
370-
if err != nil {
371-
log.Errorf("%d addFriend:%d erorr:%s", s.id, req.UserID, errors.ErrorStack(err))
372-
return &meta.GateAddFriendResponse{Header: &meta.ResponseHeader{Code: util.ErrorAddFriend, Msg: err.Error()}}, nil
373-
}
374-
375-
// 被动添加好友,更新对方好友信息
376-
if state, err = g.store.addFriend(req.UserID, s.id, meta.FriendRelation_Passive, req.Msg); err != nil {
377-
log.Errorf("%d addFriend:%d erorr:%s", s.id, req.UserID, errors.ErrorStack(err))
378-
return &meta.GateAddFriendResponse{Header: &meta.ResponseHeader{Code: util.ErrorAddFriend, Msg: err.Error()}}, nil
379-
}
380-
381-
// 如果对方返回FriendRelation_Confirm,说明之前对方添加过自己, 只不过本地信息未更新,要先更新本地信息,再返回FriendRelation_Confirm
382-
if state == meta.FriendRelation_Confirm {
383-
// 正常流程走不到这里,除非是数据丢失了
384-
_, err := g.store.addFriend(s.id, req.UserID, meta.FriendRelation_Confirm, req.Msg)
385-
if err != nil {
386-
log.Errorf("%d addFriend:%d erorr:%s", s.id, req.UserID, errors.ErrorStack(err))
387-
return &meta.GateAddFriendResponse{Header: &meta.ResponseHeader{Code: util.ErrorAddFriend, Msg: err.Error()}}, nil
388-
}
389-
return &meta.GateAddFriendResponse{Confirm: true}, nil
367+
if err = g.store.friend(s.id, req.UserID, req.Operate, req.Msg); err != nil {
368+
log.Errorf("%d friend:%d operate:%d erorr:%s", s.id, req.UserID, req.Operate, errors.ErrorStack(err))
369+
return &meta.GateFriendResponse{Header: &meta.ResponseHeader{Code: util.ErrorAddFriend, Msg: err.Error()}}, nil
390370
}
391371

392-
return &meta.GateAddFriendResponse{}, nil
372+
return &meta.GateFriendResponse{}, nil
393373
}
394374

395375
// LoadFriendList 加载好友列表

gate/session.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ type session struct {
1717
state int
1818
last int64
1919
addr string
20-
push chan *meta.Message
20+
push chan *meta.PushMessage
2121
}
2222

2323
func newSession(addr string) *session {
2424
log.Debugf("addr:%s", addr)
25-
return &session{addr: addr, push: make(chan *meta.Message)}
25+
return &session{addr: addr, push: make(chan *meta.PushMessage)}
2626
}
2727

2828
func (s *session) online(id int64) {

gate/store.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,15 @@ func (s *store) findUser(user string) ([]string, error) {
102102
return resp.Users, errors.Trace(resp.Header.Error())
103103
}
104104

105-
func (s *store) addFriend(from, to int64, state meta.FriendRelation, msg string) (meta.FriendRelation, error) {
106-
log.Debugf("store addFriend, from:%v to:%v state:%v", from, to, state)
107-
req := &meta.StoreAddFriendRequest{From: from, To: to, State: state, Msg: msg}
108-
resp, err := s.api.AddFriend(s.ctx, req)
105+
func (s *store) friend(from, to int64, operate meta.Relation, msg string) error {
106+
log.Debugf("store friend, from:%v to:%v operate:%v", from, to, operate)
107+
req := &meta.StoreFriendRequest{From: from, To: to, Operate: operate, Msg: msg}
108+
resp, err := s.api.Friend(s.ctx, req)
109109
if err != nil {
110-
return meta.FriendRelation_None, errors.Trace(err)
110+
return errors.Trace(err)
111111
}
112112

113-
return resp.State, errors.Trace(resp.Header.Error())
113+
return errors.Trace(resp.Header.Error())
114114
}
115115

116116
func (s *store) loadFriendList(user int64) ([]int64, error) {
@@ -134,7 +134,7 @@ func (s *store) createGroup(userID, groupID int64, name string) error {
134134
return errors.Trace(resp.Header.Error())
135135
}
136136

137-
func (s *store) loadGroupList(userID int64) ([]*meta.Group, error) {
137+
func (s *store) loadGroupList(userID int64) ([]*meta.GroupInfo, error) {
138138
req := &meta.StoreLoadGroupListRequest{User: userID}
139139
resp, err := s.api.LoadGroupList(s.ctx, req)
140140
if err != nil {
@@ -205,7 +205,7 @@ func (s *store) newMessage(msg *meta.Message) error {
205205
return errors.Trace(resp.Header.Error())
206206
}
207207

208-
func (s *store) loadMessage(userID, id int64, reverse bool) ([]*meta.Message, error) {
208+
func (s *store) loadMessage(userID, id int64, reverse bool) ([]*meta.PushMessage, error) {
209209
log.Debugf("store loadMessage")
210210
req := &meta.StoreLoadMessageRequest{User: userID, ID: id, Reverse: reverse}
211211
resp, err := s.api.LoadMessage(s.ctx, req)

0 commit comments

Comments
 (0)