forked from new-frontiers-14/frontier-station-14
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add project to update Patrons.yml from a csv file containing Patreon …
…webhooks, add missing Patrons (#20942)
- Loading branch information
1 parent
1e14333
commit 388e424
Showing
13 changed files
with
267 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
using System.Text.Json.Serialization; | ||
|
||
namespace Content.PatreonParser; | ||
|
||
public sealed class Attributes | ||
{ | ||
[JsonPropertyName("full_name")] | ||
public string FullName = default!; | ||
|
||
[JsonPropertyName("pledge_relationship_start")] | ||
public DateTime? PledgeRelationshipStart; | ||
|
||
[JsonPropertyName("title")] | ||
public string Title = default!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<OutputType>Exe</OutputType> | ||
<TargetFramework>net7.0</TargetFramework> | ||
<ImplicitUsings>enable</ImplicitUsings> | ||
<Nullable>enable</Nullable> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="CsvHelper" Version="30.0.1" /> | ||
</ItemGroup> | ||
|
||
</Project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
using System.Text.Json.Serialization; | ||
|
||
namespace Content.PatreonParser; | ||
|
||
public sealed class CurrentlyEntitledTiers | ||
{ | ||
[JsonPropertyName("data")] | ||
public List<TierData> Data = default!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
using System.Text.Json.Serialization; | ||
|
||
namespace Content.PatreonParser; | ||
|
||
public sealed class Data | ||
{ | ||
[JsonPropertyName("id")] | ||
public string Id = default!; | ||
|
||
[JsonPropertyName("type")] | ||
public string Type = default!; | ||
|
||
[JsonPropertyName("attributes")] | ||
public Attributes Attributes = default!; | ||
|
||
[JsonPropertyName("relationships")] | ||
public Relationships Relationships = default!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
using System.Text.Json.Serialization; | ||
|
||
namespace Content.PatreonParser; | ||
|
||
public sealed class Included | ||
{ | ||
[JsonPropertyName("id")] | ||
public int Id; | ||
|
||
[JsonPropertyName("type")] | ||
public string Type = default!; | ||
|
||
[JsonPropertyName("attributes")] | ||
public Attributes Attributes = default!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Content.PatreonParser; | ||
|
||
public readonly record struct Patron(string FullName, string TierName, DateTime Start); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
using System.Globalization; | ||
using System.Text.Json; | ||
using System.Text.Json.Serialization; | ||
using Content.PatreonParser; | ||
using CsvHelper; | ||
using CsvHelper.Configuration; | ||
using static System.Environment; | ||
|
||
var repository = new DirectoryInfo(Directory.GetCurrentDirectory()).Parent!.Parent!.Parent!.Parent!; | ||
var patronsPath = Path.Combine(repository.FullName, "Resources/Credits/Patrons.yml"); | ||
if (!File.Exists(patronsPath)) | ||
{ | ||
Console.WriteLine($"File {patronsPath} not found."); | ||
return; | ||
} | ||
|
||
Console.WriteLine($"Updating {patronsPath}"); | ||
Console.WriteLine("Is this correct? [Y/N]"); | ||
var response = Console.ReadLine()?.ToUpper(); | ||
if (response != "Y") | ||
{ | ||
Console.WriteLine("Exiting"); | ||
return; | ||
} | ||
|
||
var delimiter = ","; | ||
var hasHeaderRecord = false; | ||
var mode = CsvMode.RFC4180; | ||
var escape = '\''; | ||
Console.WriteLine($""" | ||
Delimiter: {delimiter} | ||
HasHeaderRecord: {hasHeaderRecord} | ||
Mode: {mode} | ||
Escape Character: {escape} | ||
"""); | ||
|
||
Console.WriteLine("Enter the full path to the .csv file containing the Patreon webhook data:"); | ||
var filePath = Console.ReadLine(); | ||
if (filePath == null) | ||
{ | ||
Console.Write("No path given."); | ||
return; | ||
} | ||
|
||
var file = File.OpenRead(filePath); | ||
var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) | ||
{ | ||
Delimiter = delimiter, | ||
HasHeaderRecord = hasHeaderRecord, | ||
Mode = mode, | ||
Escape = escape, | ||
}; | ||
|
||
using var reader = new CsvReader(new StreamReader(file), csvConfig); | ||
|
||
// This does not handle tier name changes, but we haven't had any yet | ||
var patrons = new Dictionary<Guid, Patron>(); | ||
var jsonOptions = new JsonSerializerOptions | ||
{ | ||
IncludeFields = true, | ||
NumberHandling = JsonNumberHandling.AllowReadingFromString | ||
}; | ||
|
||
// This assumes that the rows are already sorted by id | ||
foreach (var record in reader.GetRecords<Row>()) | ||
{ | ||
if (record.Trigger == "members:create") | ||
continue; | ||
|
||
var content = JsonSerializer.Deserialize<Root>(record.ContentJson, jsonOptions)!; | ||
|
||
var id = Guid.Parse(content.Data.Id); | ||
patrons.Remove(id); | ||
|
||
var tiers = content.Data.Relationships.CurrentlyEntitledTiers.Data; | ||
if (tiers.Count == 0) | ||
continue; | ||
else if (tiers.Count > 1) | ||
throw new ArgumentException("Found more than one tier"); | ||
|
||
var tier = tiers[0]; | ||
var tierName = content.Included.SingleOrDefault(i => i.Id == tier.Id && i.Type == tier.Type)?.Attributes.Title; | ||
if (tierName == null) | ||
continue; | ||
|
||
if (record.Trigger == "members:delete") | ||
continue; | ||
|
||
var fullName = content.Data.Attributes.FullName.Trim(); | ||
var pledgeStart = content.Data.Attributes.PledgeRelationshipStart; | ||
|
||
switch (record.Trigger) | ||
{ | ||
case "members:create": | ||
break; | ||
case "members:delete": | ||
break; | ||
case "members:update": | ||
patrons.Add(id, new Patron(fullName, tierName, pledgeStart!.Value)); | ||
break; | ||
case "members:pledge:create": | ||
if (pledgeStart == null) | ||
continue; | ||
|
||
patrons.Add(id, new Patron(fullName, tierName, pledgeStart.Value)); | ||
break; | ||
case "members:pledge:delete": | ||
// Deleted pledge but still not expired, expired is handled earlier | ||
patrons.Add(id, new Patron(fullName, tierName, pledgeStart!.Value)); | ||
break; | ||
case "members:pledge:update": | ||
patrons.Add(id, new Patron(fullName, tierName, pledgeStart!.Value)); | ||
break; | ||
} | ||
} | ||
|
||
var patronList = patrons.Values.ToList(); | ||
patronList.Sort((a, b) => a.Start.CompareTo(b.Start)); | ||
var yaml = patronList.Select(p => $""" | ||
- Name: "{p.FullName.Replace("\"", "\\\"")}" | ||
Tier: {p.TierName} | ||
"""); | ||
var output = string.Join(NewLine, yaml) + NewLine; | ||
File.WriteAllText(patronsPath, output); | ||
Console.WriteLine($"Updated {patronsPath} with {patronList.Count} patrons."); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
using System.Text.Json.Serialization; | ||
|
||
namespace Content.PatreonParser; | ||
|
||
public sealed class Relationships | ||
{ | ||
[JsonPropertyName("currently_entitled_tiers")] | ||
public CurrentlyEntitledTiers CurrentlyEntitledTiers = default!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
using System.Text.Json.Serialization; | ||
|
||
namespace Content.PatreonParser; | ||
|
||
public sealed class Root | ||
{ | ||
[JsonPropertyName("data")] | ||
public Data Data = default!; | ||
|
||
[JsonPropertyName("included")] | ||
public List<Included> Included = default!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
using CsvHelper.Configuration.Attributes; | ||
|
||
namespace Content.PatreonParser; | ||
|
||
// These need to be properties or CSVHelper will not find them | ||
public sealed class Row | ||
{ | ||
[Name("Id"), Index(0)] | ||
public int Id { get; set; } | ||
|
||
[Name("Trigger"), Index(1)] | ||
public string Trigger { get; set; } = default!; | ||
|
||
[Name("Time"), Index(2)] | ||
public DateTime Time { get; set; } | ||
|
||
[Name("Content"), Index(3)] | ||
public string ContentJson { get; set; } = default!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
using System.Text.Json.Serialization; | ||
|
||
namespace Content.PatreonParser; | ||
|
||
public sealed class TierData | ||
{ | ||
[JsonPropertyName("id")] | ||
public int Id; | ||
|
||
[JsonPropertyName("type")] | ||
public string Type = default!; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters