Exemplo n.º 1
0
        public async Task <IActionResult> SendFriendRequest([FromBody] SendFriendRequest.Request req)
        {
            var requester = new evosequencing.ProtocolModels.Friend.SendFriendRequest();

            requester.request.playerIdSrc = SelfHost.playerInfo.playerId;
            requester.request.playerIdDst = req.playerId;

            if (requester.request.playerIdSrc == requester.request.playerIdDst)
            {
                return(BuildErrorResponse(Error.LowCode.BadParameter));
            }

            var db = PDBSM.PersonalDBContext(req.playerId.Value);

            if (false == await db.PlayerBasicInformations.AnyAsync(p => p.playerId == req.playerId))
            {
                return(BuildErrorResponse(Error.LowCode.BadParameter));
            }

            var response = await requester.PostAsyncXXX(SequencingServerInfo.Uri);

            if (response.StatusCode != System.Net.HttpStatusCode.OK)
            {
                return(BuildErrorResponse(Error.LowCode.ServerInternalError));
            }

            if (response.Payload.resultCode == evosequencing.ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.Ok)
            {
                Logger.Logging(
                    new LogObj().AddChild(new LogModels.SendFriend
                {
                    PlayerIdSrc = SelfHost.playerInfo.playerId,
                    PlayerIdDst = req.playerId.Value,
                    Date        = DateTime.UtcNow,
                })
                    );
            }

            switch (response.Payload.resultCode)
            {
            case evosequencing.ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.Ok:
                return(Ok(new SendFriendRequest.Response
                {
                    ok = true,
                }));

            case evosequencing.ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.AlreadyFriend:
                return(BuildErrorResponse(Error.LowCode.AlreadyFriend));

            case evosequencing.ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.AlreadySent:
                return(BuildErrorResponse(Error.LowCode.AlreadySentFriendRequest));

            case evosequencing.ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.AlreadyRecieved:
                return(BuildErrorResponse(Error.LowCode.AlreadyRecievedFriendRequest));

            case evosequencing.ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.RequestsCntLimit:
                return(BuildErrorResponse(Error.LowCode.FriendRequestsCntLimit));

            default:
                return(BuildErrorResponse(Error.LowCode.Others));
            }
        }
Exemplo n.º 2
0
        public async Task <IActionResult> SendFriendRequest([FromBody] SendFriendRequest.Request req)
        {
            var res = new SendFriendRequest.Response();

            res.resultCode = ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.Unknown;

            await DependJobManager.Enqueue(req.playerIdSrc.Value, req.playerIdDst.Value, async() =>
            {
                var friend = Friend.Create(req.playerIdSrc.Value, req.playerIdDst.Value);
                if (null != await Common2DB.Friends.FindAsync(friend.playerIdL, friend.playerIdR))
                {
                    res.resultCode = ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.AlreadyFriend;
                    return;
                }

                var dbDst    = PDBSM.PersonalDBContext(req.playerIdDst.Value);
                var requests = await dbDst.FriendRequests.Where(r => r.playerIdDst == req.playerIdDst).ToListAsync();

                if (null != requests.Find(r => r.playerIdSrc == req.playerIdSrc))
                {
                    res.resultCode = ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.AlreadySent;
                    return;
                }

                if (evolib.Social.MaxFriendRequestsCnt <= requests.Count)
                {
                    res.resultCode = ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.RequestsCntLimit;
                    return;
                }

                var dbSrc = PDBSM.PersonalDBContext(req.playerIdSrc.Value);
                if (await dbSrc.FriendRequests.AnyAsync(r => r.playerIdDst == req.playerIdSrc && r.playerIdSrc == req.playerIdDst))
                {
                    res.resultCode = ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.AlreadyRecieved;
                    return;
                }

                await dbDst.FriendRequests.AddAsync(new FriendRequest
                {
                    playerIdDst = req.playerIdDst.Value,
                    playerIdSrc = req.playerIdSrc.Value,
                    timeStamp   = DateTime.UtcNow,
                });
                await dbDst.SaveChangesAsync();

                res.resultCode = ProtocolModels.Friend.SendFriendRequest.Response.ResultCode.Ok;

                //PUSH
                var player = new Player(req.playerIdDst.Value);
                await player.FetchAsync();
                if (await new Session(player.Model.sessionId).ExistsAsync())
                {
                    await new ConnectionQueue(player.Model.sessionId).EnqueueAsync(new RecievedFriendRequest()
                    {
                        playerId = req.playerIdSrc.Value,
                    });
                }
            });

            return(Ok(res));
        }