Exemplo n.º 1
0
        //Проверяет доступность дома соблюдая последовательность подключения к базе
        public bool CheckAccessHome(string login, string homeType)
        {
            try
            {
                if (string.IsNullOrEmpty(homeType))
                {
                    return(true);
                }
                else
                {
                    WCFUser profile    = GamePortalServer.GetProfileByLogin(login);
                    int     liaveCount = profile.UserGames.Count(p => p.GameId == this.GameId && p.EndTime.HasValue && !p.IsIgnoreHonor);
                    if (liaveCount > GameHost.MaxLiaveCount)
                    {
                        return(false);
                    }
                }

                return(CheckAccessHomeFunc(login, homeType));
            }
            catch (Exception exp)
            {
                GameException.NewGameException(GameId, "Не удалось проверить доступность дома.", exp, false);
                return(false);
            }
        }
Exemplo n.º 2
0
        //LockFunc _ClientList
        public bool InviteUser(WCFUser user, string inviteLogin, string msg)
        {
            lock (_ClientList)
            {
                //проверка подключена ли система оповещения пользователя
                var client = _ClientList.SingleOrDefault(p => p.Login == inviteLogin);
                if (client == null)
                {
                    return(false);
                }

                //загрузка настроект окна приглошения
                PublicFileJson <NotifiSettings> notifiSettings = new PublicFileJson <NotifiSettings>(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "configs\\invite.config"));
                notifiSettings.Read();
                if (notifiSettings.Value == null)
                {
                    if (!tmpMethod(notifiSettings))
                    {
                        return(false);
                    }
                }

                client.NotifiList.Add(new Notifi()
                {
                    Content = string.Format("dynamic_message*{0}", msg), User = user.Login, Settings = notifiSettings.Value
                });
            }

            return(true);
        }
Exemplo n.º 3
0
        //LockFunc _ClientList
        public void AddUserNotifi(WCFUser user, string message)
        {
            //TODO можно загружать при старте хоста
            PublicFileJson <NotifiSettings> notifiSettings = new PublicFileJson <NotifiSettings>(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "configs\\user.config"));

            notifiSettings.Read();
            if (notifiSettings.Value == null)
            {
                if (!tmpMethod(notifiSettings))
                {
                    return;
                }
            }

            foreach (var login in user.SignerUsers)
            {
                lock (_ClientList)
                {
                    var client = _ClientList.SingleOrDefault(p => p.Login == login);
                    if (client == null)
                    {
                        continue;
                    }

                    client.NotifiList.Add(new Notifi()
                    {
                        Content = message, User = user.Login, Settings = notifiSettings.Value
                    });
                }
            }
        }
Exemplo n.º 4
0
        public WCFGame NewGame(string clientVersion, WCFGameSettings gameSettings, string gamePassword)
        {
            try
            {
                if (IsDisableNewGame || gameSettings == null || !gameSettings.CheckInput())
                {
                    return(null);
                }

#if !DEBUG
                //проверка версии клиента
                if (!string.IsNullOrEmpty(_UpdaterService.ClientVersion) && clientVersion != _UpdaterService.ClientVersion)
                {
                    throw new Exception($"Неверная версия клиента: login={gameSettings.CreatorLogin}.");
                }
#endif

                WCFUser gpUser = _GamePortalService.GetProfileByLogin(gameSettings.CreatorLogin);

                //TODO проверка может ли пользователь поставить такие условия

                /*if (gpUser == null
                || gpUser.MindRate < gameSettings.RateSettings.MindRate
                || gpUser.HonorRate < gameSettings.RateSettings.HonorRate
                || gpUser.LikeRate < gameSettings.RateSettings.LikeRate
                || gpUser.DurationHours < gameSettings.RateSettings.DurationRate)
                ||  return Guid.Empty;*/

#if !DEBUG //запрет на много игр
                using (Agot2p6Entities dbContext = new Agot2p6Entities())
                {
                    if (dbContext.Game.Count(p => p.CloseTime == null && (p.CreatorLogin == gameSettings.CreatorLogin || p.GameUser.Any(p1 => !string.IsNullOrEmpty(p1.HomeType) && p1.Login == gameSettings.CreatorLogin))) > 0)
                    {
                        return(null);
                    }
                }
#endif

                WCFGame wcfGame = CreateGame(gameSettings, gamePassword);
                if (wcfGame == null)
                {
                    return(null);
                }

                //поднимаем хост и сообщаем о новой игре
                NewHost(wcfGame.Id);
                _NotifyService.AddGameNotifi(wcfGame);

                return(wcfGame);
            }
            catch (Exception exp)
            {
                GameException.NewGameException(null, "Не удалось создать игру.", exp, false);
                return(null);
            }
        }
Exemplo n.º 5
0
        public bool?CheckBlackList(string login)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(login) || login == "System" || login == "Вестерос")
                {
                    return(false);
                }

                using (Agot2p6Entities dbContext = new Agot2p6Entities())
                {
                    Game            game     = dbContext.Game.SingleOrDefault(p => p.Id == GameId);
                    List <GameUser> homeUser = game.HomeUsersSL;

                    //уже играл
                    WCFUser user = GamePortalServer.GetProfileByLogin(login);
                    if (user.UserGames.Any(p => p.GameId == this.GameId))
                    {
                        return(true);
                    }

                    //находится в чёрном списке у одного из игроков
                    List <WCFUser> users = homeUser.Where(p => !string.IsNullOrEmpty(p.Login)).Select(p => GamePortalServer.GetProfileByLogin(p.Login)).ToList();
                    if (users.Any(p => p.SpecialUsers.Any(p1 => p1.IsBlock && p1.SpecialLogin == login)))
                    {
                        return(false);
                    }

                    //один из игроков в чёрном списке
                    user = GamePortalServer.GetProfileByLogin(login);
                    if (users.Any(p => user.SpecialUsers.Any(p1 => p1.IsBlock && p1.SpecialLogin == p.Login)))
                    {
                        return(null);
                    }
                }

                return(true);
            }
            catch (Exception exp)
            {
                GameException.NewGameException(GameId, "CheckBlackList", exp, false);
                return(false);
            }
        }
Exemplo n.º 6
0
 public void TestMethodConsoleWCF()
 {
     WCFConsoleService.MathServiceClient client = null;
     try
     {
         client = new WCFConsoleService.MathServiceClient();
         WCFUser user = client.GetUser(1, 2);
         int     n    = client.PlusInt(1, 5);
         client.Close();
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.Message);
         if (client != null)
         {
             client.Abort();
         }
         throw;
     }
 }
Exemplo n.º 7
0
        public WCFGame Connect(string login, string gamePassword, string homeType)
        {
            return(TaskFactory.StartNew <WCFGame>(() =>
            {
                try
                {
                    if (CheckBlackList(login) == false)
                    {
                        return null;
                    }

#if !DEBUG //запрет на много игр
                    using (Agot2p6Entities dbContext = new Agot2p6Entities())
                    {
                        if (!dbContext.GameUser.Any(p1 => !string.IsNullOrEmpty(p1.HomeType) && p1.Login == login) &&
                            dbContext.Game.Count(p => p.CloseTime == null &&
                                                 p.GameUser.Any(p1 => !string.IsNullOrEmpty(p1.HomeType) && p1.Login == login)) > 1)
                        {
                            WCFUser profile = GamePortalServer.GetProfileByLogin(login);
                            if (profile.AllPower < 400 || (int)profile.UserGames.Where(p => !p.IsIgnoreHonor && p.EndTime.HasValue).Sum(p => (p.EndTime.Value - p.StartTime).TotalHours) < 48)
                            {
                                return null;
                            }
                        }
                    }
#endif

                    return ConnectTask(login, gamePassword, homeType);
                }
                catch (Exception exp)
                {
                    GameException.NewGameException(GameId, "Не удалось подключиться к игре.", exp, false);
                    return null;
                }
            }).Result);
        }
Exemplo n.º 8
0
        private void RemoveUser(Game game)
        {
            DateTimeOffset         time     = dateTimeNow - _UserLiveTime;
            IEnumerable <GameUser> userList = game.GameUser.Where(p => !string.IsNullOrEmpty(p.Login) && p.Login != "Вестерос" && p.LastUpdate < time);

            //лишаем лордства неактивных
            foreach (GameUser user in userList.ToList())
            {
                //лорды
                if (!string.IsNullOrEmpty(user.HomeType))
                {
                    WCFUser profile = GamePortalServer.GetProfileByLogin(user.Login);
                    //                    bool hasVaule = _DeniedLogin.TryGetValue(user.Login, out int oldLiaveCount);
                    //                    int newLiaveCount = game.OpenTime == null ? GameHost.MaxLiaveCount + 1 : oldLiaveCount + 1;
                    //#if !DEBUG
                    //                    if (!hasVaule) _DeniedLogin.TryAdd(user.Login, newLiaveCount);
                    //                    else _DeniedLogin.TryUpdate(user.Login, newLiaveCount, oldLiaveCount);
                    //#endif
                    if (game.OpenTime != null)
                    {
                        GamePortalServer.StopUserGame(user.Login, game.Id, 0, royalPardon);
                    }
                    else
                    {
                        GameHost.AddUserNotifiFunc(profile, $"dynamic_leftGame1*unknown home");//{user.HomeType}
                    }
                    string whois      = profile == null ? user.Login : profile.Api["FIO"];
                    int    liaveCount = profile.UserGames.Count(p => p.GameId == this.GameId && p.EndTime.HasValue && !p.IsIgnoreHonor);
                    if (liaveCount > GameHost.MaxLiaveCount)
                    {
                        ChatService.AddChat(new Chat()
                        {
                            Creator = "Вестерос", Message = $"dynamic_Exile*homeType_{user.HomeType}*Faceless Men"
                        });                                                                                                                        //{whois}
                    }
                    else if (game.OpenTime != null)
                    {
                        ChatService.AddChat(new Chat()
                        {
                            Creator = "Вестерос", Message = $"dynamic_leftGame*homeType_{user.HomeType}*Faceless Men*{GameHost.MaxLiaveCount - liaveCount + 1}"
                        });                                                                                                                                                                     //{whois}
                    }
                    user.Login = null;

                    //сообщаем что требуется замена
                    if (game.OpenTime != null)
                    {
                        GameHost.AddGameNotifiFunc(game.ToWCFGame());
                    }
                }
                //наблюдателей удаляем
                else
                {
                    game.DbContext.GameUser.Remove(user);
                }
            }

            royalPardon = false;

            //если партию покинули все игроки
            if (game.HomeUsersSL.All(p => p.Login == null))
            {
                game.CloseTime = dateTimeNow;
            }
        }
Exemplo n.º 9
0
        private WCFGame ConnectTask(string login, string gamePassword, string homeType)
        {
            //если дом занят или недоступен то наблюдатель
            if (homeType != null && !CheckAccessHomeFunc(login, homeType))
            {
                homeType = null;
            }

            using (Agot2p6Entities dbContext = new Agot2p6Entities())
            {
                WCFUser  profile  = GamePortalServer.GetProfileByLogin(login);
                Game     game     = dbContext.Game.Single(p => p.Id == GameId);
                GameUser gameUser = game.GameUser.SingleOrDefault(p => p.Login == login);

                //Пользователь уже принимал участие
                //_DeniedLogin.TryGetValue(login, out int liaveCount);
                IEnumerable <WCFUserGame> usergames = profile.UserGames.Where(p => p.GameId == this.GameId);
                if (usergames.Count(p => p.EndTime.HasValue && !p.IsIgnoreHonor) > GameHost.MaxLiaveCount)
                {
                    homeType = null;
                    ChatService.AddChat(new Chat()
                    {
                        Creator = "Вестерос", Message = $"dynamic_ExileEarlier*{profile.Api["FIO"]}"
                    });
                }
                else
                {
                    //потенциаьный лорд
                    if (gameUser == null || gameUser.HomeType == null)
                    {
                        //выбран дом и игра не закрыта
                        if (!string.IsNullOrEmpty(homeType) && game.CloseTime == null)
                        {
                            //пароль отсутствует или указан верно
                            if (string.IsNullOrEmpty(game.Password) || game.Password == gamePassword)
                            {
                                //Удаляем наблюдателя
                                if (gameUser != null && gameUser.HomeType == null)
                                {
                                    dbContext.GameUser.Remove(gameUser);
                                    gameUser = null;
                                }

                                //конкретный дом
                                if (homeType != "Random")
                                {
                                    gameUser       = game.HomeUsersSL.SingleOrDefault(p => p.HomeType == homeType);
                                    gameUser.Login = login;
                                }
                                //Случайный дом
                                else
                                {
                                    //Определяем свободные дома и сортируем по имени дома
                                    List <GameUser> freeHome = game.HomeUsersSL.Where(p => p.Login == null).OrderBy(p => p.HomeType).ToList();

                                    //если игрок ранее заходил в эту игру, то определяем за какой дом в последний раз он играл
                                    WCFUserGame lastgame = usergames.OrderBy(p => p.StartTime).LastOrDefault();
                                    if (lastgame != null)
                                    {
                                        //Если этот дом свободен, то отдаём его пользователю
                                        gameUser = freeHome.FirstOrDefault(p => p.HomeType == lastgame.HomeType);
                                        if (gameUser != null)
                                        {
                                            gameUser.Login = login;
                                        }
                                    }

                                    //если дом не присвоен
                                    if (gameUser == null)
                                    {
                                        //отдаём тот дом за который пользователь играл меньше всего
                                        gameUser       = freeHome.OrderBy(p => profile.UserGames.Count(p1 => p1.HomeType == p.HomeType)).First();
                                        gameUser.Login = login;
                                    }

                                    //if (lastgame == null)
                                    //{
                                    //    int index = GameHost.Rnd.Next(freeHome.Count());
                                    //    gameUser = freeHome.ElementAt(index);
                                    //    gameUser.Login = login;
                                    //}
                                }

                                ChatService.AddChat(new Chat()
                                {
                                    Creator = "Вестерос", Message = $"dynamic_hiLord*Faceless Men*homeType_{gameUser.HomeType}"
                                });                                                                                                //profile.Api["FIO"]
                                GameHost.AddUserNotifiFunc(profile, $"dynamic_inGame*{game.Name ?? "text_newGame"}*unknown home"); //{gameUser.HomeType}
                                if (game.OpenTime != null)
                                {
                                    GamePortalServer.StartUserGame(gameUser.Login, gameUser.HomeType, game.Id, game.Type + (game.RandomIndex > 0 || game.IsRandomSkull ? 1 : 0), game.NoTimer, true);
                                }
                            }
                            else
                            {
                                ChatService.AddChat(new Chat()
                                {
                                    Creator = "Вестерос", Message = $"dynamic_passwordDenied*Faceless Men"
                                });                                                                                                        //{profile.Api["FIO"]}
                            }
                        }
                    }
                }

                //наблюдатель
                if (gameUser == null)
                {
                    gameUser = new GameUser(game)
                    {
                        Login = login
                    };

                    game.GameUser.Add(gameUser);
                }

                gameUser.LastUpdate    = DateTimeOffset.UtcNow;
                gameUser.NeedReConnect = false;


                if (game.OpenTime == null && game.HomeUsersSL.All(p => !string.IsNullOrEmpty(p.Login) && (DateTimeOffset.UtcNow - p.LastUpdate) < new TimeSpan(0, 0, 5)))
                {
                    game.HomeUsersSL.ForEach(p => GamePortalServer.StartUserGame(p.Login, p.HomeType, game.Id, game.Type + (game.RandomIndex > 0 || game.IsRandomSkull ? 1 : 0), game.NoTimer));
                    game.OpenTime = DateTimeOffset.UtcNow;
                    game.NewThink();
                }

                dbContext.SaveChanges();

                System.Collections.Generic.IEnumerable <GameUser> gameUsers = game.HomeUsersSL.Where(p => p.Login != null);
                var privateDate = gameUsers.Select(p => new { gameUser = p, privateDate = GamePortalServer.GetPrivateProfileData(p.Login) }).ToList();
                var groupe      = privateDate.GroupBy(p => p.privateDate["clientId"]).Where(p => p.Count() > 1).ToList();
                groupe.AddRange(privateDate.GroupBy(p => p.privateDate["email"]).Where(p => p.Key != null && p.Count() > 1).ToList());
                groupe.AddRange(privateDate.GroupBy(p => p.privateDate["password"]).Where(p => p.Count() > 1).ToList());
                groupe.SelectMany(p => p.Select(p1 => string.Concat(p.Select(p2 => "\n" + p2.gameUser.HomeType)))).Distinct().ToList().ForEach(p =>
                {
                    ChatService.AddChat(new Chat()
                    {
                        Creator = "Вестерос", Message = $"dynamic_samePC*{p}"
                    });
                });

                return(game.ToWCFGame());
            }
        }