public async Task Handle(ISession session, WebSocketSession webSocketSession, dynamic message) { await HumanWalkSnipeTask.TargetPokemonSnip(session, (string)message.Id); await Task.Delay(1000); // Logic.Tasks.RecycleItemsTask.DropItem(session, (ItemId)message.ItemId, (int)message.Count); }
public async Task Handle(ISession session, WebSocketSession webSocketSession, dynamic message) { CatchState.AddFastPokemapItem(message.Data); await HumanWalkSnipeTask.AddFastPokemapItem(message.Data); //Console.WriteLine(JsonConvert.DeserializeObject(message.Data)); }
private static void ONFPMBridgeData(ISession session, string message) { var match = Regex.Match(message, "42\\[\"fpm\",(.*)]"); if (match != null && !string.IsNullOrEmpty(match.Groups[1].Value)) { //var data = JsonConvert.DeserializeObject<List<Logic.Tasks.HumanWalkSnipeTask.FastPokemapItem>>(match.Groups[1].Value); HumanWalkSnipeTask.AddFastPokemapItem(match.Groups[1].Value); } }
public static void HandleEvent(SnipePokemonFoundEvent ev, ISession session) { HumanWalkSnipeTask.AddSnipePokemon("Local Feeder", ev.PokemonFound.Id, ev.PokemonFound.Latitude, ev.PokemonFound.Longitude, ev.PokemonFound.ExpirationTimestamp, ev.PokemonFound.IV, session ); }
private static void ONFPMBridgeData(ISession session, string message) { var match = Regex.Match(message, "42\\[\"fpm\",(.*)]"); if (match != null && !string.IsNullOrEmpty(match.Groups[1].Value)) { //var data = JsonConvert.DeserializeObject<List<Logic.Tasks.HumanWalkSnipeTask.FastPokemapItem>>(match.Groups[1].Value); // jjskuld - Ignore CS4014 warning for now. #pragma warning disable 4014 HumanWalkSnipeTask.AddFastPokemapItem(match.Groups[1].Value); #pragma warning restore 4014 } }
public static async Task HandleEventAsync(EncounteredEvent ev, ISession session) { if (!ev.IsRecievedFromSocket) { return; } await HumanWalkSnipeTask.AddSnipePokemon("mypogosnipers.com", ev.PokemonId, ev.Latitude, ev.Longitude, ev.Expires, ev.IV, session ).ConfigureAwait(false); }
public static void HandleEvent(EncounteredEvent ev, ISession session) { if (!ev.IsRecievedFromSocket) { return; } HumanWalkSnipeTask.AddSnipePokemon("mypogosnipers.com", ev.PokemonId, ev.Latitude, ev.Longitude, ev.Expires, ev.IV, session ); }
private async void HandleMessage(WebSocketSession session, string message) { switch (message) { case "PokemonList": await PokemonListTask.Execute(_session); break; case "EggsList": await EggsListTask.Execute(_session); break; case "InventoryList": await InventoryListTask.Execute(_session); break; case "PokemonSnipeList": await HumanWalkSnipeTask.ExecuteFetchData(_session); break; } // Setup to only send data back to the session that requested it. try { dynamic decodedMessage = JObject.Parse(message); var handle = _websocketHandler?.Handle(_session, session, decodedMessage); if (handle != null) { await handle; } } catch (Exception ex) { #if DEBUG //Logger.Write(ex.Message); #endif } // When we first get a message from the web socket, turn off log buffering. // This allows us to flush out buffered LogEvent messages to the GUI. Logger.TurnOffLogBuffering(); }
private static void onSocketMessageRecieved(ISession session, object sender, WebSocketSharp.MessageEventArgs e) { try { var match = Regex.Match(e.Data, "42\\[\"pokemon\",(.*)]"); if (match != null && !string.IsNullOrEmpty(match.Groups[1].Value)) { var data = JsonConvert.DeserializeObject <EncounteredEvent>(match.Groups[1].Value); data.IsRecievedFromSocket = true; session.EventDispatcher.Send(data); if (session.LogicSettings.AllowAutoSnipe) { var move1 = PokemonMove.Absorb; var move2 = PokemonMove.Absorb; Enum.TryParse <PokemonMove>(data.Move1, true, out move1); Enum.TryParse <PokemonMove>(data.Move1, true, out move2); MSniperServiceTask.AddSnipeItem(session, new MSniperServiceTask.MSniperInfo2() { Latitude = data.Latitude, Longitude = data.Longitude, EncounterId = Convert.ToUInt64(data.EncounterId), SpawnPointId = data.SpawnPointId, PokemonId = (short)data.PokemonId, Iv = data.IV, Move1 = move1, Move2 = move2 }); } return; } match = Regex.Match(e.Data, "42\\[\"fpm\",(.*)]"); if (match != null && !string.IsNullOrEmpty(match.Groups[1].Value)) { //var data = JsonConvert.DeserializeObject<List<Logic.Tasks.HumanWalkSnipeTask.FastPokemapItem>>(match.Groups[1].Value); HumanWalkSnipeTask.AddFastPokemapItem(match.Groups[1].Value); return; } } catch (Exception ex) { #if DEBUG Logger.Write("ERROR TO ADD SNIPE< DEBUG ONLY " + ex.Message, LogLevel.Info, ConsoleColor.Yellow); #endif } }
private async void HandleMessage(WebSocketSession session, string message) { switch (message) { case "PokemonList": await PokemonListTask.Execute(_session); break; case "EggsList": await EggsListTask.Execute(_session); break; case "InventoryList": await InventoryListTask.Execute(_session); break; case "PokemonSnipeList": await HumanWalkSnipeTask.ExecuteFetchData(_session); break; } // Setup to only send data back to the session that requested it. try { dynamic decodedMessage = JObject.Parse(message); var handle = _websocketHandler?.Handle(_session, session, decodedMessage); if (handle != null) { await handle; } } catch { // ignored } }
public static void RunBotWithParameters(Action <ISession, StatisticsAggregator> onBotStarted, string[] args) { var ioc = TinyIoC.TinyIoCContainer.Current; //Setup Logger for API APIConfiguration.Logger = new APILogListener(); //Application.EnableVisualStyles(); var strCulture = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName; var culture = CultureInfo.CreateSpecificCulture("en"); CultureInfo.DefaultThreadCurrentCulture = culture; Thread.CurrentThread.CurrentCulture = culture; AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionEventHandler; Console.Title = @"NecroBot2"; Console.CancelKeyPress += (sender, eArgs) => { QuitEvent.Set(); eArgs.Cancel = true; }; // Command line parsing var commandLine = new Arguments(args); // Look for specific arguments values if (commandLine["subpath"] != null && commandLine["subpath"].Length > 0) { _subPath = commandLine["subpath"]; } if (commandLine["jsonvalid"] != null && commandLine["jsonvalid"].Length > 0) { switch (commandLine["jsonvalid"]) { case "true": _enableJsonValidation = true; break; case "false": _enableJsonValidation = false; break; } } if (commandLine["killswitch"] != null && commandLine["killswitch"].Length > 0) { switch (commandLine["killswitch"]) { case "true": _ignoreKillSwitch = false; break; case "false": _ignoreKillSwitch = true; break; } } bool excelConfigAllow = false; if (commandLine["provider"] != null && commandLine["provider"] == "excel") { excelConfigAllow = true; } // Logger.AddLogger(new ConsoleLogger(LogLevel.Service), _subPath); Logger.AddLogger(new FileLogger(LogLevel.Service), _subPath); Logger.AddLogger(new WebSocketLogger(LogLevel.Service), _subPath); var profilePath = Path.Combine(Directory.GetCurrentDirectory(), _subPath); var profileConfigPath = Path.Combine(profilePath, "config"); var configFile = Path.Combine(profileConfigPath, "config.json"); var excelConfigFile = Path.Combine(profileConfigPath, "config.xlsm"); GlobalSettings settings; var boolNeedsSetup = false; if (File.Exists(configFile)) { // Load the settings from the config file settings = GlobalSettings.Load(_subPath, _enableJsonValidation); if (excelConfigAllow) { if (!File.Exists(excelConfigFile)) { Logger.Write( "Migrating existing json confix to excel config, please check the config.xlsm in your config folder" ); ExcelConfigHelper.MigrateFromObject(settings, excelConfigFile); } else { settings = ExcelConfigHelper.ReadExcel(settings, excelConfigFile); } Logger.Write("Bot will run with your excel config, loading excel config"); } } else { settings = new GlobalSettings { ProfilePath = profilePath, ProfileConfigPath = profileConfigPath, GeneralConfigPath = Path.Combine(Directory.GetCurrentDirectory(), "config"), ConsoleConfig = { TranslationLanguageCode = strCulture } }; boolNeedsSetup = true; } if (commandLine["latlng"] != null && commandLine["latlng"].Length > 0) { var crds = commandLine["latlng"].Split(','); try { var lat = double.Parse(crds[0]); var lng = double.Parse(crds[1]); settings.LocationConfig.DefaultLatitude = lat; settings.LocationConfig.DefaultLongitude = lng; } catch (Exception) { // ignored } } var options = new Options(); if (CommandLine.Parser.Default.ParseArguments(args, options)) { // Values are available here if (options.Init) { settings.GenerateAccount(options.IsGoogle, options.Template, options.Start, options.End, options.Password); } } var lastPosFile = Path.Combine(profileConfigPath, "LastPos.ini"); if (File.Exists(lastPosFile) && settings.LocationConfig.StartFromLastPosition) { var text = File.ReadAllText(lastPosFile); var crds = text.Split(':'); try { var lat = double.Parse(crds[0]); var lng = double.Parse(crds[1]); //If lastcoord is snipe coord, bot start from default location if (LocationUtils.CalculateDistanceInMeters(lat, lng, settings.LocationConfig.DefaultLatitude, settings.LocationConfig.DefaultLongitude) < 2000) { settings.LocationConfig.DefaultLatitude = lat; settings.LocationConfig.DefaultLongitude = lng; } } catch (Exception) { // ignored } } if (!_ignoreKillSwitch) { if (CheckMKillSwitch() || CheckKillSwitch()) { return; } } var logicSettings = new LogicSettings(settings); var translation = Translation.Load(logicSettings); TinyIoC.TinyIoCContainer.Current.Register <ITranslation>(translation); if (settings.GPXConfig.UseGpxPathing) { var xmlString = File.ReadAllText(settings.GPXConfig.GpxFile); var readgpx = new GpxReader(xmlString, translation); var nearestPt = readgpx.Tracks.SelectMany( (trk, trkindex) => trk.Segments.SelectMany( (seg, segindex) => seg.TrackPoints.Select( (pt, ptindex) => new { TrackPoint = pt, TrackIndex = trkindex, SegIndex = segindex, PtIndex = ptindex, Latitude = Convert.ToDouble(pt.Lat, CultureInfo.InvariantCulture), Longitude = Convert.ToDouble(pt.Lon, CultureInfo.InvariantCulture), Distance = LocationUtils.CalculateDistanceInMeters( settings.LocationConfig.DefaultLatitude, settings.LocationConfig.DefaultLongitude, Convert.ToDouble(pt.Lat, CultureInfo.InvariantCulture), Convert.ToDouble(pt.Lon, CultureInfo.InvariantCulture) ) } ) ) ) .OrderBy(pt => pt.Distance) .FirstOrDefault(pt => pt.Distance <= 5000); if (nearestPt != null) { settings.LocationConfig.DefaultLatitude = nearestPt.Latitude; settings.LocationConfig.DefaultLongitude = nearestPt.Longitude; settings.LocationConfig.ResumeTrack = nearestPt.TrackIndex; settings.LocationConfig.ResumeTrackSeg = nearestPt.SegIndex; settings.LocationConfig.ResumeTrackPt = nearestPt.PtIndex; } } IElevationService elevationService = new ElevationService(settings); //validation auth.config if (boolNeedsSetup) { AuthAPIForm form = new AuthAPIForm(true); if (form.ShowDialog() == DialogResult.OK) { settings.Auth.APIConfig = form.Config; } } else { var apiCfg = settings.Auth.APIConfig; if (apiCfg.UsePogoDevAPI) { if (string.IsNullOrEmpty(apiCfg.AuthAPIKey)) { Logger.Write( "You select pogodev API but not provide API Key, please press any key to exit and correct you auth.json, \r\n The Pogodev API key call be purchased at - https://talk.pogodev.org/d/51-api-hashing-service-by-pokefarmer", LogLevel.Error ); Console.ReadKey(); Environment.Exit(0); } //TODO - test api call to valida auth key } else if (apiCfg.UseLegacyAPI) { Logger.Write( "You bot will start after 15 second, You are running bot with Legacy API (0.45) it will increase your risk to be banned and trigger captcha. Config captcha in config.json to auto resolve them", LogLevel.Warning ); #if RELEASE Thread.Sleep(15000); #endif } else { Logger.Write( "At least 1 authentication method is selected, please correct your auth.json, ", LogLevel.Error ); Console.ReadKey(); Environment.Exit(0); } } _session = new Session(settings, new ClientSettings(settings, elevationService), logicSettings, elevationService, translation ); ioc.Register <ISession>(_session); Logger.SetLoggerContext(_session); MultiAccountManager accountManager = new MultiAccountManager(logicSettings.Bots); ioc.Register <MultiAccountManager>(accountManager); if (boolNeedsSetup) { StarterConfigForm configForm = new StarterConfigForm(_session, settings, elevationService, configFile); if (configForm.ShowDialog() == DialogResult.OK) { var fileName = Assembly.GetEntryAssembly().Location; Process.Start(fileName); Environment.Exit(0); } //if (GlobalSettings.PromptForSetup(_session.Translation)) //{ // _session = GlobalSettings.SetupSettings(_session, settings, elevationService, configFile); // var fileName = Assembly.GetExecutingAssembly().Location; // Process.Start(fileName); // Environment.Exit(0); //} else { GlobalSettings.Load(_subPath, _enableJsonValidation); Logger.Write("Press a Key to continue...", LogLevel.Warning); Console.ReadKey(); return; } if (excelConfigAllow) { ExcelConfigHelper.MigrateFromObject(settings, excelConfigFile); } } ProgressBar.Start("NecroBot2 is starting up", 10); ProgressBar.Fill(20); var machine = new StateMachine(); var stats = _session.RuntimeStatistics; ProgressBar.Fill(30); var strVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(4); stats.DirtyEvent += () => Console.Title = $"[Necrobot2 v{strVersion}] " + stats.GetTemplatedStats( _session.Translation.GetTranslation(TranslationString.StatsTemplateString), _session.Translation.GetTranslation(TranslationString.StatsXpTemplateString)); ProgressBar.Fill(40); var aggregator = new StatisticsAggregator(stats); if (onBotStarted != null) { onBotStarted(_session, aggregator); } ProgressBar.Fill(50); var listener = new ConsoleEventListener(); ProgressBar.Fill(60); var snipeEventListener = new SniperEventListener(); _session.EventDispatcher.EventReceived += evt => listener.Listen(evt, _session); _session.EventDispatcher.EventReceived += evt => aggregator.Listen(evt, _session); _session.EventDispatcher.EventReceived += evt => snipeEventListener.Listen(evt, _session); ProgressBar.Fill(70); machine.SetFailureState(new LoginState()); ProgressBar.Fill(80); ProgressBar.Fill(90); _session.Navigation.WalkStrategy.UpdatePositionEvent += (session, lat, lng, speed) => _session.EventDispatcher.Send(new UpdatePositionEvent { Latitude = lat, Longitude = lng, Speed = speed }); _session.Navigation.WalkStrategy.UpdatePositionEvent += LoadSaveState.SaveLocationToDisk; ProgressBar.Fill(100); //TODO: temporary if (settings.Auth.APIConfig.UseLegacyAPI) { Logger.Write("The PoGoDev Community Has Updated The Hashing Service To Be Compatible With 0.57.4 So We Have Updated Our Code To Be Compliant. Unfortunately During This Update Niantic Has Also Attempted To Block The Legacy .45 Service Again So At The Moment Only Hashing Service Users Are Able To Login Successfully. Please Be Patient As Always We Will Attempt To Keep The Bot 100% Free But Please Realize We Have Already Done Quite A Few Workarounds To Keep .45 Alive For You Guys. Even If We Are Able To Get Access Again To The .45 API Again It Is Over 3 Months Old So Is Going To Be More Detectable And Cause Captchas. Please Consider Upgrading To A Paid API Key To Avoid Captchas And You Will Be Connecting Using Latest Version So Less Detectable So More Safe For You In The End.", LogLevel.Warning); Logger.Write("The bot will now close", LogLevel.Error); Console.ReadLine(); Environment.Exit(0); return; } // if (settings.WebsocketsConfig.UseWebsocket) { var websocket = new WebSocketInterface(settings.WebsocketsConfig.WebSocketPort, _session); _session.EventDispatcher.EventReceived += evt => websocket.Listen(evt, _session); } var bot = accountManager.GetStartUpAccount(); _session.ReInitSessionWithNextBot(bot); machine.AsyncStart(new VersionCheckState(), _session, _subPath, excelConfigAllow); try { Console.Clear(); } catch (IOException) { } if (settings.TelegramConfig.UseTelegramAPI) { _session.Telegram = new TelegramService(settings.TelegramConfig.TelegramAPIKey, _session); } if (_session.LogicSettings.EnableHumanWalkingSnipe && _session.LogicSettings.HumanWalkingSnipeUseFastPokemap) { // jjskuld - Ignore CS4014 warning for now. #pragma warning disable 4014 HumanWalkSnipeTask.StartFastPokemapAsync(_session, _session.CancellationTokenSource.Token); // that need to keep data live #pragma warning restore 4014 } if (_session.LogicSettings.UseSnipeLocationServer || _session.LogicSettings.HumanWalkingSnipeUsePogoLocationFeeder) { SnipePokemonTask.AsyncStart(_session); } if (_session.LogicSettings.DataSharingConfig.EnableSyncData) { BotDataSocketClient.StartAsync(_session); _session.EventDispatcher.EventReceived += evt => BotDataSocketClient.Listen(evt, _session); } settings.CheckProxy(_session.Translation); if (_session.LogicSettings.ActivateMSniper) { ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; //temporary disable MSniper connection because site under attacking. //MSniperServiceTask.ConnectToService(); //_session.EventDispatcher.EventReceived += evt => MSniperServiceTask.AddToList(evt); } var trackFile = Path.GetTempPath() + "\\necrobot2.io"; if (!File.Exists(trackFile) || File.GetLastWriteTime(trackFile) < DateTime.Now.AddDays(-1)) { Thread.Sleep(10000); Thread mThread = new Thread(delegate() { var infoForm = new InfoForm(); infoForm.ShowDialog(); }); File.WriteAllText(trackFile, DateTime.Now.Ticks.ToString()); mThread.SetApartmentState(ApartmentState.STA); mThread.Start(); } QuitEvent.WaitOne(); }
public async Task Handle(ISession session, WebSocketSession webSocketSession, dynamic message) { await HumanWalkSnipeTask.RemovePokemonFromQueue(session, (string)message.Id); }
public async Task Handle(ISession session, WebSocketSession webSocketSession, dynamic message) { await HumanWalkSnipeTask.ExecuteFetchData(session); //await GetPokemonSnipeListTask.Execute(session, webSocketSession, (string)message.RequestID); }
public async Task Handle(ISession session, WebSocketSession webSocketSession, dynamic message) { await HumanWalkSnipeTask.TargetPokemonSnip(session, (string)message.Id); }
private static void HandleEvent(PokemonCaptureEvent pokemonCaptureEvent, ISession session) { //remove pokemon from list HumanWalkSnipeTask.UpdateCatchPokemon(pokemonCaptureEvent.Latitude, pokemonCaptureEvent.Longitude, pokemonCaptureEvent.Id); }
public static void RunBotWithParameters(Action <ISession, StatisticsAggregator> onBotStarted, string[] args) { Application.EnableVisualStyles(); var strCulture = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName; var culture = CultureInfo.CreateSpecificCulture("en"); CultureInfo.DefaultThreadCurrentCulture = culture; Thread.CurrentThread.CurrentCulture = culture; AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionEventHandler; Console.Title = @"NecroBot2"; Console.CancelKeyPress += (sender, eArgs) => { QuitEvent.Set(); eArgs.Cancel = true; }; // Command line parsing var commandLine = new Arguments(args); // Look for specific arguments values if (commandLine["subpath"] != null && commandLine["subpath"].Length > 0) { _subPath = commandLine["subpath"]; } if (commandLine["jsonvalid"] != null && commandLine["jsonvalid"].Length > 0) { switch (commandLine["jsonvalid"]) { case "true": _enableJsonValidation = true; break; case "false": _enableJsonValidation = false; break; } } if (commandLine["killswitch"] != null && commandLine["killswitch"].Length > 0) { switch (commandLine["killswitch"]) { case "true": //_ignoreKillSwitch = false; break; case "false": //_ignoreKillSwitch = true; break; } } bool excelConfigAllow = false; if (commandLine["provider"] != null && commandLine["provider"] == "excel") { excelConfigAllow = true; } Logger.AddLogger(new ConsoleLogger(LogLevel.Service), _subPath); Logger.AddLogger(new FileLogger(LogLevel.Service), _subPath); Logger.AddLogger(new WebSocketLogger(LogLevel.Service), _subPath); var profilePath = Path.Combine(Directory.GetCurrentDirectory(), _subPath); var profileConfigPath = Path.Combine(profilePath, "config"); var configFile = Path.Combine(profileConfigPath, "config.json"); var excelConfigFile = Path.Combine(profileConfigPath, "config.xlsm"); GlobalSettings settings; var boolNeedsSetup = false; if (File.Exists(configFile)) { // Load the settings from the config file settings = GlobalSettings.Load(_subPath, _enableJsonValidation); if (excelConfigAllow) { if (!File.Exists(excelConfigFile)) { Logger.Write( "Migrating existing json confix to excel config, please check the config.xlsm in your config folder" ); ExcelConfigHelper.MigrateFromObject(settings, excelConfigFile); } else { settings = ExcelConfigHelper.ReadExcel(settings, excelConfigFile); } Logger.Write("Bot will run with your excel config, loading excel config"); } } else { settings = new GlobalSettings { ProfilePath = profilePath, ProfileConfigPath = profileConfigPath, GeneralConfigPath = Path.Combine(Directory.GetCurrentDirectory(), "config"), ConsoleConfig = { TranslationLanguageCode = strCulture } }; boolNeedsSetup = true; } if (commandLine["latlng"] != null && commandLine["latlng"].Length > 0) { var crds = commandLine["latlng"].Split(','); try { var lat = double.Parse(crds[0]); var lng = double.Parse(crds[1]); settings.LocationConfig.DefaultLatitude = lat; settings.LocationConfig.DefaultLongitude = lng; } catch (Exception) { // ignored } } var lastPosFile = Path.Combine(profileConfigPath, "LastPos.ini"); if (File.Exists(lastPosFile) && settings.LocationConfig.StartFromLastPosition) { var text = File.ReadAllText(lastPosFile); var crds = text.Split(':'); try { var lat = double.Parse(crds[0]); var lng = double.Parse(crds[1]); settings.LocationConfig.DefaultLatitude = lat; settings.LocationConfig.DefaultLongitude = lng; } catch (Exception) { // ignored } } //Only check killswitch if use legacyAPI //if (settings.Auth.APIConfig.UseLegacyAPI && (!_ignoreKillSwitch && CheckKillSwitch() || CheckMKillSwitch())) // return; var logicSettings = new LogicSettings(settings); var translation = Translation.Load(logicSettings); if (settings.GPXConfig.UseGpxPathing) { var xmlString = File.ReadAllText(settings.GPXConfig.GpxFile); var readgpx = new GpxReader(xmlString, translation); var nearestPt = readgpx.Tracks.SelectMany( (trk, trkindex) => trk.Segments.SelectMany( (seg, segindex) => seg.TrackPoints.Select( (pt, ptindex) => new { TrackPoint = pt, TrackIndex = trkindex, SegIndex = segindex, PtIndex = ptindex, Latitude = Convert.ToDouble(pt.Lat, CultureInfo.InvariantCulture), Longitude = Convert.ToDouble(pt.Lon, CultureInfo.InvariantCulture), Distance = LocationUtils.CalculateDistanceInMeters( settings.LocationConfig.DefaultLatitude, settings.LocationConfig.DefaultLongitude, Convert.ToDouble(pt.Lat, CultureInfo.InvariantCulture), Convert.ToDouble(pt.Lon, CultureInfo.InvariantCulture) ) } ) ) ) .OrderBy(pt => pt.Distance) .FirstOrDefault(pt => pt.Distance <= 5000); if (nearestPt != null) { settings.LocationConfig.DefaultLatitude = nearestPt.Latitude; settings.LocationConfig.DefaultLongitude = nearestPt.Longitude; settings.LocationConfig.ResumeTrack = nearestPt.TrackIndex; settings.LocationConfig.ResumeTrackSeg = nearestPt.SegIndex; settings.LocationConfig.ResumeTrackPt = nearestPt.PtIndex; } } IElevationService elevationService = new ElevationService(settings); //validation auth.config if (boolNeedsSetup) { AuthAPIForm form = new AuthAPIForm(true); if (form.ShowDialog() == DialogResult.OK) { settings.Auth.APIConfig = form.Config; } } else { var apiCfg = settings.Auth.APIConfig; if (apiCfg.UsePogoDevAPI) { if (string.IsNullOrEmpty(apiCfg.AuthAPIKey)) { Logger.Write( "You select pogodev API but not provide API Key, please press any key to exit and correct you auth.json, \r\n The Pogodev API key call be purchased at - https://talk.pogodev.org/d/51-api-hashing-service-by-pokefarmer", LogLevel.Error ); Console.ReadKey(); Environment.Exit(0); } //TODO - test api call to valida auth key } else if (apiCfg.UseLegacyAPI) { Logger.Write( "You bot will start after 15 second, You are running bot with Legacy API (0.45) it will increase your risk to be banned and trigger captcha. Config captcha in config.json to auto resolve them", LogLevel.Warning ); #if RELEASE Thread.Sleep(15000); #endif } else { Logger.Write( "At least 1 authentication method is selected, please correct your auth.json, ", LogLevel.Error ); Console.ReadKey(); Environment.Exit(0); } } _session = new Session( new ClientSettings(settings, elevationService), logicSettings, elevationService, translation ); Logger.SetLoggerContext(_session); if (boolNeedsSetup) { StarterConfigForm configForm = new StarterConfigForm(_session, settings, elevationService, configFile); if (configForm.ShowDialog() == DialogResult.OK) { var fileName = Assembly.GetExecutingAssembly().Location; Process.Start(fileName); Environment.Exit(0); } //if (GlobalSettings.PromptForSetup(_session.Translation)) //{ // _session = GlobalSettings.SetupSettings(_session, settings, elevationService, configFile); // var fileName = Assembly.GetExecutingAssembly().Location; // Process.Start(fileName); // Environment.Exit(0); //} else { GlobalSettings.Load(_subPath, _enableJsonValidation); Logger.Write("Press a Key to continue...", LogLevel.Warning); Console.ReadKey(); return; } if (excelConfigAllow) { ExcelConfigHelper.MigrateFromObject(settings, excelConfigFile); } } ProgressBar.Start("NecroBot2 is starting up", 10); if (settings.WebsocketsConfig.UseWebsocket) { var websocket = new WebSocketInterface(settings.WebsocketsConfig.WebSocketPort, _session); _session.EventDispatcher.EventReceived += evt => websocket.Listen(evt, _session); } ProgressBar.Fill(20); var machine = new StateMachine(); var stats = _session.RuntimeStatistics; ProgressBar.Fill(30); var strVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(4); stats.DirtyEvent += () => Console.Title = $"[Necrobot2 v{strVersion}] " + stats.GetTemplatedStats( _session.Translation.GetTranslation(TranslationString.StatsTemplateString), _session.Translation.GetTranslation(TranslationString.StatsXpTemplateString)); ProgressBar.Fill(40); var aggregator = new StatisticsAggregator(stats); if (onBotStarted != null) { onBotStarted(_session, aggregator); } ProgressBar.Fill(50); var listener = new ConsoleEventListener(); ProgressBar.Fill(60); var snipeEventListener = new SniperEventListener(); _session.EventDispatcher.EventReceived += evt => listener.Listen(evt, _session); _session.EventDispatcher.EventReceived += evt => aggregator.Listen(evt, _session); _session.EventDispatcher.EventReceived += evt => snipeEventListener.Listen(evt, _session); ProgressBar.Fill(70); machine.SetFailureState(new LoginState()); ProgressBar.Fill(80); ProgressBar.Fill(90); _session.Navigation.WalkStrategy.UpdatePositionEvent += (lat, lng) => _session.EventDispatcher.Send(new UpdatePositionEvent { Latitude = lat, Longitude = lng }); _session.Navigation.WalkStrategy.UpdatePositionEvent += SaveLocationToDisk; ProgressBar.Fill(100); if (_session.LogicSettings.AllowMultipleBot && _session.LogicSettings.MultipleBotConfig.SelectAccountOnStartUp) { byte index = 0; Console.WriteLine(); Console.WriteLine(); Logger.Write("PLEASE SELECT AN ACCOUNT TO START. AUTO START AFTER 30 SEC"); List <Char> availableOption = new List <char>(); foreach (var item in _session.Accounts) { var ch = (char)(index + 65); availableOption.Add(ch); int day = (int)item.RuntimeTotal / 1440; int hour = (int)(item.RuntimeTotal - (day * 1400)) / 60; int min = (int)(item.RuntimeTotal - (day * 1400) - hour * 60); var runtime = $"{day:00}:{hour:00}:{min:00}:00"; Logger.Write($"{ch}. {item.GoogleUsername}{item.PtcUsername} \t\t{runtime}"); index++; } char select = ' '; DateTime timeoutvalue = DateTime.Now.AddSeconds(30); while (DateTime.Now < timeoutvalue && !availableOption.Contains(select)) { if (Console.KeyAvailable) { ConsoleKeyInfo cki = Console.ReadKey(); select = cki.KeyChar; select = Char.ToUpper(select); if (!availableOption.Contains(select)) { Console.Out.WriteLine("Please select an account from list"); } } else { Thread.Sleep(100); } } if (availableOption.Contains(select)) { var bot = _session.Accounts[select - 65]; _session.ReInitSessionWithNextBot(bot); } else { var bot = _session.Accounts.OrderBy(p => p.RuntimeTotal).First(); _session.ReInitSessionWithNextBot(bot); } } machine.AsyncStart(new VersionCheckState(), _session, _subPath, excelConfigAllow); try { Console.Clear(); } catch (IOException) { } if (settings.TelegramConfig.UseTelegramAPI) { _session.Telegram = new TelegramService(settings.TelegramConfig.TelegramAPIKey, _session); } if (_session.LogicSettings.UseSnipeLocationServer || _session.LogicSettings.HumanWalkingSnipeUsePogoLocationFeeder) { SnipePokemonTask.AsyncStart(_session); } if (_session.LogicSettings.EnableHumanWalkingSnipe && _session.LogicSettings.HumanWalkingSnipeUseFastPokemap) { HumanWalkSnipeTask.StartFastPokemapAsync(_session, _session.CancellationTokenSource.Token); // that need to keep data live } if (_session.LogicSettings.DataSharingEnable) { BotDataSocketClient.StartAsync(_session); _session.EventDispatcher.EventReceived += evt => BotDataSocketClient.Listen(evt, _session); } settings.CheckProxy(_session.Translation); if (_session.LogicSettings.ActivateMSniper) { MSniperServiceTask.ConnectToService(); _session.EventDispatcher.EventReceived += evt => MSniperServiceTask.AddToList(evt); } var trackFile = Path.GetTempPath() + "\\necrobot2.io"; if (!File.Exists(trackFile) || File.GetLastWriteTime(trackFile) < DateTime.Now.AddDays(-1)) { Thread.Sleep(10000); Thread mThread = new Thread(delegate() { var infoForm = new InfoForm(); infoForm.ShowDialog(); }); File.WriteAllText(trackFile, DateTime.Now.Ticks.ToString()); mThread.SetApartmentState(ApartmentState.STA); mThread.Start(); } QuitEvent.WaitOne(); }
public static async Task Execute(ISession session, WebSocketSession webSocketSession, string requestID) { var allItems = await HumanWalkSnipeTask.GetCurrentQueueItems(session); webSocketSession.Send(EncodingHelper.Serialize(new SnipeListResponce(allItems, requestID))); }
public static void RunBotWithParameters(Action <ISession, StatisticsAggregator> onBotStarted, string[] args) { var ioc = TinyIoC.TinyIoCContainer.Current; //Setup Logger for API APIConfiguration.Logger = new APILogListener(); //Application.EnableVisualStyles(); var strCulture = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName; var culture = CultureInfo.CreateSpecificCulture("en"); CultureInfo.DefaultThreadCurrentCulture = culture; Thread.CurrentThread.CurrentCulture = culture; AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionEventHandler; Console.Title = @"NecroBot2 Loading"; Console.CancelKeyPress += (sender, eArgs) => { QuitEvent.Set(); eArgs.Cancel = true; }; // Command line parsing var commandLine = new Arguments(args); // Look for specific arguments values if (commandLine["subpath"] != null && commandLine["subpath"].Length > 0) { _subPath = commandLine["subpath"]; } if (commandLine["jsonvalid"] != null && commandLine["jsonvalid"].Length > 0) { switch (commandLine["jsonvalid"]) { case "true": _enableJsonValidation = true; break; case "false": _enableJsonValidation = false; break; } } if (commandLine["killswitch"] != null && commandLine["killswitch"].Length > 0) { switch (commandLine["killswitch"]) { case "true": _ignoreKillSwitch = false; break; case "false": _ignoreKillSwitch = true; break; } } bool excelConfigAllow = false; if (commandLine["provider"] != null && commandLine["provider"] == "excel") { excelConfigAllow = true; } // Logger.AddLogger(new ConsoleLogger(LogLevel.Service), _subPath); Logger.AddLogger(new FileLogger(LogLevel.Service), _subPath); Logger.AddLogger(new WebSocketLogger(LogLevel.Service), _subPath); var profilePath = Path.Combine(Directory.GetCurrentDirectory(), _subPath); var profileConfigPath = Path.Combine(profilePath, "config"); var configFile = Path.Combine(profileConfigPath, "config.json"); var excelConfigFile = Path.Combine(profileConfigPath, "config.xlsm"); GlobalSettings settings; var boolNeedsSetup = false; if (File.Exists(configFile)) { // Load the settings from the config file settings = GlobalSettings.Load(_subPath, _enableJsonValidation); if (excelConfigAllow) { if (!File.Exists(excelConfigFile)) { Logger.Write( "Migrating existing json confix to excel config, please check the config.xlsm in your config folder" ); ExcelConfigHelper.MigrateFromObject(settings, excelConfigFile); } else { settings = ExcelConfigHelper.ReadExcel(settings, excelConfigFile); } Logger.Write("Bot will run with your excel config, loading excel config"); } } else { settings = new GlobalSettings { ProfilePath = profilePath, ProfileConfigPath = profileConfigPath, GeneralConfigPath = Path.Combine(Directory.GetCurrentDirectory(), "config"), ConsoleConfig = { TranslationLanguageCode = strCulture } }; boolNeedsSetup = true; } if (commandLine["latlng"] != null && commandLine["latlng"].Length > 0) { var crds = commandLine["latlng"].Split(','); try { var lat = double.Parse(crds[0]); var lng = double.Parse(crds[1]); settings.LocationConfig.DefaultLatitude = lat; settings.LocationConfig.DefaultLongitude = lng; } catch (Exception) { // ignored } } var options = new Options(); if (CommandLine.Parser.Default.ParseArguments(args, options)) { // Values are available here if (options.Init) { settings.GenerateAccount(options.IsGoogle, options.Template, options.Start, options.End, options.Password); } } var lastPosFile = Path.Combine(profileConfigPath, "LastPos.ini"); if (File.Exists(lastPosFile) && settings.LocationConfig.StartFromLastPosition) { var text = File.ReadAllText(lastPosFile); var crds = text.Split(':'); try { var lat = double.Parse(crds[0]); var lng = double.Parse(crds[1]); //If lastcoord is snipe coord, bot start from default location if (LocationUtils.CalculateDistanceInMeters(lat, lng, settings.LocationConfig.DefaultLatitude, settings.LocationConfig.DefaultLongitude) < 2000) { settings.LocationConfig.DefaultLatitude = lat; settings.LocationConfig.DefaultLongitude = lng; } } catch (Exception) { // ignored } } if (!_ignoreKillSwitch) { if (CheckMKillSwitch() || CheckKillSwitch()) { return; } } var logicSettings = new LogicSettings(settings); var translation = Translation.Load(logicSettings); TinyIoC.TinyIoCContainer.Current.Register <ITranslation>(translation); if (settings.GPXConfig.UseGpxPathing) { var xmlString = File.ReadAllText(settings.GPXConfig.GpxFile); var readgpx = new GpxReader(xmlString, translation); var nearestPt = readgpx.Tracks.SelectMany( (trk, trkindex) => trk.Segments.SelectMany( (seg, segindex) => seg.TrackPoints.Select( (pt, ptindex) => new { TrackPoint = pt, TrackIndex = trkindex, SegIndex = segindex, PtIndex = ptindex, Latitude = Convert.ToDouble(pt.Lat, CultureInfo.InvariantCulture), Longitude = Convert.ToDouble(pt.Lon, CultureInfo.InvariantCulture), Distance = LocationUtils.CalculateDistanceInMeters( settings.LocationConfig.DefaultLatitude, settings.LocationConfig.DefaultLongitude, Convert.ToDouble(pt.Lat, CultureInfo.InvariantCulture), Convert.ToDouble(pt.Lon, CultureInfo.InvariantCulture) ) } ) ) ) .OrderBy(pt => pt.Distance) .FirstOrDefault(pt => pt.Distance <= 5000); if (nearestPt != null) { settings.LocationConfig.DefaultLatitude = nearestPt.Latitude; settings.LocationConfig.DefaultLongitude = nearestPt.Longitude; settings.LocationConfig.ResumeTrack = nearestPt.TrackIndex; settings.LocationConfig.ResumeTrackSeg = nearestPt.SegIndex; settings.LocationConfig.ResumeTrackPt = nearestPt.PtIndex; } } IElevationService elevationService = new ElevationService(settings); _session = new Session(settings, new ClientSettings(settings, elevationService), logicSettings, elevationService, translation); //validation auth.config if (boolNeedsSetup) { AuthAPIForm form = new AuthAPIForm(true); if (form.ShowDialog() == DialogResult.OK) { settings.Auth.APIConfig = form.Config; } } else { var apiCfg = settings.Auth.APIConfig; if (apiCfg.UsePogoDevAPI) { if (string.IsNullOrEmpty(apiCfg.AuthAPIKey)) { Logger.Write( "You have selected PogoDev API but you have not provided an API Key, please press any key to exit and correct you auth.json, \r\n The Pogodev API key can be purchased at - https://talk.pogodev.org/d/51-api-hashing-service-by-pokefarmer", LogLevel.Error ); Console.ReadKey(); Environment.Exit(0); } try { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("X-AuthToken", apiCfg.AuthAPIKey); var maskedKey = apiCfg.AuthAPIKey.Substring(0, 4) + "".PadLeft(apiCfg.AuthAPIKey.Length - 8, 'X') + apiCfg.AuthAPIKey.Substring(apiCfg.AuthAPIKey.Length - 4, 4); HttpResponseMessage response = client.PostAsync($"https://pokehash.buddyauth.com/{_session.Client.ApiEndPoint}", null).Result; string AuthKey = response.Headers.GetValues("X-AuthToken").FirstOrDefault(); string MaxRequestCount = response.Headers.GetValues("X-MaxRequestCount").FirstOrDefault(); DateTime AuthTokenExpiration = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local).AddSeconds(Convert.ToDouble(response.Headers.GetValues("X-AuthTokenExpiration").FirstOrDefault())).ToLocalTime(); TimeSpan Expiration = AuthTokenExpiration - DateTime.Now; string Result = $"Key: {maskedKey} RPM: {MaxRequestCount} Expiration Date: {AuthTokenExpiration.Month}/{AuthTokenExpiration.Day}/{AuthTokenExpiration.Year} ({Expiration.Days} Days {Expiration.Hours} Hours {Expiration.Minutes} Minutes)"; Logger.Write(Result, LogLevel.Info, ConsoleColor.Green); } catch { Logger.Write("The HashKey is invalid or has expired, please press any key to exit and correct you auth.json, \r\n The Pogodev API key can be purchased at - https://talk.pogodev.org/d/51-api-hashing-service-by-pokefarmer", LogLevel.Error); Console.ReadKey(); Environment.Exit(0); } } else if (apiCfg.UseLegacyAPI) { Logger.Write( "You bot will start after 15 seconds, You are running bot with Legacy API (0.45), but it will increase your risk of being banned and triggering captchas. Config Captchas in config.json to auto-resolve them", LogLevel.Warning ); #if RELEASE Thread.Sleep(15000); #endif } else { Logger.Write( "At least 1 authentication method must be selected, please correct your auth.json.", LogLevel.Error ); Console.ReadKey(); Environment.Exit(0); } } ioc.Register <ISession>(_session); Logger.SetLoggerContext(_session); MultiAccountManager accountManager = new MultiAccountManager(settings, logicSettings.Bots); ioc.Register(accountManager); if (boolNeedsSetup) { StarterConfigForm configForm = new StarterConfigForm(_session, settings, elevationService, configFile); if (configForm.ShowDialog() == DialogResult.OK) { var fileName = Assembly.GetEntryAssembly().Location; Process.Start(fileName); Environment.Exit(0); } //if (GlobalSettings.PromptForSetup(_session.Translation)) //{ // _session = GlobalSettings.SetupSettings(_session, settings, elevationService, configFile); // var fileName = Assembly.GetExecutingAssembly().Location; // Process.Start(fileName); // Environment.Exit(0); //} else { GlobalSettings.Load(_subPath, _enableJsonValidation); Logger.Write("Press a Key to continue...", LogLevel.Warning); Console.ReadKey(); return; } if (excelConfigAllow) { ExcelConfigHelper.MigrateFromObject(settings, excelConfigFile); } } ProgressBar.Start("NecroBot2 is starting up", 10); ProgressBar.Fill(20); var machine = new StateMachine(); var stats = _session.RuntimeStatistics; ProgressBar.Fill(30); var strVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(4); stats.DirtyEvent += () => { GetPlayerResponse x = _session.Client.Player.GetPlayer().Result; string warn = x.Warn ? "*(Flagged)*-" : null; Console.Title = $"[Necrobot2 v{strVersion}] Team: {x.PlayerData.Team} - {warn}" + stats.GetTemplatedStats( _session.Translation.GetTranslation(TranslationString.StatsTemplateString), _session.Translation.GetTranslation(TranslationString.StatsXpTemplateString)); }; ProgressBar.Fill(40); var aggregator = new StatisticsAggregator(stats); onBotStarted?.Invoke(_session, aggregator); ProgressBar.Fill(50); var listener = new ConsoleEventListener(); ProgressBar.Fill(60); var snipeEventListener = new SniperEventListener(); _session.EventDispatcher.EventReceived += evt => listener.Listen(evt, _session); _session.EventDispatcher.EventReceived += evt => aggregator.Listen(evt, _session); _session.EventDispatcher.EventReceived += evt => snipeEventListener.Listen(evt, _session); ProgressBar.Fill(70); machine.SetFailureState(new LoginState()); ProgressBar.Fill(80); ProgressBar.Fill(90); _session.Navigation.WalkStrategy.UpdatePositionEvent += (session, lat, lng, speed) => _session.EventDispatcher.Send(new UpdatePositionEvent { Latitude = lat, Longitude = lng, Speed = speed }); _session.Navigation.WalkStrategy.UpdatePositionEvent += LoadSaveState.SaveLocationToDisk; ProgressBar.Fill(100); if (settings.WebsocketsConfig.UseWebsocket) { var websocket = new WebSocketInterface(settings.WebsocketsConfig.WebSocketPort, _session); _session.EventDispatcher.EventReceived += evt => websocket.Listen(evt, _session); } var bot = accountManager.GetStartUpAccount(); _session.ReInitSessionWithNextBot(bot); machine.AsyncStart(new VersionCheckState(), _session, _subPath, excelConfigAllow); try { Console.Clear(); } catch (IOException) { } if (settings.TelegramConfig.UseTelegramAPI) { _session.Telegram = new TelegramService(settings.TelegramConfig.TelegramAPIKey, _session); } if (_session.LogicSettings.EnableHumanWalkingSnipe && _session.LogicSettings.HumanWalkingSnipeUseFastPokemap) { HumanWalkSnipeTask.StartFastPokemapAsync(_session, _session.CancellationTokenSource.Token).ConfigureAwait(false); // that need to keep data live } if (_session.LogicSettings.UseSnipeLocationServer || _session.LogicSettings.HumanWalkingSnipeUsePogoLocationFeeder) { SnipePokemonTask.AsyncStart(_session); } if (_session.LogicSettings.DataSharingConfig.EnableSyncData) { BotDataSocketClient.StartAsync(_session, Properties.Resources.EncryptKey); _session.EventDispatcher.EventReceived += evt => BotDataSocketClient.Listen(evt, _session); } settings.CheckProxy(_session.Translation); if (_session.LogicSettings.ActivateMSniper) { ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; //temporary disable MSniper connection because site under attacking. //MSniperServiceTask.ConnectToService(); //_session.EventDispatcher.EventReceived += evt => MSniperServiceTask.AddToList(evt); } // jjskuld - Don't await the analytics service since it starts a worker thread that never returns. #pragma warning disable 4014 _session.AnalyticsService.StartAsync(_session, _session.CancellationTokenSource.Token); #pragma warning restore 4014 _session.EventDispatcher.EventReceived += evt => AnalyticsService.Listen(evt, _session); var trackFile = Path.GetTempPath() + "\\necrobot2.io"; if (!File.Exists(trackFile) || File.GetLastWriteTime(trackFile) < DateTime.Now.AddDays(-1)) { Thread.Sleep(10000); Thread mThread = new Thread(delegate() { var infoForm = new InfoForm(); infoForm.ShowDialog(); }); File.WriteAllText(trackFile, DateTime.Now.Ticks.ToString()); mThread.SetApartmentState(ApartmentState.STA); mThread.Start(); } QuitEvent.WaitOne(); }
private static void Main(string[] args) { var strCulture = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName; var culture = CultureInfo.CreateSpecificCulture("en"); CultureInfo.DefaultThreadCurrentCulture = culture; Thread.CurrentThread.CurrentCulture = culture; AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionEventHandler; Console.Title = @"NecroBot2"; Console.CancelKeyPress += (sender, eArgs) => { QuitEvent.Set(); eArgs.Cancel = true; }; // Command line parsing var commandLine = new Arguments(args); // Look for specific arguments values if (commandLine["subpath"] != null && commandLine["subpath"].Length > 0) { _subPath = commandLine["subpath"]; } if (commandLine["jsonvalid"] != null && commandLine["jsonvalid"].Length > 0) { switch (commandLine["jsonvalid"]) { case "true": _enableJsonValidation = true; break; case "false": _enableJsonValidation = false; break; } } if (commandLine["killswitch"] != null && commandLine["killswitch"].Length > 0) { switch (commandLine["killswitch"]) { case "true": _ignoreKillSwitch = false; break; case "false": _ignoreKillSwitch = true; break; } } bool excelConfigAllow = false; if (commandLine["provider"] != null && commandLine["provider"] == "excel") { excelConfigAllow = true; } Logger.AddLogger(new ConsoleLogger(LogLevel.Service), _subPath); Logger.AddLogger(new FileLogger(LogLevel.Service), _subPath); Logger.AddLogger(new WebSocketLogger(LogLevel.Service), _subPath); if (!_ignoreKillSwitch && CheckKillSwitch() || CheckMKillSwitch()) { return; } var profilePath = Path.Combine(Directory.GetCurrentDirectory(), _subPath); var profileConfigPath = Path.Combine(profilePath, "config"); var configFile = Path.Combine(profileConfigPath, "config.json"); var excelConfigFile = Path.Combine(profileConfigPath, "config.xlsm"); GlobalSettings settings; var boolNeedsSetup = false; if (File.Exists(configFile)) { // Load the settings from the config file settings = GlobalSettings.Load(_subPath, _enableJsonValidation); if (excelConfigAllow) { if (!File.Exists(excelConfigFile)) { Logger.Write("Migrating existing json confix to excel config, please check the config.xlsm in your config folder"); ExcelConfigHelper.MigrateFromObject(settings, excelConfigFile); } else { settings = ExcelConfigHelper.ReadExcel(settings, excelConfigFile); } Logger.Write("Bot will run with your excel config, loading excel config"); } } else { settings = new GlobalSettings { ProfilePath = profilePath, ProfileConfigPath = profileConfigPath, GeneralConfigPath = Path.Combine(Directory.GetCurrentDirectory(), "config"), ConsoleConfig = { TranslationLanguageCode = strCulture } }; boolNeedsSetup = true; } if (commandLine["latlng"] != null && commandLine["latlng"].Length > 0) { var crds = commandLine["latlng"].Split(','); try { var lat = double.Parse(crds[0]); var lng = double.Parse(crds[1]); settings.LocationConfig.DefaultLatitude = lat; settings.LocationConfig.DefaultLongitude = lng; } catch (Exception) { // ignored } } var lastPosFile = Path.Combine(profileConfigPath, "LastPos.ini"); if (File.Exists(lastPosFile) && settings.LocationConfig.StartFromLastPosition) { var text = File.ReadAllText(lastPosFile); var crds = text.Split(':'); try { var lat = double.Parse(crds[0]); var lng = double.Parse(crds[1]); settings.LocationConfig.DefaultLatitude = lat; settings.LocationConfig.DefaultLongitude = lng; } catch (Exception) { // ignored } } var logicSettings = new LogicSettings(settings); var translation = Translation.Load(logicSettings); if (settings.GPXConfig.UseGpxPathing) { var xmlString = File.ReadAllText(settings.GPXConfig.GpxFile); var readgpx = new GpxReader(xmlString, translation); var nearestPt = readgpx.Tracks.SelectMany( (trk, trkindex) => trk.Segments.SelectMany( (seg, segindex) => seg.TrackPoints.Select( (pt, ptindex) => new { TrackPoint = pt, TrackIndex = trkindex, SegIndex = segindex, PtIndex = ptindex, Latitude = Convert.ToDouble(pt.Lat, CultureInfo.InvariantCulture), Longitude = Convert.ToDouble(pt.Lon, CultureInfo.InvariantCulture), Distance = LocationUtils.CalculateDistanceInMeters( settings.LocationConfig.DefaultLatitude, settings.LocationConfig.DefaultLongitude, Convert.ToDouble(pt.Lat, CultureInfo.InvariantCulture), Convert.ToDouble(pt.Lon, CultureInfo.InvariantCulture) ) } ) ) ).OrderBy(pt => pt.Distance).FirstOrDefault(pt => pt.Distance <= 5000); if (nearestPt != null) { settings.LocationConfig.DefaultLatitude = nearestPt.Latitude; settings.LocationConfig.DefaultLongitude = nearestPt.Longitude; settings.LocationConfig.ResumeTrack = nearestPt.TrackIndex; settings.LocationConfig.ResumeTrackSeg = nearestPt.SegIndex; settings.LocationConfig.ResumeTrackPt = nearestPt.PtIndex; } } IElevationService elevationService = new ElevationService(settings); _session = new Session(new ClientSettings(settings, elevationService), logicSettings, elevationService, translation); Logger.SetLoggerContext(_session); if (boolNeedsSetup) { if (GlobalSettings.PromptForSetup(_session.Translation)) { _session = GlobalSettings.SetupSettings(_session, settings, elevationService, configFile); var fileName = Assembly.GetExecutingAssembly().Location; Process.Start(fileName); Environment.Exit(0); } else { GlobalSettings.Load(_subPath, _enableJsonValidation); Logger.Write("Press a Key to continue...", LogLevel.Warning); Console.ReadKey(); return; } if (excelConfigAllow) { ExcelConfigHelper.MigrateFromObject(settings, excelConfigFile); } } ProgressBar.Start("NecroBot2 is starting up", 10); if (settings.WebsocketsConfig.UseWebsocket) { var websocket = new WebSocketInterface(settings.WebsocketsConfig.WebSocketPort, _session); _session.EventDispatcher.EventReceived += evt => websocket.Listen(evt, _session); } ProgressBar.Fill(20); var machine = new StateMachine(); var stats = new Statistics(); ProgressBar.Fill(30); var strVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(4); stats.DirtyEvent += () => Console.Title = $"[Necrobot2 v{strVersion}] " + stats.GetTemplatedStats( _session.Translation.GetTranslation(TranslationString.StatsTemplateString), _session.Translation.GetTranslation(TranslationString.StatsXpTemplateString)); ProgressBar.Fill(40); var aggregator = new StatisticsAggregator(stats); ProgressBar.Fill(50); var listener = new ConsoleEventListener(); ProgressBar.Fill(60); var snipeEventListener = new SniperEventListener(); _session.EventDispatcher.EventReceived += evt => listener.Listen(evt, _session); _session.EventDispatcher.EventReceived += evt => aggregator.Listen(evt, _session); _session.EventDispatcher.EventReceived += evt => snipeEventListener.Listen(evt, _session); ProgressBar.Fill(70); machine.SetFailureState(new LoginState()); ProgressBar.Fill(80); ProgressBar.Fill(90); _session.Navigation.WalkStrategy.UpdatePositionEvent += (lat, lng) => _session.EventDispatcher.Send(new UpdatePositionEvent { Latitude = lat, Longitude = lng }); _session.Navigation.WalkStrategy.UpdatePositionEvent += SaveLocationToDisk; ProgressBar.Fill(100); if (_session.LogicSettings.AllowMultipleBot && _session.LogicSettings.MultipleBotConfig.SelectAccountOnStartUp) { byte index = 0; Console.WriteLine(); Console.WriteLine(); Logger.Write("PLEASE SELECT AN ACCOUNT TO START."); List <Char> availableOption = new List <char>(); foreach (var item in _session.Accounts) { var ch = (char)(index + 65); availableOption.Add(ch); Logger.Write($"{ch}. {item.GoogleUsername}{item.PtcUsername}"); index++; } ; char select = ' '; do { select = Console.ReadKey(true).KeyChar; Console.WriteLine(select); select = Char.ToUpper(select); }while (!availableOption.Contains(select)); var bot = _session.Accounts[select - 65]; _session.ResetSessionToWithNextBot(bot); } machine.AsyncStart(new VersionCheckState(), _session, _subPath, excelConfigAllow); try { Console.Clear(); } catch (IOException) { } if (settings.TelegramConfig.UseTelegramAPI) { _session.Telegram = new TelegramService(settings.TelegramConfig.TelegramAPIKey, _session); } if (_session.LogicSettings.UseSnipeLocationServer || _session.LogicSettings.HumanWalkingSnipeUsePogoLocationFeeder) { SnipePokemonTask.AsyncStart(_session); } if (_session.LogicSettings.EnableHumanWalkingSnipe && _session.LogicSettings.HumanWalkingSnipeUseFastPokemap) { HumanWalkSnipeTask.StartFastPokemapAsync(_session, _session.CancellationTokenSource.Token);// that need to keep data live } if (_session.LogicSettings.DataSharingEnable) { BotDataSocketClient.StartAsync(_session); _session.EventDispatcher.EventReceived += evt => BotDataSocketClient.Listen(evt, _session); } settings.CheckProxy(_session.Translation); if (_session.LogicSettings.ActivateMSniper) { MSniperServiceTask.ConnectToService(); _session.EventDispatcher.EventReceived += evt => MSniperServiceTask.AddToList(evt); } QuitEvent.WaitOne(); }