public async Task <IActionResult> SendInvitation([FromBody] SendInvitation.Request req)
        {
            var requester = new evomatching.ProtocolModels.PremadeGroup.SendInvitation();

            //dst
            var playerDst = new Player(req.playerId.Value);

            if (!await playerDst.Validate(PDBSM))
            {
                return(BuildErrorResponse(Error.LowCode.BadParameter));
            }
            requester.request.playerIdDst  = playerDst.playerId;
            requester.request.sessionIdDst = playerDst.Model.sessionId;

            if (playerDst.Model.matchingArea != SelfHost.matchingArea)
            {
                return(BuildErrorResponse(Error.LowCode.PremadeGroupDifferentArea));
            }

            //src
            requester.request.playerIdSrc  = SelfHost.playerInfo.playerId;
            requester.request.sessionIdSrc = SelfHost.sessionId;


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

            var response = await requester.PostAsyncXXX(MatchingServerInfo.AreaUri(SelfHost.matchingArea));

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

            switch (response.Payload.resultCode)
            {
            case evomatching.ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.Ok:
                return(Ok(new SendInvitation.Response()
                {
                }));

            case evomatching.ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.AlreadyEntrySelf:
            case evomatching.ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.AlreadyBattleSelf:
                return(BuildErrorResponse(Error.LowCode.BadRequest));

            case evomatching.ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.ReceivedInvitationSelf:
                return(BuildErrorResponse(Error.LowCode.PremadeGroupRecievedInvitationSelf));

            case evomatching.ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.BusyTarget:
                return(BuildErrorResponse(Error.LowCode.PremadeGroupTargetBusy));

            case evomatching.ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.AlreadyGroupTarget:
                return(BuildErrorResponse(Error.LowCode.PremadeGroupAlreadyGroupTarget));

            case evomatching.ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.AlreadyEntryTarget:
                return(BuildErrorResponse(Error.LowCode.PremadeGroupAlreadyEntryTarget));

            case evomatching.ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.AlreadyBattleTarget:
                return(BuildErrorResponse(Error.LowCode.PremadeGroupAlreadyBattleTarget));

            case evomatching.ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.OverLimit:
                return(BuildErrorResponse(Error.LowCode.PremadeGroupOverLimit));

            default:
                return(BuildErrorResponse(Error.LowCode.Others));
            }
        }
        public async Task <IActionResult> SendInvitation(
            [FromBody] SendInvitation.Request req, [FromServices] GeneralManager gm)
        {
            var res = new SendInvitation.Response();

            await gm.EnqueueJob(async() =>
            {
                if (gm.BattleEntryManager.Entried(req.playerIdSrc))
                {
                    res.resultCode = ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.AlreadyEntrySelf;
                    return;
                }

                if (null != gm.MatchManager.GetAssignedMatch(req.playerIdSrc))
                {
                    res.resultCode = ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.AlreadyBattleSelf;
                    return;
                }

                if (null != gm.PgInvitationManager.GetInvitationTo(req.playerIdSrc))
                {
                    res.resultCode = ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.ReceivedInvitationSelf;
                    return;
                }

                if (null != gm.PgInvitationManager.GetInvitationTo(req.playerIdDst) ||
                    0 < gm.PgInvitationManager.GetInvitationFrom(req.playerIdDst).Count)
                {
                    res.resultCode = ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.BusyTarget;
                    return;
                }

                if (null != gm.PremadeGroupManager.GetBelongs(req.playerIdDst))
                {
                    res.resultCode = ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.AlreadyGroupTarget;
                    return;
                }

                if (gm.BattleEntryManager.Entried(req.playerIdDst))
                {
                    res.resultCode = ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.AlreadyEntryTarget;
                    return;
                }

                if (null != gm.MatchManager.GetAssignedMatch(req.playerIdDst))
                {
                    res.resultCode = ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.AlreadyBattleTarget;
                    return;
                }

                if (evolib.Battle.SidePlayersNum <= gm.CreatePremadeGroupQueueData(req.playerIdSrc).players.Count)
                {
                    res.resultCode = ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.OverLimit;
                    return;
                }

                Logger.Logging(
                    new LogObj().AddChild(new LogModels.SendInvitationParty
                {
                    PlayerIdSrc = req.playerIdSrc,
                    PlayerIdDst = req.playerIdDst,
                    Date        = DateTime.UtcNow,
                })
                    );

                // OK!
                gm.PgInvitationManager.CreateInvitation(
                    req.playerIdSrc, req.sessionIdSrc,
                    req.playerIdDst, req.sessionIdDst
                    );

                var queData = gm.CreatePremadeGroupQueueData(req.playerIdSrc);
                await new ConnectionQueue(req.sessionIdSrc).EnqueueAsync(queData);

                var group = gm.PremadeGroupManager.GetBelongs(req.playerIdSrc);
                if (group != null)
                {
                    for (int i = 0; i < group.Players.Count; i++)
                    {
                        var member = group.Players[i];
                        if (member.PlayerId == req.playerIdSrc)
                        {
                            continue;                                                            //already sended!
                        }
                        await new ConnectionQueue(member.SessionId).EnqueueAsync(queData);
                    }
                }

                await new ConnectionQueue(req.sessionIdDst).EnqueueAsync(new PremadeGroupInvitation()
                {
                    playerId     = req.playerIdSrc,
                    remainingSec = (float)(evolib.PremadeGroup.InvitationExpiry.TotalSeconds),
                });

                res.resultCode = ProtocolModels.PremadeGroup.SendInvitation.Response.ResultCode.Ok;
            });

            return(Ok(res));
        }