예제 #1
0
        public async Task <IgsGame> AcceptMatchRequestAsync(IgsMatchRequest matchRequest)
        {
            // We are accepting a match and it begins.
            var lines = await MakeRequestAsync(matchRequest.AcceptCommand);

            if (lines.IsError)
            {
                return(null);
            }
            if (lines.Any(ln => ln.Code == IgsCode.Info && ln.PureLine.Contains("Requesting")))
            {
                this.igsConnection.Events.OnErrorMessageReceived("Requesting " + matchRequest.OpponentName +
                                                                 " to confirm match.");
                return(null);
            }
            var heading = this.igsConnection.Data.LastReceivedGameHeading;
            var ogi     = await GetGameByIdAsync(heading.GameNumber);

            var  builder     = GameBuilder.CreateOnlineGame(ogi).Connection(this.igsConnection);
            bool youAreBlack = heading.BlackName == this.igsConnection.Username;
            var  humanPlayer =
                new HumanPlayerBuilder(youAreBlack ? StoneColor.Black : StoneColor.White).Name(youAreBlack
                    ? heading.BlackName
                    : heading.WhiteName)
                .Rank(youAreBlack ? ogi.Black.Rank : ogi.White.Rank)
                .Clock(new CanadianTimeControl(TimeSpan.Zero, 25, TimeSpan.FromMinutes(ogi.ByoyomiPeriod)))
                .Build();
            var onlinePlayer =
                new IgsPlayerBuilder(youAreBlack ? StoneColor.White : StoneColor.Black, this.igsConnection).Name(
                    youAreBlack
                        ? heading.WhiteName
                        : heading.BlackName)
                .Rank(youAreBlack ? ogi.White.Rank : ogi.Black.Rank)
                .Clock(new CanadianTimeControl(TimeSpan.Zero, 25, TimeSpan.FromMinutes(ogi.ByoyomiPeriod)))
                .Build();

            builder.BlackPlayer(youAreBlack ? humanPlayer : onlinePlayer)
            .WhitePlayer(youAreBlack ? onlinePlayer : humanPlayer);
            var game = builder.Build();

            this.igsConnection.GamesYouHaveOpened.Add(game);
            return(game);
        }
예제 #2
0
        public async Task <IgsGame> StartObserving(IgsGameInfo gameInfo)
        {
            if (this.igsConnection.GamesBeingObserved.Any(g => g.Info.IgsIndex == gameInfo.IgsIndex))
            {
                // We are already observing this game.
                return(null);
            }
            var response = await MakeRequestAsync("observe " + gameInfo.IgsIndex);

            if (response.IsError)
            {
                // Observing failed.
                return(null);
            }
            var heading = response.GetGameHeading();

            if (heading == null)
            {
                return(null);
            }
            if (heading.BlackName != gameInfo.Black.Name || heading.WhiteName != gameInfo.White.Name)
            {
                // It's a different game now.
                return(null);
            }
            TimeControl blackClock =
                new CanadianTimeControl(TimeSpan.Zero, 25, TimeSpan.FromMinutes(gameInfo.ByoyomiPeriod)).UpdateFrom(
                    heading.BlackTimeRemaining);
            TimeControl whiteClock =
                new CanadianTimeControl(TimeSpan.Zero, 25, TimeSpan.FromMinutes(gameInfo.ByoyomiPeriod)).UpdateFrom(
                    heading.WhiteTimeRemaining);

            if (heading.BlackTimeRemaining.PeriodStonesLeft == 0 &&
                heading.BlackTimeRemaining.PeriodTimeLeft == TimeSpan.Zero &&
                heading.BlackTimeRemaining.MainTimeLeft == TimeSpan.Zero)
            {
                blackClock = new NoTimeControl();
                whiteClock = new NoTimeControl();
            }

            var    titleLine = response.LastOrDefault(line => line.Code == IgsCode.Info);
            string gameName  = null;

            if (titleLine != null)
            {
                gameName = IgsRegex.ParseTitleInformation(titleLine);
            }
            var blackPlayer =
                new IgsPlayerBuilder(StoneColor.Black, this.igsConnection)
                .Name(gameInfo.Black.Name)
                .Rank(gameInfo.Black.Rank)
                .Clock(blackClock)
                .Build();
            var whitePlayer =
                new IgsPlayerBuilder(StoneColor.White, this.igsConnection)
                .Name(gameInfo.White.Name)
                .Rank(gameInfo.White.Rank)
                .Clock(whiteClock)
                .Build();
            var onlineGame = GameBuilder.CreateOnlineGame(gameInfo)
                             .Connection(this.igsConnection)
                             .BlackPlayer(blackPlayer)
                             .WhitePlayer(whitePlayer)
                             .Ruleset(RulesetType.Japanese)
                             .Komi(gameInfo.Komi)
                             .BoardSize(gameInfo.BoardSize)
                             .Name(gameName)
                             .Build();

            this.igsConnection.GamesBeingObserved.Add(onlineGame);
            this.igsConnection.GamesYouHaveOpened.Add(onlineGame);
            this.igsConnection.MakeUnattendedRequest("moves " + gameInfo.IgsIndex);
            return(onlineGame);
        }