public async Task Start(IState initialState, Session session, CancellationToken cancellationToken = default(CancellationToken)) { _ctx = session; var state = initialState; do { try { state = await state.Execute(session, cancellationToken); } catch (InvalidResponseException) { session.EventDispatcher.Send(new ErrorEvent { Message = "The PokemonGo servers are having a bad time, chill." }); } catch (OperationCanceledException) { session.EventDispatcher.Send(new ErrorEvent { Message = "The bot was stopped." }); return; } catch (Exception ex) { session.EventDispatcher.Send(new ErrorEvent { Message = ex.ToString() }); state = _initialState; } } while (state != null); }
public WebSocketInterface(int port, Session session) { _session = session; var translations = session.Translation; _server = new WebSocketServer(); _websocketHandler = WebSocketEventManager.CreateInstance(); var setupComplete = _server.Setup(new ServerConfig { Name = "NecroWebSocket", Ip = "Any", Port = port, Mode = SocketMode.Tcp, Security = "tls", Certificate = new CertificateConfig { FilePath = @"cert.pfx", Password = "******" } }); if (setupComplete == false) { Logger.Write(translations.GetTranslation(TranslationString.WebSocketFailStart, port), LogLevel.Error); return; } _server.NewMessageReceived += HandleMessage; _server.NewSessionConnected += HandleSession; _server.Start(); }
public async Task Start(IState initialState, Session session, CancellationToken cancellationToken = default(CancellationToken)) { var state = initialState; do { try { state = await state.Execute(session, cancellationToken); } catch (InvalidResponseException) { session.EventDispatcher.Send(new ErrorEvent { Message = "Niantic Servers unstable, throttling API Calls." }); } catch (OperationCanceledException) { session.EventDispatcher.Send(new ErrorEvent {Message = "Current Operation was canceled."}); state = _initialState; } catch (Exception ex) { session.EventDispatcher.Send(new ErrorEvent {Message = ex.ToString()}); state = _initialState; } } while (state != null); }
public void HandleEvent(TransferPokemonEvent evt, Session session) { Logger.Write( session.Translations.GetTranslation(TranslationString.EventPokemonTransferred, evt.Id, evt.Cp, evt.Perfection.ToString("0.00"), evt.BestCp, evt.BestPerfection.ToString("0.00"), evt.FamilyCandies), LogLevel.Transfer); }
public async Task Start(IState initialState, Session session, CancellationToken cancellationToken = default(CancellationToken)) { Logging.Logger.Write("Version 1.0.5 : 2016.08.02 14:18", Logging.LogLevel.Self, ConsoleColor.Yellow); var state = initialState; do { try { state = await state.Execute(session, cancellationToken); } catch (InvalidResponseException) { session.EventDispatcher.Send(new ErrorEvent { Message = "Niantic Servers unstable, throttling API Calls." }); } catch (OperationCanceledException) { session.EventDispatcher.Send(new ErrorEvent { Message = "Current Operation was canceled." }); state = _initialState; } catch (Exception ex) { session.EventDispatcher.Send(new ErrorEvent { Message = ex.ToString() }); state = _initialState; } } while (state != null); }
public void HandleEvent(PokemonEvolveEvent evt, Session session) { Logger.Write(evt.Result == EvolvePokemonResponse.Types.Result.Success ? session.Translations.GetTranslation(TranslationString.EventPokemonEvolvedSuccess, evt.Id, evt.Exp) : session.Translations.GetTranslation(TranslationString.EventPokemonEvolvedFailed, evt.Id, evt.Result, evt.Id), LogLevel.Evolve); }
public void HandleEvent(PokemonCaptureEvent evt, Session session) { if (evt.Status == CatchPokemonResponse.Types.CatchStatus.CatchSuccess) { _stats.TotalExperience += evt.Exp; _stats.TotalPokemons++; _stats.TotalStardust = evt.Stardust; _stats.Dirty(session.Inventory); } }
/// <summary> /// This is used for dumping contents to a file stored in the Logs folder. /// </summary> /// <param name="data">Dumps the string data to the file</param> /// <param name="filename">Filename to be used for naming the file.</param> private static void DumpToFile(Session ctx, string data, string filename) { string path = Path.Combine(ctx.LogicSettings.ProfilePath,"Dumps",$"NecroBot-{filename}-{DateTime.Today.ToString("yyyy-MM-dd")}-{DateTime.Now.ToString("HH")}.txt"); using ( var dumpFile = File.AppendText(path) ) { dumpFile.WriteLine(data); dumpFile.Flush(); } }
public async Task Start(IState initialState, Session session, CancellationToken cancellationToken = default(CancellationToken)) { var state = initialState; var profilePath = Path.Combine(Directory.GetCurrentDirectory(), ""); var profileConfigPath = Path.Combine(profilePath, "config"); FileSystemWatcher configWatcher = new FileSystemWatcher(); configWatcher.Path = profileConfigPath; configWatcher.Filter = "config.json"; configWatcher.NotifyFilter = NotifyFilters.LastWrite; configWatcher.EnableRaisingEvents = true; configWatcher.Changed += (sender, e) => { if (e.ChangeType == WatcherChangeTypes.Changed) { session.LogicSettings = new LogicSettings(GlobalSettings.Load("")); configWatcher.EnableRaisingEvents = !configWatcher.EnableRaisingEvents; configWatcher.EnableRaisingEvents = !configWatcher.EnableRaisingEvents; Logger.Write(" ##### config.json ##### ", LogLevel.Info); } }; do { try { state = await state.Execute(session, cancellationToken); } catch (InvalidResponseException) { session.EventDispatcher.Send(new ErrorEvent { Message = "Niantic Servers unstable, throttling API Calls." }); } catch (OperationCanceledException) { session.EventDispatcher.Send(new ErrorEvent {Message = "Current Operation was canceled."}); state = _initialState; } catch (Exception ex) { session.EventDispatcher.Send(new ErrorEvent {Message = "Pokemon Servers might be offline / unstable. Trying again..."}); Thread.Sleep(1000); session.EventDispatcher.Send(new ErrorEvent { Message = "Error: " + ex }); state = _initialState; } } while (state != null); configWatcher.EnableRaisingEvents = false; configWatcher.Dispose(); }
public void Listen(IEvent evt, Session session) { dynamic eve = evt; try { HandleEvent(eve); } catch { // ignored } Broadcast(Serialize(eve)); }
public async Task Start(IState initialState, Session session) { _ctx = session; var state = initialState; do { try { state = await state.Execute(session); } catch (Exception ex) { session.EventDispatcher.Send(new ErrorEvent {Message = ex.ToString()}); state = _initialState; } } while (state != null); }
public async Task Start(IState initialState, Session session) { _ctx = session; var state = initialState; do { try { state = await state.Execute(session); } catch(InvalidResponseException) { session.EventDispatcher.Send(new ErrorEvent { Message = "The PokemonGo servers are having a bad time, chill." }); } catch (Exception ex) { session.EventDispatcher.Send(new ErrorEvent {Message = ex.ToString()}); state = _initialState; } } while (state != null); }
public void SetContext(Session session) { _ctx = session; }
private static void Main(string[] args) { var subPath = ""; if (args.Length > 0) subPath = args[0]; Logger.SetLogger(new ConsoleLogger(LogLevel.Info), subPath); var settings = GlobalSettings.Load(subPath); if (settings == null) { Logger.Write("This is your first start and the bot will use the default config!", LogLevel.Warning); Logger.Write("Continue? (y/n)", LogLevel.Warning); if (!Console.ReadLine().ToUpper().Equals("Y")) return; settings = GlobalSettings.Load(subPath); } var session = new Session(new ClientSettings(settings), new LogicSettings(settings)); /*SimpleSession session = new SimpleSession { _client = new PokemonGo.RocketAPI.Client(new ClientSettings(settings)), _dispatcher = new EventDispatcher(), _localizer = new Localizer() }; BotService service = new BotService { _session = session, _loginTask = new Login(session) }; service.Run(); */ var machine = new StateMachine(); var stats = new Statistics(); stats.DirtyEvent += () => Console.Title = stats.ToString(); var aggregator = new StatisticsAggregator(stats); var listener = new ConsoleEventListener(); var websocket = new WebSocketInterface(settings.WebSocketPort); session.EventDispatcher.EventReceived += (IEvent evt) => listener.Listen(evt, session); session.EventDispatcher.EventReceived += (IEvent evt) => aggregator.Listen(evt, session); session.EventDispatcher.EventReceived += (IEvent evt) => websocket.Listen(evt, session); machine.SetFailureState(new LoginState()); Logger.SetLoggerContext(session); session.Navigation.UpdatePositionEvent += (lat, lng) => session.EventDispatcher.Send(new UpdatePositionEvent {Latitude = lat, Longitude = lng}); session.Client.Login.GoogleDeviceCodeEvent += (usercode, uri) => { try { Logger.Write(session.Translations.GetTranslation(Logic.Common.TranslationString.OpeningGoogleDevicePage), LogLevel.Warning); Thread.Sleep(5000); Process.Start(uri); var thread = new Thread(() => Clipboard.SetText(usercode)); //Copy device code thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA thread.Start(); thread.Join(); } catch (Exception) { Logger.Write(session.Translations.GetTranslation(Logic.Common.TranslationString.CouldntCopyToClipboard), LogLevel.Error); Logger.Write(session.Translations.GetTranslation(Logic.Common.TranslationString.CouldntCopyToClipboard2, uri, usercode), LogLevel.Error); } }; machine.AsyncStart(new VersionCheckState(), session); Console.ReadLine(); }
private static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionEventHandler; Console.Title = "NecroBot starting"; Console.CancelKeyPress += (sender, eArgs) => { QuitEvent.Set(); eArgs.Cancel = true; }; var culture = CultureInfo.CreateSpecificCulture("en-US"); CultureInfo.DefaultThreadCurrentCulture = culture; Thread.CurrentThread.CurrentCulture = culture; if (args.Length > 0) subPath = args[0]; Logger.SetLogger(new ConsoleLogger(LogLevel.Info), subPath); var settings = GlobalSettings.Load(subPath); if (settings == null) { Logger.Write("Press a Key to continue...", LogLevel.Warning); Console.ReadKey(); return; } var session = new Session(new ClientSettings(settings), new LogicSettings(settings)); session.Client.ApiFailure = new ApiFailureStrategy(session); /*SimpleSession session = new SimpleSession { _client = new PokemonGo.RocketAPI.Client(new ClientSettings(settings)), _dispatcher = new EventDispatcher(), _localizer = new Localizer() }; BotService service = new BotService { _session = session, _loginTask = new Login(session) }; service.Run(); */ var machine = new StateMachine(); var stats = new Statistics(); stats.DirtyEvent += () => Console.Title = stats.GetTemplatedStats( session.Translation.GetTranslation(TranslationString.StatsTemplateString), session.Translation.GetTranslation(TranslationString.StatsXpTemplateString)); var aggregator = new StatisticsAggregator(stats); var listener = new ConsoleEventListener(); var websocket = new WebSocketInterface(settings.WebSocketPort, session); session.EventDispatcher.EventReceived += evt => listener.Listen(evt, session); session.EventDispatcher.EventReceived += evt => aggregator.Listen(evt, session); session.EventDispatcher.EventReceived += evt => websocket.Listen(evt, session); machine.SetFailureState(new LoginState()); Logger.SetLoggerContext(session); session.Navigation.UpdatePositionEvent += (lat, lng) => session.EventDispatcher.Send(new UpdatePositionEvent {Latitude = lat, Longitude = lng}); session.Navigation.UpdatePositionEvent += Navigation_UpdatePositionEvent; machine.AsyncStart(new VersionCheckState(), session); if (session.LogicSettings.UseSnipeLocationServer) SnipePokemonTask.AsyncStart(session); QuitEvent.WaitOne(); }
public Task AsyncStart(IState initialState, Session session, CancellationToken cancellationToken = default(CancellationToken)) { return Task.Run(() => Start(initialState, session, cancellationToken), cancellationToken); }
public void HandleEvent(FortUsedEvent evt, Session session) { Logger.Write( session.Translations.GetTranslation(TranslationString.EventFortUsed, evt.Name, evt.Exp, evt.Gems, evt.Items), LogLevel.Pokestop); }
public Task AsyncStart(IState initialState, Session session) { return Task.Run(() => Start(initialState, session)); }
public static async Task Start(Session session, CancellationToken cancellationToken) { while (true) { cancellationToken.ThrowIfCancellationRequested(); try { TcpClient lClient = new TcpClient(); lClient.Connect(session.LogicSettings.SnipeLocationServer, session.LogicSettings.SnipeLocationServerPort); var sr = new StreamReader(lClient.GetStream()); while (lClient.Connected) { var line = sr.ReadLine(); if (line == null) throw new Exception("Unable to ReadLine from sniper socket"); var info = JsonConvert.DeserializeObject<SniperInfo>(line); if (snipeLocations.Any(x => Math.Abs(x.latitude - info.latitude) < 0.0001 && Math.Abs(x.longitude - info.longitude) < 0.0001)) // we might have different precisions from other sources continue; snipeLocations.RemoveAll(x => DateTime.Now > x.timeStampAdded.AddMinutes(15)); snipeLocations.Add(info); } } catch (SocketException) { // this is spammed to often. Maybe add it to debug log later } catch (Exception ex) { // most likely System.IO.IOException session.EventDispatcher.Send(new ErrorEvent { Message = ex.ToString() }); } await Task.Delay(5000, cancellationToken); } }
public static async Task Start(Session session, CancellationToken cancellationToken) { while (true) { if (session.LogicSettings.UseSnipeOnlineLocationServer) { try { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); var response =await httpClient.GetAsync("http://pokesnipers.com/api/v1/pokemon.json", cancellationToken); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); dynamic pokesniper = JsonConvert.DeserializeObject(json); JArray results = pokesniper.results; SnipeLocations.Clear(); foreach (var result in results) { PokemonId id; Enum.TryParse(result.Value<string>("name"), out id); var a = new SniperInfo { Id = id, Iv = 100, Latitude = Convert.ToDouble(result.Value<string>("coords").Split(',')[0]), Longitude = Convert.ToDouble(result.Value<string>("coords").Split(',')[1]), TimeStamp = DateTime.Now }; SnipeLocations.Add(a); } } } catch (Exception e) { // ignored } } else { cancellationToken.ThrowIfCancellationRequested(); try { var lClient = new TcpClient(); lClient.Connect(session.LogicSettings.SnipeLocationServer, session.LogicSettings.SnipeLocationServerPort); var sr = new StreamReader(lClient.GetStream()); while (lClient.Connected) { var line = sr.ReadLine(); if (line == null) throw new Exception("Unable to ReadLine from sniper socket"); var info = JsonConvert.DeserializeObject<SniperInfo>(line); if (SnipeLocations.Any(x => Math.Abs(x.Latitude - info.Latitude) < 0.0001 && Math.Abs(x.Longitude - info.Longitude) < 0.0001)) // we might have different precisions from other sources continue; SnipeLocations.RemoveAll(x => DateTime.Now > x.TimeStampAdded.AddMinutes(15)); SnipeLocations.Add(info); } } catch (SocketException) { // this is spammed to often. Maybe add it to debug log later } catch (Exception ex) { // most likely System.IO.IOException session.EventDispatcher.Send(new ErrorEvent {Message = ex.ToString()}); } } await Task.Delay(5000, cancellationToken); } }
public static Session SetupSettings(Session session, GlobalSettings settings, String configPath) { Session newSession = SetupTranslationCode(session, session.Translation, settings); SetupAccountType(newSession.Translation, settings); SetupUserAccount(newSession.Translation, settings); SetupConfig(newSession.Translation, settings); SaveFiles(settings, configPath); Logger.Write(session.Translation.GetTranslation(TranslationString.FirstStartSetupCompleted), LogLevel.None); return newSession; }
public void HandleEvent(FortTargetEvent evt, Session session) { Logger.Write( session.Translations.GetTranslation(TranslationString.EventFortTargeted, evt.Name, Math.Round(evt.Distance)), LogLevel.Info, ConsoleColor.DarkRed); }
public void HandleEvent(PokemonCaptureEvent evt, Session session) { Func<ItemId, string> returnRealBallName = a => { switch (a) { case ItemId.ItemPokeBall: return session.Translations.GetTranslation(TranslationString.Pokeball); case ItemId.ItemGreatBall: return session.Translations.GetTranslation(TranslationString.GreatPokeball); case ItemId.ItemUltraBall: return session.Translations.GetTranslation(TranslationString.UltraPokeball); case ItemId.ItemMasterBall: return session.Translations.GetTranslation(TranslationString.MasterPokeball); default: return session.Translations.GetTranslation(TranslationString.CommonWordUnknown); } }; var catchType = evt.CatchType; string strStatus; switch (evt.Status) { case CatchPokemonResponse.Types.CatchStatus.CatchError: strStatus = session.Translations.GetTranslation(TranslationString.CatchStatusError); break; case CatchPokemonResponse.Types.CatchStatus.CatchEscape: strStatus = session.Translations.GetTranslation(TranslationString.CatchStatusEscape); break; case CatchPokemonResponse.Types.CatchStatus.CatchFlee: strStatus = session.Translations.GetTranslation(TranslationString.CatchStatusFlee); break; case CatchPokemonResponse.Types.CatchStatus.CatchMissed: strStatus = session.Translations.GetTranslation(TranslationString.CatchStatusMissed); break; case CatchPokemonResponse.Types.CatchStatus.CatchSuccess: strStatus = session.Translations.GetTranslation(TranslationString.CatchStatusSuccess); break; default: strStatus = evt.Status.ToString(); break; } var catchStatus = evt.Attempt > 1 ? session.Translations.GetTranslation(TranslationString.CatchStatusAttempt, strStatus, evt.Attempt) : session.Translations.GetTranslation(TranslationString.CatchStatus, strStatus); var familyCandies = evt.FamilyCandies > 0 ? session.Translations.GetTranslation(TranslationString.Candies, evt.FamilyCandies) : ""; Logger.Write( session.Translations.GetTranslation(TranslationString.EventPokemonCapture, catchStatus, catchType, evt.Id, evt.Level, evt.Cp, evt.MaxCp, evt.Perfection.ToString("0.00"), evt.Probability, evt.Distance.ToString("F2"), returnRealBallName(evt.Pokeball), evt.BallAmount, familyCandies), LogLevel.Caught); }
/// <summary> /// Dumps data to a file /// </summary> /// <param name="data">Dumps the string data to the file</param> /// <param name="filename">Filename to be used for naming the file.</param> public static void Dump(Session ctx, string data, string filename) { string uniqueFileName = $"{filename}"; DumpToFile(ctx, data, uniqueFileName); }
/// <summary> /// Clears the specified dumpfile. /// </summary> /// <param name="filename">File to clear/param> public static void ClearDumpFile(Session ctx, string filename) { string path = Path.Combine(ctx.LogicSettings.ProfilePath,"Dumps",$"NecroBot-{filename}-{DateTime.Today.ToString("yyyy-MM-dd")}-{DateTime.Now.ToString("HH")}.txt"); // Clears all contents of a file first if overwrite is true File.WriteAllText(path, string.Empty); }
/// <summary> /// Sets Context for the logger /// </summary> /// <param name="session">Context</param> public static void SetLoggerContext(Session session) { if (_logger != null) _logger.SetContext(session); }
public static Task AsyncStart(Session session, CancellationToken cancellationToken = default(CancellationToken)) { return Task.Run(() => Start(session, cancellationToken), cancellationToken); }
private static void Main(string[] args) { var subPath = ""; if (args.Length > 0) subPath = args[0]; Logger.SetLogger(new ConsoleLogger(LogLevel.Info), subPath); var settings = GlobalSettings.Load(subPath); if (settings == null) { Logger.Write("This is your first start and the bot has generated the default config!", LogLevel.Warning); Logger.Write("We will now shutdown to let you configure the bot and then launch it again.", LogLevel.Warning); Thread.Sleep(2000); Environment.Exit(0); return; } var session = new Session(new ClientSettings(settings), new LogicSettings(settings)); /*SimpleSession session = new SimpleSession { _client = new PokemonGo.RocketAPI.Client(new ClientSettings(settings)), _dispatcher = new EventDispatcher(), _localizer = new Localizer() }; BotService service = new BotService { _session = session, _loginTask = new Login(session) }; service.Run(); */ var machine = new StateMachine(); var stats = new Statistics(); stats.DirtyEvent += () => Console.Title = stats.GetTemplatedStats(session.Translation.GetTranslation(Logic.Common.TranslationString.StatsTemplateString), session.Translation.GetTranslation(Logic.Common.TranslationString.StatsXpTemplateString)); var aggregator = new StatisticsAggregator(stats); var listener = new ConsoleEventListener(); var websocket = new WebSocketInterface(settings.WebSocketPort, session.Translation); session.EventDispatcher.EventReceived += (IEvent evt) => listener.Listen(evt, session); session.EventDispatcher.EventReceived += (IEvent evt) => aggregator.Listen(evt, session); session.EventDispatcher.EventReceived += (IEvent evt) => websocket.Listen(evt, session); machine.SetFailureState(new LoginState()); Logger.SetLoggerContext(session); session.Navigation.UpdatePositionEvent += (lat, lng) => session.EventDispatcher.Send(new UpdatePositionEvent {Latitude = lat, Longitude = lng}); machine.AsyncStart(new VersionCheckState(), session); //Non-blocking key reader //This will allow to process console key presses in another code parts while (true) { if (Console.KeyAvailable) { var info = Console.ReadKey(); if (info.Key == ConsoleKey.Enter) break; } Thread.Sleep(5); } }
private static Session SetupTranslationCode(Session session, ITranslation translator, GlobalSettings settings) { Logger.Write(translator.GetTranslation(TranslationString.FirstStartLanguagePrompt, "Y", "N"), LogLevel.None); string strInput; bool boolBreak = false; while (!boolBreak) { strInput = Console.ReadLine().ToLower(); switch (strInput) { case "y": boolBreak = true; break; case "n": return session; default: Logger.Write(translator.GetTranslation(TranslationString.PromptError, "y", "n"), LogLevel.Error); continue; } } Logger.Write(translator.GetTranslation(TranslationString.FirstStartLanguageCodePrompt)); strInput = Console.ReadLine(); settings.TranslationLanguageCode = strInput; session = new Session(new ClientSettings(settings), new LogicSettings(settings)); translator = session.Translation; Logger.Write(translator.GetTranslation(TranslationString.FirstStartLanguageConfirm, strInput)); return session; }
public void HandleEvent(FortFailedEvent evt, Session session) { Logger.Write(session.Translations.GetTranslation(TranslationString.EventFortFailed, evt.Name, evt.Try, evt.Max), LogLevel.Pokestop, ConsoleColor.DarkRed); }