Blame view

src/actions/FriendAction.lua 18.5 KB
c384626d   zhouhaihai   好友
1
2
3
4
5
6
7
8
9
10
11
12
13
  local ipairs = ipairs
  local table = table
  local math = math
  local string = string
  local redisproxy = redisproxy
  local MsgPack = MsgPack
  local string_format = string.format
  local tonumber = tonumber
  local table_insert = table.insert
  local table_unpack = table.unpack
  local table_find = table.find
  local table_nums = table.nums
  local math_random = math.randomInt
6136eaca   liuzujun   添加好友表
14
  require "utils.MysqlUtil"
c384626d   zhouhaihai   好友
15
16
17
18
19
20
21
22
23
24
25
26
  
  local _M = {}
  
  local function formatArray(tb)
  	tb = tb or {}
  	local t = {}
  	for _, objectId in ipairs(tb) do
  		t[tonumber(objectId)] = 1
  	end
  	return t
  end
  
c384626d   zhouhaihai   好友
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  
  local function addAndCheckApplyLimit(roleId, objId)
  	roleId = tonumber(roleId)
  	local dbKey = FRIEND_APPLY_KEY:format(roleId)
  	local redret = redisproxy:pipelining(function (red)
  		red:zadd(dbKey, skynet.timex(), objId)
  		red:zremrangebyrank(dbKey, 0, -(globalCsv.friendApplyLimit + 1))
  	end)
  end
  
  local function checkBlackLimit(roleId)
  	roleId = tonumber(roleId)
  	local count = redisproxy:scard(FRIEND_BLACK_KEY:format(roleId))
  	return count < globalCsv.friendListLimit
  end
  
  local function getRoleInfo(roleId)
  	local online, info = rpcRole(roleId, "friendSInfo")
  	return online, info
  end
  
  local function getRoleAllInfo(roleId)
  	local online, info = rpcRole(roleId, "friendInfo")
  	return online, info
  end
  
  local function table_merge(tab1, tab2, filter)
  	tab1 = tab1 or {}
  	tab2 = tab2 or {}
  	filter = filter or {}
  	for k_, v_ in pairs(tab2) do
  		if not filter[k_] then
  			tab1[k_] = v_
  		end
  	end
  	return tab1
  end
  
  function _M.searchRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  	local msg = MsgPack.unpack(data)
  	local key = msg.key
  
  	if not key then return end
  
  	local objIds = {}
  	local tempId = tonumber(key)
  	if tempId then
6136eaca   liuzujun   添加好友表
76
  		if roleExists(tempId) then
c384626d   zhouhaihai   好友
77
78
79
80
81
82
83
84
85
86
87
88
89
  			objIds[tempId] = 1
  		end
  	end
  	local tempId = redisproxy:get(string_format("user:%s", string.upper(key)))
  	if tempId then
  		objIds[tonumber(tempId)] = 1
  	end
  	objIds[roleId] = nil --不能有自己
  
  	local searchList = {}
  	for objId, _ in pairs(objIds) do
  		local online, info = getRoleInfo(objId)
  		local redret = redisproxy:pipelining(function (red)
c384626d   zhouhaihai   好友
90
91
92
  			red:zscore(FRIEND_APPLY_KEY:format(objId), roleId)
  			red:sismember(FRIEND_BLACK_KEY:format(roleId), objId)
  		end)
6136eaca   liuzujun   添加好友表
93
94
95
96
  		
  		local isFriend = role.friends[objId] and 1 or nil
  		local hadApply = redret[1] and 1 or nil
  		local inBlack = redret[2] == 1 and 1 or nil
c384626d   zhouhaihai   好友
97
98
99
100
101
102
103
104
105
106
107
  
  		table.insert(searchList, table_merge({
  			roleId = objId, 
  			online = online, 
  			isFriend = isFriend, 
  			hadApply = hadApply,
  			inBlack = inBlack,
  		}, info, {
  
  		}))
  	end
3133cb76   zhouhaihai   日志
108
  
f22a33af   zhouhaihai   自己的日志
109
  	role:mylog("role_action", {desc = "searchFriend"})
c384626d   zhouhaihai   好友
110
111
112
113
114
115
116
117
118
119
120
  	SendPacket(actionCodes.Friend_searchRpc, MsgPack.pack({searchList = searchList}))
  	return true
  end
  
  
  function _M.applyRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  
  	local msg = MsgPack.unpack(data)
  	local objectId = msg.roleId
c384626d   zhouhaihai   好友
121
122
123
124
125
126
127
  
  	if objectId == roleId then
  		return
  	end
  
  	local result = nil
  	local redret = redisproxy:pipelining(function (red)
c384626d   zhouhaihai   好友
128
129
130
  		red:zscore(FRIEND_APPLY_KEY:format(objectId), roleId)
  		red:sismember(FRIEND_BLACK_KEY:format(objectId), roleId)
  		red:sismember(FRIEND_BLACK_KEY:format(roleId), objectId)
c384626d   zhouhaihai   好友
131
  	end)
5dfc4978   zhouhaihai   好友完善
132
  
c384626d   zhouhaihai   好友
133
  	-- 玩家id不存在
6136eaca   liuzujun   添加好友表
134
  	if not result and not roleExists(objectId) then
c384626d   zhouhaihai   好友
135
136
137
138
  		result = 1	
  	end
  
  	-- 已经有这个好友
6136eaca   liuzujun   添加好友表
139
  	if not result and role.friends[objectId] then
c384626d   zhouhaihai   好友
140
141
142
  		result = 2
  	end
  	-- 已经申请
6136eaca   liuzujun   添加好友表
143
  	if not result and redret[1] then
c384626d   zhouhaihai   好友
144
145
146
  		result = 3
  	end
  	-- 对方把你拉黑
6136eaca   liuzujun   添加好友表
147
  	if not result and redret[2] == 1 then
c384626d   zhouhaihai   好友
148
149
150
151
  		result = 4
  	end
  
  	-- 你把对方拉黑了
6136eaca   liuzujun   添加好友表
152
  	if not result and redret[3] == 1 then
c384626d   zhouhaihai   好友
153
154
155
156
  		result = 5
  	end
  
  	-- 自己好友已经满
6136eaca   liuzujun   添加好友表
157
  	if not result and table.numbers(role.friends) >= globalCsv.friendListLimit then
c384626d   zhouhaihai   好友
158
159
160
  		result = 6
  	end
  	-- 对方的好友已满
6136eaca   liuzujun   添加好友表
161
  	if not result and getFriendCount(objectId) >= globalCsv.friendListLimit then
c384626d   zhouhaihai   好友
162
163
164
165
166
167
168
169
170
  		result = 7
  	end
  
  	if not result then
  		addAndCheckApplyLimit(objectId, roleId)
  		local myInfo = role:friendSInfo()
  		myInfo.roleId = roleId
  		myInfo.online = true
  		myInfo.hadApply = true
3133cb76   zhouhaihai   日志
171
  
70fb62d1   liuzujun   服务器数据打点
172
  		role:mylog("role_action", {desc = "applyFriend", int1 = 1})
f22a33af   zhouhaihai   自己的日志
173
  
c384626d   zhouhaihai   好友
174
175
  		rpcRole(objectId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({newApply = 1, info = {myInfo}})) 	-- 通知对方
  	end
3133cb76   zhouhaihai   日志
176
177
178
  
  	
  
c384626d   zhouhaihai   好友
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
  	SendPacket(actionCodes.Friend_applyRpc, MsgPack.pack({result = result}))
  	return true
  end
  
  function _M.applyListRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  
  	local applyList = {}
  
  	local friends = redisproxy:zrange(FRIEND_APPLY_KEY:format(roleId), 0, -1)
  	for _ , id in pairs(friends) do
  		id = tonumber(id)
  		local online, info = getRoleInfo(id)
  		table.insert(applyList, table_merge({
  			roleId = id, online = online
  		}, info, {
  
  		}))
  	end
  	SendPacket(actionCodes.Friend_applyListRpc, MsgPack.pack({list = applyList}))
  	return true
  end
  
6136eaca   liuzujun   添加好友表
203
  local function checkHandleApply(role, objectId, needAddNew) 
763d6396   zhouhaihai   批量增加好友bug
204
  	needAddNew = needAddNew or 0
6136eaca   liuzujun   添加好友表
205
  	local roleId = role:getProperty("id")
c384626d   zhouhaihai   好友
206
  	local redret = redisproxy:pipelining(function (red)
c384626d   zhouhaihai   好友
207
208
209
  		red:sismember(FRIEND_BLACK_KEY:format(objectId), roleId)
  		red:sismember(FRIEND_BLACK_KEY:format(roleId), objectId)
  	end)
c59e058b   zhouhaihai   新一批日志记录
210
  
c384626d   zhouhaihai   好友
211
  	--自己好友满了
6136eaca   liuzujun   添加好友表
212
  	if (table.numbers(role.friends) + needAddNew) >= globalCsv.friendListLimit then
763d6396   zhouhaihai   批量增加好友bug
213
  		return 1
c384626d   zhouhaihai   好友
214
215
  	end
  	-- 对方好友满了
6136eaca   liuzujun   添加好友表
216
  	if getFriendCount(objectId) >= globalCsv.friendListLimit then
763d6396   zhouhaihai   批量增加好友bug
217
  		return 2
c384626d   zhouhaihai   好友
218
219
  	end
  	-- 对方把你拉黑
6136eaca   liuzujun   添加好友表
220
  	if redret[1] == 1 then
763d6396   zhouhaihai   批量增加好友bug
221
  		return 3
c384626d   zhouhaihai   好友
222
223
  	end
  	-- 你把对方拉黑了
6136eaca   liuzujun   添加好友表
224
  	if redret[2] == 1 then
763d6396   zhouhaihai   批量增加好友bug
225
  		return 4
c384626d   zhouhaihai   好友
226
  	end
c59e058b   zhouhaihai   新一批日志记录
227
228
  
  	return nil, redret[1]
c384626d   zhouhaihai   好友
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
  end
  
  function _M.handleApplyRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  
  	local msg = MsgPack.unpack(data)
  	local cmd = msg.cmd
  
  	local newTag = MsgPack.pack({ skynet.timex(), 1})
  	local result = nil
  	if cmd == 1 then	--同意
  
  		local objectId = msg.roleId
  
  		if not redisproxy:zscore(FRIEND_APPLY_KEY:format(roleId), objectId) then
  			return
  		end
c59e058b   zhouhaihai   新一批日志记录
247
  		local curCount
6136eaca   liuzujun   添加好友表
248
  		result, curCount = checkHandleApply(role, objectId)
c384626d   zhouhaihai   好友
249
250
251
252
253
  
  		if not result then
  			redisproxy:pipelining(function (red)
  				red:ZREM(FRIEND_APPLY_KEY:format(roleId), objectId)
  				red:ZREM(FRIEND_APPLY_KEY:format(objectId), roleId)
6136eaca   liuzujun   添加好友表
254
  				addFriend(roleId, objectId)
c384626d   zhouhaihai   好友
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  			end)
  			local myInfo = role:friendSInfo()
  			myInfo.online = true
  			myInfo.roleId = roleId
  			myInfo.isFriend = 1
  			local redret = redisproxy:pipelining(function (red)
  				red:sismember(FRIEND_POINT:format(objectId), roleId)
  				red:sismember(FRIEND_POINT:format(roleId), objectId)
  			end)
  			myInfo.pGet = redret[1] == 1 and 1 or nil
  			rpcRole(objectId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({newFriend = 1, info = {myInfo}}))	-- 通知对方
  			local online , otherInfo = getRoleInfo(objectId)
  			otherInfo.roleId = objectId
  			otherInfo.online = online
  			otherInfo.isFriend = true
  			otherInfo.pGet = redret[2] == 1 and 1 or nil
  			SendPacket(actionCodes.Friend_updateProperty, MsgPack.pack({newFriend = 1, info = {otherInfo}}))
3133cb76   zhouhaihai   日志
272
  
c59e058b   zhouhaihai   新一批日志记录
273
274
275
276
277
  			role:log("friend_opt", {
  				friend_opt_type = 100, -- 好友操作类型,见枚举表中 好友操作类型枚举表
  				friend_roleid = objectId, -- 好友账户下的角色id
  				friend_cnt = curCount + 1, -- 操作后好友数量
  			})
f22a33af   zhouhaihai   自己的日志
278
279
  			role:mylog("role_action", {desc = "addFriend", int1 = 1})
  
c384626d   zhouhaihai   好友
280
281
282
283
284
285
286
287
288
289
290
291
  		end
  
  	elseif cmd == 0 then	-- 不同意
  		local objectId = msg.roleId
  		if not redisproxy:zscore(FRIEND_APPLY_KEY:format(roleId), objectId) then
  			return
  		end
  		redisproxy:ZREM(FRIEND_APPLY_KEY:format(roleId), objectId)
  	elseif cmd == 2 then    -- 一键拒绝
  		redisproxy:del(FRIEND_APPLY_KEY:format(roleId))
  	elseif cmd == 3 then    -- 一键同意
  		local redret = redisproxy:pipelining(function(red)
5dfc4978   zhouhaihai   好友完善
292
  			red:zrange(FRIEND_APPLY_KEY:format(roleId), 0, -1)
c384626d   zhouhaihai   好友
293
294
295
296
297
298
299
300
301
  			red:SMEMBERS(FRIEND_POINT:format(roleId))
  		end)
  		local allIds = redret[1]
  		local fpoint = formatArray(redret[2])
  		local needAdd = {}
  		local needAddMy = {}
  		local needAddInfo = {}
  		for _, objId in ipairs(allIds) do
  			objId = tonumber(objId)
6136eaca   liuzujun   添加好友表
302
  			local cr, curCount = checkHandleApply(role, objId, #needAdd)
c384626d   zhouhaihai   好友
303
304
305
306
307
308
309
310
311
312
  			if not cr then 
  				table.insert(needAdd, objId)
  				table.insert(needAddMy, objId)
  				table.insert(needAddMy, newTag)
  				local online, otherInfo = getRoleInfo(objId)
  				otherInfo.online = true
  				otherInfo.roleId = objId
  				otherInfo.isFriend = true
  				otherInfo.pGet = fpoint[objId] and 1 or nil
  				table.insert(needAddInfo, otherInfo)
c59e058b   zhouhaihai   新一批日志记录
313
314
315
316
317
318
  
  				role:log("friend_opt", {
  					friend_opt_type = 100, -- 好友操作类型,见枚举表中 好友操作类型枚举表
  					friend_roleid = objId, -- 好友账户下的角色id
  					friend_cnt = curCount + 1, -- 操作后好友数量
  				})
c384626d   zhouhaihai   好友
319
320
321
322
  			end
  		end
  
  		redisproxy:pipelining(function (red)
92d7d6ac   zhouhaihai   加一些数据保护
323
324
325
326
  			if next(needAdd) then
  				red:ZREM(FRIEND_APPLY_KEY:format(roleId), table_unpack(needAdd))
  				for _, objectId in pairs(needAdd) do
  					red:ZREM(FRIEND_APPLY_KEY:format(objectId), roleId)
6136eaca   liuzujun   添加好友表
327
  					addFriend(roleId, objectId)
92d7d6ac   zhouhaihai   加一些数据保护
328
329
  				end
  			end
c384626d   zhouhaihai   好友
330
331
332
333
334
335
336
337
338
339
340
  		end)
  		local myInfo = role:friendSInfo()
  		myInfo.roleId = roleId
  		myInfo.online = true
  		myInfo.isFriend = 1
  		local giveFP = role.dailyData:getProperty("giveFP")
  		for _, objectId in pairs(needAdd) do
  			myInfo.pGet = giveFP[objectId]
  			rpcRole(objectId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({newFriend = 1, info = {myInfo}}))	-- 通知对方
  		end
  		if next(needAdd) then
f22a33af   zhouhaihai   自己的日志
341
342
  			role:mylog("role_action", {desc = "addFriend", int1 = #needAdd})
  
c384626d   zhouhaihai   好友
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
  			SendPacket(actionCodes.Friend_updateProperty, MsgPack.pack({newFriend = 1, info = needAddInfo}))
  		else
  			result = 1
  		end
  		
  	else 	--不存在
  		return
  	end
  
  	SendPacket(actionCodes.Friend_handleApplyRpc, MsgPack.pack({result = result}))
  	return true
  end
  
  function _M.listRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  
  	local friendList = {}
  	local redret = redisproxy:pipelining(function (red)
c384626d   zhouhaihai   好友
362
363
364
  		red:SMEMBERS(FRIEND_POINT:format(roleId))
  	end)
  
6136eaca   liuzujun   添加好友表
365
  	local fpoint = formatArray(redret[1])
c384626d   zhouhaihai   好友
366
367
368
  	local hadGet = role.dailyData:getProperty("getFP")
  	local hadGive = role.dailyData:getProperty("giveFP")
  
6136eaca   liuzujun   添加好友表
369
370
  	local addNew = false 
  	for id, friend in pairs(role.friends) do
c384626d   zhouhaihai   好友
371
372
373
374
  		local online, info = getRoleInfo(id)
  		local roleInfo = {
  			roleId = id, 
  			online = online, 
6136eaca   liuzujun   添加好友表
375
376
  			addTime = friend:getProperty("addTime"), 
  			isNew = friend:getProperty("isNew"),
c384626d   zhouhaihai   好友
377
378
379
380
381
382
383
  			pGive = hadGive[id],
  			pGet = hadGet[id] and -1 or (fpoint[id] and 1 or nil)
  		}
  		roleInfo = table_merge(roleInfo, info, {})
  
  		friendList[#friendList + 1] = roleInfo
  
6136eaca   liuzujun   添加好友表
384
385
386
  		if roleInfo.isNew then
  			friend:setProperty("isNew", 0)	
  			addNew = true
c384626d   zhouhaihai   好友
387
388
  		end
  	end
6136eaca   liuzujun   添加好友表
389
  	if addNew then
3dbbc9f3   zhouhaihai   加上新的任务
390
  		role:checkTaskEnter("AddFriend", {count = #friendList})
c384626d   zhouhaihai   好友
391
392
393
394
395
396
397
398
399
400
401
  	end
  
  	SendPacket(actionCodes.Friend_listRpc, MsgPack.pack({list = friendList}))
  	return true
  end
  
  function _M.deleteRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  	local msg = MsgPack.unpack(data)
  	local objectId = msg.roleId
6136eaca   liuzujun   添加好友表
402
  	if not roleExists(objectId) then
c384626d   zhouhaihai   好友
403
404
405
  		return
  	end
  	-- 是否在好友列表中
6136eaca   liuzujun   添加好友表
406
407
  	if role.friends[objectId] then
  		role.friends[objectId] = nil
c384626d   zhouhaihai   好友
408
  		redisproxy:pipelining(function (red)
6136eaca   liuzujun   添加好友表
409
  			delFriend(roleId, objectId)
c384626d   zhouhaihai   好友
410
411
412
413
414
415
  			red:ZREM(FRIEND_APPLY_KEY:format(roleId), objectId)
  			red:ZREM(FRIEND_APPLY_KEY:format(objectId), roleId)
  		end)
  	end
  	rpcRole(objectId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({deleteFriend = 1, roleId = roleId}))
  
c59e058b   zhouhaihai   新一批日志记录
416
417
418
419
420
  	role:log("friend_opt", {
  		friend_opt_type = 200, -- 好友操作类型,见枚举表中 好友操作类型枚举表
  		friend_roleid = objectId, -- 好友账户下的角色id
  		friend_cnt = 0, -- 操作后好友数量
  	})
70fb62d1   liuzujun   服务器数据打点
421
  	role:mylog("role_action", {desc = "delFriend", int1 = 1})
c384626d   zhouhaihai   好友
422
423
424
425
426
427
428
429
430
431
  	SendPacket(actionCodes.Friend_deleteRpc, MsgPack.pack(""))
  	return true
  end
  
  function _M.blockRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  	local msg = MsgPack.unpack(data)
  	local cmd = msg.cmd
  	local objectId = msg.roleId
6136eaca   liuzujun   添加好友表
432
  	if not roleExists(objectId) then
c384626d   zhouhaihai   好友
433
434
435
436
437
438
439
440
441
442
443
444
  		return
  	end
  
  	local result = nil
  	if cmd == 1 then
  		-- 黑名单满了
  		if not result and not checkBlackLimit(roleId) then 
  			result = 1
  		end
  		-- 删除好友
  		if not result then
  			redisproxy:pipelining(function (red)
6136eaca   liuzujun   添加好友表
445
  				delFriend(roleId, objectId)
85083dba   zhouhaihai   拉黑从申请列表移除
446
447
  				red:ZREM(FRIEND_APPLY_KEY:format(roleId), objectId)
  				red:ZREM(FRIEND_APPLY_KEY:format(objectId), roleId)
c384626d   zhouhaihai   好友
448
449
  				red:sadd(FRIEND_BLACK_KEY:format(roleId), objectId)
  			end)
c59e058b   zhouhaihai   新一批日志记录
450
451
452
453
454
455
  			rpcRole(objectId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({deleteFriend = 1, roleId = roleId}))
  			role:log("friend_opt", {
  				friend_opt_type = 300, -- 好友操作类型,见枚举表中 好友操作类型枚举表
  				friend_roleid = objectId, -- 好友账户下的角色id
  				friend_cnt = 0, -- 操作后好友数量
  			})
c384626d   zhouhaihai   好友
456
457
458
459
460
461
  		end
  	elseif cmd == 2 then
  		redisproxy:SREM(FRIEND_BLACK_KEY:format(roleId), objectId)
  	else
  		return
  	end
c384626d   zhouhaihai   好友
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
  	SendPacket(actionCodes.Friend_blockRpc, MsgPack.pack({result = result}))
  	return true
  end
  
  function _M.blockListRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  
  	local blockList = {}
  
  	local friends = redisproxy:SMEMBERS(FRIEND_BLACK_KEY:format(roleId))
  	for _ , id in pairs(friends) do
  		id = tonumber(id)
  		local online, info = getRoleInfo(id)
  		table.insert(blockList, table_merge({
  			roleId = id, online = online
  		}, info, {
  
  		}))
  	end
5dfc4978   zhouhaihai   好友完善
482
  
c384626d   zhouhaihai   好友
483
484
485
486
487
488
489
490
491
  	SendPacket(actionCodes.Friend_blockListRpc, MsgPack.pack({list = blockList}))
  	return true
  end
  
  function _M.infoRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  	local msg = MsgPack.unpack(data)
  	local objectId = msg.roleId
6136eaca   liuzujun   添加好友表
492
493
  
  	if not roleExists(objectId) then
c384626d   zhouhaihai   好友
494
495
496
497
498
  		return
  	end
  
  	local online, info = getRoleAllInfo(objectId)
  	local redret = redisproxy:pipelining(function (red)
c384626d   zhouhaihai   好友
499
500
501
  		red:zscore(FRIEND_APPLY_KEY:format(objectId), roleId)
  		red:sismember(FRIEND_BLACK_KEY:format(roleId), objectId)
  	end)
6136eaca   liuzujun   添加好友表
502
503
504
  	local isFriend = role.friends[objectId] and 1 or nil
  	local hadApply = redret[1] == 1 and 1 or nil
  	local inBlack = redret[2] == 1 and 1 or nil
c384626d   zhouhaihai   好友
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
  
  	local objInfo = table_merge({
  		roleId = objectId, 
  		online = online, 
  		isFriend = isFriend, 
  		hadApply = hadApply,
  		inBlack = inBlack,
  	}, info, {
  
  	})
  	SendPacket(actionCodes.Friend_infoRpc, MsgPack.pack({info = objInfo}))
  	return true
  end
  
  function _M.pointRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  	local msg = MsgPack.unpack(data)
  	local cmd = msg.cmd
  	local result = nil
  	local reward = {}
  	if cmd == 1 then  -- 赠送
  		local objId = msg.roleId
  		local giveP = role.dailyData:getProperty("giveFP")
  		if not result and giveP[objId] then 
  			result = 1
  		end
6136eaca   liuzujun   添加好友表
532
  		if not result and not role.friends[objId] then
c384626d   zhouhaihai   好友
533
534
535
536
537
538
  			result = 2
  		end
  		if not result then
  			redisproxy:sadd(FRIEND_POINT:format(objId), roleId)
  			giveP[objId] = 1
  			role.dailyData:updateProperty({field = "giveFP", value = giveP})
3dbbc9f3   zhouhaihai   加上新的任务
539
  			role:checkTaskEnter("GiveFriendP", {count = 1})
c384626d   zhouhaihai   好友
540
  			rpcRole(objId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({newPoint = 1, roleId = roleId}))
f22a33af   zhouhaihai   自己的日志
541
542
  
  			role:mylog("role_action", {desc = "giveFPoint", int1 = 1})
c384626d   zhouhaihai   好友
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
  		end
  	elseif cmd == 2 then -- 领取
  		local objId = msg.roleId
  		local getP = role.dailyData:getProperty("getFP")
  		if not result and table.numbers(getP) >= globalCsv.friendPointLimit then
  			result = 1
  		end
  		if not result and getP[objId] then
  			result = 2
  		end
  		if not redisproxy:sismember(FRIEND_POINT:format(roleId), objId) then
  			result = 3
  		end
  		if not result then
  			getP[objId] = 1
3133cb76   zhouhaihai   日志
558
  			reward = role:award({[ItemId.FriendPoint] = 1}, {log = {desc = "friendPoint"}})
c384626d   zhouhaihai   好友
559
  			role.dailyData:updateProperty({field = "getFP", value = getP})
3dbbc9f3   zhouhaihai   加上新的任务
560
  			role:checkTaskEnter("GetFriendP", {count = 1})
3133cb76   zhouhaihai   日志
561
  
f22a33af   zhouhaihai   自己的日志
562
  			role:mylog("role_action", {desc = "getFPoint", int1 = 1})
c384626d   zhouhaihai   好友
563
564
565
566
  		end
  	elseif cmd == 3 then -- 一键赠送领取
  		-- 赠送
  		local giveP = role.dailyData:getProperty("giveFP")
3dbbc9f3   zhouhaihai   加上新的任务
567
  		local change = 0
c384626d   zhouhaihai   好友
568
  		redisproxy:pipelining(function(red)
6136eaca   liuzujun   添加好友表
569
  			for objId, friend in pairs(role.friends) do
c384626d   zhouhaihai   好友
570
571
  				if not giveP[objId] then
  					giveP[objId] = 1
3dbbc9f3   zhouhaihai   加上新的任务
572
  					change = change + 1
c384626d   zhouhaihai   好友
573
574
575
576
577
  					red:sadd(FRIEND_POINT:format(objId), roleId)
  					rpcRole(objId, "SendPacket", actionCodes.Friend_updateProperty, MsgPack.pack({newPoint = 1, roleId = roleId}))
  				end
  			end
  		end)
3dbbc9f3   zhouhaihai   加上新的任务
578
  		if change > 0 then
c384626d   zhouhaihai   好友
579
  			role.dailyData:updateProperty({field = "giveFP", value = giveP})
3dbbc9f3   zhouhaihai   加上新的任务
580
  			role:checkTaskEnter("GiveFriendP", {count = change})
3133cb76   zhouhaihai   日志
581
  
f22a33af   zhouhaihai   自己的日志
582
583
  			role:mylog("role_action", {desc = "giveFPoint", int1 = change})
  
c384626d   zhouhaihai   好友
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
  		else
  			result = 1
  		end
  		
  		--领取
  		local getP = role.dailyData:getProperty("getFP")
  		local curCount = table.numbers(getP)
  		local getCount = 0
  		if curCount < globalCsv.friendPointLimit then
  			for _, objId in pairs(redisproxy:SMEMBERS(FRIEND_POINT:format(roleId))) do
  				local objId = tonumber(objId)
  				if not getP[objId] then
  					getCount = getCount + 1
  					curCount = curCount + 1
  					getP[objId] = 1
  					if curCount >= globalCsv.friendPointLimit then
  						break
  					end
  				end
  			end
  			if getCount > 0 then
3133cb76   zhouhaihai   日志
605
  				reward = role:award({[ItemId.FriendPoint] = getCount}, {log = {desc = "friendPoint"}})
c384626d   zhouhaihai   好友
606
  				role.dailyData:updateProperty({field = "getFP", value = getP})
3dbbc9f3   zhouhaihai   加上新的任务
607
  				role:checkTaskEnter("GetFriendP", {count = getCount})
f22a33af   zhouhaihai   自己的日志
608
  				role:mylog("role_action", {desc = "getFPoint", int1 = getCount})
c384626d   zhouhaihai   好友
609
  			else
8474ca36   zhouhaihai   聊天
610
  				result = (result or 0) + 2
c384626d   zhouhaihai   好友
611
612
613
614
615
616
617
618
619
620
621
622
623
  			end
  		end
  	else
  		return
  	end
  	SendPacket(actionCodes.Friend_pointRpc, MsgPack.pack({result = result, reward = reward}))
  	return true
  end
  function _M.randomRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  
  	local redret = redisproxy:pipelining(function (red)
5dfc4978   zhouhaihai   好友完善
624
625
  		red:zrevrange(FRIEND_RECOMMEND, 0, globalCsv.friendRecommendLimit + globalCsv.friendListLimit + 10) --扩充10个
  		red:SMEMBERS(FRIEND_BLACK_KEY:format(roleId))
c384626d   zhouhaihai   好友
626
  	end)
5dfc4978   zhouhaihai   好友完善
627
  
6136eaca   liuzujun   添加好友表
628
629
  	local newList = redret[1]
  	local hadBlack = formatArray(redret[2])
5dfc4978   zhouhaihai   好友完善
630
  
c384626d   zhouhaihai   好友
631
632
633
  	local needRoleIds = {}
  	for _, newId in pairs(newList) do
  		local numNewId = tonumber(newId)
6136eaca   liuzujun   添加好友表
634
  		if numNewId ~= roleId and not role.friends[numNewId] and not hadBlack[numNewId] then
c384626d   zhouhaihai   好友
635
636
637
638
639
  			table.insert(needRoleIds, numNewId)
  		end
  	end
  
  	local randomRoles = {}
5dfc4978   zhouhaihai   好友完善
640
641
  	local redret = redisproxy:pipelining(function (red)
  		for _, objId in ipairs(needRoleIds) do
c384626d   zhouhaihai   好友
642
  			red:zscore(FRIEND_APPLY_KEY:format(objId), roleId)
5dfc4978   zhouhaihai   好友完善
643
644
645
646
647
  		end
  	end)
  	for idx, objId in ipairs(needRoleIds) do
  		if not redret[idx] then
  			local online, info = getRoleInfo(objId)
1dfcef53   liuzujun   好友推荐列表bug
648
649
650
651
652
653
654
655
656
657
658
  			if next(info) then
  				table.insert(randomRoles, table_merge({
  					roleId = objId, 
  					online = online,  
  					hadApply = hadApply,
  					inBlack = inBlack,
  				}, info, {
  
  				}))
  				if #randomRoles >= globalCsv.friendRecommendLimit then break end
  			end
5dfc4978   zhouhaihai   好友完善
659
  		end
c384626d   zhouhaihai   好友
660
  	end
c384626d   zhouhaihai   好友
661
662
663
664
  	SendPacket(actionCodes.Friend_randomRpc, MsgPack.pack({list = randomRoles}))
  	return true
  end
  
f603a60f   zhouhaihai   支援技实装
665
666
667
668
669
670
671
672
673
674
  function _M.battleInfoRpc(agent, data)
  	local role = agent.role
  	local roleId = role:getProperty("id")
  	local msg = MsgPack.unpack(data)
  	local objId = msg.roleId
  	local online, matchInfo = rpcRole(objId, "friendBattleInfo")
  	SendPacket(actionCodes.Friend_battleInfoRpc, MsgPack.pack({matchInfo = matchInfo}))
  	return true
  end
  
c384626d   zhouhaihai   好友
675
676
  
  return _M