/// <summary>
        /// 建立關係申請
        /// </summary>
        /// <param name="uid"></param>
        /// <param name="targetUid"></param>
        /// <returns></returns>
        public static async ETTask <RelationshipApply> AddRelationshipApply(long senderUid, long receiverUid)
        {
            bool exist = await ExistRelationshipApply(senderUid, receiverUid);

            if (exist)
            {
                return(null);
            }

            var relationshipApply = ComponentFactory.CreateWithId <RelationshipApply>(IdGenerater.GenerateId());

            relationshipApply.applyId = relationshipApply.Id;

            var senderUser = await UserDataHelper.FindOneUser(senderUid);

            relationshipApply.senderUid      = senderUid;
            relationshipApply.senderName     = senderUser.name;
            relationshipApply.senderLocation = senderUser.location;
            relationshipApply.senderMileage  = senderUser.playerRideTotalInfo.Mileage;

            var receiverUser = await UserDataHelper.FindOneUser(receiverUid);

            relationshipApply.receiverUid      = receiverUid;
            relationshipApply.receiverName     = receiverUser.name;
            relationshipApply.receiverLocation = receiverUser.location;
            relationshipApply.receiverMileage  = receiverUser.playerRideTotalInfo.Mileage;

            await dbProxy.Save(relationshipApply);

            await dbProxy.SaveLog(senderUid, DBLog.LogType.RelationshipApply, relationshipApply);

            return(relationshipApply);
        }
Esempio n. 2
0
        protected async ETTask RunAsync(MapUnit mapUnit, C2M_GiveEmoticon message)
        {
            await ETTask.CompletedTask;

            try
            {
                M2C_GiveEmoticon m2C_GiveEmoticon = new M2C_GiveEmoticon();
                if (mapUnit.Id == message.MapUnitId)
                {
                    Log.Error("給自己按讚是不行的!");
                    return;
                }
                MapUnit target = mapUnit.Room.GetMapUnitById(message.MapUnitId);
                User    user   = await UserDataHelper.FindOneUser(mapUnit.Uid);

                m2C_GiveEmoticon.Name          = user?.name;
                m2C_GiveEmoticon.EmoticonIndex = message.EmoticonIndex;
                MapMessageHelper.BroadcastTarget(m2C_GiveEmoticon, new List <MapUnit> {
                    target
                });
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
        protected async ETTask RunAsync(MapUnit mapUnit, C2M_GiveAisatsu message)
        {
            await ETTask.CompletedTask;

            try
            {
                M2C_GiveAisatsu m2C_GiveAisatsu = new M2C_GiveAisatsu();
                if (mapUnit.Id == message.MapUnitId)
                {
                    Log.Error("µ¹¦Û¤v«öÆg¬O¤£¦æªº!");
                    return;
                }
                MapUnit target = mapUnit.Room.GetMapUnitById(message.MapUnitId);
                User    user   = await UserDataHelper.FindOneUser(mapUnit.Uid);

                m2C_GiveAisatsu.Name    = user?.name;
                m2C_GiveAisatsu.Content = message.Content;
                MapMessageHelper.BroadcastTarget(m2C_GiveAisatsu, new List <MapUnit> {
                    target
                });
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
        public static async void SaveRoadAllInfo(MapUnit mapUnit, long teamId, bool saveRideRoadInfos = true, bool saveRideTotalInfos = true)
        {
            if (mapUnit == null)
            {
                Log.Error("SaveRoadAllInfo Failed, mapUnit == null");
                return;
            }

            if (mapUnit.MapUnitType == MapUnitType.Npc)
            {
                return;
            }

            var roadInfo      = mapUnit.CreateRideRecord(teamId);
            var roadTotalInfo = mapUnit.CreateRideTotalInfo();
            var user          = await UserDataHelper.FindOneUser(mapUnit.Uid);

            BsonDocument log = null;

            if (saveRideRoadInfos)
            {
                SaveRideRoadInfos(roadInfo);
            }
            if (saveRideTotalInfos)
            {
                SaveRideTotalInfo(user, roadTotalInfo, out log);
            }
            SaveUserAndBroadcastTarget(mapUnit, user, log);
        }
Esempio n. 5
0
        protected async ETTask RunAsync(Session session, C2G_TeamInviteRefuse message, Action <G2C_TeamInviteRefuse> reply)
        {
            G2C_TeamInviteRefuse response = new G2C_TeamInviteRefuse();

            try
            {
                //取得自身資料
                Player player = session.GetComponent <SessionPlayerComponent>().Player;
                User   user   = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                //判斷邀請是否合法
                var inviteComponent = Game.Scene.GetComponent <InviteComponent>();
                var invite          = inviteComponent.GetByInviteId(message.InviteId);

                if (invite == null)
                {
                    response.Error = ErrorCode.ERR_InviteIdNotFind;
                    reply(response);
                    return;
                }

                if (invite.data.ReceiverUid != player?.uid)
                {
                    response.Error = ErrorCode.ERR_InviteNotSelf;
                    reply(response);
                    return;
                }

                //告知對方拒絕邀請
                var    proxy        = Game.Scene.GetComponent <CacheProxyComponent>();
                var    playerSync   = proxy.GetMemorySyncSolver <Player>();
                Player senderTarget = playerSync.Get <Player>(invite.data.SenderUid);
                if (senderTarget != null)
                {
                    G2C_TeamInviteTargerRefuse g2c_TeamInviteTargerRefuse = new G2C_TeamInviteTargerRefuse();
                    g2c_TeamInviteTargerRefuse.RefuseUid = player.uid;
                    GateMessageHelper.BroadcastTarget(g2c_TeamInviteTargerRefuse, invite.data.SenderUid);
                }

                //刪除該邀請
                await inviteComponent.DestroyByInviteId(message.InviteId);

                //回傳資料
                response.Error = ErrorCode.ERR_Success;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        private async ETTask RunAsync(Player player, C2L_AddRelationship message, Action <L2C_AddRelationship> reply)
        {
            L2C_AddRelationship response = new L2C_AddRelationship();

            try
            {
                long uid = player.uid;
                //Apply
                var relationshipApply = await RelationshipDataHelper.AddRelationshipApply(uid, message.Uid);

                if (relationshipApply == null)
                {
                    response.Error = ErrorCode.ERR_RelationshipApplyInfo_AddFailed;
                    reply(response);
                    return;
                }
                response.Error = ErrorCode.ERR_Success;
                reply(response);

                // 確認玩家是在線,在線的話傳送好友資訊
                var relationshipApplyInfo = RelationshipApply.ConvertToRelationshipApplyInfo(relationshipApply);
                var uidUser = await UserDataHelper.FindOneUser(uid);

                var receiverUidUser = await UserDataHelper.FindOneUser(message.Uid);

                var    proxy      = Game.Scene.GetComponent <CacheProxyComponent>();
                var    playerSync = proxy.GetMemorySyncSolver <Player>();
                Player target     = playerSync.Get <Player>(message.Uid);
                if (target != null)
                {
                    var notifyRelationshipState_SenderNotRequested = new L2C_NotifyRelationshipApplyState()
                    {
                        AddApplyInfo = relationshipApplyInfo,
                        IsRequested  = false,
                    };
                    GateMessageHelper.BroadcastTarget(notifyRelationshipState_SenderNotRequested, message.Uid);
                }

                //傳給自己更新Apply列表
                var notifyRelationshipState_SenderIsRequested = new L2C_NotifyRelationshipApplyState()
                {
                    AddApplyInfo = relationshipApplyInfo,
                    IsRequested  = true,
                };
                GateMessageHelper.BroadcastTarget(notifyRelationshipState_SenderIsRequested, uid);

                // 推播告知receiverUser
                var firebase = Game.Scene.GetComponent <FirebaseComponent>();
                var lang     = Game.Scene.GetComponent <LanguageComponent>();
                // 7 = {0}向你發出好友邀請!
                var body = lang.GetString(receiverUidUser.language, 7);
                await firebase.SendOneNotification(receiverUidUser.firebaseDeviceToken, string.Empty, string.Format(body, uidUser.name));
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        private async ETTask RunAsync(Player player, C2L_UpdateUserEquip message, Action <L2C_UpdateUserEquip> reply)
        {
            L2C_UpdateUserEquip response = new L2C_UpdateUserEquip();

            try
            {
                long uid = player.uid;
                if (uid <= 0)
                {
                    //未被Gate授權的帳戶
                    response.Error = ErrorCode.ERR_ConnectGateKeyError;
                }
                else
                {
                    User user = await UserDataHelper.FindOneUser(uid);

                    if (user == null)
                    {
                        response.Error = ErrorCode.ERR_AccountDoesntExist;
                    }
                    else
                    {
                        // 蒐集Log資訊(可一致性,但複雜)
                        var log = new BsonDocument();
                        if (user.playerCharSetting.CharacterId != message.CharSetting.CharacterId)
                        {
                            log["characterId"] = message.CharSetting.CharacterId;
                        }
                        if (user.playerCharSetting.BicycleId != message.CharSetting.BicycleId)
                        {
                            log["bicycleId"] = message.CharSetting.BicycleId;
                        }
                        if (user.playerCharSetting.BodyId != message.CharSetting.BodyId)
                        {
                            log["bodyId"] = message.CharSetting.BodyId;
                        }
                        if (user.playerCharSetting.DecorationId != message.CharSetting.DecorationId)
                        {
                            log["decorationId"] = message.CharSetting.DecorationId;
                        }
                        if (user.playerCharSetting.MedalId != message.CharSetting.MedalId)
                        {
                            log["medalId"] = message.CharSetting.MedalId;
                        }
                        user.playerCharSetting = message.CharSetting;
                        await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserCharacterSetting, log);

                        response.Error = ErrorCode.ERR_Success;
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        public async static ETTask LinkByFaceBook(Player player, LinkInfo info, L2C_Link response)
        {
            string fbToken      = info.Secret;
            bool   isValidToken = await FacebookHelper.ValidateFacebookToken(fbToken);

            if (!isValidToken)
            {
                response.Error = ErrorCode.ERR_LinkFailed;
                return;
            }
            ThirdPartyInfo fbInfo = await FacebookHelper.GetFacebookUserInfo(fbToken);

            if (fbInfo == null)
            {
                response.Error = ErrorCode.ERR_LinkFailed;
                return;
            }
            long           now            = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            ThirdPartyUser thirdPartyUser = await UserDataHelper.FindOneThirdPartyUser(fbInfo.id, UserDataHelper.tagFB);

            if (thirdPartyUser == null)
            {
                long uid  = player.uid;
                User user = await UserDataHelper.FindOneUser(uid);

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_LinkFailed;
                    return;
                }

                //綁定第三方-FB
                thirdPartyUser          = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId());
                thirdPartyUser.uid      = user.Id;
                thirdPartyUser.party    = UserDataHelper.tagFB;
                thirdPartyUser.userId   = fbInfo.id;
                thirdPartyUser.gender   = fbInfo.gender;
                thirdPartyUser.location = fbInfo.location;
                thirdPartyUser.email    = fbInfo.email;
                thirdPartyUser.name     = fbInfo.name;
                thirdPartyUser.birthday = fbInfo.birthday;
                thirdPartyUser.createAt = now;
                await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser);

                //取得新的第三方列表
                response.LinkTypes.Clear();
                response.LinkTypes.AddRange(await GetAllLinkType(user.Id));
            }
            else
            {
                response.Error = ErrorCode.ERR_LinkIsExist;
            }
        }
        private async ETTask RunAsync(Player player, C2L_TeamReservationCancel message, Action <L2C_TeamReservationCancel> reply)
        {
            L2C_TeamReservationCancel response = new L2C_TeamReservationCancel();

            try
            {
                User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                //判斷是否為發起人
                var reservationComponent = Game.Scene.GetComponent <ReservationComponent>();
                var reservation          = reservationComponent.GetByReservationId(message.ReservationId);
                if (reservation.allData.SenderUid != player.uid)
                {
                    response.Error = ErrorCode.ERR_ReservationIsNotLeader;
                    reply(response);
                    return;
                }

                if (reservation.room != null)
                {
                    if (reservation.room.State != RoomState.Ready && reservation.room.State != RoomState.Start)
                    {
                        response.Error = ErrorCode.ERR_ReservationRoomStateCanNotToRemove;
                        reply(response);
                        return;
                    }
                    else
                    {
                        var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>();
                        // 告知失去房間訊息
                        await lobbyComponent.BroadcastTeamLose(reservation.room.Id);
                    }
                }

                //刪除預約實體(DB會一起刪除)
                await reservationComponent.DestroyReservation(message.ReservationId);

                //回傳資料
                response.Error = ErrorCode.ERR_Success;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Esempio n. 10
0
        private async void CreateRoomAsync(Reservation self)
        {
            var roomInfo = new RoomInfo()
            {
                RoomId         = 0,
                Title          = self.allData.SenderName,
                RoadSettingId  = self.allData.RoadSettingId,
                MaxMemberCount = 8,
                NowMemberCount = 0,
            };

            var teamRoomData = new TeamRoomData()
            {
                LeaderUid        = -1,
                LeaderName       = self.allData.SenderName,
                StartUTCTimeTick = self.allData.StartUTCTimeTick,
                IsReservation    = true,
            };

            var reservationMembers = new RepeatedField <ReservationMemberData>();

            for (int i = 0; i < self.allData.MemberUid?.count; i++)
            {
                var  uid  = self.allData.MemberUid[i];
                User user = await UserDataHelper.FindOneUser(uid);

                if (user == null)
                {
                    Log.Error($"Reservation CreateRoomAsync Failed, Can't find user, uid:{uid}");
                    continue;
                }
                var reservationMemberData = new ReservationMemberData()
                {
                    MemberIndex = i,
                    Uid         = user.Id,
                    Name        = user.name,
                    Location    = user.location,
                };
                reservationMembers.Add(reservationMemberData);
            }

            var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>();
            // 隨機一個Map給要預約的房間
            var startConfig = NetworkHelper.GetRandomMap();

            self.room = await lobbyComponent.CreateTeamRoom(startConfig.AppId, roomInfo, teamRoomData);

            var reservationComponent = Game.Scene.GetComponent <ReservationComponent>();
            await reservationComponent.UpdateReservation(self);

            await lobbyComponent.SetReservationMember(self.room.Id, reservationMembers);
        }
        protected async ETTask RunAsync(Session session, C2G_TeamInviteRefuseAll message, Action <G2C_TeamInviteRefuseAll> reply)
        {
            G2C_TeamInviteRefuseAll response = new G2C_TeamInviteRefuseAll();

            try
            {
                //取得自身資料
                Player player = session.GetComponent <SessionPlayerComponent>().Player;
                User   user   = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                var inviteComponent = Game.Scene.GetComponent <InviteComponent>();
                var inviteList      = inviteComponent.GetByUid(player.uid);
                var proxy           = Game.Scene.GetComponent <CacheProxyComponent>();
                var playerSync      = proxy.GetMemorySyncSolver <Player>();

                for (int i = 0; i < inviteList.Count; i++)
                {
                    //告知對方拒絕邀請
                    Player senderTarget = playerSync.Get <Player>(inviteList[i].data.SenderUid);
                    if (senderTarget != null)
                    {
                        G2C_TeamInviteTargerRefuse g2c_TeamInviteTargerRefuse = new G2C_TeamInviteTargerRefuse();
                        g2c_TeamInviteTargerRefuse.RefuseUid = player.uid;
                        GateMessageHelper.BroadcastTarget(g2c_TeamInviteTargerRefuse, inviteList[i].data.SenderUid);
                    }
                }

                //刪除自身全部邀請
                await inviteComponent.DestroyByUid(player.uid);

                //回傳資料
                response.Error = ErrorCode.ERR_Success;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        public async static ETTask LinkByAppleId(Player player, LinkInfo info, L2C_Link response)
        {
            string         appleId   = CryptographyHelper.AESDecrypt(info.Secret);
            ThirdPartyInfo appleInfo = new ThirdPartyInfo
            {
                id = appleId,
            };
            long           now            = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            ThirdPartyUser thirdPartyUser = await UserDataHelper.FindOneThirdPartyUser(appleInfo.id, UserDataHelper.tagAppleId);

            if (thirdPartyUser == null)
            {
                long uid  = player.uid;
                User user = await UserDataHelper.FindOneUser(uid);

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_LinkFailed;
                    return;
                }

                // 綁定第三方-Apple
                thirdPartyUser          = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId());
                thirdPartyUser.uid      = user.Id;
                thirdPartyUser.party    = UserDataHelper.tagAppleId;
                thirdPartyUser.userId   = appleInfo.id;
                thirdPartyUser.gender   = appleInfo.gender;
                thirdPartyUser.location = appleInfo.location;
                thirdPartyUser.email    = appleInfo.email;
                thirdPartyUser.name     = appleInfo.name;
                thirdPartyUser.birthday = appleInfo.birthday;
                thirdPartyUser.createAt = now;
                await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser);

                // 取得新的第三方列表
                response.LinkTypes.Clear();
                response.LinkTypes.AddRange(await GetAllLinkType(user.Id));
            }
            else
            {
                response.Error = ErrorCode.ERR_LinkIsExist;
            }
        }
Esempio n. 13
0
        public async override void Run(long messageId)
        {
            StartConfig startConfig = Game.Scene.GetComponent <StartConfigComponent>().StartConfig;

            if (!appTypes.Contains(startConfig.AppType))
            {
                Log.Warning($"not supported server type on event: {typeof(Event_MessageTip).Name}!");
                return;
            }

            var proxy      = Game.Scene.GetComponent <CacheProxyComponent>();
            var playerSync = proxy.GetMemorySyncSolver <Player>();

            var messageTipSetting = Game.Scene.GetComponent <ConfigComponent>().Get(typeof(MessageTipSetting), messageId) as MessageTipSetting;

            if (messageTipSetting != null)
            {
                foreach (var playerData in playerSync.Data)
                {
                    var uid  = playerData.Key;
                    var user = await UserDataHelper.FindOneUser(uid);

                    var tipContent = string.Empty;
                    switch (user.language)
                    {
                    //SystemLanguage.English
                    default:
                    case 10:
                        tipContent = messageTipSetting.en_context;
                        break;

                    //SystemLanguage.ChineseTraditional
                    case 41:
                        tipContent = messageTipSetting.zh_tw_context;
                        break;
                    }
                    GateMessageHelper.BroadcastTarget(new G2C_MessageTip()
                    {
                        TipContent = tipContent
                    }, uid);
                }
            }
        }
        private async ETTask RunAsync(Player player, C2L_UpdateUserLanguage message, Action <L2C_UpdateUserLanguage> reply)
        {
            L2C_UpdateUserLanguage response = new L2C_UpdateUserLanguage();

            try
            {
                long uid = player.uid;
                if (uid <= 0)
                {
                    //未被Gate授權的帳戶
                    response.Error = ErrorCode.ERR_ConnectGateKeyError;
                }
                else
                {
                    User user = await UserDataHelper.FindOneUser(uid);

                    if (user == null)
                    {
                        response.Error = ErrorCode.ERR_AccountDoesntExist;
                    }
                    else
                    {
                        var log = new BsonDocument();
                        if (user.language != message.Language)
                        {
                            log["language"] = message.Language;
                            user.language   = message.Language;
                        }
                        await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserLanguage, log);

                        response.Error = ErrorCode.ERR_Success;
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        public async static ETTask AuthenticationByToken(Session session, AuthenticationInfo info, R2C_Authentication response)
        {
            SignInCryptographyHelper.Token tok = null;
            try
            {
                tok = SignInCryptographyHelper.DecodeToken(info.Secret);
                if (tok == null)
                {
                    response.Error = ErrorCode.ERR_InvalidToken;
                    return;
                }
            }
            catch (Exception e)
            {
                response.Error = ErrorCode.ERR_InvalidToken;
                return;
            }

            User user = await UserDataHelper.FindOneUser(tok.uid);

            if (user != null)
            {
                if (user.salt != tok.salt || user.lastCreateTokenAt != tok.lastCreateTokenAt)
                {
                    response.Error = ErrorCode.ERR_InvalidToken;
                }
                else
                {
                    await SignInByUid(session, user, response, info.FirebaseDeviceToken, false, UserDataHelper.tagToken);
                }
            }
            else
            {
                response.Error = ErrorCode.ERR_AccountDoesntExist;
            }
        }
Esempio n. 16
0
        protected override async ETTask Run(MapUnit mapUnit, C2M_TeamInvite message, Action <M2C_TeamInvite> reply)
        {
            await ETTask.CompletedTask;

            M2C_TeamInvite response = new M2C_TeamInvite();

            try
            {
                if (mapUnit.Room == null)
                {
                    response.Error = ErrorCode.ERR_RoomIdNotFound;
                    reply(response);
                    return;
                }

                if (mapUnit.Room.Type != RoomType.Team)
                {
                    response.Error = ErrorCode.ERR_RoonTypeError;
                    reply(response);
                    return;
                }

                if (mapUnit.Room.State != RoomState.Start)
                {
                    response.Error = ErrorCode.ERR_RoomTeamStateCanNotInvite;
                    reply(response);
                    return;
                }

                User user = await UserDataHelper.FindOneUser(mapUnit.Uid);

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                // 建立邀請
                InviteData inviteData = new InviteData()
                {
                    SenderName    = user.name,
                    SenderUid     = mapUnit.Uid,
                    ReceiverUid   = message.ReceiverUid,
                    TeamRoomId    = mapUnit.Room.Id,
                    RoadSettingId = mapUnit.Room.info.RoadSettingId
                };

                var player       = CacheExHelper.GetFromCache <Player>(mapUnit.Uid);
                var lobbySession = SessionHelper.GetLobbySession(player.lobbyAppId);
                L2M_CreateInvite l2M_CreateInvite = (L2M_CreateInvite)await lobbySession.Call(new M2L_CreateInvite
                {
                    InviteInfo = inviteData,
                });

                if (l2M_CreateInvite.Error != ErrorCode.ERR_Success)
                {
                    response.Error = ErrorCode.ERR_InviteIdNotFind;
                    reply(response);
                    return;
                }

                Invite inviteEntity = BsonSerializer.Deserialize <Invite>(l2M_CreateInvite.Json);
                CacheExHelper.WriteInCache(inviteEntity, out inviteEntity);

                // 告知對方
                Player inviteTarget = CacheExHelper.GetFromCache <Player>(message.ReceiverUid);
                if (inviteTarget != null)
                {
                    //在線上 廣播給指定玩家邀請訊息
                    G2C_TeamInviteReceiver g2c_TeamInviteReceiver = new G2C_TeamInviteReceiver();
                    g2c_TeamInviteReceiver.InviteId   = inviteEntity.Id;
                    g2c_TeamInviteReceiver.SenderName = inviteEntity.data.SenderName;
                    GateMessageHelper.BroadcastTarget(g2c_TeamInviteReceiver, message.ReceiverUid);
                }
                // 推播
                User u = await UserDataHelper.FindOneUser(message.ReceiverUid);

                var firebase = Game.Scene.GetComponent <FirebaseComponent>();
                var lang     = Game.Scene.GetComponent <LanguageComponent>();
                // 多國2-'{0}'邀請你一起組隊!
                var body = lang.GetString(u.language, 2L);
                await firebase.SendOneNotification(u.firebaseDeviceToken, string.Empty, string.Format(body, user.name));

                response.Error = ErrorCode.ERR_Success;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        protected async ETTask RunAsync(Session session, C2G_TeamInviteAccept message, Action <G2C_TeamInviteAccept> reply)
        {
            G2C_TeamInviteAccept response = new G2C_TeamInviteAccept();

            try
            {
                //取得自身資料
                Player player = session.GetComponent <SessionPlayerComponent>().Player;
                User   user   = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault(0));

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                //判斷邀請是否合法
                var inviteComponent = Game.Scene.GetComponent <InviteComponent>();
                var invite          = inviteComponent.GetByInviteId(message.InviteId);

                if (invite == null)
                {
                    response.Error = ErrorCode.ERR_InviteIdNotFind;
                    reply(response);
                    return;
                }

                if (invite.data.ReceiverUid != player?.uid)
                {
                    response.Error = ErrorCode.ERR_InviteNotSelf;
                    reply(response);
                    return;
                }

                //刪除該邀請
                await inviteComponent.DestroyByInviteId(message.InviteId);

                //判斷房間是否合法
                var room = Game.Scene.GetComponent <RoomComponent>().Get(invite.data.TeamRoomId);
                if (room == null)
                {
                    response.Error = ErrorCode.ERR_RoomIdNotFound;
                    reply(response);
                    return;
                }

                if (room.Type != RoomType.Team)
                {
                    response.Error = ErrorCode.ERR_RoonTypeError;
                    reply(response);
                    return;
                }

                if (room.State != RoomState.Start)
                {
                    response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter;
                    reply(response);
                    return;
                }

                var roomTeamComponent = room.GetComponent <RoomTeamComponent>();
                if (roomTeamComponent == null)
                {
                    response.Error = ErrorCode.ERR_RoomTeamComponentNull;
                    reply(response);
                    return;
                }

                if (room.info.NowMemberCount >= room.info.MaxMemberCount)
                {
                    response.Error = ErrorCode.ERR_RoomTeamMemberIsFull;
                    reply(response);
                    return;
                }

                // 連接到Map伺服器,並創建Unit實體
                IPEndPoint mapAddress = StartConfigComponent.Instance.Get(player.mapAppId).GetComponent <InnerConfig>().IPEndPoint;
                Session    mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress);

                //建立Map實體並進入房間
                G2M_MapUnitCreate g2M_MapUnitCreate = new G2M_MapUnitCreate();
                g2M_MapUnitCreate.Uid           = player.uid;
                g2M_MapUnitCreate.GateSessionId = session.InstanceId;
                g2M_MapUnitCreate.MapUnitInfo   = new MapUnitInfo()
                {
                    Name              = user.name,
                    Location          = user.location,
                    RoomId            = room.Id,
                    DistanceTravelled = 0,
                    CharSetting       = user.playerCharSetting,
                    //PathId 一般組隊入場再決定
                };

                //建立自身MapUnit
                M2G_MapUnitCreate createUnit = (M2G_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate);

                g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId;
                player.EnterRoom(createUnit.MapUnitId, room);

                //對全體廣播自己剛建立的MapUnitInfo(不包含自己)
                TeamMemberData       selfMemberData       = roomTeamComponent.GetMember(player.uid);
                M2C_TeamModifyMember m2c_TeamModifyMember = new M2C_TeamModifyMember();
                m2c_TeamModifyMember.Uid        = player.uid;
                m2c_TeamModifyMember.MemberData = selfMemberData;
                MapMessageHelper.BroadcastRoom(room.Id, m2c_TeamModifyMember, player.uid);

                //回傳資料
                response.Info = room.info;
                response.Data = roomTeamComponent.Data;
                for (int i = 0; i < roomTeamComponent.MemberDatas.Length; i++)
                {
                    if (roomTeamComponent.MemberDatas[i] != null)
                    {
                        response.MemberDatas.Add(roomTeamComponent.MemberDatas[i]);
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        /// <summary>
        /// 使用AppleID登入
        /// </summary>
        /// <param name="session"></param>
        /// <param name="info"></param>
        /// <param name="response"></param>
        /// <returns></returns>
        public async static ETTask AuthenticationByAppleId(Session session, AuthenticationInfo info, R2C_Authentication response)
        {
            string         appleId   = CryptographyHelper.AESDecrypt(info.Secret);
            ThirdPartyInfo appleInfo = new ThirdPartyInfo
            {
                id = appleId,
            };
            long           now            = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            ThirdPartyUser thirdPartyUser = await UserDataHelper.FindOneThirdPartyUser(appleInfo.id, UserDataHelper.tagAppleId);

            User user = null;

            if (thirdPartyUser == null)
            {
                // 用AppleId註冊帳號
                user = ComponentFactory.CreateWithId <User>(IdGenerater.GenerateId());
                string salt         = CryptographyHelper.GenerateRandomId();
                string password     = CryptographyHelper.GenerateRandomId(16);
                string hashPassword = CryptographyHelper.MD5Encoding(password, salt);
                user.salt                          = salt;
                user.hashPassword                  = hashPassword;
                user.email                         = appleInfo.email;
                user.name                          = user.Id.ToString();
                user.gender                        = appleInfo.genderCode;
                user.location                      = appleInfo.locationCode;
                user.birthday                      = appleInfo.birthdayCode;
                user.createAt                      = now;
                user.playerCharSetting             = new PlayerCharSetting();
                user.playerCharSetting.CharacterId = 1L;
                user.playerRideTotalInfo           = new RideTotalInfo();
                user.language                      = info.Language;
                user.identity                      = (int)User.Identity.Player;
                user.userBagCapacity               = EquipmentDataHelper.GetDefaultUserBag();
                await UserDataHelper.SinUserUp(user);

                // 註冊第三方-AppleId
                thirdPartyUser          = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId());
                thirdPartyUser.uid      = user.Id;
                thirdPartyUser.party    = UserDataHelper.tagAppleId;
                thirdPartyUser.userId   = appleInfo.id;
                thirdPartyUser.gender   = appleInfo.gender;
                thirdPartyUser.location = appleInfo.location;
                thirdPartyUser.email    = appleInfo.email;
                thirdPartyUser.name     = appleInfo.name;
                thirdPartyUser.birthday = appleInfo.birthday;
                thirdPartyUser.createAt = now;
                await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser);

                // 註冊第三方-Guest
                thirdPartyUser          = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId());
                thirdPartyUser.uid      = user.Id;
                thirdPartyUser.party    = UserDataHelper.tagGuest;
                thirdPartyUser.userId   = info.DeviceId;
                thirdPartyUser.name     = "";
                thirdPartyUser.gender   = "";
                thirdPartyUser.location = "";
                thirdPartyUser.email    = "";
                thirdPartyUser.birthday = "";
                thirdPartyUser.createAt = now;
                await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser);
            }
            else
            {
                user = await UserDataHelper.FindOneUser(thirdPartyUser.uid);
            }

            await SignInByUid(session, user, response, info.FirebaseDeviceToken, true, UserDataHelper.tagAppleId);
        }
        public async static ETTask AuthenticationByFaceBook(Session session, AuthenticationInfo info, R2C_Authentication response)
        {
            string fbToken      = info.Secret;
            bool   isValidToken = await FacebookHelper.ValidateFacebookToken(fbToken);

            if (!isValidToken)
            {
                response.Error = ErrorCode.ERR_FBSignInFailed;
                return;
            }
            ThirdPartyInfo fbInfo = await FacebookHelper.GetFacebookUserInfo(fbToken);

            if (fbInfo == null)
            {
                response.Error = ErrorCode.ERR_FBSignInFailed;
                return;
            }
            long           now            = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            ThirdPartyUser thirdPartyUser = await UserDataHelper.FindOneThirdPartyUser(fbInfo.id, UserDataHelper.tagFB);

            User user = null;

            if (thirdPartyUser == null)
            {
                // 用FB註冊帳號
                user = ComponentFactory.CreateWithId <User>(IdGenerater.GenerateId());
                string salt         = CryptographyHelper.GenerateRandomId();
                string password     = CryptographyHelper.GenerateRandomId(16);
                string hashPassword = CryptographyHelper.MD5Encoding(password, salt);
                user.salt                          = salt;
                user.hashPassword                  = hashPassword;
                user.email                         = fbInfo.email;
                user.name                          = fbInfo.name;
                user.gender                        = fbInfo.genderCode;
                user.location                      = fbInfo.locationCode;
                user.birthday                      = fbInfo.birthdayCode;
                user.createAt                      = now;
                user.playerCharSetting             = new PlayerCharSetting();
                user.playerCharSetting.CharacterId = 1L;
                user.playerRideTotalInfo           = new RideTotalInfo();
                user.language                      = info.Language;
                user.identity                      = (int)User.Identity.Player;
                user.userBagCapacity               = EquipmentDataHelper.GetDefaultUserBag();
                await UserDataHelper.SinUserUp(user);

                //註冊第三方-FB
                thirdPartyUser          = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId());
                thirdPartyUser.uid      = user.Id;
                thirdPartyUser.party    = UserDataHelper.tagFB;
                thirdPartyUser.userId   = fbInfo.id;
                thirdPartyUser.gender   = fbInfo.gender;
                thirdPartyUser.location = fbInfo.location;
                thirdPartyUser.email    = fbInfo.email;
                thirdPartyUser.name     = fbInfo.name;
                thirdPartyUser.birthday = fbInfo.birthday;
                thirdPartyUser.createAt = now;
                await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser);

                //註冊第三方-Guest
                thirdPartyUser          = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId());
                thirdPartyUser.uid      = user.Id;
                thirdPartyUser.party    = UserDataHelper.tagGuest;
                thirdPartyUser.userId   = info.DeviceId;
                thirdPartyUser.name     = "";
                thirdPartyUser.gender   = "";
                thirdPartyUser.location = "";
                thirdPartyUser.email    = "";
                thirdPartyUser.birthday = "";
                thirdPartyUser.createAt = now;
                await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser);
            }
            else
            {
                user = await UserDataHelper.FindOneUser(thirdPartyUser.uid);
            }

            await SignInByUid(session, user, response, info.FirebaseDeviceToken, true, UserDataHelper.tagFB);
        }
        public async static ETTask AuthenticationByGuest(Session session, AuthenticationInfo info, R2C_Authentication response)
        {
            string deviceUniqueIdentifier = string.Empty;

            try
            {
                deviceUniqueIdentifier = CryptographyHelper.AESDecrypt(info.Secret);
            }
            catch (Exception)
            {
                response.Error = ErrorCode.ERR_InvalidDeviceUniqueIdentifier;
                return;
            }

            if (string.IsNullOrEmpty(deviceUniqueIdentifier))
            {
                response.Error = ErrorCode.ERR_DeviceUniqueIdentifierIsNull;
                return;
            }

            long           now            = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            ThirdPartyUser thirdPartyUser = await UserDataHelper.FindOneThirdPartyUser(deviceUniqueIdentifier, UserDataHelper.tagGuest);

            User user = null;

            if (thirdPartyUser == null)
            {
                user = ComponentFactory.CreateWithId <User>(IdGenerater.GenerateId());
                string salt         = CryptographyHelper.GenerateRandomId();
                string password     = CryptographyHelper.GenerateRandomId(16);
                string hashPassword = CryptographyHelper.MD5Encoding(password, salt);
                user.salt                          = salt;
                user.hashPassword                  = hashPassword;
                user.createAt                      = now;
                user.name                          = $"{user.Id}";
                user.email                         = "";
                user.playerCharSetting             = new PlayerCharSetting();
                user.playerCharSetting.CharacterId = 1L;
                user.playerRideTotalInfo           = new RideTotalInfo();
                user.language                      = info.Language;
                user.identity                      = (int)User.Identity.Player;
                user.userBagCapacity               = EquipmentDataHelper.GetDefaultUserBag();
                await UserDataHelper.SinUserUp(user);

                //註冊第三方-Guest
                thirdPartyUser          = ComponentFactory.CreateWithId <ThirdPartyUser>(IdGenerater.GenerateId());
                thirdPartyUser.uid      = user.Id;
                thirdPartyUser.party    = UserDataHelper.tagGuest;
                thirdPartyUser.userId   = deviceUniqueIdentifier;
                thirdPartyUser.name     = "";
                thirdPartyUser.gender   = "";
                thirdPartyUser.location = "";
                thirdPartyUser.email    = "";
                thirdPartyUser.birthday = "";
                thirdPartyUser.createAt = now;
                await UserDataHelper.UpsertThirdPartyUser(thirdPartyUser);
            }
            else
            {
                user = await UserDataHelper.FindOneUser(thirdPartyUser.uid);
            }

            await SignInByUid(session, user, response, info.FirebaseDeviceToken, true, UserDataHelper.tagGuest);
        }
Esempio n. 21
0
        private async ETTask RunAsync(Player player, C2L_UpdateUserProfile message, Action <L2C_UpdateUserProfile> reply)
        {
            L2C_UpdateUserProfile response = new L2C_UpdateUserProfile();

            try
            {
                long uid = player.uid;
                if (uid <= 0)
                {
                    //未被Gate授權的帳戶
                    response.Error = ErrorCode.ERR_ConnectGateKeyError;
                }
                else
                {
                    User user = await UserDataHelper.FindOneUser(uid);

                    if (user == null)
                    {
                        response.Error = ErrorCode.ERR_AccountDoesntExist;
                    }
                    else
                    {
                        var log = new BsonDocument();
                        if (user.name != message.Name)
                        {
                            log["name"] = message.Name;
                            user.name   = message.Name;
                        }
                        if (user.gender != message.Sex)
                        {
                            log["gender"] = message.Sex;
                            user.gender   = message.Sex;
                        }
                        if (user.location != message.Location)
                        {
                            log["location"] = message.Location;
                            user.location   = message.Location;
                        }
                        if (user.height != message.Height)
                        {
                            log["height"] = message.Height;
                            user.height   = message.Height;
                        }
                        if (user.weight != message.Weight)
                        {
                            log["weight"] = message.Weight;
                            user.weight   = message.Weight;
                        }
                        if (user.birthday != message.Birthday)
                        {
                            log["birthday"] = message.Birthday;
                            user.birthday   = message.Birthday;
                        }
                        await UserDataHelper.UpsertUser(user, DBLog.LogType.UpdateUserProfiler, log);

                        response.Error = ErrorCode.ERR_Success;
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        private async ETVoid RunAsync(Session session, C2G_TeamReservationCreate message, Action <G2C_TeamReservationCreate> reply)
        {
            G2C_TeamReservationCreate response = new G2C_TeamReservationCreate();

            try
            {
                //取得自身資料
                Player player = session.GetComponent <SessionPlayerComponent>().Player;
                User   user   = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                var reservationComponent = Game.Scene.GetComponent <ReservationComponent>();
                var reservationList      = reservationComponent.GetByUid(player.uid);
                if (reservationList?.OwnCount >= ReservationDataHelper.ReservationMaxCount)
                {
                    response.Error = ErrorCode.ERR_ReservationIsFull;
                    reply(response);
                    return;
                }

                var reservationData = new ReservationAllData()
                {
                    ReservationId    = IdGenerater.GenerateId(),
                    SenderName       = user.name,
                    SenderUid        = player.uid,
                    RoadSettingId    = message.RoadSettingId,
                    AwakeUTCTimeTick = message.StartUTCTimeTick - ReservationDataHelper.AwakeBeforeTimeTick,
                    StartUTCTimeTick = message.StartUTCTimeTick,
                };

                //邀請對象加入自己
                reservationData.MemberUid.Add(player.uid);

                //邀請對象加入其他成員
                if (message.MemberUid?.Count > 0)
                {
                    reservationData.MemberUid.AddRange(message.MemberUid);
                }

                //寫入DB
                await ReservationDataHelper.Add(reservationData.ReservationId, reservationData);

                //建立預約資料實體
                var newReservation = await reservationComponent.CreateReservation(reservationData);

                var proxy      = Game.Scene.GetComponent <CacheProxyComponent>();
                var playerSync = proxy.GetMemorySyncSolver <Player>();

                //告知成員
                for (int i = 0; i < reservationData.MemberUid?.Count; i++)
                {
                    //告知對方
                    long   targetMemberUid   = reservationData.MemberUid[i];
                    Player reservationTarget = playerSync.Get <Player>(targetMemberUid);
                    if (reservationTarget != null)
                    {
                        //在線上 廣播給指定玩家邀請訊息
                        G2C_TeamReservationAdd g2c_TeamReservationAdd = new G2C_TeamReservationAdd();
                        g2c_TeamReservationAdd.ReservationData = newReservation.data;
                        GateMessageHelper.BroadcastTarget(g2c_TeamReservationAdd, new[] { targetMemberUid });
                    }
                    // 推播
                    User u = await UserDataHelper.FindOneUser(targetMemberUid);

                    var firebase = Game.Scene.GetComponent <FirebaseComponent>();
                    var lang     = Game.Scene.GetComponent <LanguageComponent>();
                    //多國3-'{0}'預約了比賽並邀請你參加!預約時間為{1}。
                    var str = lang.GetString(u.language, 3L);
                    //多國4-時。
                    var hourStr = lang.GetString(u.language, 4L);
                    //多國5-分。
                    var minuteStr = lang.GetString(u.language, 5L);
                    //多國6-秒。
                    var           secondStr = lang.GetString(u.language, 6L);
                    DateTime      date      = new DateTime(reservationData.StartUTCTimeTick);
                    TimeSpan      remainder = date - DateTime.UtcNow;
                    string        dateStr   = string.Empty;
                    List <string> list      = new List <string>();
                    if (remainder.Hours > 0)
                    {
                        list.Add($"{remainder.Hours}{hourStr}");
                    }
                    if (remainder.Minutes > 0)
                    {
                        list.Add($"{remainder.Minutes}{minuteStr}");
                    }
                    //if (remainder.Seconds > 0)
                    //{
                    //    list.Add($"{remainder.Seconds}{secondStr}");
                    //}
                    dateStr += string.Join(" ", list);
                    await firebase.SendOneNotification(u.firebaseDeviceToken, string.Empty,
                                                       string.Format(str, user.name, dateStr));
                }

                //回傳資料
                response.Error = ErrorCode.ERR_Success;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Esempio n. 23
0
        private async ETVoid RunAsync(Player player, C2L_Announcement message, Action <L2C_Announcement> reply)
        {
            L2C_Announcement response = new L2C_Announcement();

            try
            {
                long uid = player.uid;
                if (uid <= 0)
                {
                    //未被Gate授權的帳戶
                    response.Error = ErrorCode.ERR_ConnectGateKeyError;
                }
                else
                {
                    User user = await UserDataHelper.FindOneUser(uid);

                    if (user == null)
                    {
                        response.Error = ErrorCode.ERR_AccountDoesntExist;
                    }
                    else
                    {
                        ConfigComponent configComponent     = Game.Scene.GetComponent <ConfigComponent>();
                        IConfig[]       announcementSetting = configComponent.GetAll(typeof(AnnouncementSetting));
                        for (int i = 0; i < announcementSetting.Length; i++)
                        {
                            AnnouncementSetting setting = announcementSetting[i] as AnnouncementSetting;
                            if (setting == null)
                            {
                                continue;
                            }

                            var announcementInfo = new AnnouncementInfo()
                            {
                                Timestamp = setting.timestamp
                            };

                            switch (user.language)
                            {
                            case 41:    // zh_tw = 41;
                                announcementInfo.Title   = setting.zh_tw_title;
                                announcementInfo.Context = setting.zh_tw_context;
                                break;

                            case 40:    // zh_cn = 40;
                                announcementInfo.Title   = setting.zh_cn_title;
                                announcementInfo.Context = setting.zh_cn_context;
                                break;

                            case 10:    // en = 10;
                                announcementInfo.Title   = setting.en_title;
                                announcementInfo.Context = setting.en_context;
                                break;
                            }
                            response.AnnouncementInfos.Add(announcementInfo);
                        }
                        response.Error = ErrorCode.ERR_Success;
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        protected async ETTask RunAsync(Player player, C2L_RoamingEnter message, Action <L2C_RoamingEnter> reply)
        {
            L2C_RoamingEnter response = new L2C_RoamingEnter();

            try
            {
                var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>();

                // 判斷是否還在舊的房間
                if (player.roomID != 0L)
                {
                    // 如果有就強制退房
                    await lobbyComponent.LeaveRoom(player.roomID, player.uid);
                }

                // 判斷房間是否合法
                Room room = lobbyComponent.GetRoom(message.RoamingRoomId);
                if (room == null)
                {
                    response.Error = ErrorCode.ERR_RoomIdNotFound;
                    reply(response);
                    return;
                }

                // 0518 Saitou add member Limit
                if (room.info.NowMemberCount >= room.info.MaxMemberCount)
                {
                    response.Error = ErrorCode.ERR_RoomRoamingMemberIsFull;
                    reply(response);
                    return;
                }

                // 回傳房間設定
                response.RoadSettingId = room.info.RoadSettingId;

                // 取得自身資料
                User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                // 連接到Map伺服器,並創建Unit實體
                Session mapSession = SessionHelper.GetMapSession(IdGenerater.GetAppId(room.Id));

                // 建立Map實體並進入房間
                L2M_MapUnitCreate g2M_MapUnitCreate = new L2M_MapUnitCreate();
                g2M_MapUnitCreate.Uid           = player.uid;
                g2M_MapUnitCreate.GateSessionId = player.gateSessionActorId;
                g2M_MapUnitCreate.MapUnitInfo   = new MapUnitInfo()
                {
                    Name              = user.name,
                    Location          = user.location,
                    RoomId            = message.RoamingRoomId,
                    DistanceTravelled = 0,
                    SpeedMS           = 0,
                    CharSetting       = user.playerCharSetting,
                    PathId            = room.info.NowMemberCount % 4,
                    StartUTCTick      = DateTime.UtcNow.Ticks,
                    Uid = player.uid,
                };

                // 建立自身MapUnit
                M2L_MapUnitCreate createUnit = (M2L_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate);

                g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId;

                // 進入房間
                player.EnterRoom(createUnit.MapUnitId, room);
                player.StartRoom();

                // 更新MapUnitId
                await Game.Scene.GetComponent <PlayerComponent>().Update(player);

                // TODO:紀錄
                // 回傳自己MapUnitInfo
                response.SelfInfo    = g2M_MapUnitCreate.MapUnitInfo;
                response.GlobalInfos = await lobbyComponent.GetAllMapUnitGlobalInfoOnRoom(room.Id);

                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Esempio n. 25
0
        private async ETVoid RunAsync(Session session, C2G_TeamReservationJoin message, Action <G2C_TeamReservationJoin> reply)
        {
            G2C_TeamReservationJoin response = new G2C_TeamReservationJoin();

            try
            {
                //取得自身資料
                Player player = session.GetComponent <SessionPlayerComponent>().Player;
                User   user   = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                //取得預約資料
                var reservationComponent = Game.Scene.GetComponent <ReservationComponent>();
                var reservation          = reservationComponent.GetByReservationId(message.ReservationId);

                //判斷是否有該預約
                if (reservation == null)
                {
                    response.Error = ErrorCode.ERR_ReservationIdNotFind;
                    reply(response);
                    return;
                }

                //判斷是否為被邀請者
                if (!reservation.allData.MemberUid.Contains(player.uid))
                {
                    response.Error = ErrorCode.ERR_ReservationNotTheOwner;
                    reply(response);
                    return;
                }

                //判斷是否有該房間
                if (reservation.room == null)
                {
                    response.Error = ErrorCode.ERR_ReservationRoomNotFind;
                    reply(response);
                    return;
                }

                //判斷該房間是否可以進入
                if (reservation.room.State != RoomState.Start)
                {
                    response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter;
                    reply(response);
                    return;
                }

                //判斷是否人滿
                if (reservation.room.info.NowMemberCount >= reservation.room.info.MaxMemberCount)
                {
                    response.Error = ErrorCode.ERR_RoomTeamMemberIsFull;
                    reply(response);
                    return;
                }

                //判斷房間資料是否正確
                var roomTeamComponent = reservation.room.GetComponent <RoomTeamComponent>();
                if (roomTeamComponent == null)
                {
                    response.Error = ErrorCode.ERR_RoomTeamComponentNull;
                    reply(response);
                    return;
                }

                // 連接到Map伺服器,並創建Unit實體
                IPEndPoint mapAddress = StartConfigComponent.Instance.Get(player.mapAppId).GetComponent <InnerConfig>().IPEndPoint;
                Session    mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress);

                //建立Map實體並進入房間
                G2M_MapUnitCreate g2M_MapUnitCreate = new G2M_MapUnitCreate();
                g2M_MapUnitCreate.Uid           = player.uid;
                g2M_MapUnitCreate.GateSessionId = session.InstanceId;
                g2M_MapUnitCreate.MapUnitInfo   = new MapUnitInfo()
                {
                    Name              = user.name,
                    Location          = user.location,
                    RoomId            = reservation.room.Id,
                    DistanceTravelled = 0,
                    CharSetting       = user.playerCharSetting,
                    //PathId 一般組隊入場再決定
                };

                //建立自身MapUnit
                M2G_MapUnitCreate createUnit = (M2G_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate);

                g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId;
                player.EnterRoom(createUnit.MapUnitId, reservation.room);

                //對全體廣播自己剛建立的MapUnitInfo(不包含自己)
                TeamMemberData       selfMemberData       = roomTeamComponent.GetMember(player.uid);
                M2C_TeamModifyMember m2c_TeamModifyMember = new M2C_TeamModifyMember();
                m2c_TeamModifyMember.Uid        = player.uid;
                m2c_TeamModifyMember.MemberData = selfMemberData;
                MapMessageHelper.BroadcastRoom(reservation.room.Id, m2c_TeamModifyMember, player.uid);

                //回傳資料
                response.Error = ErrorCode.ERR_Success;
                response.Info  = reservation.room.info;
                response.Data  = roomTeamComponent.Data;
                for (int i = 0; i < roomTeamComponent.MemberDatas.Length; i++)
                {
                    if (roomTeamComponent.MemberDatas[i] != null)
                    {
                        response.MemberDatas.Add(roomTeamComponent.MemberDatas[i]);
                    }
                }
                for (int i = 0; i < roomTeamComponent.ReservationMembers.Count; i++)
                {
                    if (roomTeamComponent.ReservationMembers[i] != null)
                    {
                        response.ReservationMemberDatas.Add(roomTeamComponent.ReservationMembers[i]);
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        private async ETTask RunAsync(Player player, C2L_TeamReservationJoin message, Action <L2C_TeamReservationJoin> reply)
        {
            L2C_TeamReservationJoin response = new L2C_TeamReservationJoin();

            try
            {
                //取得自身資料
                User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                //取得預約資料
                var reservationComponent = Game.Scene.GetComponent <ReservationComponent>();
                var reservation          = reservationComponent.GetByReservationId(message.ReservationId);

                //判斷是否有該預約
                if (reservation == null)
                {
                    response.Error = ErrorCode.ERR_ReservationIdNotFind;
                    reply(response);
                    return;
                }

                //判斷是否為被邀請者
                if (!reservation.allData.MemberUid.Contains(player.uid))
                {
                    response.Error = ErrorCode.ERR_ReservationNotTheOwner;
                    reply(response);
                    return;
                }

                //判斷是否有該房間
                if (reservation.room == null)
                {
                    response.Error = ErrorCode.ERR_ReservationRoomNotFind;
                    reply(response);
                    return;
                }

                //判斷該房間是否可以進入
                if (reservation.room.State != RoomState.Start)
                {
                    response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter;
                    reply(response);
                    return;
                }

                //判斷是否人滿
                if (reservation.room.info.NowMemberCount >= reservation.room.info.MaxMemberCount)
                {
                    response.Error = ErrorCode.ERR_RoomTeamMemberIsFull;
                    reply(response);
                    return;
                }

                // 連接到Map伺服器,並創建Unit實體
                Session mapSession = SessionHelper.GetMapSession(IdGenerater.GetAppId(reservation.room.Id));

                //建立Map實體並進入房間
                L2M_MapUnitCreate g2M_MapUnitCreate = new L2M_MapUnitCreate();
                g2M_MapUnitCreate.Uid           = player.uid;
                g2M_MapUnitCreate.GateSessionId = player.gateSessionActorId;
                g2M_MapUnitCreate.MapUnitInfo   = new MapUnitInfo()
                {
                    Name              = user.name,
                    Location          = user.location,
                    RoomId            = reservation.room.Id,
                    DistanceTravelled = 0,
                    CharSetting       = user.playerCharSetting,
                    //PathId 一般組隊入場再決定
                };

                //建立自身MapUnit
                M2L_MapUnitCreate createUnit = (M2L_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate);

                g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId;
                player.EnterRoom(createUnit.MapUnitId, reservation.room);
                // 更新MapUnitId
                await Game.Scene.GetComponent <PlayerComponent>().Update(player);

                var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>();
                //對全體廣播自己剛建立的MapUnitInfo(不包含自己)
                await lobbyComponent.BroadcastTeamModifyMember(player.uid, reservation.room.Id);

                //回傳資料
                var result = await lobbyComponent.GetTeamInfo(reservation.room.Id);

                response.Error = ErrorCode.ERR_Success;
                response.Info  = reservation.room.info;
                response.Data  = result.Item1;
                for (int i = 0; i < result.Item2.Count; i++)
                {
                    if (result.Item2[i] != null)
                    {
                        response.MemberDatas.Add(result.Item2[i]);
                    }
                }
                for (int i = 0; i < result.Item3.Count; i++)
                {
                    if (result.Item3[i] != null)
                    {
                        response.ReservationMemberDatas.Add(result.Item3[i]);
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        private async ETTask RunAsync(Session session, C2G_TeamReservationCancel message, Action <G2C_TeamReservationCancel> reply)
        {
            G2C_TeamReservationCancel response = new G2C_TeamReservationCancel();

            try
            {
                //取得自身資料
                Player player = session.GetComponent <SessionPlayerComponent>().Player;
                User   user   = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                //判斷是否為發起人
                var reservationComponent = Game.Scene.GetComponent <ReservationComponent>();
                var reservation          = reservationComponent.GetByReservationId(message.ReservationId);
                if (reservation.allData.SenderUid != player.uid)
                {
                    response.Error = ErrorCode.ERR_ReservationIsNotLeader;
                    reply(response);
                    return;
                }

                if (reservation.room != null)
                {
                    if (reservation.room.State != RoomState.Ready && reservation.room.State != RoomState.Start)
                    {
                        response.Error = ErrorCode.ERR_ReservationRoomStateCanNotToRemove;
                        reply(response);
                        return;
                    }
                    else
                    {
                        //告知失去房間訊息
                        M2C_TeamLose m2c_TeamLose = new M2C_TeamLose();
                        m2c_TeamLose.LoseType = TeamLoseType.Disband;
                        List <MapUnit> broadcastMapUnits = new List <MapUnit>();
                        broadcastMapUnits.AddRange(reservation.room.GetAll());
                        MapMessageHelper.BroadcastTarget(m2c_TeamLose, broadcastMapUnits);

                        //讓隊員清空Map相關訊息
                        var proxy      = Game.Scene.GetComponent <CacheProxyComponent>();
                        var playerSync = proxy.GetMemorySyncSolver <Player>();
                        var mapUnits   = reservation.room.GetAll();
                        for (int i = 0; i < mapUnits?.Count; i++)
                        {
                            //Player移除mapUnitId
                            var targetPlayer = playerSync.Get <Player>(mapUnits[i].Uid);
                            targetPlayer?.LeaveRoom();

                            //中斷指定玩家與Map的連接
                            mapUnits[i].GetComponent <MapUnitGateComponent>().IsDisconnect = true;
                            //TODO:G2M_TeamDisband抄C2M_TeamDisbandHandler
                            Game.Scene.GetComponent <MapUnitComponent>().Remove(mapUnits[i].Id);
                        }

                        //刪除房間實體
                        var roomComponent = Game.Scene.GetComponent <RoomComponent>();
                        await roomComponent.DestroyRoom(reservation.room.Id);
                    }
                }

                //刪除預約實體(DB會一起刪除)
                await reservationComponent.DestroyReservation(message.ReservationId);

                //回傳資料
                response.Error = ErrorCode.ERR_Success;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Esempio n. 28
0
        protected async ETTask RunAsync(Session session, C2G_RoamingEnter message, Action <G2C_RoamingEnter> reply)
        {
            G2C_RoamingEnter response = new G2C_RoamingEnter();

            try
            {
                //判斷房間是否合法
                Room room = Game.Scene.GetComponent <RoomComponent>().Get(message.RoamingRoomId);
                if (room == null)
                {
                    response.Error = ErrorCode.ERR_RoomIdNotFound;
                    reply(response);
                    return;
                }

                //回傳房間設定
                response.RoadSettingId = room.info.RoadSettingId;

                //取得自身資料
                Player player = session.GetComponent <SessionPlayerComponent>().Player;
                User   user   = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault());

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                // 連接到Map伺服器,並創建Unit實體
                IPEndPoint mapAddress = StartConfigComponent.Instance.Get(player.mapAppId).GetComponent <InnerConfig>().IPEndPoint;
                Session    mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress);

                //建立Map實體並進入房間
                G2M_MapUnitCreate g2M_MapUnitCreate = new G2M_MapUnitCreate();
                g2M_MapUnitCreate.Uid           = player.uid;
                g2M_MapUnitCreate.GateSessionId = session.InstanceId;
                g2M_MapUnitCreate.MapUnitInfo   = new MapUnitInfo()
                {
                    Name              = user.name,
                    Location          = user.location,
                    RoomId            = message.RoamingRoomId,
                    DistanceTravelled = 0,
                    SpeedMS           = 0,
                    CharSetting       = user.playerCharSetting,
                    PathId            = room.info.NowMemberCount % 4,
                    StartUTCTick      = DateTime.UtcNow.Ticks
                };

                //建立自身MapUnit
                M2G_MapUnitCreate createUnit = (M2G_MapUnitCreate)await mapSession.Call(g2M_MapUnitCreate);

                g2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId;

                //進入房間
                player.EnterRoom(createUnit.MapUnitId, room);
                player.StartRoom();

                //TODO:紀錄
                //回傳自己MapUnitInfo
                response.SelfInfo = g2M_MapUnitCreate.MapUnitInfo;
                var mapUnits = room.GetAll();
                for (int i = 0; i < mapUnits.Count; i++)
                {
                    response.GlobalInfos.Add(mapUnits[i].GlobalInfo);
                }
                reply(response);

                ////對全體廣播MapUnitInfo(不包含自己)
                //M2C_MapUnitCreate m2C_MapUnitCreate = new M2C_MapUnitCreate();
                //m2C_MapUnitCreate.MapUnitInfo = g2M_MapUnitCreate.MapUnitInfo;
                //MapMessageHelper.BroadcastRoom(g2M_MapUnitCreate.MapUnitInfo.RoomId, m2C_MapUnitCreate, player.Uid);

                // 紀錄所有MapUnit(包含自己)
                //List<MapUnit> mapUnits = room.GetAll();
                //for (int i = 0; i < mapUnits.Count; i++)
                //{
                //    response.MapUnitInfos.Add(mapUnits[i].Info);
                //}
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
        private async ETTask RunAsync(Player player, C2L_RefuseRelationshipApply message, Action <L2C_RefuseRelationshipApply> reply)
        {
            L2C_RefuseRelationshipApply response = new L2C_RefuseRelationshipApply();

            try
            {
                long uid = player.uid;

                //尋找指定RelationshipApplyInfo
                var targetApplyInfo = await RelationshipDataHelper.GetRelationshipApplyInfoByApplyId(message.ApplyId);

                //判斷是否存在RelationshipApplyInfo
                if (targetApplyInfo == null)
                {
                    response.Error = ErrorCode.ERR_RelationshipApplyInfo_NotFind;
                    reply(response);
                    return;
                }

                //判斷是否為申請目標
                if (targetApplyInfo.ReceiverUid != uid)
                {
                    response.Error = ErrorCode.ERR_RelationshipApplyInfo_NotReceiver;
                    reply(response);
                    return;
                }

                // 刪除關係申請
                await RelationshipDataHelper.RemoveRelationship(targetApplyInfo.ApplyId);

                // 傳送senderUser更新申請列表
                var notifyRelationshipApplyStateIsRequested = new L2C_NotifyRelationshipApplyState()
                {
                    DeleteApplyId = message.ApplyId,
                    IsRequested   = true,
                };
                GateMessageHelper.BroadcastTarget(notifyRelationshipApplyStateIsRequested, targetApplyInfo.SenderUid);

                // 傳送receiverUser更新申請列表
                var notifyRelationshipApplyStateNotRequested = new L2C_NotifyRelationshipApplyState()
                {
                    DeleteApplyId = message.ApplyId,
                    IsRequested   = false,
                };
                GateMessageHelper.BroadcastTarget(notifyRelationshipApplyStateNotRequested, targetApplyInfo.ReceiverUid);

                var uidUser = await UserDataHelper.FindOneUser(uid);

                var senderUser = await UserDataHelper.FindOneUser(targetApplyInfo.SenderUid);

                // 推播告知senderUser
                var firebase = Game.Scene.GetComponent <FirebaseComponent>();
                var lang     = Game.Scene.GetComponent <LanguageComponent>();
                // 8 = {0}拒絕你的好友邀請!
                var body = lang.GetString(senderUser.language, 8);
                await firebase.SendOneNotification(senderUser.firebaseDeviceToken, string.Empty, string.Format(body, uidUser.name));

                response.Error = ErrorCode.ERR_Success;
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }
Esempio n. 30
0
        protected async ETTask RunAsync(Player player, C2L_TeamInviteAccept message, Action <L2C_TeamInviteAccept> reply)
        {
            L2C_TeamInviteAccept response = new L2C_TeamInviteAccept();

            try
            {
                var lobbyComponent = Game.Scene.GetComponent <LobbyComponent>();
                // 取得自身資料
                User user = await UserDataHelper.FindOneUser((player?.uid).GetValueOrDefault(0));

                if (user == null)
                {
                    response.Error = ErrorCode.ERR_AccountDoesntExist;
                    reply(response);
                    return;
                }

                // 判斷邀請是否合法
                var inviteComponent = Game.Scene.GetComponent <InviteComponent>();
                var invite          = inviteComponent.GetByInviteId(message.InviteId);

                if (invite == null)
                {
                    response.Error = ErrorCode.ERR_InviteIdNotFind;
                    reply(response);
                    return;
                }

                if (invite.data.ReceiverUid != player?.uid)
                {
                    response.Error = ErrorCode.ERR_InviteNotSelf;
                    reply(response);
                    return;
                }

                // 刪除該邀請
                await inviteComponent.DestroyByInviteId(message.InviteId);

                // 判斷房間是否合法
                var room = lobbyComponent.GetRoom(invite.data.TeamRoomId);
                if (room == null)
                {
                    response.Error = ErrorCode.ERR_RoomIdNotFound;
                    reply(response);
                    return;
                }

                if (room.Type != RoomType.Team)
                {
                    response.Error = ErrorCode.ERR_RoonTypeError;
                    reply(response);
                    return;
                }

                if (room.State != RoomState.Start)
                {
                    response.Error = ErrorCode.ERR_RoomTeamStateCanNotEnter;
                    reply(response);
                    return;
                }

                if (room.info.NowMemberCount >= room.info.MaxMemberCount)
                {
                    response.Error = ErrorCode.ERR_RoomTeamMemberIsFull;
                    reply(response);
                    return;
                }

                // 連接到Map伺服器,並創建Unit實體
                Session mapSession = SessionHelper.GetMapSession(IdGenerater.GetAppId(room.Id));

                // 建立Map實體並進入房間
                L2M_MapUnitCreate l2M_MapUnitCreate = new L2M_MapUnitCreate();
                l2M_MapUnitCreate.Uid           = player.uid;
                l2M_MapUnitCreate.GateSessionId = player.gateSessionActorId;
                l2M_MapUnitCreate.MapUnitInfo   = new MapUnitInfo()
                {
                    Name              = user.name,
                    Location          = user.location,
                    RoomId            = room.Id,
                    DistanceTravelled = 0,
                    CharSetting       = user.playerCharSetting,
                    // PathId 一般組隊入場再決定
                };

                // 建立自身MapUnit
                M2L_MapUnitCreate createUnit = (M2L_MapUnitCreate)await mapSession.Call(l2M_MapUnitCreate);

                l2M_MapUnitCreate.MapUnitInfo.MapUnitId = createUnit.MapUnitId;
                player.EnterRoom(createUnit.MapUnitId, room);

                // 更新Player的MapUnitId
                await Game.Scene.GetComponent <PlayerComponent>().Update(player);

                // 對全體廣播自己剛建立的MapUnitInfo(不包含自己)
                await lobbyComponent.BroadcastTeamModifyMember(player.uid, room.Id);

                // 回傳資料
                var teamData = await lobbyComponent.GetTeamInfo(room.Id);

                response.Info = room.info;
                response.Data = teamData.Item1;
                for (int i = 0; i < teamData.Item2.Count; i++)
                {
                    if (teamData.Item2[i] != null)
                    {
                        response.MemberDatas.Add(teamData.Item2[i]);
                    }
                }
                reply(response);
            }
            catch (Exception e)
            {
                ReplyError(response, e, reply);
            }
        }