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); }
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); }