init commit
This commit is contained in:
@@ -0,0 +1,76 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Contacts
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents an address for a contact. Contains methods to determine if two addresses are equal.
|
||||||
|
/// </summary>
|
||||||
|
public class Address : IEquatable<Address>
|
||||||
|
{
|
||||||
|
private readonly string _abbr;
|
||||||
|
private readonly string _city;
|
||||||
|
private readonly string _street;
|
||||||
|
private readonly string _zip;
|
||||||
|
public AddressType Type { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accepts input string in format "123 Example St,City,ST,12345".
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="address">Full address</param>
|
||||||
|
/// <param name="type">If null, defaults to "Other"</param>
|
||||||
|
public Address(string address, AddressType? type)
|
||||||
|
{
|
||||||
|
string[] parsedAddress = address.Split(",");
|
||||||
|
if (parsedAddress.Length != 4)
|
||||||
|
throw new ArgumentException("Address must be in the format of \"123 Example St,City,ST,12345\"");
|
||||||
|
|
||||||
|
_street = parsedAddress[0];
|
||||||
|
_city = parsedAddress[1];
|
||||||
|
_abbr = parsedAddress[2];
|
||||||
|
_zip = parsedAddress[3];
|
||||||
|
|
||||||
|
this.Type = type ?? AddressType.Other;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accepts input strings for each part of an address to create a new Address object.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="street"></param>
|
||||||
|
/// <param name="city"></param>
|
||||||
|
/// <param name="abbr"></param>
|
||||||
|
/// <param name="zip"></param>
|
||||||
|
/// <param name="type">If null, defaults to "Other"</param>
|
||||||
|
public Address(string street, string city, string abbr, string zip, AddressType? type)
|
||||||
|
{
|
||||||
|
this._street = street;
|
||||||
|
this._city = city;
|
||||||
|
this._abbr = abbr;
|
||||||
|
this._zip = zip;
|
||||||
|
|
||||||
|
this.Type = type ?? AddressType.Other;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines if two addresses are equal, to avoid potential duplication.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="otherAddr">Address to compare to. If null, returns false.</param>
|
||||||
|
/// <returns>Whether or not the two addresses are the same.</returns>
|
||||||
|
public bool Equals(Address? otherAddr)
|
||||||
|
{
|
||||||
|
if (otherAddr == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return this.ToString().Equals(otherAddr.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Formats address object to "123 Example St, City, ST 12345".
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return _street + ", " + _city + ", " + _abbr + " " + _zip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace Contacts
|
||||||
|
{
|
||||||
|
|
||||||
|
public enum AddressType
|
||||||
|
{
|
||||||
|
Home,
|
||||||
|
Business,
|
||||||
|
Work,
|
||||||
|
Other
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Contacts
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the birthday of a contact.
|
||||||
|
/// </summary>
|
||||||
|
/// <author>Josh A</author>
|
||||||
|
public class Birthday : IEquatable<Birthday>
|
||||||
|
{
|
||||||
|
private readonly int day;
|
||||||
|
private readonly int month;
|
||||||
|
private readonly int year;
|
||||||
|
public int Age { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new Birthday object.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="month"></param>
|
||||||
|
/// <param name="day"></param>
|
||||||
|
public Birthday(int month, int day)
|
||||||
|
{
|
||||||
|
this.month = month;
|
||||||
|
this.day = day;
|
||||||
|
year = -1;
|
||||||
|
Age = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new Birthday and determines the age.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="month"></param>
|
||||||
|
/// <param name="day"></param>
|
||||||
|
/// <param name="year"></param>
|
||||||
|
public Birthday(int month, int day, int year)
|
||||||
|
{
|
||||||
|
this.month = month;
|
||||||
|
this.day = day;
|
||||||
|
this.year = year;
|
||||||
|
Age = 2023 - year;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines if two birthdays are equal, to avoid potential duplication.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="birthdayToCompare">Birthday to compare to. If null, returns false.</param>
|
||||||
|
/// <returns>Whether or not the two birthdays are the same.</returns>
|
||||||
|
public bool Equals(Birthday? birthdayToCompare)
|
||||||
|
{
|
||||||
|
if (birthdayToCompare == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return this.ToString().Equals(birthdayToCompare.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Formats a birthday to "MM-DD" or "MM-DD-YYYY", if a birthyear was provided.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Formatted birthdate.</returns>
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
if (year == -1)
|
||||||
|
return month + "-" + day;
|
||||||
|
return month + "-" + day + "-" + year;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,385 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Contacts
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a contact inside of the contacts manager console application. Provides methods to update key information as well as methods to add and remove communication information.
|
||||||
|
/// </summary>
|
||||||
|
public class Contact : IEquatable<Contact>
|
||||||
|
{
|
||||||
|
public string FirstName { get; set; }
|
||||||
|
public string LastName { get; set; }
|
||||||
|
public Birthday? Bday { get; set; }
|
||||||
|
public List<Address> Addresses { get; }
|
||||||
|
public List<Phone> Numbers { get; }
|
||||||
|
public List<string> Emails { get; }
|
||||||
|
public ContactCategory Type { get; set; }
|
||||||
|
public string PictureUrl { get; set; }
|
||||||
|
private List<string> attributes { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads a saved contact and creates a new Contact object based upon the saved information.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="savedContact"></param>
|
||||||
|
public Contact(string savedContact)
|
||||||
|
{
|
||||||
|
string[] contactArr = savedContact.Split("|");
|
||||||
|
FirstName = contactArr[0];
|
||||||
|
LastName = contactArr[1];
|
||||||
|
Addresses = new List<Address>();
|
||||||
|
Numbers = new List<Phone>();
|
||||||
|
Emails = new List<string>();
|
||||||
|
|
||||||
|
if (contactArr[2].Length > 0)
|
||||||
|
{
|
||||||
|
string[] addr = contactArr[2].Split(",");
|
||||||
|
foreach (string a in addr)
|
||||||
|
{
|
||||||
|
if (!a.Equals(""))
|
||||||
|
Addresses.Add(new Address(a, null)); // TODO: Need to find addr type.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (contactArr[3].Length > 0)
|
||||||
|
{
|
||||||
|
string[] phones = contactArr[3].Split(",");
|
||||||
|
foreach (string p in phones)
|
||||||
|
{
|
||||||
|
if (!p.Equals(""))
|
||||||
|
Numbers.Add(new Phone(p, null)); // TODO: Need to find phone type.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (contactArr[4].Length > 0)
|
||||||
|
{
|
||||||
|
string[] emails = contactArr[4].Split(",");
|
||||||
|
foreach (string e in emails)
|
||||||
|
{
|
||||||
|
if (!e.Equals(""))
|
||||||
|
Emails.Add(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!contactArr[5].Equals(""))
|
||||||
|
{
|
||||||
|
ContactCategory cat = (ContactCategory)Enum.Parse(typeof(ContactCategory), contactArr[5]);
|
||||||
|
Type = cat;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Type = ContactCategory.Other;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!contactArr[6].Equals(""))
|
||||||
|
PictureUrl = contactArr[6];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a new Contacts object and initialize the data structures responsible for storing multiple addresses, phone numbers, and emails.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="firstName">New contact's first name</param>
|
||||||
|
/// <param name="lastName">New contact's last name</param>
|
||||||
|
/// <param name="type">If null, defaults to "Other"</param>
|
||||||
|
public Contact(string firstName, string lastName, ContactCategory? type)
|
||||||
|
{
|
||||||
|
this.FirstName = firstName;
|
||||||
|
this.LastName = lastName;
|
||||||
|
this.Type = type ?? ContactCategory.Other;
|
||||||
|
|
||||||
|
Addresses = new List<Address>();
|
||||||
|
Numbers = new List<Phone>();
|
||||||
|
Emails = new List<string>();
|
||||||
|
|
||||||
|
attributes = new List<string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a new Contacts object.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="firstName"></param>
|
||||||
|
/// <param name="lastName"></param>
|
||||||
|
/// <param name="bday"></param>
|
||||||
|
/// <param name="addresses"></param>
|
||||||
|
/// <param name="numbers"></param>
|
||||||
|
/// <param name="emails"></param>
|
||||||
|
/// <param name="type"></param>
|
||||||
|
public Contact(string firstName, string lastName, Birthday bday, List<Address> addresses, List<Phone> numbers,
|
||||||
|
List<string> emails, ContactCategory? type)
|
||||||
|
{
|
||||||
|
this.FirstName = firstName;
|
||||||
|
this.LastName = lastName;
|
||||||
|
this.Bday = bday;
|
||||||
|
this.Addresses = addresses;
|
||||||
|
this.Numbers = numbers;
|
||||||
|
this.Emails = emails;
|
||||||
|
|
||||||
|
this.Type = type ?? ContactCategory.Other;
|
||||||
|
attributes = new List<string>();
|
||||||
|
}
|
||||||
|
public Contact()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If first = true, update only the first name, otherwise update the last name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">Updated name</param>
|
||||||
|
/// <param name="first">First or last name</param>
|
||||||
|
public void UpdateName(string name, bool first)
|
||||||
|
{
|
||||||
|
if (first)
|
||||||
|
FirstName = name;
|
||||||
|
else
|
||||||
|
LastName = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update both the first name and the last name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fName">Updated first name</param>
|
||||||
|
/// <param name="lName">Updated last name</param>
|
||||||
|
public void UpdateName(string fName, string lName)
|
||||||
|
{
|
||||||
|
FirstName = fName;
|
||||||
|
LastName = lName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Associate a birthday with the contact.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="bday">Birthday object to save</param>
|
||||||
|
public void UpdateBDay(Birthday bday)
|
||||||
|
{
|
||||||
|
this.Bday = bday;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Associate a new address with the contact.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="a">Address object to add</param>
|
||||||
|
public void AddAddress(Address a)
|
||||||
|
{
|
||||||
|
Addresses.Add(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Disassociate an address from a contact.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="addrToRemove">Address object to find and remove.</param>
|
||||||
|
/// <exception cref="ArgumentException">Thrown if the address is not associated with the contact.</exception>
|
||||||
|
public void RemoveAddress(Address addrToRemove)
|
||||||
|
{
|
||||||
|
if (!Addresses.Remove(addrToRemove))
|
||||||
|
throw new ArgumentException("Address does not exist.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add a new Phone to the contact, if it does not already exist.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="newPhone">Phone object to add.</param>
|
||||||
|
public void AddPhone(Phone newPhone)
|
||||||
|
{
|
||||||
|
bool canAdd = true;
|
||||||
|
foreach (Phone p in Numbers)
|
||||||
|
{
|
||||||
|
if (newPhone.Equals(p))
|
||||||
|
canAdd = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (canAdd)
|
||||||
|
Numbers.Add(newPhone);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Disassociate a phone from a contact.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="phoneToRemove">Phone object to find and remove.</param>
|
||||||
|
/// <exception cref="ArgumentException">Thrown if the phone is not associated with the contact.</exception>
|
||||||
|
public void RemovePhone(Phone phoneToRemove)
|
||||||
|
{
|
||||||
|
if (!Numbers.Remove(phoneToRemove))
|
||||||
|
throw new ArgumentException("Phone number does not exist.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add a new email to the contact.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="email">Email to add.</param>
|
||||||
|
public void AddEmail(string email)
|
||||||
|
{
|
||||||
|
Emails.Add(email);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Disassociate an email from a contact.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="emailToRemove">Email to search and remove.</param>
|
||||||
|
/// <exception cref="ArgumentException">Thrown if the email is not associated with this contact.</exception>
|
||||||
|
public void RemoveEmail(string emailToRemove)
|
||||||
|
{
|
||||||
|
if (!Emails.Remove(emailToRemove))
|
||||||
|
throw new ArgumentException("Email does not exist.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the contact type, ie. the relationship to the contact.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">Type to update to</param>
|
||||||
|
public void SetContactType(ContactCategory type)
|
||||||
|
{
|
||||||
|
this.Type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Need overloaded Equals methods for different situations. This is only checking if two Contacts objects are equal, but an imported Contacts may not be detected.
|
||||||
|
/// <summary>
|
||||||
|
/// Determines if two contacts are equal, to avoid potential duplication.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="contactToCompare">Contacts to compare to. If null, returns false.</param>
|
||||||
|
/// <returns>Whether or not the two contacts are the same.</returns>
|
||||||
|
public bool Equals(Contact? contactToCompare)
|
||||||
|
{
|
||||||
|
if (contactToCompare == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return this.GetHashCode() == contactToCompare.GetHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Calculates the hashcode of a contact by combining the hashcodes of each field of a contact.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The Contacts's hashcode</returns>
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
int code = 17;
|
||||||
|
code *= FirstName.GetHashCode();
|
||||||
|
code *= LastName.GetHashCode();
|
||||||
|
code *= Bday.GetHashCode();
|
||||||
|
|
||||||
|
foreach (Address a in Addresses)
|
||||||
|
{
|
||||||
|
code *= a.GetHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (Phone p in Numbers)
|
||||||
|
{
|
||||||
|
code *= p.GetHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (string e in Emails)
|
||||||
|
{
|
||||||
|
code *= e.GetHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
code *= Type.GetHashCode();
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Formats the contact in a parsable string, designed to be saved to a file.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Parsable string.</returns>
|
||||||
|
public string SaveString()
|
||||||
|
{
|
||||||
|
attributes.Clear();
|
||||||
|
attributes.Add(FirstName);
|
||||||
|
attributes.Add(LastName);
|
||||||
|
//attributes.Add(Bday.ToString()); // TODO: Need to implement and test birthdates.
|
||||||
|
attributes.Add(String.Join(",", Addresses));
|
||||||
|
List<string> nums = new List<string>();
|
||||||
|
foreach (Phone n in Numbers)
|
||||||
|
{
|
||||||
|
nums.Add(n.DisplayString());
|
||||||
|
}
|
||||||
|
attributes.Add(String.Join(",", nums));
|
||||||
|
attributes.Add(String.Join(",", Emails));
|
||||||
|
attributes.Add("" + Type);
|
||||||
|
attributes.Add(String.Join(",", PictureUrl));
|
||||||
|
|
||||||
|
return String.Join("|", attributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Implement this method once the GUI is created, formatting contacts to best integrate into the GUI.
|
||||||
|
/// <summary>
|
||||||
|
/// Standard string representation of a Contact, for use while still using the console with no other GUI elements.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return FirstName + (LastName.Equals("") ? "" : ", " + LastName) + ": " + String.Join(", ", Addresses) + " || " +
|
||||||
|
String.Join(", ", Numbers) + " || " + String.Join(", ", Emails) + " || " + Type + " || " + PictureUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//full name needs to be firstname lastname
|
||||||
|
public static void RemoveContact(string fullName)
|
||||||
|
{
|
||||||
|
fullName = fullName.ToLower();
|
||||||
|
|
||||||
|
string[] arguments = fullName.Split(" ");
|
||||||
|
|
||||||
|
string firstName = arguments[0];
|
||||||
|
string lastName = arguments[1];
|
||||||
|
|
||||||
|
string filePath = "yourContacts.save";
|
||||||
|
List<string> linesToKeep = new List<string>();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (StreamReader reader = new StreamReader(filePath))
|
||||||
|
{
|
||||||
|
string line;
|
||||||
|
while ((line = reader.ReadLine()) != null) // Read line by line until EOF
|
||||||
|
{
|
||||||
|
if (!(line.ToLower().Contains(firstName) && line.ToLower().Contains(lastName)))
|
||||||
|
{
|
||||||
|
linesToKeep.Add(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
using (StreamWriter writer = new StreamWriter(filePath))
|
||||||
|
{
|
||||||
|
foreach (string line in linesToKeep)
|
||||||
|
{
|
||||||
|
writer.WriteLine(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Contact removed successfully.");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error reading or writing the file: " + ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void AddContact(string firstName, string lastName, string phoneNumber, string ContactCategory)
|
||||||
|
{
|
||||||
|
string filePath = "yourContacts.save";
|
||||||
|
string contactLine = $"{firstName}|{lastName}|{phoneNumber}|{ContactCategory}";
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (StreamWriter writer = new StreamWriter(filePath, true)) // Append mode is set to true
|
||||||
|
{
|
||||||
|
writer.WriteLine(contactLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Contact added successfully.");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error writing to the file: " + ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
namespace Contacts
|
||||||
|
{
|
||||||
|
public enum ContactCategory
|
||||||
|
{
|
||||||
|
Family,
|
||||||
|
Friends,
|
||||||
|
Work,
|
||||||
|
Other
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Crayon" Version="2.0.69" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contacts", "Contacts.csproj", "{300D68D7-C6ED-4FB6-8387-6ECE80CFE236}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{300D68D7-C6ED-4FB6-8387-6ECE80CFE236}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{300D68D7-C6ED-4FB6-8387-6ECE80CFE236}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{300D68D7-C6ED-4FB6-8387-6ECE80CFE236}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{300D68D7-C6ED-4FB6-8387-6ECE80CFE236}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Contacts
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Manages the contacts database and facilitates viewing the database via searching and sorting. Contains methods to update the current view.
|
||||||
|
/// </summary>
|
||||||
|
public class FileIO
|
||||||
|
{
|
||||||
|
public IEnumerable<Contact> currentState { get; set; }
|
||||||
|
private readonly List<Contact> _contacts = new();
|
||||||
|
//private string _filepath = "~/.contacts";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the FileIo object and set default view.
|
||||||
|
/// </summary>
|
||||||
|
public FileIO()
|
||||||
|
{
|
||||||
|
currentState =
|
||||||
|
from c in _contacts
|
||||||
|
select c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Facilitates incoming compatability with .vcf, .card, and .csv filetypes for contacts into this console-based
|
||||||
|
/// contacts manager.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="resolver"></param>
|
||||||
|
public void Import(Resolver resolver)
|
||||||
|
{
|
||||||
|
resolver.Parse();
|
||||||
|
List<Contact> contacts = resolver.Contacts;
|
||||||
|
foreach (Contact c in contacts)
|
||||||
|
_contacts.Add(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Facilitates outgoing compatability with .vcf, .card, and .csv filetypes for contacts into this console-based contacts manager.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="onIos"></param>
|
||||||
|
public void Export(bool onIos)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Save the contacts in the database to a file.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="targetFilePath">Path to the file on computer</param>
|
||||||
|
public void Save()
|
||||||
|
{
|
||||||
|
using (StreamWriter writer = new StreamWriter("yourContacts.save"))
|
||||||
|
{
|
||||||
|
foreach (Contact c in _contacts)
|
||||||
|
{
|
||||||
|
writer.WriteLine($"{c.SaveString()}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Load the saved contacts in the database.
|
||||||
|
/// </summary>
|
||||||
|
public void Load()
|
||||||
|
{
|
||||||
|
using (StreamReader reader = new StreamReader("yourContacts.save"))
|
||||||
|
{
|
||||||
|
while (!reader.EndOfStream)
|
||||||
|
{
|
||||||
|
_contacts.Add(new Contact(reader.ReadLine()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a phone number for a contact. Contains methods to determine if two phone numbers are the same.
|
||||||
|
/// </summary>
|
||||||
|
namespace Contacts
|
||||||
|
{
|
||||||
|
public class Phone : IEquatable<Phone>
|
||||||
|
{
|
||||||
|
public string number { get; }
|
||||||
|
public PhoneType? Type { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Accepts an input string in the format "1234567890" to create a new Phone object for a Contacts.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="number"></param>
|
||||||
|
/// <param name="type">If null, defaults to "Other"</param>
|
||||||
|
/// <exception cref="ArgumentException">Thrown if input has an invalid format.</exception>
|
||||||
|
public Phone(string number, PhoneType? type)
|
||||||
|
{
|
||||||
|
if (number.Length != 10)
|
||||||
|
throw new ArgumentException("Input phone number should be in the format 1234567890.");
|
||||||
|
|
||||||
|
this.number = number;
|
||||||
|
this.Type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines if two phone numbers are equal, to avoid potential duplication.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="numberToCompare">Phone number to compare to. If null, returns false.</param>
|
||||||
|
/// <returns>Whether or not the two phone numbers are the same.</returns>
|
||||||
|
public bool Equals(Phone? numberToCompare)
|
||||||
|
{
|
||||||
|
if (numberToCompare == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return this.ToString().Equals(numberToCompare.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the phone number without any formatting, for use in saving contacts to a file.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Unformatted phone number</returns>
|
||||||
|
public string DisplayString()
|
||||||
|
{
|
||||||
|
return number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Formats the phone number to "(123) 456 - 7890"
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Formatted phone number</returns>
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "(" + number.Substring(0, 3) + ") " + number.Substring(3, 3) + " - " + number.Substring(6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
namespace Contacts
|
||||||
|
{
|
||||||
|
public enum PhoneType
|
||||||
|
{
|
||||||
|
Cell,
|
||||||
|
Work,
|
||||||
|
Home,
|
||||||
|
Other
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,266 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
|
using Contacts;
|
||||||
|
using static Crayon.Output;
|
||||||
|
using Crayon;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test program for the contacts manager. Currently, to use, export a contacts list from your Google account or iCloud, in a CSV format. Save this file to bin/Debug/net7.0/testResources.
|
||||||
|
/// This will allow you to test with your own contacts.
|
||||||
|
/// Please remove this file prior to any pushes to Github.
|
||||||
|
/// </summary>
|
||||||
|
public class Program
|
||||||
|
{
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
OperatingSystem os = Environment.OSVersion; // checking what OS is running
|
||||||
|
Console.WriteLine("Platform: {0}", os.Platform);
|
||||||
|
Console.WriteLine("Version: {0}", os.Version);
|
||||||
|
Console.WriteLine("Service Pack: {0}", os.ServicePack);
|
||||||
|
|
||||||
|
bool isMacOS = (os.Platform == PlatformID.MacOSX || os.Platform == PlatformID.Unix);
|
||||||
|
|
||||||
|
FileIO fileIO = new FileIO();
|
||||||
|
Resolver? resolver;
|
||||||
|
|
||||||
|
Console.Clear();
|
||||||
|
Console.ResetColor();
|
||||||
|
var rainbow = new Rainbow(0.5);
|
||||||
|
Console.WriteLine(Bold("""
|
||||||
|
___ _ _
|
||||||
|
/ __\ ___ _ __ | |_ __ _ ___ | |_ ___ /\/\ ___ _ __ __ _ ___ _ __
|
||||||
|
/ / / _ \ | '_ \ | __|/ _` | / __|| __|/ __| / \ / _ \| '__|/ _` | / _ \| '__|
|
||||||
|
/ /___| (_) || | | || |_| (_| || (__ | |_ \__ \ / /\/\ \| __/| | | (_| || __/| |
|
||||||
|
\____/ \___/ |_| |_| \__|\__,_| \___| \__||___/ \/ \/ \___||_| \__, | \___||_|
|
||||||
|
|___/
|
||||||
|
"""));
|
||||||
|
// DrawLines();
|
||||||
|
Console.WriteLine($"\n{Output.Background.Red(White(new string('~', Console.BufferWidth - 2)))}");
|
||||||
|
Console.Write("> ");
|
||||||
|
Point point = new Point(Console.CursorLeft, Console.CursorTop);
|
||||||
|
bool isDebug = false;
|
||||||
|
bool isExported = false;
|
||||||
|
writeHelpCommand(Console.BufferWidth / 2, 9);
|
||||||
|
Console.SetCursorPosition(point.X, point.Y);
|
||||||
|
string? commandString = Console.ReadLine();
|
||||||
|
while (commandString != "exit")
|
||||||
|
{
|
||||||
|
List<String> arguments = commandString.Split(" ").ToList<String>();
|
||||||
|
string command = arguments[0];
|
||||||
|
arguments.RemoveAt(0);
|
||||||
|
|
||||||
|
switch (command.ToLower())
|
||||||
|
{
|
||||||
|
case "add":
|
||||||
|
if (arguments.Count < 4)
|
||||||
|
{
|
||||||
|
Console.WriteLine("This command requires an argument. Use \"help\" for more info.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Contact.AddContact(arguments[0], arguments[1], arguments[2], arguments[3]);
|
||||||
|
break;
|
||||||
|
case "remove":
|
||||||
|
if (arguments.Count < 2)
|
||||||
|
{
|
||||||
|
Console.WriteLine("This command requires an argument. Use \"help\" for more info.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
string fullname = arguments[0];
|
||||||
|
fullname += " " + arguments[1];
|
||||||
|
Contact.RemoveContact(fullname);
|
||||||
|
break;
|
||||||
|
case "view":
|
||||||
|
if (!isDebug)
|
||||||
|
{
|
||||||
|
if (isExported)
|
||||||
|
{
|
||||||
|
if (isMacOS)
|
||||||
|
{
|
||||||
|
Process.Start("/System/Applications/TextEdit.app/Contents/MacOS/TextEdit", Path.Combine(Directory.GetCurrentDirectory(), "yourContacts.save"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Process.Start("notepad.exe", "yourContacts.save");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"The database hasn't been exported to a {Red(".save")} file. Use {Cyan("EXPORT")} before using this command");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (isMacOS)
|
||||||
|
{
|
||||||
|
Process.Start("/System/Applications/TextEdit.app/Contents/MacOS/TextEdit", Path.Combine(Directory.GetCurrentDirectory(), "yourContacts.save"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Process.Start("notepad.exe", "yourContacts.save");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "import":
|
||||||
|
if (arguments.Count <= 0)
|
||||||
|
{
|
||||||
|
System.Console.WriteLine("This command requires an argument. Use \"help\" for more info.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
resolver = new Resolver(@arguments[0]);
|
||||||
|
fileIO.Import(resolver);
|
||||||
|
break;
|
||||||
|
case "export":
|
||||||
|
fileIO.Save();
|
||||||
|
isExported = true;
|
||||||
|
Console.WriteLine($"Your new {Red(".save")} file has been saved @ {Path.Combine(Directory.GetCurrentDirectory(), "yourContacts.save")}");
|
||||||
|
// TODO: Some way to tell them that it was saved to a certain spot in their computer
|
||||||
|
break;
|
||||||
|
case "help":
|
||||||
|
writeHelpCommand(0, 0);
|
||||||
|
break;
|
||||||
|
case "clear":
|
||||||
|
Console.Clear();
|
||||||
|
break;
|
||||||
|
case "debug":
|
||||||
|
if (arguments.Count <= 0)
|
||||||
|
{
|
||||||
|
System.Console.WriteLine("This command requires an argument. Use \"help\" for more info.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (arguments[0] == "true")
|
||||||
|
{
|
||||||
|
isDebug = true;
|
||||||
|
Console.WriteLine(Yellow("ABSOLUTE FILE PATH TO yourContacts.save: {0}"), Path.Combine(Directory.GetCurrentDirectory(), "yourContacts.save"));
|
||||||
|
}
|
||||||
|
else if (arguments[0] == "false")
|
||||||
|
{
|
||||||
|
isDebug = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Invalid argument. Try again.");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "":
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Console.WriteLine("Invalid Opperation. Try again.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DEAD LAST DO NOT TOUCHY
|
||||||
|
Console.Write(rainbow.Next().Bold().Text("> "));
|
||||||
|
commandString = Console.ReadLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static void DrawLines()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 1; i++)
|
||||||
|
{
|
||||||
|
if (i % 2 == 0)
|
||||||
|
{
|
||||||
|
Console.Write($"{Red(new string('*', 1))}");
|
||||||
|
Console.Write($"{Magenta(new string('*', 1))}");
|
||||||
|
Console.Write($"{Yellow(new string('*', 1))}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.Write($"{Yellow(new string('*', 1))}");
|
||||||
|
Console.Write($"{Magenta(new string('*', 1))}");
|
||||||
|
Console.Write($"{Red(new string('*', 1))}");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 51; i++)
|
||||||
|
{
|
||||||
|
if (i % 2 == 0)
|
||||||
|
{
|
||||||
|
Console.Write($"{Red(new string('*', 1))}");
|
||||||
|
Console.Write($"{Magenta(new string('*', 1))}");
|
||||||
|
Console.Write($"{Yellow(new string('*', 1))}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.Write($"{Yellow(new string('*', 1))}");
|
||||||
|
Console.Write($"{Magenta(new string('*', 1))}");
|
||||||
|
Console.Write($"{Red(new string('*', 1))}");
|
||||||
|
|
||||||
|
}
|
||||||
|
//Console.Write($"{Cyan(new string('*', i))}");
|
||||||
|
// Console.WriteLine($"{('*', Console.BufferWidth - i))}");
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 33; i++)
|
||||||
|
{
|
||||||
|
if (i % 2 == 0)
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(153, 6 + i);
|
||||||
|
Console.Write($"{Magenta(new string('*', 1))}");
|
||||||
|
Console.Write($"{Yellow(new string('*', 1))}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(153, 6 + i);
|
||||||
|
Console.Write($"{Red(new string('*', 1))}");
|
||||||
|
Console.Write($"{Yellow(new string('*', 1))}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Console.WriteLine($"{('*', Console.BufferWidth - i))}");
|
||||||
|
if (i == 31)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Console.SetCursorPosition(1, 7);
|
||||||
|
|
||||||
|
}
|
||||||
|
private static void writeHelpCommand(int left, int top)
|
||||||
|
{
|
||||||
|
if (left == 0 && top == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Contacts Merger Help\n");
|
||||||
|
Console.WriteLine(Bold(Green("ADD {0} {1}")), new string('.', 8), "<FirstName> <LastName> <Phone#> <PhoneCategory>");
|
||||||
|
Console.WriteLine("Adds a new contact to the final save file");
|
||||||
|
Console.WriteLine(Bold(Yellow("REMOVE {0} {1}")), new string('.', 5), "<FirstName> <LastName>");
|
||||||
|
Console.WriteLine("Removes contact from final save file");
|
||||||
|
Console.WriteLine(Bold(Blue("IMPORT {0} {1}")), new string('.', 5), "<filePath (.csv) or (.vcf)>");
|
||||||
|
Console.WriteLine($"Brings in contacts from either a {Red(".csv")} file or a {Red(".vcf")} file.");
|
||||||
|
Console.WriteLine(Bold(Cyan("EXPORT {0}")), new string('.', 5));
|
||||||
|
Console.WriteLine($"Takes all contacts taken from {Blue("IMPORT")} and compiles them-");
|
||||||
|
Console.WriteLine("-into a pipe-separated file.");
|
||||||
|
Console.WriteLine(Bold(Magenta("VIEW {0}")), new string('.', 5));
|
||||||
|
Console.WriteLine($"Opens the .save file that has been exported.");
|
||||||
|
Console.WriteLine(Bold(Yellow("EXIT {0}")), new string('.', 7));
|
||||||
|
Console.WriteLine($"Exits the program");
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(left, top);
|
||||||
|
Console.WriteLine("Contacts Merger Help\n");
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine(Bold(Green("ADD {0} {1}")), new string('.', 8), "<FirstName> <LastName> <Phone#> <PhoneCategory> ");
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine("Adds a new contact to the final save file");
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine(Bold(Yellow("REMOVE {0} {1}")), new string('.', 5), "<FirstName> <LastName>");
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine("Removes contact from final save file");
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine(Bold(Blue("IMPORT {0} {1}")), new string('.', 5), "<filePath (.csv) or (.vcf)>");
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine($"Brings in contacts from either a {Red(".csv")} file or a {Red(".vcf")} file.");
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine(Bold(Cyan("EXPORT {0}")), new string('.', 5));
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine($"Takes all contacts taken from {Blue("IMPORT")} and compiles-.");
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine("-into a pipe-separated file.");
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine(Bold(Magenta("VIEW {0}")), new string('.', 5));
|
||||||
|
Console.SetCursorPosition(left, top++);
|
||||||
|
Console.WriteLine($"Opens the .save file that has been exported.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,272 @@
|
|||||||
|
using Microsoft.VisualBasic.FileIO;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Contacts
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a file, and provides implementations for parsing contacts from a file.
|
||||||
|
/// </summary>
|
||||||
|
public class Resolver
|
||||||
|
{
|
||||||
|
public List<Contact> Contacts { get; set; }
|
||||||
|
internal string _filepath;
|
||||||
|
private bool isGoogleCsv;
|
||||||
|
|
||||||
|
public Resolver(string filepath)
|
||||||
|
{
|
||||||
|
_filepath = filepath;
|
||||||
|
if (!File.Exists(_filepath))
|
||||||
|
throw new InvalidOperationException("File does not exist.");
|
||||||
|
|
||||||
|
Contacts = new List<Contact>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Manages the parsing process and determines the correct parser to use based upon the filetype.
|
||||||
|
/// </summary>
|
||||||
|
public void Parse()
|
||||||
|
{
|
||||||
|
string filetype = _filepath.Substring(_filepath.LastIndexOf('.'));
|
||||||
|
|
||||||
|
switch (filetype)
|
||||||
|
{
|
||||||
|
case ".csv":
|
||||||
|
ParseCsv();
|
||||||
|
break;
|
||||||
|
case ".vcf":
|
||||||
|
ParseVCF();
|
||||||
|
break;
|
||||||
|
case ".card":
|
||||||
|
ParseVCF();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert a CSV file into a List<string>, and determine if the input csv is in the Google contact format or the Outlook contact format.
|
||||||
|
/// </summary>
|
||||||
|
private void ParseCsv()
|
||||||
|
{
|
||||||
|
List<string> contactInfo = new List<string>();
|
||||||
|
using (TextFieldParser parser = new TextFieldParser(_filepath))
|
||||||
|
{
|
||||||
|
if (parser.PeekChars(5).Equals("Name,"))
|
||||||
|
isGoogleCsv = true;
|
||||||
|
else
|
||||||
|
isGoogleCsv = false;
|
||||||
|
|
||||||
|
parser.ReadLine(); // skip header row
|
||||||
|
parser.TextFieldType = FieldType.Delimited;
|
||||||
|
parser.SetDelimiters(",");
|
||||||
|
while (!parser.EndOfData)
|
||||||
|
{
|
||||||
|
//Processing row
|
||||||
|
string[] fields = parser.ReadFields();
|
||||||
|
foreach (string field in fields)
|
||||||
|
if (!field.Equals("")) // skip blank fields
|
||||||
|
contactInfo.Add(field);
|
||||||
|
|
||||||
|
parser.ReadLine(); // move to next line to read the next contact.
|
||||||
|
ConvertToContact(contactInfo); // with current contact information, generate and add the new contact.
|
||||||
|
contactInfo.Clear(); // clear contact information for next contact.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parse the information contained by a Google formatted .csv file to generate a new Contacts object.
|
||||||
|
/// </summary>
|
||||||
|
private void ConvertToContact(List<string> csv)
|
||||||
|
{
|
||||||
|
Phone home = null;
|
||||||
|
Phone work = null;
|
||||||
|
Phone cell = null;
|
||||||
|
Phone other = null;
|
||||||
|
Contact c;
|
||||||
|
string[] contact = csv.ToArray();
|
||||||
|
|
||||||
|
// Check if the csv is a google or outlook formatted csv.
|
||||||
|
if (isGoogleCsv)
|
||||||
|
c = new Contact(contact[1], contact[2].Contains("*") ? "" : contact[2], null);
|
||||||
|
else
|
||||||
|
c = new Contact(contact[0], contact[1].Contains("*") ? "" : contact[1], null);
|
||||||
|
|
||||||
|
// iterate through csv array
|
||||||
|
for (int i = 0; i < contact.Length; i++)
|
||||||
|
{
|
||||||
|
// if current element is labeled as a number,
|
||||||
|
switch (contact[i])
|
||||||
|
{
|
||||||
|
case "Home":
|
||||||
|
home = ParsePhone(PhoneType.Home, contact[i + 1]);
|
||||||
|
if (home != null)
|
||||||
|
c.AddPhone(home);
|
||||||
|
break;
|
||||||
|
case "Work":
|
||||||
|
work = ParsePhone(PhoneType.Work, contact[i + 1]);
|
||||||
|
if (work != null)
|
||||||
|
c.AddPhone(work);
|
||||||
|
break;
|
||||||
|
case "Job":
|
||||||
|
work = ParsePhone(PhoneType.Work, contact[i + 1]);
|
||||||
|
if (work != null)
|
||||||
|
c.AddPhone(work);
|
||||||
|
break;
|
||||||
|
case "Mobile":
|
||||||
|
cell = ParsePhone(PhoneType.Cell, contact[i + 1]);
|
||||||
|
if (cell != null)
|
||||||
|
c.AddPhone(cell);
|
||||||
|
break;
|
||||||
|
case "Cell":
|
||||||
|
cell = ParsePhone(PhoneType.Cell, contact[i + 1]);
|
||||||
|
if (cell != null)
|
||||||
|
c.AddPhone(cell);
|
||||||
|
break;
|
||||||
|
case "Other":
|
||||||
|
other = ParsePhone(PhoneType.Other, contact[i + 1]);
|
||||||
|
if (other != null)
|
||||||
|
c.AddPhone(other);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
other = ParsePhone(PhoneType.Other, contact[i]);
|
||||||
|
if (other != null)
|
||||||
|
c.AddPhone(other);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (contact[i].Contains("@")) // detect an email address and add to the current contact.
|
||||||
|
c.AddEmail(contact[i]);
|
||||||
|
if (contact[i].Contains("http") ||
|
||||||
|
contact[i].Contains("www.")) // detect a URL and add to the current contact.
|
||||||
|
c.PictureUrl = contact[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
Contacts.Add(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parse the information contained by the .vcf file to generate a new Contacts object.
|
||||||
|
/// </summary>
|
||||||
|
private void ParseVCF()
|
||||||
|
{
|
||||||
|
using (StreamReader reader = new StreamReader(_filepath))
|
||||||
|
{
|
||||||
|
string line;
|
||||||
|
Contact contact = null;
|
||||||
|
while ((line = reader.ReadLine()) != null)
|
||||||
|
{
|
||||||
|
if (line.StartsWith("BEGIN:VCARD"))
|
||||||
|
{
|
||||||
|
contact = new Contact();
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("FN:") && contact != null)
|
||||||
|
{
|
||||||
|
//mabye wrong
|
||||||
|
string myLine = line;
|
||||||
|
int i = 0;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (myLine[i].Equals(" "))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
contact.FirstName += myLine[i];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//now at last name
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
//mabye change
|
||||||
|
if (i == myLine.Length)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
contact.LastName += myLine[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("TEL;TYPE=") && contact != null)
|
||||||
|
{
|
||||||
|
int typeEndIndex = line.IndexOf(':', 9);
|
||||||
|
string phoneType = line.Substring(9, typeEndIndex - 9).ToUpper();
|
||||||
|
string phoneNumber = line.Substring(typeEndIndex + 1);
|
||||||
|
|
||||||
|
PhoneType parsedPhoneType = PhoneType.Other;
|
||||||
|
|
||||||
|
switch (phoneType)
|
||||||
|
{
|
||||||
|
case "HOME":
|
||||||
|
parsedPhoneType = PhoneType.Home;
|
||||||
|
break;
|
||||||
|
case "WORK":
|
||||||
|
parsedPhoneType = PhoneType.Work;
|
||||||
|
break;
|
||||||
|
case "CELL":
|
||||||
|
parsedPhoneType = PhoneType.Cell;
|
||||||
|
break;
|
||||||
|
case "OTHER":
|
||||||
|
parsedPhoneType = PhoneType.Other;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Phone phone = ParsePhone(parsedPhoneType, phoneNumber);
|
||||||
|
if (phone != null)
|
||||||
|
{
|
||||||
|
contact.AddPhone(phone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("EMAIL:") && contact != null)
|
||||||
|
{
|
||||||
|
string email = line.Substring(6);
|
||||||
|
contact.AddEmail(email);
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("PHOTO;VALUE=URI:") && contact != null)
|
||||||
|
{
|
||||||
|
string pictureUrl = line.Substring(15);
|
||||||
|
contact.PictureUrl = pictureUrl;
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("END:VCARD") && contact != null)
|
||||||
|
{
|
||||||
|
Contacts.Add(contact);
|
||||||
|
contact = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parses any format of a phone number into the acceptable format 1234567890.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type"></param>
|
||||||
|
/// <param name="number"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private Phone ParsePhone(PhoneType type, string number)
|
||||||
|
{
|
||||||
|
List<char> list = new List<char>();
|
||||||
|
char[] characters = number.ToCharArray();
|
||||||
|
|
||||||
|
for (int i = 0; i < characters.Length; i++)
|
||||||
|
if (char.IsDigit(characters[i])) // if the character is a digit, add it to the list
|
||||||
|
list.Add(characters[i]);
|
||||||
|
|
||||||
|
if (list.Count == 11) // remove the international code
|
||||||
|
list.RemoveAt(0);
|
||||||
|
|
||||||
|
string outputNumber = string.Join("", list);
|
||||||
|
if (outputNumber.Length > 10 ||
|
||||||
|
outputNumber.Length <
|
||||||
|
10) // detect if this was an email or address labeled as a generic category, ie. "Home".
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return new Phone(outputNumber, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"format": 1,
|
||||||
|
"restore": {
|
||||||
|
"/home/jashton/dev/active/2410-Contacts/ContactApp/ContactApp/ContactApp.csproj": {}
|
||||||
|
},
|
||||||
|
"projects": {
|
||||||
|
"/home/jashton/dev/active/2410-Contacts/ContactApp/ContactApp/ContactApp.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/home/jashton/dev/active/2410-Contacts/ContactApp/ContactApp/ContactApp.csproj",
|
||||||
|
"projectName": "ContactApp",
|
||||||
|
"projectPath": "/home/jashton/dev/active/2410-Contacts/ContactApp/ContactApp/ContactApp.csproj",
|
||||||
|
"packagesPath": "/home/jashton/.nuget/packages/",
|
||||||
|
"outputPath": "/home/jashton/dev/active/2410-Contacts/ContactApp/ContactApp/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/jashton/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net7.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net7.0": {
|
||||||
|
"targetAlias": "net7.0",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net7.0": {
|
||||||
|
"targetAlias": "net7.0",
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48",
|
||||||
|
"net481"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"downloadDependencies": [
|
||||||
|
{
|
||||||
|
"name": "Microsoft.AspNetCore.App.Ref",
|
||||||
|
"version": "[7.0.3, 7.0.3]"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"frameworkReferences": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"privateAssets": "all"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/7.0.103/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||||
|
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||||
|
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||||
|
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/jashton/.nuget/packages/</NuGetPackageRoot>
|
||||||
|
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/jashton/.nuget/packages/</NuGetPackageFolders>
|
||||||
|
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||||
|
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.4.0</NuGetToolVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<SourceRoot Include="/home/jashton/.nuget/packages/" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
{
|
||||||
|
"format": 1,
|
||||||
|
"restore": {
|
||||||
|
"/Users/marcuswalker/Documents/2410-Contacts/Contacts.csproj": {}
|
||||||
|
},
|
||||||
|
"projects": {
|
||||||
|
"/Users/marcuswalker/Documents/2410-Contacts/Contacts.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/Users/marcuswalker/Documents/2410-Contacts/Contacts.csproj",
|
||||||
|
"projectName": "Contacts",
|
||||||
|
"projectPath": "/Users/marcuswalker/Documents/2410-Contacts/Contacts.csproj",
|
||||||
|
"packagesPath": "/Users/marcuswalker/.nuget/packages/",
|
||||||
|
"outputPath": "/Users/marcuswalker/Documents/2410-Contacts/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/Users/marcuswalker/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net7.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net7.0": {
|
||||||
|
"targetAlias": "net7.0",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net7.0": {
|
||||||
|
"targetAlias": "net7.0",
|
||||||
|
"dependencies": {
|
||||||
|
"Crayon": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[2.0.69, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48",
|
||||||
|
"net481"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"frameworkReferences": {
|
||||||
|
"Microsoft.AspNetCore.App": {
|
||||||
|
"privateAssets": "none"
|
||||||
|
},
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"privateAssets": "all"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/7.0.203/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||||
|
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||||
|
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||||
|
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/Users/marcuswalker/.nuget/packages/</NuGetPackageRoot>
|
||||||
|
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/Users/marcuswalker/.nuget/packages/</NuGetPackageFolders>
|
||||||
|
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||||
|
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.5.0</NuGetToolVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<SourceRoot Include="/Users/marcuswalker/.nuget/packages/" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: System.Reflection.AssemblyCompanyAttribute("ContactApp")]
|
||||||
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyProductAttribute("ContactApp")]
|
||||||
|
[assembly: System.Reflection.AssemblyTitleAttribute("ContactApp")]
|
||||||
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|
||||||
|
// Generated by the MSBuild WriteCodeFragment class.
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
179adf1247370440b107dc2dfb5bbe6de8400e1e
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
is_global = true
|
||||||
|
build_property.TargetFramework = net7.0
|
||||||
|
build_property.TargetPlatformMinVersion =
|
||||||
|
build_property.UsingMicrosoftNETSdkWeb =
|
||||||
|
build_property.ProjectTypeGuids =
|
||||||
|
build_property.InvariantGlobalization =
|
||||||
|
build_property.PlatformNeutralAssembly =
|
||||||
|
build_property.EnforceExtendedAnalyzerRules =
|
||||||
|
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||||
|
build_property.RootNamespace = ContactApp
|
||||||
|
build_property.ProjectDir = /home/jashton/dev/active/2410-Contacts/ContactApp/
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// <auto-generated/>
|
||||||
|
global using global::System;
|
||||||
|
global using global::System.Collections.Generic;
|
||||||
|
global using global::System.IO;
|
||||||
|
global using global::System.Linq;
|
||||||
|
global using global::System.Net.Http;
|
||||||
|
global using global::System.Threading;
|
||||||
|
global using global::System.Threading.Tasks;
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,22 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: System.Reflection.AssemblyCompanyAttribute("Contacts")]
|
||||||
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyProductAttribute("Contacts")]
|
||||||
|
[assembly: System.Reflection.AssemblyTitleAttribute("Contacts")]
|
||||||
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|
||||||
|
// Generated by the MSBuild WriteCodeFragment class.
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
ac8a5cca5cb465ad43c1acdee69302679ed547f9
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
is_global = true
|
||||||
|
build_property.TargetFramework = net7.0
|
||||||
|
build_property.TargetPlatformMinVersion =
|
||||||
|
build_property.UsingMicrosoftNETSdkWeb = true
|
||||||
|
build_property.ProjectTypeGuids =
|
||||||
|
build_property.InvariantGlobalization =
|
||||||
|
build_property.PlatformNeutralAssembly =
|
||||||
|
build_property.EnforceExtendedAnalyzerRules =
|
||||||
|
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||||
|
build_property.RootNamespace = Contacts
|
||||||
|
build_property.RootNamespace = Contacts
|
||||||
|
build_property.ProjectDir = /Users/marcuswalker/Documents/2410-Contacts/
|
||||||
|
build_property.RazorLangVersion = 7.0
|
||||||
|
build_property.SupportLocalizedComponentNames =
|
||||||
|
build_property.GenerateRazorMetadataSourceChecksumAttributes =
|
||||||
|
build_property.MSBuildProjectDirectory = /Users/marcuswalker/Documents/2410-Contacts
|
||||||
|
build_property._RazorSourceGeneratorDebug =
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// <auto-generated/>
|
||||||
|
global using global::Microsoft.AspNetCore.Builder;
|
||||||
|
global using global::Microsoft.AspNetCore.Hosting;
|
||||||
|
global using global::Microsoft.AspNetCore.Http;
|
||||||
|
global using global::Microsoft.AspNetCore.Routing;
|
||||||
|
global using global::Microsoft.Extensions.Configuration;
|
||||||
|
global using global::Microsoft.Extensions.DependencyInjection;
|
||||||
|
global using global::Microsoft.Extensions.Hosting;
|
||||||
|
global using global::Microsoft.Extensions.Logging;
|
||||||
|
global using global::System;
|
||||||
|
global using global::System.Collections.Generic;
|
||||||
|
global using global::System.IO;
|
||||||
|
global using global::System.Linq;
|
||||||
|
global using global::System.Net.Http;
|
||||||
|
global using global::System.Net.Http.Json;
|
||||||
|
global using global::System.Threading;
|
||||||
|
global using global::System.Threading.Tasks;
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
20479485776e2d1315de5d34b1bc77d2e424ee1f
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
/home/jashton/dev/active/2410Contacts/bin/Debug/net7.0/Contacts
|
||||||
|
/home/jashton/dev/active/2410Contacts/bin/Debug/net7.0/Contacts.deps.json
|
||||||
|
/home/jashton/dev/active/2410Contacts/bin/Debug/net7.0/Contacts.runtimeconfig.json
|
||||||
|
/home/jashton/dev/active/2410Contacts/bin/Debug/net7.0/Contacts.dll
|
||||||
|
/home/jashton/dev/active/2410Contacts/bin/Debug/net7.0/Contacts.pdb
|
||||||
|
/home/jashton/dev/active/2410Contacts/obj/Debug/net7.0/Contacts.csproj.AssemblyReference.cache
|
||||||
|
/home/jashton/dev/active/2410Contacts/obj/Debug/net7.0/Contacts.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
/home/jashton/dev/active/2410Contacts/obj/Debug/net7.0/Contacts.AssemblyInfoInputs.cache
|
||||||
|
/home/jashton/dev/active/2410Contacts/obj/Debug/net7.0/Contacts.AssemblyInfo.cs
|
||||||
|
/home/jashton/dev/active/2410Contacts/obj/Debug/net7.0/Contacts.csproj.CoreCompileInputs.cache
|
||||||
|
/home/jashton/dev/active/2410Contacts/obj/Debug/net7.0/Contacts.dll
|
||||||
|
/home/jashton/dev/active/2410Contacts/obj/Debug/net7.0/refint/Contacts.dll
|
||||||
|
/home/jashton/dev/active/2410Contacts/obj/Debug/net7.0/Contacts.pdb
|
||||||
|
/home/jashton/dev/active/2410Contacts/obj/Debug/net7.0/Contacts.genruntimeconfig.cache
|
||||||
|
/home/jashton/dev/active/2410Contacts/obj/Debug/net7.0/ref/Contacts.dll
|
||||||
|
/home/jashton/dev/active/2410-Contacts/bin/Debug/net7.0/Contacts
|
||||||
|
/home/jashton/dev/active/2410-Contacts/bin/Debug/net7.0/Contacts.deps.json
|
||||||
|
/home/jashton/dev/active/2410-Contacts/bin/Debug/net7.0/Contacts.runtimeconfig.json
|
||||||
|
/home/jashton/dev/active/2410-Contacts/bin/Debug/net7.0/Contacts.dll
|
||||||
|
/home/jashton/dev/active/2410-Contacts/bin/Debug/net7.0/Contacts.pdb
|
||||||
|
/home/jashton/dev/active/2410-Contacts/obj/Debug/net7.0/Contacts.csproj.AssemblyReference.cache
|
||||||
|
/home/jashton/dev/active/2410-Contacts/obj/Debug/net7.0/Contacts.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
/home/jashton/dev/active/2410-Contacts/obj/Debug/net7.0/Contacts.AssemblyInfoInputs.cache
|
||||||
|
/home/jashton/dev/active/2410-Contacts/obj/Debug/net7.0/Contacts.AssemblyInfo.cs
|
||||||
|
/home/jashton/dev/active/2410-Contacts/obj/Debug/net7.0/Contacts.csproj.CoreCompileInputs.cache
|
||||||
|
/home/jashton/dev/active/2410-Contacts/obj/Debug/net7.0/Contacts.dll
|
||||||
|
/home/jashton/dev/active/2410-Contacts/obj/Debug/net7.0/refint/Contacts.dll
|
||||||
|
/home/jashton/dev/active/2410-Contacts/obj/Debug/net7.0/Contacts.pdb
|
||||||
|
/home/jashton/dev/active/2410-Contacts/obj/Debug/net7.0/Contacts.genruntimeconfig.cache
|
||||||
|
/home/jashton/dev/active/2410-Contacts/obj/Debug/net7.0/ref/Contacts.dll
|
||||||
|
/home/jashton/dev/active/2410-contacts/bin/Debug/net7.0/appsettings.Development.json
|
||||||
|
/home/jashton/dev/active/2410-contacts/bin/Debug/net7.0/appsettings.json
|
||||||
|
/home/jashton/dev/active/2410-contacts/bin/Debug/net7.0/Contacts.staticwebassets.runtime.json
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/Contacts.MvcApplicationPartsAssemblyInfo.cache
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/Contacts.RazorAssemblyInfo.cache
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/Contacts.RazorAssemblyInfo.cs
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/staticwebassets/msbuild.Contacts.Microsoft.AspNetCore.StaticWebAssets.props
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/staticwebassets/msbuild.build.Contacts.props
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/staticwebassets/msbuild.buildMultiTargeting.Contacts.props
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/staticwebassets/msbuild.buildTransitive.Contacts.props
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/staticwebassets.pack.json
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/staticwebassets.build.json
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/staticwebassets.development.json
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/scopedcss/Pages/Shared/_Layout.cshtml.rz.scp.css
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/scopedcss/bundle/Contacts.styles.css
|
||||||
|
/home/jashton/dev/active/2410-contacts/obj/Debug/net7.0/scopedcss/projectbundle/Contacts.bundle.scp.css
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/bin/Debug/net7.0/Contacts.exe
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/bin/Debug/net7.0/Contacts.deps.json
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/bin/Debug/net7.0/Contacts.runtimeconfig.json
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/bin/Debug/net7.0/Contacts.dll
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/bin/Debug/net7.0/Contacts.pdb
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/Contacts.csproj.AssemblyReference.cache
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/Contacts.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/Contacts.AssemblyInfoInputs.cache
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/Contacts.AssemblyInfo.cs
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/Contacts.csproj.CoreCompileInputs.cache
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/Contacts.MvcApplicationPartsAssemblyInfo.cache
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/staticwebassets/msbuild.Contacts.Microsoft.AspNetCore.StaticWebAssets.props
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/staticwebassets/msbuild.build.Contacts.props
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/staticwebassets/msbuild.buildMultiTargeting.Contacts.props
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/staticwebassets/msbuild.buildTransitive.Contacts.props
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/staticwebassets.pack.json
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/staticwebassets.build.json
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/staticwebassets.development.json
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/scopedcss/bundle/Contacts.styles.css
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/Contacts.dll
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/refint/Contacts.dll
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/Contacts.pdb
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/Contacts.genruntimeconfig.cache
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/ref/Contacts.dll
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/bin/Debug/net7.0/Contacts.exe
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/bin/Debug/net7.0/Contacts.deps.json
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/bin/Debug/net7.0/Contacts.runtimeconfig.json
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/bin/Debug/net7.0/Contacts.dll
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/bin/Debug/net7.0/Contacts.pdb
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/Contacts.csproj.AssemblyReference.cache
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/Contacts.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/Contacts.AssemblyInfoInputs.cache
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/Contacts.AssemblyInfo.cs
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/Contacts.csproj.CoreCompileInputs.cache
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/Contacts.MvcApplicationPartsAssemblyInfo.cache
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/staticwebassets/msbuild.Contacts.Microsoft.AspNetCore.StaticWebAssets.props
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/staticwebassets/msbuild.build.Contacts.props
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/staticwebassets/msbuild.buildMultiTargeting.Contacts.props
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/staticwebassets/msbuild.buildTransitive.Contacts.props
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/staticwebassets.pack.json
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/staticwebassets.build.json
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/staticwebassets.development.json
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/scopedcss/bundle/Contacts.styles.css
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/Contacts.dll
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/refint/Contacts.dll
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/Contacts.pdb
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/Contacts.genruntimeconfig.cache
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/ref/Contacts.dll
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/bin/Debug/net7.0/Crayon.dll
|
||||||
|
C:/Users/Marcus/Desktop/contacts-console/obj/Debug/net7.0/Contacts.csproj.CopyComplete
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/bin/Debug/net7.0/Crayon.dll
|
||||||
|
C:/Users/overw/source/repos/2410-Contacts/obj/Debug/net7.0/Contacts.csproj.CopyComplete
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/bin/Debug/net7.0/Contacts
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/bin/Debug/net7.0/Contacts.deps.json
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/bin/Debug/net7.0/Contacts.runtimeconfig.json
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/bin/Debug/net7.0/Contacts.dll
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/bin/Debug/net7.0/Contacts.pdb
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/bin/Debug/net7.0/Crayon.dll
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/Contacts.csproj.AssemblyReference.cache
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/Contacts.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/Contacts.AssemblyInfoInputs.cache
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/Contacts.AssemblyInfo.cs
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/Contacts.csproj.CoreCompileInputs.cache
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/Contacts.MvcApplicationPartsAssemblyInfo.cache
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/staticwebassets/msbuild.Contacts.Microsoft.AspNetCore.StaticWebAssets.props
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/staticwebassets/msbuild.build.Contacts.props
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/staticwebassets/msbuild.buildMultiTargeting.Contacts.props
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/staticwebassets/msbuild.buildTransitive.Contacts.props
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/staticwebassets.pack.json
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/staticwebassets.build.json
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/staticwebassets.development.json
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/scopedcss/bundle/Contacts.styles.css
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/Contacts.csproj.CopyComplete
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/Contacts.dll
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/refint/Contacts.dll
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/Contacts.pdb
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/Contacts.genruntimeconfig.cache
|
||||||
|
/Users/marcuswalker/Documents/2410-Contacts/obj/Debug/net7.0/ref/Contacts.dll
|
||||||
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
7a96de072f111734042ad45faa57d5c212ab845a
|
||||||
Binary file not shown.
Executable
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"targets": {
|
||||||
|
"net7.0": {
|
||||||
|
"Crayon/2.0.69": {
|
||||||
|
"type": "package",
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard2.0/Crayon.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Crayon.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"Crayon/2.0.69": {
|
||||||
|
"sha512": "eJHxoMTfhZs1782YUIMafXIDTPcTwAV5I3MNsl2d4Mn61/h3ABPMSzHwzigL/NO7BrCKRoP4gHJuERpLHdSCvg==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "crayon/2.0.69",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"crayon.2.0.69.nupkg.sha512",
|
||||||
|
"crayon.nuspec",
|
||||||
|
"lib/netstandard2.0/Crayon.dll"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"projectFileDependencyGroups": {
|
||||||
|
"net7.0": [
|
||||||
|
"Crayon >= 2.0.69"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"packageFolders": {
|
||||||
|
"/Users/marcuswalker/.nuget/packages/": {}
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/Users/marcuswalker/Documents/2410-Contacts/Contacts.csproj",
|
||||||
|
"projectName": "Contacts",
|
||||||
|
"projectPath": "/Users/marcuswalker/Documents/2410-Contacts/Contacts.csproj",
|
||||||
|
"packagesPath": "/Users/marcuswalker/.nuget/packages/",
|
||||||
|
"outputPath": "/Users/marcuswalker/Documents/2410-Contacts/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/Users/marcuswalker/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net7.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net7.0": {
|
||||||
|
"targetAlias": "net7.0",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net7.0": {
|
||||||
|
"targetAlias": "net7.0",
|
||||||
|
"dependencies": {
|
||||||
|
"Crayon": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[2.0.69, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48",
|
||||||
|
"net481"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"frameworkReferences": {
|
||||||
|
"Microsoft.AspNetCore.App": {
|
||||||
|
"privateAssets": "none"
|
||||||
|
},
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"privateAssets": "all"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/7.0.203/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"dgSpecHash": "hLf4B0n+n6M/x10I7MS4T+MbxFSG+50xIg2qJF4KHIq49lAHX6cG+62zutm3rbOfEU/CZrsdUv0fn88Rt+TDaw==",
|
||||||
|
"success": true,
|
||||||
|
"projectFilePath": "/Users/marcuswalker/Documents/2410-Contacts/Contacts.csproj",
|
||||||
|
"expectedPackageFiles": [
|
||||||
|
"/Users/marcuswalker/.nuget/packages/crayon/2.0.69/crayon.2.0.69.nupkg.sha512"
|
||||||
|
],
|
||||||
|
"logs": []
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
"restore":{"projectUniqueName":"/home/jashton/dev/active/2410-contacts/Contacts.csproj","projectName":"Contacts","projectPath":"/home/jashton/dev/active/2410-contacts/Contacts.csproj","outputPath":"/home/jashton/dev/active/2410-contacts/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net7.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net7.0":{"targetAlias":"net7.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]}}"frameworks":{"net7.0":{"targetAlias":"net7.0","imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"Microsoft.AspNetCore.App.Ref","version":"[7.0.3, 7.0.3]"}],"frameworkReferences":{"Microsoft.AspNetCore.App":{"privateAssets":"none"},"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/share/dotnet/sdk/7.0.103/RuntimeIdentifierGraph.json"}}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
16816954560259051
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# Contact Project A05
|
||||||
|
|
||||||
|
### Project Status
|
||||||
|
- [X] Imports from `.card`, and `.vcf`
|
||||||
|
- [-] Exporting into human readable (`.json`?)
|
||||||
|
- Making it into a `.save` file instead. No specific naming scheme in mind
|
||||||
|
- [X] Exporing into both Outlook and Google `.csv`s
|
||||||
|
- [ ] Exporting into `.card`
|
||||||
|
- [ ] Exporting into `.vcf`
|
||||||
|
- [X] Figure out what kind of UX should be given 👀
|
||||||
|
- [ ] Contact Merger??
|
||||||
|
|
||||||
|
### Third Party Libraries
|
||||||
|
- [Crayon by riezebosch](https://github.com/riezebosch/Crayon)
|
||||||
|
- helps out with the formatting of the command line
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Snake
|
||||||
|
Snake
|
||||||
|
CLI snake game. CSIS 2410 project A05.
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Snake", "Snake\Snake.csproj", "{4A6995A3-4AC4-4954-A7CA-904A77D5AC85}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{4A6995A3-4AC4-4954-A7CA-904A77D5AC85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{4A6995A3-4AC4-4954-A7CA-904A77D5AC85}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{4A6995A3-4AC4-4954-A7CA-904A77D5AC85}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{4A6995A3-4AC4-4954-A7CA-904A77D5AC85}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
namespace Snake
|
||||||
|
{
|
||||||
|
///
|
||||||
|
/// <summary>Represents a Console position in Left and Top coordinates, AKA (x, y).</summary>
|
||||||
|
///
|
||||||
|
/// <author>Josh Ashton</author>
|
||||||
|
///
|
||||||
|
public class Position
|
||||||
|
{
|
||||||
|
public int X1;
|
||||||
|
public int X2;
|
||||||
|
public int Y { get; }
|
||||||
|
|
||||||
|
private const ConsoleColor D_GREEN = ConsoleColor.DarkGreen;
|
||||||
|
private const ConsoleColor BLACK = ConsoleColor.Black;
|
||||||
|
private const ConsoleColor GREEN = ConsoleColor.Green;
|
||||||
|
private const ConsoleColor WHITE = ConsoleColor.White;
|
||||||
|
private const ConsoleColor YELLOW = ConsoleColor.Yellow;
|
||||||
|
|
||||||
|
|
||||||
|
public bool SnakeKiller { get; }
|
||||||
|
public bool Snake { get; set; }
|
||||||
|
public Position Next { get; set; }
|
||||||
|
public Position Prev { get; set; }
|
||||||
|
|
||||||
|
public Position(int x1, int x2, int y)
|
||||||
|
{
|
||||||
|
X1 = x1;
|
||||||
|
X2 = x2;
|
||||||
|
Y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Position(int x1, int x2, int y, bool snakeKiller)
|
||||||
|
{
|
||||||
|
X1 = x1;
|
||||||
|
X2 = x2;
|
||||||
|
Y = y;
|
||||||
|
SnakeKiller = snakeKiller;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Draw(bool isHead) {
|
||||||
|
if(SnakeKiller)
|
||||||
|
{
|
||||||
|
Console.BackgroundColor = D_GREEN;
|
||||||
|
Console.Write(" ");
|
||||||
|
Console.BackgroundColor = BLACK;
|
||||||
|
} else if (Snake)
|
||||||
|
{
|
||||||
|
Console.BackgroundColor = WHITE;
|
||||||
|
Console.Write(" ");
|
||||||
|
Console.BackgroundColor = BLACK;
|
||||||
|
} else if (isHead)
|
||||||
|
{
|
||||||
|
Console.BackgroundColor = GREEN;
|
||||||
|
Console.Write(" ");
|
||||||
|
Console.BackgroundColor = BLACK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.Write(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,228 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using System.Timers;
|
||||||
|
using Timer = System.Timers.Timer;
|
||||||
|
|
||||||
|
namespace Snake;
|
||||||
|
|
||||||
|
public class Program
|
||||||
|
{
|
||||||
|
int leftMargin = 9;
|
||||||
|
int topMargin = 0;
|
||||||
|
private int height = 19;
|
||||||
|
private int width = 31;
|
||||||
|
private double difficulty;
|
||||||
|
private int time;
|
||||||
|
private Position[][] grid;
|
||||||
|
private Position bottom { get; set; }
|
||||||
|
private Position top { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Program p = new Program();
|
||||||
|
p.bottom = new Position(p.leftMargin, p.leftMargin + 1, p.topMargin + p.height);
|
||||||
|
p.top = new Position(p.leftMargin, p.leftMargin + 1, p.topMargin);
|
||||||
|
p.time = 0;
|
||||||
|
p.PrintIntro();
|
||||||
|
p.MenuInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawSnake()
|
||||||
|
{
|
||||||
|
Snake s = new Snake(grid, 100);
|
||||||
|
Timer t = new Timer(100);
|
||||||
|
t.Elapsed += TimerAction;
|
||||||
|
t.Enabled = true;
|
||||||
|
if (!s.Move())
|
||||||
|
{
|
||||||
|
DisplayGameOver();
|
||||||
|
Thread.Sleep(3000);
|
||||||
|
PrintIntro();
|
||||||
|
MenuInput();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DisplayNextLevel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TimerAction(object? sender, ElapsedEventArgs elapsedEventArgs)
|
||||||
|
{
|
||||||
|
time++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintIntro()
|
||||||
|
{
|
||||||
|
string[] s =
|
||||||
|
{
|
||||||
|
"╔════════════════════════════════════════════════════════════╗",
|
||||||
|
" /^\\/^\\ ",
|
||||||
|
" _|__| O| ",
|
||||||
|
" \\/ /~ \\_/ \\ ",
|
||||||
|
" \\____|__________/ \\ ",
|
||||||
|
" \\_______ \\ ",
|
||||||
|
" '\\ \\ \\ ",
|
||||||
|
" | | \\ ",
|
||||||
|
" / / \\ ",
|
||||||
|
" / / \\\\ ",
|
||||||
|
" / / \\\\ ",
|
||||||
|
" / / \\ \\\\ ",
|
||||||
|
" / / _----_ \\ \\\\ ",
|
||||||
|
" / / _-~ ~-_ | | ",
|
||||||
|
" ( ( _-~ _--_ ~-_ _/ | ",
|
||||||
|
" \\ ~-____-~ _-~ ~-_ ~-_-~ / ",
|
||||||
|
" ~-_ _-~ ~-_ _-~ ",
|
||||||
|
" ~--______-~ ~-___-~ ",
|
||||||
|
"╚════════════════════════════════════════════════════════════╝"
|
||||||
|
};
|
||||||
|
PrintConsole(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Can no longer press q or r after starting the game.
|
||||||
|
void MenuInput()
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(bottom.X1, bottom.Y);
|
||||||
|
Console.Write("Enter p to play, q to quit, r for rules: ");
|
||||||
|
char input = Console.ReadKey().KeyChar;
|
||||||
|
Console.SetCursorPosition(bottom.X1, bottom.Y);
|
||||||
|
while (input != 'q')
|
||||||
|
{
|
||||||
|
switch (input)
|
||||||
|
{
|
||||||
|
case 'p':
|
||||||
|
Console.SetCursorPosition(bottom.X1, bottom.Y);
|
||||||
|
Console.Write("Enter e for easy, m for medium, and h for hard: ");
|
||||||
|
char level = Console.ReadKey().KeyChar;
|
||||||
|
grid = new Position[height][];
|
||||||
|
switch (level)
|
||||||
|
{
|
||||||
|
case 'e':
|
||||||
|
grid = GenerateGameBoard(grid, 0.03);
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
grid = GenerateGameBoard(grid, 0.06);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
grid = GenerateGameBoard(grid, 0.1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
DrawGameBoard(grid);
|
||||||
|
DrawSnake();
|
||||||
|
break;
|
||||||
|
case 'q':
|
||||||
|
Environment.Exit(0);
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
DisplayRules();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawGameBoard(Position[][] grid)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < grid.Length; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < grid[i].Length; j++)
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(grid[i][j].X1, grid[i][j].Y);
|
||||||
|
grid[i][j].Draw(false);
|
||||||
|
}
|
||||||
|
Console.WriteLine();
|
||||||
|
}
|
||||||
|
time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayRules()
|
||||||
|
{
|
||||||
|
Position[][] grid = new Position[height][];
|
||||||
|
grid = GenerateGameBoard(grid, 0.03);
|
||||||
|
DrawGameBoard(grid);
|
||||||
|
|
||||||
|
string rules = (
|
||||||
|
"RULES:\n" +
|
||||||
|
" - Do not let the snake head touch walls or obstacles.\n" +
|
||||||
|
" - Use the arrow keys to control the snake."
|
||||||
|
//" - Collect all points in a level to move to the next level.",
|
||||||
|
//" - Levels increase difficulty."
|
||||||
|
);
|
||||||
|
PrintConsole(rules);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: ASCII art for game over screen
|
||||||
|
void DisplayGameOver()
|
||||||
|
{
|
||||||
|
string[] s =
|
||||||
|
{
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣤⠀⠀⠀⢀⣴⣿⡶⠀⣾⣿⣿⡿⠟⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣄⣀⠀⠀⠀⠀⣶⣶⣦⠀⠀⠀⠀⣼⣿⣿⡇⠀⣠⣿⣿⣿⠇⣸⣿⣿⣧⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⡿⠿⠿⠿⠇⠀⠀⣸⣿⣿⣿⡆⠀⠀⢰⣿⣿⣿⣷⣼⣿⣿⣿⡿⢀⣿⣿⡿⠟⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⡿⠋⠁⠀⠀⠀⠀⠀⠀⢠⣿⣿⣹⣿⣿⣿⣿⣿⣿⡏⢻⣿⣿⢿⣿⣿⠃⣼⣿⣯⣤⣴⣶⣿⡤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⠏⠀⣀⣠⣤⣶⣾⣷⠄⣰⣿⣿⡿⠿⠻⣿⣯⣸⣿⡿⠀⠀⠀⠁⣾⣿⡏⢠⣿⣿⠿⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠲⢿⣿⣿⣿⣿⡿⠋⢰⣿⣿⠋⠀⠀⠀⢻⣿⣿⣿⠇⠀⠀⠀⠀⠙⠛⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⢿⣷⣶⣿⣿⠿⠋⠀⠀⠈⠙⠃⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣤⣴⣶⣦⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⡇⢰⣶⣶⣾⡿⠷⣿⣿⣿⡟⠛⣉⣿⣿⣿⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣿⣿⡎⣿⣿⣦⠀⠀⠀⢀⣤⣾⠟⢀⣿⣿⡟⣁⠀⠀⣸⣿⣿⣤⣾⣿⡿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⡿⠛⠉⢿⣦⠘⣿⣿⡆⠀⢠⣾⣿⠋⠀⣼⣿⣿⣿⠿⠷⢠⣿⣿⣿⠿⢻⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣿⠋⠀⠀⠀⢸⣿⣇⢹⣿⣷⣰⣿⣿⠃⠀⢠⣿⣿⢃⣀⣤⣤⣾⣿⡟⠀⠀⠀⢻⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡇⠀⠀⢀⣴⣿⣿⡟⠀⣿⣿⣿⣿⠃⠀⠀⣾⣿⣿⡿⠿⠛⢛⣿⡟⠀⠀⠀⠀⠀⠻⠿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣶⣾⣿⣿⣿⠟⠁⠀⠸⢿⣿⠇⠀⠀⠀⠛⠛⠁⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠛⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||||
|
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀"
|
||||||
|
};
|
||||||
|
// Prints score and time below ASCII art of same dimension as the snake drawing above
|
||||||
|
PrintConsole($"Score: {time * 100} | Time: {time / 10} seconds ");
|
||||||
|
PrintConsole(s);
|
||||||
|
time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayNextLevel()
|
||||||
|
{
|
||||||
|
grid = GenerateGameBoard(grid, difficulty * (1 + difficulty));
|
||||||
|
DrawGameBoard(grid);
|
||||||
|
DrawSnake();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintConsole(string message)
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(bottom.X1, bottom.Y + 1);
|
||||||
|
Console.WriteLine(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintConsole(string[] s)
|
||||||
|
{
|
||||||
|
Console.BackgroundColor = ConsoleColor.Black;
|
||||||
|
for (int i = 0; i < s.Length; i++)
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(top.X1, top.Y + i);
|
||||||
|
Console.WriteLine(s[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Position[][] GenerateGameBoard(Position[][] grid, double chance)
|
||||||
|
{
|
||||||
|
int xCounter = 0;
|
||||||
|
for (int y = 0; y < grid.Length; y++)
|
||||||
|
{
|
||||||
|
grid[y] = new Position[width];
|
||||||
|
for (int x = 0; x < grid[y].Length; x++)
|
||||||
|
{
|
||||||
|
if (x == 0 || x == grid[y].Length - 1 || y == 0 || y == grid.Length - 1 ||
|
||||||
|
new Random().NextDouble() <= chance)
|
||||||
|
{
|
||||||
|
grid[y][x] = new Position(xCounter++ + leftMargin, xCounter++ + leftMargin, y + topMargin, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grid[y][x] = new Position(xCounter++ + leftMargin, xCounter++ + leftMargin, y + topMargin, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xCounter = 0;
|
||||||
|
}
|
||||||
|
return grid;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
namespace Snake
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the in-game snake, which traverses the 2D array of Positions.
|
||||||
|
/// </summary>
|
||||||
|
public class Snake
|
||||||
|
{
|
||||||
|
private Queue<Position> body;
|
||||||
|
private int n;
|
||||||
|
private int capacity;
|
||||||
|
private Position[][] grid;
|
||||||
|
private bool Collided;
|
||||||
|
|
||||||
|
public Snake(Position[][] grid, int capacity)
|
||||||
|
{
|
||||||
|
this.grid = grid;
|
||||||
|
this.capacity = capacity;
|
||||||
|
n = 0;
|
||||||
|
Collided = false;
|
||||||
|
body = new Queue<Position>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Move()
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.Black;
|
||||||
|
int x = 1;
|
||||||
|
int y = grid.Length / 2;
|
||||||
|
int direction = 0;
|
||||||
|
|
||||||
|
while (!Collided && x < grid[0].Length - 1 && y < grid.Length - 1 && x > 0 && y > 0)
|
||||||
|
{
|
||||||
|
if (Console.KeyAvailable)
|
||||||
|
{
|
||||||
|
char d = Console.ReadKey().KeyChar;
|
||||||
|
switch (d)
|
||||||
|
{
|
||||||
|
case 'w':
|
||||||
|
direction = 1;
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
direction = 2;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
direction = 3;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
direction = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Console.SetCursorPosition(grid[y][x].X1, grid[y][x].Y);
|
||||||
|
grid[y][x].Draw(false);
|
||||||
|
switch (direction)
|
||||||
|
{
|
||||||
|
case 0: // move right
|
||||||
|
x++;
|
||||||
|
break;
|
||||||
|
case 1: // move up
|
||||||
|
y--;
|
||||||
|
break;
|
||||||
|
case 2: // move left
|
||||||
|
x--;
|
||||||
|
break;
|
||||||
|
case 3: // move down
|
||||||
|
y++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (grid[y][x].SnakeKiller)
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(grid[0][0].X1, grid[grid.Length - 1][0].Y + 1);
|
||||||
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
body.Enqueue(grid[y][x]);
|
||||||
|
body.Dequeue();
|
||||||
|
grid[y][x].Snake = true;
|
||||||
|
Thread.Sleep(150);
|
||||||
|
}
|
||||||
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
Reference in New Issue
Block a user