Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
4affa27
added GraphicsCard class and ReturnOfInvestmentCalculator class
Apr 18, 2021
f6d27d9
Updated method which calculate price
h00jraq Apr 19, 2021
b269b30
Implemented Factory Pattern,
Apr 23, 2021
0b4d57c
Added one UnitTest for CryptoFactory
h00jraq Apr 25, 2021
ee5dc1e
Added more tests for Factory
h00jraq Apr 26, 2021
1da8aac
added new class for asic devices
h00jraq Apr 26, 2021
0890f4a
added new main class for all computing devices, added new class for c…
h00jraq Apr 28, 2021
f1063c5
added class/api for getting currency exchange rate
h00jraq Apr 29, 2021
b687f48
added method for enum parsing
h00jraq Apr 29, 2021
1469b5c
Changed Project Structure,
Apr 30, 2021
c058f54
changed ChooseCurrencyType() method
Apr 30, 2021
89c1478
Fixed error with ExchangeRateAPI,
h00jraq May 2, 2021
1e890b4
adding way to list devices type
h00jraq May 3, 2021
4e39578
fixed query for displaying types in the list of computing devices
h00jraq May 3, 2021
cf91ea7
added another query for devices
h00jraq May 3, 2021
e6bd4f8
Added rest logic for choosing computing device
h00jraq May 9, 2021
db0f8fc
moved logic for chosing computing device to ChooseDevice method
h00jraq May 10, 2021
5549d1d
Partial Commit: working with Currency methods
h00jraq May 11, 2021
3a26869
Moved some for handling currency code to new methods
May 12, 2021
3eca3b8
Added API for CryptoCurrencyData
May 12, 2021
cad4a73
moved login for creating crypto based on enum type to
May 13, 2021
985fe24
Trying to implement RoI method but have a problem
May 13, 2021
3dc25a6
fixed error with displaying chosen computing device
May 13, 2021
0f2ec0b
Fixed method that CalculateRoi
May 13, 2021
267897f
Changed algorithm for calculating ROI for Bitcoin (different compared…
May 13, 2021
ffa2c14
Changed enum validation(for currency) for better handling invalid
May 13, 2021
24a23bb
Changed method for handling crypto currency
May 13, 2021
053300e
removed some comments
May 13, 2021
b8f8981
removed more comments...
May 13, 2021
c611752
added some checks for input values
May 13, 2021
f625178
Improved some methods so loops works as they should
May 28, 2021
fc67cd6
changed ChoseCryptoCurrency so loop works correctly and user have to …
May 28, 2021
c78ff72
changed ChooseComputingDevice method so it list
May 28, 2021
44ab5c8
Partial commit (working from laptop)
May 28, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .idea/.idea.Cryptocurrencies/.idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions .idea/.idea.Cryptocurrencies/.idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/.idea.Cryptocurrencies/.idea/indexLayout.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/.idea.Cryptocurrencies/.idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions ClientApplication/ClientApplication.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Cryptocurrencies.ROI.Calculator\Cryptocurrencies.ROI.Calculator.csproj" />
</ItemGroup>

</Project>
302 changes: 302 additions & 0 deletions ClientApplication/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,302 @@
using System;
using System.Collections.Generic;
using Cryptocurrencies.ROI.Calculator.Domain;
using System.Linq;
using Newtonsoft.Json;
using Cryptocurrencies.ROI.Calculator.Domain.ComputingDevices;
using Cryptocurrencies.ROI.Calculator.Domain.CryptoCurrencies;
using Cryptocurrencies.ROI.Calculator.HelperClasses;
using Cryptocurrencies.ROI.Calculator.Infrastructure;

namespace ClientApplication
{
class Program
{
static void Main(string[] args)
{
try
{
var device = ChooseBaseDevice();
var manufacturer = ChooseDeviceManufacturer(device);
//var device = ChooseComputingDevice()?.First();
var chosenCurrency = ChoseCurrencyRate();
UserConsole.AskChooseCryptoCurrency();
var chosenCryptoCurrency = ChoseCryptoCurrency();
// var device = ChooseComputingDevice()?.First();
UserConsole.DisplayChosenDevice(device);
var myCrypto = CreateCrypto(chosenCryptoCurrency);
UserConsole.Ask_PowerConsumptionPerHour();
var powerConsumptionPerHour = UserConsole.ReadPowerConsumptionPerHour();
var energyPricePerKwh = UserConsole.ReadPricePerKWH();
var roiInDays = myCrypto.CalculateRoIinDays(device, powerConsumptionPerHour, energyPricePerKwh, chosenCurrency);
Console.WriteLine($"You will get your money back after " + roiInDays + " days of mining 24 hours/day");
Console.WriteLine("--------The End--------");
}
catch (Exception e)
{
Console.WriteLine(e);
}
}


private static CryptoCurrencyTypes ChoseCryptoCurrency()
{
foreach (var enumerator in Enum.GetValues<CryptoCurrencyTypes>())
{
Console.WriteLine($"- {(int)enumerator}, {enumerator} ");
}
//Console.Write("Your currency: ");
CryptoCurrencyTypes chosenCryptoCurrency = 0;
var success = false;
do
{
Console.Write("Your currency: ");
if (!Int32.TryParse(Console.ReadLine(), out int value) || !TryParseCurrencyEnum(value, out CryptoCurrencyTypes currencyValue))
{
Console.WriteLine("That currency does not exist!");
}
else
{
chosenCryptoCurrency = currencyValue;
Console.WriteLine($"You have chosen " + chosenCryptoCurrency + " as Crypto Currency \n");
success = true;
}

}
while (!success);
return chosenCryptoCurrency;
}

private static ICalculateRoi CreateCrypto(CryptoCurrencyTypes choosenCryptoCurrency) => choosenCryptoCurrency switch
{
CryptoCurrencyTypes.Ethereum => CryptoCurrencyFactory.CreateCrypto(CryptoCurrencyTypes.Ethereum, 3991.7733m, 4.446598m, 7503377692267855),
CryptoCurrencyTypes.Bitcoin => CryptoCurrencyFactory.CreateCrypto(CryptoCurrencyTypes.Bitcoin, 50435.2699m, 6.88159m, 18046e16m),
_ => throw new ArgumentOutOfRangeException(nameof(choosenCryptoCurrency), $"Not expected crypto value: {choosenCryptoCurrency}"),
};
private static double ChoseCurrencyRate()
{
double myCurrency = 0;
try
{
var yourCurrency = ChooseCurrencyType();
var exchangeRateResult = ExchangeRateProvider.Import();
var conversionRateResult = exchangeRateResult.ConversionRates;
var conversionRate = conversionRateResult.GetType().GetProperty(yourCurrency)?.GetValue(conversionRateResult, null);
Console.WriteLine($"Conversion rate from $ to " + yourCurrency + " is " + conversionRate);
return (double)conversionRateResult.GetType().GetProperty(yourCurrency).GetValue(conversionRateResult, null);
}
catch
{
Console.WriteLine("API comunication error");
}
return myCurrency;
}

static ComputingDevice ChooseBaseDevice()
{

bool success = false;
Console.WriteLine("Please choose what kind of device you are using to mine CryptoCurrency: ");
var listOfDevices = DevicesProvider.AvailableDevices.Where(p => p.GetType().BaseType == typeof(ComputingDevice))
.GroupBy(p => p.GetType().Name)
.Select(g => g.First())
.ToList();

var device = listOfDevices.First();

foreach (var item in listOfDevices)
{
Console.WriteLine("-" + listOfDevices.IndexOf(item) + " " + item.GetType().Name);
}
do
{
Console.Write("Device type: ");
if(!Int32.TryParse(Console.ReadLine(), out int value) || !listOfDevices.Exists(x => x.Id == value))
{
Console.WriteLine("That base type does not exist");
}
else
{
success = true;
device = listOfDevices[value];
}
}
while (!success);



return device;

}

static ComputingDevice ChooseDeviceManufacturer(ComputingDevice device)
{
Console.WriteLine("\n");
bool success = false;
Console.WriteLine("Please choose what kind of device you are using to mine CryptoCurrency: ");
var manufacturers = DevicesProvider.AvailableDevices.Where(p => p.GetType().Name == device.GetType().Name)
.GroupBy(p => p.Manufacturer)
.Select(p => p.First())
.ToList();

var devicee = manufacturers.First();

foreach (var item in manufacturers)
{
Console.WriteLine("-" + manufacturers.IndexOf(item) + " " + item.Manufacturer);
}
do
{
Console.Write("Device Manufacturer: ");
if (!Int32.TryParse(Console.ReadLine(), out int value) || !manufacturers.Exists(x => x.Id == value))
{
Console.WriteLine("That Manufacturer type does not exist");
}
else
{
success = true;
device = manufacturers[value];
}
}
while (!success);

return device;

}
static IEnumerable<ComputingDevice> ChooseComputingDevice()
{
Console.WriteLine("Please choose what kind of device you are using to mine CryptoCurrency: ");
var listOfDevices = DevicesProvider.AvailableDevices.Where(p => p.GetType().BaseType == typeof(ComputingDevice))
.GroupBy(p => p.GetType().Name)
.Select(g => g.First())
.ToList();

foreach (var item in listOfDevices)
{
Console.WriteLine("-" + listOfDevices.IndexOf(item) +" "+ item.GetType().Name);
}
Console.Write("Your choice:");
string deviceType = Console.ReadLine();

Console.WriteLine("Choose the device Manufacturer from below ones: \n");

var manufacturers = DevicesProvider.AvailableDevices.Where(p => p.GetType().Name == deviceType)
.GroupBy(p => p.Manufacturer)
.Select(p => p.First())
.ToList();

if (manufacturers.Count == 0)
{
throw new ArgumentOutOfRangeException(nameof(deviceType), deviceType,
$"No manufactures for that type.");
}

foreach (var item in manufacturers)
{
Console.WriteLine("-" + item.Manufacturer);
}
Console.Write("Device Manufacturer: ");
string deviceManufacturer = Console.ReadLine();
Console.WriteLine("\n");

Console.Write("Choose the Model: \n");

var listOfDevicesByModel = DevicesProvider.AvailableDevices.Where(g => g.GetType().Name == deviceType).Where(g => g.Manufacturer == deviceManufacturer)
.GroupBy(g => g.Model)
.Select(g => g.First())
.ToList();

if (listOfDevicesByModel.Count == 0)
{
throw new ArgumentOutOfRangeException(nameof(deviceManufacturer), deviceManufacturer,
$"No devices for that device manufacturer.");
}

foreach (var item in listOfDevicesByModel)
{
Console.WriteLine("-" + item.Model);
}
Console.Write("Device Model: ");
string deviceModel = Console.ReadLine();
Console.WriteLine("\n");
Console.Write("Choose the Version: \n");

var listOfModelsByVersion = DevicesProvider.AvailableDevices.Where(g => g.GetType().Name == deviceType)
.Where(g => g.Model == deviceModel)
.GroupBy(g => g.Version)
.Select(g => g.First())
.ToList();

if (listOfModelsByVersion.Count == 0)
{
throw new ArgumentOutOfRangeException(nameof(deviceModel), deviceModel,
$"No versions for that device model.");
}

foreach (var item in listOfModelsByVersion)
{
Console.WriteLine("-" + item.Version);
}

Console.Write("Device Version: ");
string version = Console.ReadLine();

var chosenDevices = DevicesProvider.AvailableDevices.Where(d => d.GetType().Name == deviceType)
.Where(d => d.Manufacturer == deviceManufacturer).Where(d => d.Model == deviceModel)
.Where(d => d.Version == version)
.Select(d => d)
.ToList();

Console.WriteLine($"The Devices that you have chosen is: \n" +
$" DeviceType:{deviceType} \n" +
$" Manufacturer:{deviceManufacturer} \n" +
$" Model:{deviceModel} \n" +
$" Version:{version}\n");

return chosenDevices;
}

static string ChooseCurrencyType()
{
Console.WriteLine("Please choose from the following Currencies: ");
foreach (var currencyType in Enum.GetValues(typeof(CurrencyTypes)))
{
Console.WriteLine($"- {(int)currencyType}, {currencyType} ");
}
CurrencyTypes currencyValue = 0;
CurrencyTypes choosenCurrency = 0;
var success = false;
do
{
Console.Write("Currency number: ");
if(!Int32.TryParse(Console.ReadLine(), out int value) || !TryParseCurrencyEnum(value, out currencyValue))
{
Console.WriteLine("That currency does not exist!");
}
else
{
choosenCurrency = currencyValue;
success = true;
}
}
while (!success);
Console.WriteLine($"You have chosen " + choosenCurrency + " currency");
return choosenCurrency.ToString(); ;
}

private static bool TryParseCurrencyEnum<TEnum>(int enumValue, out TEnum retVal)
{


retVal = default(TEnum);
bool success = Enum.IsDefined(typeof(TEnum), enumValue);
if (success)
{
retVal = (TEnum)Enum.ToObject(typeof(TEnum), enumValue);
}
return success;

}

}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
Expand All @@ -17,6 +17,11 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>

</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Cryptocurrencies.ROI.Calculator\Cryptocurrencies.ROI.Calculator.csproj" />
</ItemGroup>

</Project>
Loading