-
Notifications
You must be signed in to change notification settings - Fork 0
/
EventStockParser.linq
86 lines (64 loc) · 2.53 KB
/
EventStockParser.linq
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<Query Kind="Statements">
<Namespace>System.Net.Http</Namespace>
</Query>
// Arknights event stock parser.
#nullable enable
#load "./lib/Clipboard.linq"
#load "./lib/Extensions.linq"
// TODO: Specify the event URI including /Rerun if present.
var eventUri = """
Babel_(event)
"""
.Trim()
.Replace(" Rerun", "/Rerun")
.Replace(" ", "_")
.Split('#')
.First();
const StringSplitOptions StringSplitOptions = StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries;
using var httpClient = new HttpClient();
var wiki = await httpClient.GetStringAsync($"https://arknights.wiki.gg/wiki/{eventUri}?action=raw");
var regexTimeout = TimeSpan.FromMilliseconds(100);
var eventName = Regex.Match(wiki, @"\|name\s*=\s*(.+?)\n", RegexOptions.None, regexTimeout).Groups[1].Value.Trim();
var eventStock = Regex.Match(wiki, @"=+?([^=]+)=+?[^=]+\{\{Event\s+store\s+head", RegexOptions.None, regexTimeout).Groups[1].Value.Trim();
string? eventCurrency = null;
var stockItems = wiki
.Replace("\n", string.Empty)
.Split("}}", StringSplitOptions)
.SkipWhile(static s => !s.Contains("{{Event store head"))
.TakeWhile(static s => !s.StartsWith("{{Table end"))
.Select(GetStockItem)
.Where(static s => !string.IsNullOrEmpty(s))
.ToArray();
if(!stockItems.Any())
{
throw new("No event stock items found");
}
await new string[]{
$@"[new(""{eventUri}#{(string.IsNullOrWhiteSpace(eventStock) ? "EVENT_STOCK" : eventStock.UnderscoreSpaces())}"", ""{eventName}"", ""{(eventCurrency ?? "EVENT_CURRENCY").UnderscoreSpaces()}"")] = new(""""""{Environment.NewLine}// {eventName}",
string.Join(Environment.NewLine, stockItems),
$@""""""")"
}.SetClipboard();
"Event stock has been copied to clipboard.".Dump();
string GetStockItem(string stockItem)
{
const string EventStoreCell = "{{Event store cell|";
const string Name = nameof(Name);
const string Currency = nameof(Currency);
const string Price = nameof(Price);
const string Stock = nameof(Stock);
var regex = new Regex(@$"^\s*{Regex.Escape(EventStoreCell)}\s*[a-z]+\s*=\s*(?<{Name}>[^,\|]+).*\|[a-z]+\s*=\s*(?<{Currency}>[^,]+).+?(?<{Price}>[0-9]+)\|[a-z]+\s*=\s*(?<{Stock}>[0-9]+)\s*$", RegexOptions.ExplicitCapture, regexTimeout);
var match = regex.Match(stockItem);
if(!match.Success)
{
return string.Empty;
}
eventCurrency ??= getValue(Currency);
var stock = getValue(Stock);
if(stock == "1")
{
stock = string.Empty;
}
return $"{getValue(Price)}\t{stock}\t{getValue(Name).Replace("“", @"""").Replace("”", @"""")}";
string getValue(string name) =>
match.Groups[name].Value.Trim();
}