You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
374 lines
14 KiB
Lua
374 lines
14 KiB
Lua
local skynet = require "skynet"
|
|
local netpack = require "websocketnetpack"
|
|
local msgutils = require "msgutils"
|
|
local cjson = require "cjson"
|
|
local usermodel = require "usermodel"
|
|
local bagmodel = require "bagmodel"
|
|
local heromodel = require "heromodel"
|
|
local settings = require "settings"
|
|
local dateutils = require "dateutils"
|
|
local usermodel = require "usermodel"
|
|
local heromodel = require "heromodel"
|
|
local friendmodel = require "friendmodel"
|
|
local taskmodel = require "taskmodel"
|
|
local coingetlogic = require "coingetlogic"
|
|
local friend = {}
|
|
|
|
|
|
function friend.loadfriend(cmd)
|
|
--获取我的好友
|
|
local ok, result = pcall(skynet.call, ".friendd", "lua", "loadfriends", UID)
|
|
local friends = {}
|
|
local uids = {}
|
|
if ok then
|
|
for i,v in ipairs(result) do
|
|
table.insert(uids, v.friendid)
|
|
end
|
|
end
|
|
|
|
if #uids > 0 then
|
|
local ok, ret = pcall(skynet.call, ".usercenterd", "lua", "getuserinfolist", uids)
|
|
if ok then
|
|
for k,v in pairs(result) do
|
|
local u = ret[checkint(v.friendid)]
|
|
u.status = v.status
|
|
table.insert(friends, u)
|
|
end
|
|
end
|
|
end
|
|
local ok, gives, receices = pcall(skynet.call, ".friendd", "lua", "loadfriendcoin", UID)
|
|
if not ok then
|
|
gives = {}
|
|
receices = {}
|
|
end
|
|
friendmodel:init(friends, gives, receices)
|
|
--推荐好友
|
|
local ok, recomfriends = pcall(skynet.call, ".usercenterd", "lua", "loadrecomfriends", UID, uids)
|
|
-- DEBUG("loadrecomfriends ok = ", ok)
|
|
-- DEBUG("loadrecomfriends recomfriends = ", cjson.encode(recomfriends))
|
|
if not ok then
|
|
recomfriends = {}
|
|
end
|
|
|
|
local ok, applys = pcall(skynet.call, ".friendd", "lua", "loadapply", UID)
|
|
if not ok then
|
|
applys = {}
|
|
end
|
|
|
|
local function getstatus(uid, applys)
|
|
for i,v in ipairs(applys) do
|
|
if v.friendid == uid then
|
|
return v.status
|
|
end
|
|
end
|
|
end
|
|
|
|
for i,v in ipairs(recomfriends) do
|
|
local status = getstatus(v.uid, applys)
|
|
if status then
|
|
v.status = 1
|
|
else
|
|
v.status = 0
|
|
end
|
|
end
|
|
|
|
--好友申请
|
|
local ok, applys = pcall(skynet.call, ".friendd", "lua", "loadfriendapply", UID)
|
|
if not ok then
|
|
applys = {}
|
|
end
|
|
local applyfriends = {}
|
|
if #applys > 0 then
|
|
local ok, ret = pcall(skynet.call, ".usercenterd", "lua", "getuserinfolist", applys)
|
|
if ok then
|
|
for k,v in pairs(applys) do
|
|
table.insert(applyfriends, ret[checkint(v)])
|
|
end
|
|
end
|
|
|
|
end
|
|
local refreshtime = skynet.call(".friendd", "lua", "getrefreshtime", UID) or 0
|
|
refreshtime = checkint(refreshtime) + 3600
|
|
|
|
return {c = "friend",m = "loadfriend", data = {errcode = 0, errmsg = "", data = {friends=friendmodel:serialize(), recomfriends=table.array(recomfriends), applyfriends=table.array(applyfriends), refreshtime=refreshtime}}}
|
|
end
|
|
|
|
|
|
--刷新好友
|
|
function friend.refreshfriend(cmd)
|
|
|
|
local refreshtime = skynet.call(".friendd", "lua", "getrefreshtime", UID) or 0
|
|
|
|
-- DEBUG("refreshtime 73 = ", refreshtime)
|
|
|
|
refreshtime = checkint(refreshtime)
|
|
|
|
-- DEBUG("refreshtime 77 = ", refreshtime)
|
|
|
|
if os.time() - refreshtime < 3600 then
|
|
if bagmodel:getnum("gold") < 20 then
|
|
return {c = "friend",m = "refreshfriend", data = {errcode = 10001, errmsg = "金砖数量不足", data = { }}}
|
|
end
|
|
bagmodel:decrBagA("gold", 20)
|
|
end
|
|
|
|
local result = skynet.call(".friendd", "lua", "loadfriends", UID)
|
|
local players = {}
|
|
|
|
for i,v in ipairs(result) do
|
|
table.insert(players, v.friendid)
|
|
end
|
|
|
|
local applys = skynet.call(".friendd", "lua", "loadapply", UID)
|
|
|
|
--推荐好友
|
|
local recomfriends = skynet.call(".usercenterd", "lua", "loadrecomfriends", UID, players)
|
|
|
|
local function getstatus(uid, applys)
|
|
for i,v in ipairs(applys) do
|
|
if v.uid == uid then
|
|
return v.status
|
|
end
|
|
end
|
|
end
|
|
|
|
for i,v in ipairs(recomfriends) do
|
|
local status = getstatus(v.uid, applys)
|
|
if status then
|
|
v.status = 1
|
|
else
|
|
v.status = 0
|
|
end
|
|
end
|
|
|
|
if os.time() - refreshtime > 3600 then
|
|
skynet.call(".friendd", "lua", "updaterefreshtime", UID)
|
|
refreshtime = os.time()
|
|
end
|
|
refreshtime = refreshtime + 3600
|
|
return {c = "friend",m = "refreshfriend", data = {errcode = 0, errmsg = "", data = {recomfriends=table.array(recomfriends), refreshtime=refreshtime}}}
|
|
end
|
|
|
|
--申请好友
|
|
function friend.apply(cmd)
|
|
local friendid = cmd.data.friendid --好友ID
|
|
if not friendid then
|
|
return {c = "friend",m = "apply", data = {errcode = 10001, errmsg = "请求异常,请稍后再试", data = {}}}
|
|
end
|
|
friendid = checkint(friendid)
|
|
|
|
if friendid == UID then
|
|
return {c = "friend",m = "apply", data = {errcode = 10002, errmsg = "禁止自己自己为好友", data = {}}}
|
|
end
|
|
|
|
local apply = skynet.call(".friendd", "lua", "checkapply", friendid, UID)
|
|
|
|
if apply ~= nil then
|
|
return {c = "friend",m = "apply", data = {errcode = 10002, errmsg = "请前往同意该玩家的好友申请", data = {}}}
|
|
end
|
|
|
|
local apply = skynet.call(".friendd", "lua", "checkapply", UID, friendid)
|
|
if apply ~= nil then
|
|
return {c = "friend",m = "apply", data = {errcode = 10003, errmsg = "请勿重复申请", data = {}}}
|
|
end
|
|
|
|
if friendmodel:isfriend(friendid) then
|
|
return {c = "friend",m = "apply", data = {errcode = 10003, errmsg = "该用户已是你的好友", data = {}}}
|
|
end
|
|
local ok = skynet.call(".friendd", "lua", "apply", UID, friendid)
|
|
skynet.send(".msgd", "lua", "applyfriend", friendid, usermodel:get_look_info())
|
|
return {c = "friend",m = "apply", data = {errcode = 0, errmsg = "", data = {ok=ok}}}
|
|
end
|
|
|
|
|
|
function friend.agree(cmd)
|
|
local friendid = cmd.data.friendid --好友ID
|
|
local status = cmd.data.status
|
|
if not friendid or not status then
|
|
return {c = "friend",m = "agree", data = {errcode = 10001, errmsg = "请求异常,请稍后再试", data = {}}}
|
|
end
|
|
friendid = checkint(friendid)
|
|
status = checkint(status)
|
|
if status == 1 then
|
|
if friendmodel:isfriend(friendid) then
|
|
return {c = "friend",m = "apply", data = {errcode = 10002, errmsg = "该用户已是你的好友", data = {}}}
|
|
end
|
|
local user = skynet.call(".usercenterd", "lua", "getuserinfo", friendid)
|
|
friendmodel:addfriend(user)
|
|
end
|
|
local ok = skynet.call(".friendd", "lua", "agree", UID, friendid, status)
|
|
skynet.send(".msgd", "lua", "applyagree", friendid, usermodel:get_look_info())
|
|
return {c = "friend",m = "agree", data = {errcode = 0, errmsg = "", data = {ok=ok}}}
|
|
end
|
|
|
|
function friend.opall(cmd)
|
|
local status = cmd.data.status
|
|
if not status then
|
|
return {c = "friend",m = "apply", data = {errcode = 10001, errmsg = "请求异常,请稍后再试", data = {}}}
|
|
end
|
|
status = checkint(status)
|
|
|
|
if status == 1 then
|
|
local applys = skynet.call(".friendd", "lua", "loadfriendapply", UID)
|
|
|
|
local ret = skynet.call(".usercenterd", "lua", "getuserinfolist", applys)
|
|
|
|
for k,v in pairs(applys) do
|
|
if not friendmodel:isfriend(checkint(v)) then
|
|
friendmodel:addfriend(ret[checkint(v)])
|
|
end
|
|
end
|
|
end
|
|
|
|
local ok = skynet.call(".friendd", "lua", "opagree", UID, status)
|
|
-- DEBUG("opall ok = ", ok)
|
|
return {c = "friend",m = "opall", data = {errcode = 0, errmsg = "", data = {ok=ok}}}
|
|
end
|
|
|
|
--赠送金币
|
|
function friend.givecoin(cmd)
|
|
local friendid = cmd.data.friendid --好友ID
|
|
if not friendid then
|
|
return {c = "friend",m = "givecoin", data = {errcode = 10000, errmsg = "请求异常,请稍后再试", data = {}}}
|
|
end
|
|
friendid = checkint(friendid)
|
|
if not friendmodel:isfriend(friendid) then
|
|
return {c = "friend",m = "givecoin", data = {errcode = 10001, errmsg = "该用户不是你的好友", data = {}}}
|
|
end
|
|
if friendmodel:checkgive(friendid) ~= nil then
|
|
return {c = "friend",m = "givecoin", data = {errcode = 10002, errmsg = "今日已赠送过金币", data = {}}}
|
|
end
|
|
local coin = coingetlogic.getcoingetnum(usermodel.max_level) * 0.2
|
|
-- DEBUG("givecoin coin = ", coin)
|
|
if coin == 0 then
|
|
coin = 1
|
|
end
|
|
friendmodel:givecoin(friendid, coin)
|
|
taskmodel:addtasknum(3, 1)
|
|
skynet.send(".msgd", "lua", "givecoin", friendid, {uid=UID, coin=coin})
|
|
return {c = "friend",m = "givecoin", data = {errcode = 0, errmsg = "", data = {}}}
|
|
end
|
|
|
|
--领取金币
|
|
function friend.receivecoin(cmd)
|
|
local friendid = cmd.data.friendid --好友ID
|
|
if not friendid then
|
|
return {c = "friend",m = "receivecoin", data = {errcode = 10000, errmsg = "请求异常,请稍后再试", data = {}}}
|
|
end
|
|
friendid = checkint(friendid)
|
|
if not friendmodel:isfriend(friendid) then
|
|
return {c = "friend",m = "receivecoin", data = {errcode = 10001, errmsg = "该用户不是你的好友", data = {}}}
|
|
end
|
|
if not friendmodel:checkreceive(friendid) then
|
|
return {c = "friend",m = "receivecoin", data = {errcode = 10002, errmsg = "领取金币失败", data = {}}}
|
|
end
|
|
local coin = friendmodel:receivecoin(friendid)
|
|
bagmodel:incrBagA("coin", coin)
|
|
return {c = "friend",m = "receivecoin", data = {errcode = 0, errmsg = "", data = {coin=coin}}}
|
|
end
|
|
|
|
|
|
--一键领取赠送金币
|
|
function friend.giveandreceive(cmd)
|
|
if not friendmodel:checkgiveandreceive() then
|
|
return {c = "friend",m = "giveandreceive", data = {errcode = 10000, errmsg = "暂时无法领取或赠送金币", data = {}}}
|
|
end
|
|
local coin = coingetlogic.getcoingetnum(usermodel.max_level) * 0.2
|
|
local gives, receives = friendmodel:giveandreceive()
|
|
DEBUG("giveandreceive gives = ", cjson.encode(gives))
|
|
DEBUG("giveandreceive receives = ", cjson.encode(receives))
|
|
for _, gid in ipairs(gives) do
|
|
friendmodel:givecoin(gid, coin)
|
|
taskmodel:addtasknum(3, 1)
|
|
skynet.send(".msgd", "lua", "givecoin", gid, usermodel:get_look_info())
|
|
end
|
|
local t = 0
|
|
local coins = {}
|
|
for _, fid in ipairs(receives) do
|
|
local coin = friendmodel:receivecoin(fid)
|
|
DEBUG("giveandreceive receivecoin coin = ", coin)
|
|
t = t + coin
|
|
table.insert(coins, coin)
|
|
end
|
|
bagmodel:incrBagA("coin", t)
|
|
return {c = "friend",m = "giveandreceive", data = {errcode = 0, errmsg = "", data = {coins=coins, give_num = #gives}}}
|
|
end
|
|
|
|
|
|
--拉黑好友
|
|
function friend.black(cmd)
|
|
local friendid = cmd.data.friendid --好友ID
|
|
if not friendid then
|
|
return {c = "friend",m = "black", data = {errcode = 10000, errmsg = "请求异常,请稍后再试", data = {}}}
|
|
end
|
|
friendid = checkint(friendid)
|
|
if not friendmodel:isfriend(friendid) then
|
|
return {c = "friend",m = "black", data = {errcode = 10001, errmsg = "该用户不是你的好友", data = {}}}
|
|
end
|
|
friendmodel:black(friendid)
|
|
return {c = "friend",m = "black", data = {errcode = 0, errmsg = "", data = {}}}
|
|
end
|
|
|
|
function friend.delblack(cmd)
|
|
local friendid = cmd.data.friendid --好友ID
|
|
if not friendid then
|
|
return {c = "friend",m = "delblack", data = {errcode = 10000, errmsg = "请求异常,请稍后再试", data = {}}}
|
|
end
|
|
friendid = checkint(friendid)
|
|
if not friendmodel:isfriend(friendid) then
|
|
return {c = "friend",m = "delblack", data = {errcode = 10001, errmsg = "该用户不是你的好友", data = {}}}
|
|
end
|
|
friendmodel:delblack(friendid)
|
|
return {c = "friend",m = "delblack", data = {errcode = 0, errmsg = "", data = {}}}
|
|
end
|
|
|
|
function friend.delete(cmd)
|
|
local friendid = cmd.data.friendid --好友ID
|
|
if not friendid then
|
|
return {c = "friend",m = "delete", data = {errcode = 10000, errmsg = "请求异常,请稍后再试", data = {}}}
|
|
end
|
|
friendid = checkint(friendid)
|
|
if not friendmodel:isfriend(friendid) then
|
|
return {c = "friend",m = "delete", data = {errcode = 10001, errmsg = "该用户不是你的好友", data = {}}}
|
|
end
|
|
friendmodel:delete(friendid)
|
|
return {c = "friend",m = "delete", data = {errcode = 0, errmsg = "", data = {}}}
|
|
end
|
|
|
|
function friend.sendmsg(cmd)
|
|
local friendid = cmd.data.friendid
|
|
friendid = checkint(friendid)
|
|
if not friendmodel:isfriend(friendid) then
|
|
return {c = "friend",m = "apply", data = {errcode = 10000, errmsg = "该用户不是你的好友", data = {}}}
|
|
end
|
|
local content = cmd.data.content
|
|
if not content then
|
|
return {c = "friend",m = "sendmsg",data = {errcode = 10001, errmsg = "请求异常, 请稍后再试!", data = { }}}
|
|
end
|
|
if content == "" then
|
|
return {c = "friend",m = "sendmsg",data = {errcode = 10002, errmsg = "消息不能为空!", data = { }}}
|
|
end
|
|
local is_valid = skynet.call(".word_crab", "lua", "is_valid", content)
|
|
if not is_valid then
|
|
return {c = "user",m = "sendmsg",data = {errcode = 10003, errmsg = "存在违规词!", data = { }}}
|
|
end
|
|
local id = skynet.call(".id_service", "lua", "genid", "mail")
|
|
assert(id~=nil, "id 获取失败")
|
|
local msg = {
|
|
id=id,
|
|
tp="daily",
|
|
temp="N",
|
|
receiver=friendid,
|
|
sender=usermodel:get_look_info(),
|
|
params={},
|
|
status=0,
|
|
title=0,
|
|
content=content,
|
|
rewards={},
|
|
created_at=dateutils.get_datetime()
|
|
}
|
|
skynet.send(".maild", "lua", "sendmail", friendid, msg)
|
|
return {c = "friend",m = "sendmsg", data = {errcode = 0, errmsg = "", data = {}}}
|
|
end
|
|
|
|
return friend |