private void AcceptUserInput() { var bye = false; while (!bye) { var input = Console.ReadLine(); if (input == null) { continue; } var spInput = input.Split(':'); switch (spInput[0]) { case "pizza": var pres = _spi.InitiatePurchaseTx(RequestIdHelper.Id("pizza"), 1000); if (!pres.Initiated) { Console.WriteLine($"# Could not initiate purchase: {pres.Message}. Please Retry."); } break; case "yuck": var yuckres = _spi.InitiateRefundTx(RequestIdHelper.Id("yuck"), 1000); if (!yuckres.Initiated) { Console.WriteLine($"# Could not initiate refund: {yuckres.Message}. Please Retry."); } break; case "pos_id": Console.Clear(); if (_spi.SetPosId(spInput[1])) { _posId = spInput[1]; Console.WriteLine($"## -> POS ID now set to {_posId}"); } else { Console.WriteLine($"## -> Could not set POS ID"); } PrintStatusAndActions(); Console.Write("> "); break; case "eftpos_address": Console.Clear(); if (_spi.SetEftposAddress(spInput[1])) { _eftposAddress = spInput[1]; Console.WriteLine($"## -> Eftpos Address now set to {_eftposAddress}"); } else { Console.WriteLine($"## -> Could not set Eftpos Address"); } PrintStatusAndActions(); Console.Write("> "); break; case "pair": _spi.Pair(); break; case "pair_cancel": _spi.PairingCancel(); break; case "pair_confirm": _spi.PairingConfirmCode(); break; case "unpair": _spi.Unpair(); break; case "tx_sign_accept": _spi.AcceptSignature(true); break; case "tx_sign_decline": _spi.AcceptSignature(false); break; case "tx_cancel": _spi.CancelTransaction(); break; case "settle": var settleres = _spi.InitiateSettleTx(RequestIdHelper.Id("settle")); if (!settleres.Initiated) { Console.WriteLine($"# Could not initiate settlement: {settleres.Message}. Please Retry."); } break; case "ok": Console.Clear(); _spi.AckFlowEndedAndBackToIdle(); PrintStatusAndActions(); Console.Write("> "); break; case "status": Console.Clear(); PrintStatusAndActions(); break; case "bye": bye = true; break; case "": Console.Write("> "); break; default: Console.WriteLine("# I don't understand. Sorry."); break; } } Console.WriteLine("# BaBye!"); if (_spiSecrets != null) { Console.WriteLine($"{_posId}:{_eftposAddress}:{_spiSecrets.EncKey}:{_spiSecrets.HmacKey}"); } }
private void StartHammering() { if (_hammering) { Console.WriteLine("Already Hammering."); } _txAttempts = 0; _disconnects = 0; _reconnects = 0; _lastConnect = DateTime.Now; _lastDisconnect = DateTime.Now; _connectedDuration = TimeSpan.Zero; _disconnectedDuration = TimeSpan.Zero; _txSuccesses = new Dictionary <Message.SuccessState, int>(); var tmt = new Thread(() => { Thread.CurrentThread.IsBackground = true; while (_hammering) { Console.WriteLine("Initing a purchase"); _spi.InitiatePurchaseTx(RequestIdHelper.Id("prchs"), 1000); _txAttempts += 1; do { Thread.Sleep(1000); } while (!_spi.CurrentTxFlowState.Finished); Console.WriteLine("purchase finished"); if (_txSuccesses.ContainsKey(_spi.CurrentTxFlowState.Success)) { _txSuccesses[_spi.CurrentTxFlowState.Success] += 1; } else { _txSuccesses[_spi.CurrentTxFlowState.Success] = 1; } _spi.AckFlowEndedAndBackToIdle(); if (!_hammering) { continue; } var delay = RandomGen.Next(_minTxGap, _maxTxGap); PrintHammerStats(); Console.WriteLine($"Sleeping {delay}ms before next transaction"); Thread.Sleep(delay); } if (_spi.CurrentStatus == SpiStatus.PairedConnected) { _connectedDuration = _connectedDuration.Add(DateTime.Now.Subtract(_lastConnect)); } else { _disconnectedDuration = _disconnectedDuration.Add(DateTime.Now.Subtract(_lastDisconnect)); } Console.WriteLine("Stopped Hammering."); Log.Info("Stopped Hammering."); PrintHammerStats(); // Log into app log as well. Log.Info($"Attempts {_txAttempts}"); Log.Info($"Disconnects {_disconnects}"); Log.Info($"Reconnects {_reconnects}"); Log.Info($"Time Connected {_connectedDuration}"); Log.Info($"Time Diconnected {_disconnectedDuration}"); Log.InfoFormat("Successes {0}", (_txSuccesses.ContainsKey(Message.SuccessState.Success)) ? _txSuccesses[Message.SuccessState.Success] : 0); Log.InfoFormat("Failures {0}", (_txSuccesses.ContainsKey(Message.SuccessState.Failed)) ? _txSuccesses[Message.SuccessState.Failed] : 0); Log.InfoFormat("Unknowns {0}", (_txSuccesses.ContainsKey(Message.SuccessState.Unknown)) ? _txSuccesses[Message.SuccessState.Unknown] : 0); }); _hammering = true; Console.WriteLine("Starting Hammering."); Log.Info("Starting Hammering."); tmt.Start(); }