Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions src/DaylioData/DaylioData.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<BaseOutputPath>..\..\BuildResults</BaseOutputPath>
<UseCommonOutputDirectory>true</UseCommonOutputDirectory>
<AssemblyVersion>0.1.4.0</AssemblyVersion>
<Version>0.1.4</Version>
<AssemblyVersion>0.1.5.0</AssemblyVersion>
<Version>0.1.5</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
54 changes: 49 additions & 5 deletions src/DaylioData/Methods.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using DaylioData.Models;
using System.Runtime.InteropServices;

namespace DaylioData
{
Expand Down Expand Up @@ -127,12 +126,12 @@ public static void InitData(DaylioData daylioData)
public static IEnumerable<DaylioCSVDataModel>? GetEntriesWithMood(string mood)
{
if (string.IsNullOrWhiteSpace(mood) ||
_daylioData?.DataRepo?.Moods.Where(entry => entry.Equals(mood)).Any() == false)
_daylioData?.DataRepo?.Moods.Where(entryMoods => entryMoods.Equals(mood)).Any() == false)
{
return null;
}

return _daylioData?.DataRepo?.CSVData?.Where(entry => entry.Mood?.Equals(mood, StringComparison.InvariantCultureIgnoreCase) == true);
return _daylioData?.DataRepo?.CSVData?.Where(entry => entry.Mood.Equals(mood, StringComparison.InvariantCultureIgnoreCase) == true);
}

/// <summary>
Expand Down Expand Up @@ -162,6 +161,7 @@ public static void InitData(DaylioData daylioData)
/// <summary>
/// Gets the number of entries that include a specified activity.
/// </summary>
/// <param name="daylioData">The <see cref="DaylioData"/> instance to use.</param>
/// <param name="activity">An activity string</param>
/// <returns>The <see cref="int"/> number of activities that include a specified activity.</returns>
public static int? GetActivityCount(DaylioData daylioData, string activity)
Expand All @@ -185,7 +185,6 @@ public static void InitData(DaylioData daylioData)

/// <summary>
/// Gets <see cref="DaylioCSVDataModel"/> entries that contain a specified string in the note.
/// Assumes that <see cref="DaylioData"/> has been initialized, otherwise returns null.
/// </summary>
/// <param name="daylioData">The <see cref="DaylioData"/> instance to use.</param>
/// <param name="searchString">The <see cref="string"/> to search for within entries.</param>
Expand All @@ -196,5 +195,50 @@ public static void InitData(DaylioData daylioData)
InitData(daylioData);
return GetEntriesWithString(searchString, comparisonMethod);
}

/// <summary>
/// Gets an avererage mood rating for a specified activity. Requires levels to be set for each mood.
/// Assumes that <see cref="DaylioData"/> has been initialized, otherwise returns null.
/// </summary>
/// <param name="activity">The activity name to get an avergae mood rating for.</param>
/// <returns>An average <see cref="Decimal?"/> mood rating for the specified activity.</returns>
public static decimal? GetAverageActivityMood(string activity)
{
if (_daylioData == null || _daylioData.DataRepo == null || string.IsNullOrWhiteSpace(activity)
|| !_daylioData.DataRepo.Activities.Contains(activity) || _daylioData.DataRepo.Moods.Where(x => x.Key == null).Any())
{
return null;
}

uint moodSum = 0;
uint count = 0;

foreach (DaylioCSVDataModel entry in _daylioData.DataRepo.CSVData?.Where(entry => entry.ActivitiesCollection
.Any(entryActivity => entryActivity.Equals(activity, StringComparison.InvariantCultureIgnoreCase)))
?? Enumerable.Empty<DaylioCSVDataModel>())
{
if (entry == Enumerable.Empty<DaylioCSVDataModel>())
{
continue;
}
moodSum += Convert.ToUInt32(_daylioData.DataRepo.Moods[entry.Mood]);
count++;
}

return count == 0 ? null
: (decimal)moodSum / count;
}

/// <summary>
/// Gets an avererage mood rating for a specified activity. Requires levels to be set for each mood.
/// </summary>
/// <param name="daylioData">The <see cref="DaylioData"/> instance to use.</param>
/// <param name="activity">The activity name to get an avergae mood rating for.</param>
/// <returns>An average <see cref="Decimal?"/> mood rating for the specified activity.</returns>
public static decimal? GetAverageActivityMood(DaylioData daylioData, string activity)
{
InitData(daylioData);
return GetAverageActivityMood(activity);
}
}
}
}
10 changes: 5 additions & 5 deletions src/DaylioData/Models/DaylioCSVDataModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@ namespace DaylioData.Models
public class DaylioCSVDataModel
{
[Index(0)]
public DateOnly FullDate { get; set; }
public required DateOnly FullDate { get; set; }

[Index(1)]
public DateOnly Date { get; set; }
public required DateOnly Date { get; set; }

[Index(2)]
public string? Weekday { get; set; }
public required string? Weekday { get; set; }

[Index(3)]
public TimeOnly Time { get; set; }
public required TimeOnly Time { get; set; }

[Index(4)]
public string? Mood { get; set; }
public required string Mood { get; set; }

[Index(5)]
public string? Activities { get; set; }
Expand Down
49 changes: 42 additions & 7 deletions src/DaylioData/Repo/DaylioDataRepo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,18 @@ public class DaylioDataRepo

private IEnumerable<DaylioCSVDataModel>? _CSVData;
private DaylioFileAccess? _fileAccess;
private readonly Dictionary<string, short> _defaultMoods = new Dictionary<string, short>()
{
{ "rad", 5 },
{ "good", 4 },
{ "meh", 3 },
{ "bad", 2 },
{ "awful", 1 }
};

public IEnumerable<DaylioCSVDataModel>? CSVData => _CSVData;
public HashSet<string> Activities = new HashSet<string>();
public HashSet<string> Moods = new HashSet<string>();
public Dictionary<string, short?> Moods = new Dictionary<string, short?>();

internal DaylioDataRepo(DaylioFileAccess fileAccess)
{
Expand All @@ -33,23 +41,50 @@ public void UpdateFile(string filePath)
InitializeMoods();
}

/// <summary>
/// Used to set custom mood levels.
/// </summary>
/// <param name="moodName">The name of the mood to set a level for.</param>
/// <param name="moodLevel">The level to set for the mood.</param>
public void SetMoodLevel(string moodName, short? moodLevel)
{
if (Moods.ContainsKey(moodName))
{
Moods[moodName] = moodLevel;
}
}

/// <summary>
/// Sets mood levels based on Daylio's default moods. This cannot be used with custom moods. <br></br>
/// Rad - 5, Good - 4, Meh - 3, Bad - 2, Awful - 1
/// </summary>
/// <exception cref="InvalidOperationException"></exception>
public void SetDefaultMoodLevels()
{
foreach (KeyValuePair<string, short> mood in _defaultMoods)
{
if (!Moods.ContainsKey(mood.Key))
{
throw new InvalidOperationException("Attempting to assign default mood levels to non-default moods.");
}
}

Moods = _defaultMoods.ToDictionary(x => x.Key, x => (short?)x.Value);
}

/// <summary>
/// Moods can be customized and can be any string. This will keep track of all unique moods.
/// </summary>
/// <remarks>Unfortunately there is no way to assign a scale to the moods from the CSV data. This could potentially eventually be done through a manual assignment extension. </remarks>
private void InitializeMoods()
{
if (_CSVData == null)
{
return;
}

foreach (string? mood in _CSVData.Select(x => x.Mood).Distinct())
foreach (string mood in _CSVData.Select(x => x.Mood).Distinct())
{
if (mood != null)
{
Moods.Add(mood);
}
Moods.Add(mood, null);
}
}

Expand Down