Exemple #1
0
        private async void OnScanRequest(ScanRequestEvent e)
        {
            var spots = EmptyMapSpots;

            if (spots.Count == 0)
            {
                new ScanResultEvent(false, "No empty slots left.").RaiseIn(BotBits);
                return;
            }

            List <Map> maps;

            try
            {
                maps =
                    await
                    new MapScanner(MapWidth, MapHeight).LoadMapsAsync(e.TargetWorldId, ScanSignFormat,
                                                                      MapPositionMapper);
            }
            catch (MapLoadException ex)
            {
                new ScanResultEvent(false, ex.Message).RaiseIn(BotBits);
                return;
            }

            if (maps.Count == 0)
            {
                new ScanResultEvent(false, "No maps found.").RaiseIn(BotBits);
                return;
            }

            var blocks     = Blocks.Of(BotBits);
            var spotNumber = 0;

            var numAccepted = 0;
            var numRejected = 0;

            var result = ReviewResult.Rejected;

            foreach (var map in maps)
            {
                spots[spotNumber].AddMap(blocks, map);

                await PlaceSendMessage.Of(BotBits).FinishQueueAsync();

                await BlockChecker.Of(BotBits).FinishChecksAsync();

                reviewResult       = new TaskCompletionSource <ReviewResult>();
                waitingForResponse = true;
                new MapForReviewEvent(map.Name, map.Creators, numAccepted + numRejected + 1, maps.Count).RaiseIn(BotBits);

                result = await reviewResult.Task;

                waitingForResponse = false;

                switch (result)
                {
                case ReviewResult.Accepted:
                {
                    numAccepted++;
                    spotNumber++;

                    if (spotNumber < spots.Count)
                    {
                        continue;
                    }

                    new ScanResultEvent(false,
                                        "Scan not finished completely. Ran out of free spots.",
                                        numAccepted,
                                        numRejected).RaiseIn(BotBits);
                    return;
                }

                case ReviewResult.Rejected:
                {
                    numRejected++;
                    break;
                }

                case ReviewResult.Stopped:
                {
                    spots[spotNumber].Clear(blocks);

                    new ScanResultEvent(false,
                                        "Scan stopped.",
                                        numAccepted,
                                        numRejected).RaiseIn(BotBits);
                    return;
                }
                }
            }

            // Clear last map when rejected
            if (result == ReviewResult.Rejected)
            {
                spots[spotNumber].Clear(blocks);
            }

            new ScanResultEvent(true, "Scan succeeded.", numAccepted, numRejected).RaiseIn(BotBits);
        }
 /// <summary>
 /// gets fired when a SCAN request occured; ASYNC
 /// </summary>
 /// <param name="configObject">the config object which then will be used in the scan</param>
 void ClientDefinition_OnScanRequestEvent(Post_KNV_MessageClasses.ClientConfigObject configObject)
 {
     LogManager.writeLog("[Webservice] SCAN request recieved");
     ScanRequestEvent.BeginInvoke(configObject, null, null);
 }