27 Commits
0.3.5 ... 0.4.0

Author SHA1 Message Date
450824733d polska gurom 2024-04-13 12:18:33 +02:00
110f909c6f update screenshot for combat zone 2024-04-13 12:13:08 +02:00
a1099628a0 update URL to Salus homepage 2024-04-13 12:12:14 +02:00
7e85159fd5 fix removing of entries 2024-04-13 12:07:38 +02:00
2e8daca61c add new main image 2024-04-13 12:07:30 +02:00
05b714a607 remove mkdocs.yml 2024-04-13 11:52:29 +02:00
3b0492c70f adapt the offset for the new levels 2024-04-13 11:49:13 +02:00
c20280eb13 remove mkdocs
The web page for the tool has moved to the Salus home page, so we no longer need a mkdocs file to generate the home page. But we keep the other docs around for reference.
2024-04-13 11:46:57 +02:00
dd863c326e bump version 2024-04-13 11:44:05 +02:00
2012aab7b3 update changelog 2024-04-13 11:43:17 +02:00
abb7954614 sort systems by name 2024-04-12 13:50:13 +02:00
0f44a6a9a7 add a select all button
also wished for by Shak
2024-04-12 13:48:55 +02:00
34e0a0c8ba change layout of tree to go: system / faction / bgs
This was requested by some very special commanders who, after a massive BGS bender, have very long lists in terms of BGS actions taken
2024-04-11 16:25:20 +02:00
b0b82811cc update project dependencies 2024-04-11 10:21:49 +02:00
4855d78823 forgot to fix the URL 2024-01-29 19:34:21 +01:00
5ea288ee86 update webpage 2024-01-29 19:29:28 +01:00
f3fc99a3f3 bump version to 0.3.7 2024-01-29 19:26:59 +01:00
2bee03dbc2 update changelog 2024-01-29 19:26:15 +01:00
16b579688d identify cap ship by its music 2024-01-29 19:24:53 +01:00
9994a45d06 fix location not updating on carrier jumps 2024-01-29 18:23:19 +01:00
d6e2280a00 update website 2023-10-25 11:39:39 +02:00
160f4f8370 bump version information 2023-10-25 11:38:56 +02:00
4400418d30 update changelog 2023-10-25 11:38:47 +02:00
43037b0a5b don't return null for unknown 2023-10-25 11:35:30 +02:00
afc831cf31 add the new banshee 2023-10-25 11:35:19 +02:00
4ab54ee576 show Errors found by journal parser 2023-10-25 11:30:44 +02:00
d6842115c5 no longer completely fail on one wrong entry
U17 might have caused some journal bugs so don't fail immediately on one wrong entry, instead keep them in an Errors collection for later processing
2023-10-25 11:30:34 +02:00
27 changed files with 374 additions and 151 deletions

View File

@@ -0,0 +1,30 @@
using EDPlayerJournal.Entries;
namespace EDPlayerJournal.BGS.Parsers;
internal class CarrierJumpParser : ITransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionParserOptions options, TransactionList transactions) {
CarrierJump? jump = entry as CarrierJump;
if (jump == null) {
return;
}
if (!jump.Docked) {
return;
}
context.CurrentSystem = jump.StarSystem;
context.CurrentSystemAddress = jump.SystemAddress;
context.SystemsByID.TryAdd(jump.SystemAddress, jump.StarSystem);
if (!string.IsNullOrEmpty(jump.SystemFaction)) {
context.ControllingFaction = jump.SystemFaction;
}
if (jump.SystemFactions != null && jump.SystemFactions.Count > 0) {
context.SystemFactions[jump.StarSystem] = jump.SystemFactions;
}
}
}

View File

@@ -0,0 +1,17 @@
using EDPlayerJournal.Entries;
namespace EDPlayerJournal.BGS.Parsers;
internal class MusicParser : ITransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionParserOptions options, TransactionList transactions) {
MusicEntry? entryMusic = (MusicEntry)entry;
if (entryMusic == null) {
return;
}
if (string.Compare(entryMusic.MusicTrack, "Combat_CapitalShip") == 0) {
context.HaveSeenCapShip = true;
}
}
}

View File

@@ -665,6 +665,7 @@ public class TransactionParser {
{ {
{ Events.ApproachSettlement, new ApproachSettlementParser() }, { Events.ApproachSettlement, new ApproachSettlementParser() },
{ Events.CapShipBond, new CapShipBondParser() }, { Events.CapShipBond, new CapShipBondParser() },
{ Events.CarrierJump, new CarrierJumpParser() },
{ Events.Commander, new CommanderParser() }, { Events.Commander, new CommanderParser() },
{ Events.CommitCrime, new CommitCrimeParser() }, { Events.CommitCrime, new CommitCrimeParser() },
{ Events.Died, new DiedParser() }, { Events.Died, new DiedParser() },
@@ -683,6 +684,7 @@ public class TransactionParser {
{ Events.MissionFailed, new MissionFailedParser() }, { Events.MissionFailed, new MissionFailedParser() },
{ Events.Missions, new MissionsParser() }, { Events.Missions, new MissionsParser() },
{ Events.MultiSellExplorationData, new MultiSellExplorationDataParser() }, { Events.MultiSellExplorationData, new MultiSellExplorationDataParser() },
{ Events.Music, new MusicParser() },
{ Events.ReceiveText, new ReceiveTextParser() }, { Events.ReceiveText, new ReceiveTextParser() },
{ Events.RedeemVoucher, new RedeemVoucherParser() }, { Events.RedeemVoucher, new RedeemVoucherParser() },
{ Events.SearchAndRescue, new SearchAndRescueParser() }, { Events.SearchAndRescue, new SearchAndRescueParser() },

View File

@@ -0,0 +1,44 @@
using Newtonsoft.Json.Linq;
namespace EDPlayerJournal.Entries;
public class CarrierJump : Entry {
public bool Docked { get; set; } = false;
public string? StationName { get; set; } = null;
public string? StationType { get; set; } = null;
public string? StarSystem { get; set; } = null;
public ulong SystemAddress { get; set; } = 0;
public string? SystemFaction { get; set; } = null;
public List<Faction> SystemFactions { get; set; } = new List<Faction>();
protected override void Initialise() {
Docked = JSON.Value<bool?>("Docked") ?? false;
StarSystem = JSON.Value<string>("StarSystem");
SystemAddress = JSON.Value<ulong?>("SystemAddress") ?? 0;
StationName = JSON.Value<string?>("StationName");
StationType = JSON.Value<string?>("StationType");
var faction = JSON.Value<JObject>("SystemFaction");
if (faction != null) {
SystemFaction = faction.Value<string>("Name");
}
var factions = JSON.Value<JArray>("Factions");
if (factions != null) {
foreach (JObject system_faction in factions) {
Faction? f = Faction.FromJSON(system_faction);
if (f != null) {
SystemFactions.Add(f);
}
}
}
}
}

View File

@@ -15,6 +15,7 @@ public class Entry {
{ Events.ApproachSettlement, typeof(ApproachSettlementEntry) }, { Events.ApproachSettlement, typeof(ApproachSettlementEntry) },
{ Events.Bounty, typeof(BountyEntry) }, { Events.Bounty, typeof(BountyEntry) },
{ Events.CapShipBond, typeof(CapShipBondEntry) }, { Events.CapShipBond, typeof(CapShipBondEntry) },
{ Events.CarrierJump, typeof(CarrierJump) },
{ Events.Commander, typeof(CommanderEntry) }, { Events.Commander, typeof(CommanderEntry) },
{ Events.CommitCrime, typeof(CommitCrimeEntry) }, { Events.CommitCrime, typeof(CommitCrimeEntry) },
{ Events.Died, typeof(DiedEntry) }, { Events.Died, typeof(DiedEntry) },
@@ -37,6 +38,7 @@ public class Entry {
{ Events.MissionRedirected, typeof(MissionRedirectedEntry) }, { Events.MissionRedirected, typeof(MissionRedirectedEntry) },
{ Events.Missions, typeof(MissionsEntry) }, { Events.Missions, typeof(MissionsEntry) },
{ Events.MultiSellExplorationData, typeof(MultiSellExplorationDataEntry) }, { Events.MultiSellExplorationData, typeof(MultiSellExplorationDataEntry) },
{ Events.Music, typeof(MusicEntry) },
{ Events.ReceiveText, typeof(ReceiveTextEntry) }, { Events.ReceiveText, typeof(ReceiveTextEntry) },
{ Events.RedeemVoucher, typeof(RedeemVoucherEntry) }, { Events.RedeemVoucher, typeof(RedeemVoucherEntry) },
{ Events.SearchAndRescue, typeof(SearchAndRescueEntry) }, { Events.SearchAndRescue, typeof(SearchAndRescueEntry) },
@@ -64,7 +66,15 @@ public class Entry {
public static Entry? Parse(string journalline) { public static Entry? Parse(string journalline) {
using (JsonReader reader = new JsonTextReader(new StringReader(journalline))) { using (JsonReader reader = new JsonTextReader(new StringReader(journalline))) {
reader.DateParseHandling = DateParseHandling.None; reader.DateParseHandling = DateParseHandling.None;
var json = JObject.Load(reader); JObject? json = null;
try {
json = JObject.Load(reader);
} catch (Exception e) {
throw new InvalidJournalEntryException(
"invalid JSON journal entry: " + journalline,
e
);
}
if (json == null) { if (json == null) {
return null; return null;
} }

View File

@@ -4,6 +4,7 @@ public class Events {
public static readonly string ApproachSettlement = "ApproachSettlement"; public static readonly string ApproachSettlement = "ApproachSettlement";
public static readonly string Bounty = "Bounty"; public static readonly string Bounty = "Bounty";
public static readonly string CapShipBond = "CapShipBond"; public static readonly string CapShipBond = "CapShipBond";
public static readonly string CarrierJump = "CarrierJump";
public static readonly string Commander = "Commander"; public static readonly string Commander = "Commander";
public static readonly string CommitCrime = "CommitCrime"; public static readonly string CommitCrime = "CommitCrime";
public static readonly string Died = "Died"; public static readonly string Died = "Died";
@@ -27,6 +28,7 @@ public class Events {
public static readonly string MissionRedirected = "MissionRedirected"; public static readonly string MissionRedirected = "MissionRedirected";
public static readonly string Missions = "Missions"; public static readonly string Missions = "Missions";
public static readonly string MultiSellExplorationData = "MultiSellExplorationData"; public static readonly string MultiSellExplorationData = "MultiSellExplorationData";
public static readonly string Music = "Music";
public static readonly string ReceiveText = "ReceiveText"; public static readonly string ReceiveText = "ReceiveText";
public static readonly string RedeemVoucher = "RedeemVoucher"; public static readonly string RedeemVoucher = "RedeemVoucher";
public static readonly string SearchAndRescue = "SearchAndRescue"; public static readonly string SearchAndRescue = "SearchAndRescue";

View File

@@ -0,0 +1,9 @@
namespace EDPlayerJournal.Entries;
public class MusicEntry : Entry {
public string? MusicTrack { get; set; } = null;
protected override void Initialise() {
MusicTrack = JSON.Value<string?>("MusicTrack");
}
}

View File

@@ -6,6 +6,7 @@
public class InvalidJournalEntryException : Exception { public class InvalidJournalEntryException : Exception {
public InvalidJournalEntryException() { } public InvalidJournalEntryException() { }
public InvalidJournalEntryException(string message) : base(message) { } public InvalidJournalEntryException(string message) : base(message) { }
public InvalidJournalEntryException(string message, Exception inner) : base(message, inner) { }
} }
/// <summary> /// <summary>

View File

@@ -17,6 +17,11 @@ public class JournalFile : IComparable<JournalFile>
private static Regex update11regex = new Regex("Journal\\.([^\\.]+)\\.(\\d+).log"); private static Regex update11regex = new Regex("Journal\\.([^\\.]+)\\.(\\d+).log");
private static string iso8601 = "yyyyMMddTHHmmss"; private static string iso8601 = "yyyyMMddTHHmmss";
/// <summary>
/// A public list of errors encountered while parsing the journal files
/// </summary>
public List<Exception> Errors { get; private set; } = new List<Exception>();
public static bool VerifyFile(string path) { public static bool VerifyFile(string path) {
string filename = Path.GetFileName(path); string filename = Path.GetFileName(path);
@@ -125,15 +130,20 @@ public class JournalFile : IComparable<JournalFile>
} }
entries.Clear(); entries.Clear();
foreach(var line in lines) { Errors.Clear();
foreach (var line in lines) {
// Skip empty lines // Skip empty lines
if (line.Trim().Length == 0) { if (line.Trim().Length == 0) {
continue; continue;
} }
try {
Entry? entry = Entry.Parse(line); Entry? entry = Entry.Parse(line);
if (entry != null) { if (entry != null) {
entries.Add(entry); entries.Add(entry);
} }
} catch (Exception ex) {
Errors.Add(ex);
}
} }
} }
} }

View File

@@ -22,6 +22,12 @@ public class PlayerJournal {
ScanFiles(); ScanFiles();
} }
public List<Exception> AllErrors {
get {
return Files.SelectMany(x => x.Errors).ToList();
}
}
public List<JournalFile> Files { public List<JournalFile> Files {
get { return journalfiles; } get { return journalfiles; }
} }

View File

@@ -14,6 +14,10 @@ public enum ThargoidVessel {
/// Thargoid drone /// Thargoid drone
/// </summary> /// </summary>
Revenant = 8, Revenant = 8,
/// <summary>
/// New thargoid drone in U17
/// </summary>
Banshee = 9,
} }
public class Thargoid { public class Thargoid {
@@ -24,6 +28,8 @@ public class Thargoid {
{ 25000, ThargoidVessel.Revenant }, { 25000, ThargoidVessel.Revenant },
{ 65000, ThargoidVessel.Scout }, { 65000, ThargoidVessel.Scout },
{ 75000, ThargoidVessel.Scout }, { 75000, ThargoidVessel.Scout },
// New in Update 17
{ 100000, ThargoidVessel.Banshee },
// New in Update 15 // New in Update 15
{ 4500000, ThargoidVessel.Hunter }, { 4500000, ThargoidVessel.Hunter },
{ 6500000, ThargoidVessel.Cyclops }, { 6500000, ThargoidVessel.Cyclops },
@@ -47,7 +53,7 @@ public class Thargoid {
}; };
public static Dictionary<ThargoidVessel, string?> VesselNames { get; } = new() { public static Dictionary<ThargoidVessel, string?> VesselNames { get; } = new() {
{ ThargoidVessel.Unknown, null }, { ThargoidVessel.Unknown, "(Unknown)" },
{ ThargoidVessel.Revenant, "Revenant" }, { ThargoidVessel.Revenant, "Revenant" },
{ ThargoidVessel.Scout, "Scout" }, { ThargoidVessel.Scout, "Scout" },
{ ThargoidVessel.Orthrus, "Orthrus" }, { ThargoidVessel.Orthrus, "Orthrus" },
@@ -56,6 +62,7 @@ public class Thargoid {
{ ThargoidVessel.Medusa, "Medusa" }, { ThargoidVessel.Medusa, "Medusa" },
{ ThargoidVessel.Hydra, "Hydra" }, { ThargoidVessel.Hydra, "Hydra" },
{ ThargoidVessel.Hunter, "Hunter" }, { ThargoidVessel.Hunter, "Hunter" },
{ ThargoidVessel.Banshee, "Banshee" },
}; };
public static ThargoidVessel GetVesselByPayout(ulong payout) { public static ThargoidVessel GetVesselByPayout(ulong payout) {

View File

@@ -1,5 +1,27 @@
# EliteBGS changelog # EliteBGS changelog
## 0.4.0 on 13.04.2024
* Change layout of the results into System -> Faction -> Transaction.
Many people who contribute *a lot* of things to the BGS have preferred such
a layout to find the right things to post to various discord guilds/threads.
* Sort all systems in the new overview by name. It just makes them easier to
find when there are a lot of entries.
* Add a button to deselect/select all buttons.
## 0.3.7 on 29.01.2024
* Fix wrong locations of BGS action if you remain on your carrier while its
jumping to a new system.
* Identify a capital ship in a high CZ by its music.
## 0.3.6 on 25.10.2023
* U17 introduced invalid JSON into the player journal. EliteBGS can now skip over
those and keep processing. This way players won't have to delete lines in their
journals anymore to keep using the tool.
* Banshee has been added.
## 0.3.5 on 11.09.2023 ## 0.3.5 on 11.09.2023
* Small bounty voucher formats are no longer suppressed. * Small bounty voucher formats are no longer suppressed.

View File

@@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework> <TargetFramework>net7.0-windows</TargetFramework>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<Version>0.3.5</Version> <Version>0.4.0</Version>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo> <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<UseWPF>true</UseWPF> <UseWPF>true</UseWPF>
@@ -18,12 +18,15 @@
<Copyright>Copyright 2019 by Florian Stinglmayr</Copyright> <Copyright>Copyright 2019 by Florian Stinglmayr</Copyright>
<RepositoryUrl>https://codeberg.org/nola/EDBGS</RepositoryUrl> <RepositoryUrl>https://codeberg.org/nola/EDBGS</RepositoryUrl>
<PackageTags>ED;Elite Dangerous;BGS</PackageTags> <PackageTags>ED;Elite Dangerous;BGS</PackageTags>
<PackageProjectUrl>https://bgs.n0la.org</PackageProjectUrl> <PackageProjectUrl>https://salusinvicta.org/bgstool/</PackageProjectUrl>
<PackageReadmeFile>README.md</PackageReadmeFile> <PackageReadmeFile>README.md</PackageReadmeFile>
<Description>Elite: Dangerous BGS logging and reporting tool <Description>Elite: Dangerous BGS logging and reporting tool
</Description> </Description>
<PackageIcon>logo_v5.png</PackageIcon> <PackageIcon>logo_v5.png</PackageIcon>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<None Remove="main-page.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<Resource Include="main-page.png"> <Resource Include="main-page.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -37,15 +40,10 @@
<Pack>True</Pack> <Pack>True</Pack>
<PackagePath>\</PackagePath> <PackagePath>\</PackagePath>
</None> </None>
<None Update="docs\CHANGELOG.md"> <None Update="CHANGELOG.md">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Resource Include="docs\main-page.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Resource>
</ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="LICENCE.txt"> <Content Include="LICENCE.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -55,12 +53,12 @@
<Resource Include="Salus.ico" /> <Resource Include="Salus.ico" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MahApps.Metro" Version="2.4.9" /> <PackageReference Include="MahApps.Metro" Version="2.4.10" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.Windows.Compatibility" Version="7.0.0" /> <PackageReference Include="Microsoft.Windows.Compatibility" Version="8.0.4" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Ookii.Dialogs.Wpf" Version="5.0.1" /> <PackageReference Include="Ookii.Dialogs.Wpf" Version="5.0.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -9,71 +9,32 @@
mc:Ignorable="d" mc:Ignorable="d"
Title="Elite: Dangerous BGS Helper" Height="520" Width="950" Icon="Salus.ico" Closing="window_Closing"> Title="Elite: Dangerous BGS Helper" Height="520" Width="950" Icon="Salus.ico" Closing="window_Closing">
<Window.Resources> <Window.Resources>
<local:MinusFortyFiveConverter x:Key="MinusFortyFiveConverter" />
<Style x:Key="StretchingTreeViewStyle" TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}"> <Style x:Key="StretchingTreeViewStyle" TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/> <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style> </Style>
<local:MinusFortyFiveConverter x:Key="MinusFortyFiveConverter" />
</Window.Resources> <local:Report x:Key="ObjectivesBasedOnSystem" />
<mah:MetroWindow.RightWindowCommands>
<mah:WindowCommands ShowSeparators="False"> <HierarchicalDataTemplate DataType="{x:Type local:SystemObjectives}" ItemsSource="{Binding Path=Objectives}">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0,5,0"> <Grid
<Hyperlink x:Name="URL" NavigateUri="https://bgs.n0la.org/" RequestNavigate="URL_RequestNavigate">Homepage</Hyperlink>
</TextBlock>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0,15,0">
<Hyperlink x:Name="SRC" NavigateUri="https://codeberg.org/nola/EDBGS" RequestNavigate="URL_RequestNavigate">Source</Hyperlink>
</TextBlock>
<mah:ToggleSwitch Content="Dark Theme" x:Name="SwitchTheme" IsOn="True" Toggled="SwitchTheme_Toggled"/>
</mah:WindowCommands>
</mah:MetroWindow.RightWindowCommands>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TabControl Style="{DynamicResource MahApps.Styles.TabControl.Animated}">
<TabItem Header="Current Objectives">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ToolBar VerticalAlignment="Top" Grid.Row="0" Width="Auto" Margin="0,0,0,0" Height="Auto" Grid.ColumnSpan="3" HorizontalAlignment="Left">
<Button x:Name="ParseJournal" Content="Parse Journal" VerticalAlignment="Center" Click="ParseJournal_Click" HorizontalAlignment="Center"/>
<Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/>
<Label Content="From (UTC):" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center"/>
<mah:DateTimePicker x:Name="startdate" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Label Content="To (UTC):" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<mah:DateTimePicker x:Name="enddate" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/>
<Button x:Name="ResetTime" Content="Reset Time" Click="ResetTime_Click" />
<Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/>
<Button x:Name="ManuallyParse" Content="Manually Parse" Click="ManuallyParse_Click" />
</ToolBar>
<ToolBar Grid.Row="1" HorizontalAlignment="Left" Height="Auto" VerticalAlignment="Top" Width="Auto" Grid.ColumnSpan="3">
<Button x:Name="GenerateDiscord" Content="Generate Discord Report" VerticalAlignment="Stretch" Margin="0,0,0,0" VerticalContentAlignment="Center" Click="GenerateDiscord_Click"/>
<Separator />
<ComboBox x:Name="LogType" VerticalAlignment="Stretch" Margin="0,3,0,3" Width="140" SelectionChanged="LogType_SelectionChanged" />
</ToolBar>
<TreeView CheckBox.Checked="TreeView_CheckBox_Updated"
CheckBox.Unchecked="TreeView_CheckBox_Updated"
x:Name="entries" Margin="0,0,0,0"
Grid.ColumnSpan="3" Grid.Row="2"
KeyUp="entries_KeyUp"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch" Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
> >
<TreeView.ItemTemplate> <Grid.ColumnDefinitions>
<HierarchicalDataTemplate DataType="{x:Type local:Objective}" ItemsSource="{Binding UITransactions}" ItemContainerStyle="{StaticResource StretchingTreeViewStyle}"> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,2,0,2">
<CheckBox Focusable="False" IsChecked="{Binding IsEnabled}" VerticalAlignment="Center"/>
<TextBlock Text="System: " Margin="2,0,0,0"/>
<TextBlock Text="{Binding SystemName}" FontWeight="DemiBold"/>
</StackPanel>
</Grid>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Objective}"
ItemsSource="{Binding Path=UITransactions}"
ItemContainerStyle="{StaticResource StretchingTreeViewStyle}">
<Grid <Grid
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}" Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
@@ -85,10 +46,8 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,2,0,2"> <StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,2,0,2">
<CheckBox Focusable="False" IsChecked="{Binding IsEnabled}" VerticalAlignment="Center"/> <CheckBox Focusable="False" IsChecked="{Binding IsEnabled}" VerticalAlignment="Center"/>
<TextBlock Text="System: " Visibility="{Binding HasSystem}" Margin="2,0,0,0"/> <TextBlock Text="Faction: " Margin="2,0,0,0"/>
<TextBlock Text="{Binding System}" FontWeight="DemiBold" Visibility="{Binding HasSystem}"/> <TextBlock Text="{Binding Faction}" FontWeight="DemiBold"/>
<TextBlock Text="Faction: " Visibility="{Binding HasFaction}" Margin="2,0,0,0"/>
<TextBlock Text="{Binding Faction}" FontWeight="DemiBold" Visibility="{Binding HasFaction}"/>
</StackPanel> </StackPanel>
<Separator Visibility="Hidden" Grid.Column="1" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" /> <Separator Visibility="Hidden" Grid.Column="1" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" />
<StackPanel Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Center" Orientation="Horizontal"> <StackPanel Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Center" Orientation="Horizontal">
@@ -97,8 +56,9 @@
<Button x:Name="AddCombatZone" Content="Add Combat Zone" Click="AddCombatZone_Click" /> <Button x:Name="AddCombatZone" Content="Add Combat Zone" Click="AddCombatZone_Click" />
</StackPanel> </StackPanel>
</Grid> </Grid>
<HierarchicalDataTemplate.ItemTemplate> </HierarchicalDataTemplate>
<HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type local:UITransaction}">
<!-- This will stretch out the width of the item--> <!-- This will stretch out the width of the item-->
<Grid Initialized="Transaction_Initialized" <Grid Initialized="Transaction_Initialized"
HorizontalAlignment="Left" HorizontalAlignment="Left"
@@ -148,10 +108,71 @@
<TextBox x:Name="Profit" MinWidth="80" HorizontalContentAlignment="Right" Text="{Binding Profit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" LostFocus="Profit_LostFocus" KeyUp="Profit_KeyUp"/> <TextBox x:Name="Profit" MinWidth="80" HorizontalContentAlignment="Right" Text="{Binding Profit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" LostFocus="Profit_LostFocus" KeyUp="Profit_KeyUp"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</HierarchicalDataTemplate> </DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate> </Window.Resources>
</TreeView.ItemTemplate> <mah:MetroWindow.RightWindowCommands>
<mah:WindowCommands ShowSeparators="False">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0,5,0">
<Hyperlink x:Name="URL" NavigateUri="https://salusinvicta.org/bgstool/" RequestNavigate="URL_RequestNavigate">Homepage</Hyperlink>
</TextBlock>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0,15,0">
<Hyperlink x:Name="SRC" NavigateUri="https://codeberg.org/nola/EDBGS" RequestNavigate="URL_RequestNavigate">Source</Hyperlink>
</TextBlock>
<mah:ToggleSwitch Content="Dark Theme" x:Name="SwitchTheme" IsOn="True" Toggled="SwitchTheme_Toggled"/>
</mah:WindowCommands>
</mah:MetroWindow.RightWindowCommands>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TabControl Style="{DynamicResource MahApps.Styles.TabControl.Animated}">
<TabItem Header="Current Objectives">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ToolBar VerticalAlignment="Top" Grid.Row="0" Width="Auto" Margin="0,0,0,0" Height="Auto" Grid.ColumnSpan="3" HorizontalAlignment="Left">
<Button x:Name="ParseJournal" Content="Parse Journal" VerticalAlignment="Center" Click="ParseJournal_Click" HorizontalAlignment="Center"/>
<Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/>
<Label Content="From (UTC):" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center"/>
<mah:DateTimePicker x:Name="startdate" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Label Content="To (UTC):" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<mah:DateTimePicker x:Name="enddate" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/>
<Button x:Name="ResetTime" Content="Reset Time" Click="ResetTime_Click" />
<Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/>
<Button x:Name="ManuallyParse" Content="Manually Parse" Click="ManuallyParse_Click" />
</ToolBar>
<ToolBar Grid.Row="1" HorizontalAlignment="Left" Height="Auto" VerticalAlignment="Top" Width="Auto" Grid.ColumnSpan="3">
<Button x:Name="GenerateDiscord" Content="Generate Discord Report" VerticalAlignment="Stretch" Margin="0,0,0,0" VerticalContentAlignment="Center" Click="GenerateDiscord_Click"/>
<Separator />
<ComboBox x:Name="LogType" VerticalAlignment="Stretch" Margin="0,3,0,3" Width="140" SelectionChanged="LogType_SelectionChanged" />
<Separator />
<CheckBox x:Name="SelectAll" Content="Select All" IsChecked="True" Click="SelectAll_Click"/>
</ToolBar>
<TreeView CheckBox.Checked="TreeView_CheckBox_Updated"
CheckBox.Unchecked="TreeView_CheckBox_Updated"
x:Name="entries" Margin="0,0,0,0"
Grid.ColumnSpan="3"
Grid.Row="2"
KeyUp="entries_KeyUp"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
ItemsSource="{Binding Source={StaticResource ObjectivesBasedOnSystem}}"
>
<TreeView.ItemContainerStyle> <TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem"> <Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />

View File

@@ -107,6 +107,8 @@ public partial class MainWindow : MetroWindow {
//{ "HouseSalus", Color.FromRgb(0xBC, 0x94, 0x39) }, //{ "HouseSalus", Color.FromRgb(0xBC, 0x94, 0x39) },
{ "HouseSalus", Color.FromRgb(0xED, 0xDA, 0x70) }, { "HouseSalus", Color.FromRgb(0xED, 0xDA, 0x70) },
{ "NovaNavy", Color.FromRgb(0xA1, 0xA4, 0xDB) }, { "NovaNavy", Color.FromRgb(0xA1, 0xA4, 0xDB) },
// Official Red of the Polish Flag
{ "PolskaGurom", Color.FromRgb(0xD4, 0x21, 0x3D) },
}; };
foreach (var colourtheme in colorThemes) { foreach (var colourtheme in colorThemes) {
@@ -192,7 +194,7 @@ public partial class MainWindow : MetroWindow {
transactions.RemoveAll(x => incompletes.Contains(x)); transactions.RemoveAll(x => incompletes.Contains(x));
report = new Report(transactions); report = new Report(transactions);
this.entries.ItemsSource = report.Objectives; this.entries.ItemsSource = report.SystemObjectives;
} catch (Exception exception) { } catch (Exception exception) {
Log("Something went terribly wrong while parsing the E:D player journal."); Log("Something went terribly wrong while parsing the E:D player journal.");
Log("Please send this to CMDR Hekateh:"); Log("Please send this to CMDR Hekateh:");
@@ -233,6 +235,12 @@ public partial class MainWindow : MetroWindow {
HandleEntries(entries, start, end); HandleEntries(entries, start, end);
GenerateLog(); GenerateLog();
var errors = journal.AllErrors;
foreach (var error in errors) {
Log("An error has occured in the Journal file, please send this to CMDR Hekateh:");
Log(error.ToString());
}
} catch (Exception exception) { } catch (Exception exception) {
Log("Something went terribly wrong while parsing the E:D player journal."); Log("Something went terribly wrong while parsing the E:D player journal.");
Log("Please send this to CMDR Hekateh:"); Log("Please send this to CMDR Hekateh:");
@@ -265,15 +273,27 @@ public partial class MainWindow : MetroWindow {
object obj = entries.SelectedItem; object obj = entries.SelectedItem;
bool removed = false; bool removed = false;
if (obj.GetType() == typeof(Objective)) { if (obj.GetType() == typeof(SystemObjectives)) {
removed = report.Objectives.Remove(obj as Objective); removed = report.SystemObjectives.Remove(obj as SystemObjectives);
} else if (obj.GetType() == typeof(UITransaction) || } else if (obj.GetType() == typeof(Objective)) {
obj.GetType().IsSubclassOf(typeof(UITransaction))) { report
foreach (Objective parent in report.Objectives) { .SystemObjectives
if (parent.UITransactions.Remove(obj as UITransaction)) { .ForEach(x => {
if (x.Objectives.Remove(obj as Objective)) {
removed = true; removed = true;
} }
} });
} else if (obj.GetType() == typeof(UITransaction) ||
obj.GetType().IsSubclassOf(typeof(UITransaction))) {
report
.SystemObjectives
.SelectMany(x =>
x.Objectives
.Where(x => x.UITransactions.Contains(obj as UITransaction))
)
.ToList()
.ForEach(x => removed = x.UITransactions.Remove(obj as UITransaction))
;
} }
if (removed) { if (removed) {
@@ -551,4 +571,11 @@ public partial class MainWindow : MetroWindow {
} catch (Exception) { } catch (Exception) {
} }
} }
private void SelectAll_Click(object sender, RoutedEventArgs e) {
if (report == null) {
return;
}
report.SystemObjectives.ForEach(t => { t.IsEnabled = (bool)SelectAll.IsChecked; });
}
} }

View File

@@ -8,7 +8,7 @@ public class MinusFortyFiveConverter : IValueConverter {
/// <inheritdoc/> /// <inheritdoc/>
public object Convert( public object Convert(
object value, Type targetType, object parameter, CultureInfo culture) { object value, Type targetType, object parameter, CultureInfo culture) {
return (double)value - 80; return (double)value - 110;
} }
/// <inheritdoc/> /// <inheritdoc/>

View File

@@ -242,7 +242,7 @@ public class UITransaction : INotifyPropertyChanged {
} }
public class Objective : IComparable<Objective> { public class Objective : IComparable<Objective> {
public bool IsEnabled { get; set; } public bool IsEnabled { get; set; } = true;
public List<UITransaction> UITransactions { get; } = new List<UITransaction>(); public List<UITransaction> UITransactions { get; } = new List<UITransaction>();

View File

@@ -1,6 +1,4 @@
using System.Reflection; using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows; using System.Windows;
@@ -51,5 +49,5 @@ using System.Windows;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.3.5.0")] [assembly: AssemblyVersion("0.4.0.0")]
[assembly: AssemblyFileVersion("0.3.5.0")] [assembly: AssemblyFileVersion("0.4.0.0")]

View File

@@ -7,7 +7,7 @@ been parsed, you may then generate a BGS report you can copy/paste into Discord.
Source code is available at [https://codeberg.org/nola/edbgs](https://codeberg.org/nola/edbgs). Source code is available at [https://codeberg.org/nola/edbgs](https://codeberg.org/nola/edbgs).
Binary downloads can be found here: [https://bgs.n0la.org/](https://bgs.n0la.org/). Binary downloads can be found here: [https://salusinvicta.org/bgstool/](https://salusinvicta.org/bgstool/).
## How To ## How To

View File

@@ -1,10 +1,38 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using EDPlayerJournal.BGS; using EDPlayerJournal.BGS;
namespace EliteBGS; namespace EliteBGS;
public class SystemObjectives : INotifyPropertyChanged, IComparable<SystemObjectives> {
public event PropertyChangedEventHandler PropertyChanged;
private bool isenabled = true;
public bool IsEnabled {
get { return isenabled; }
set {
isenabled = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsEnabled"));
}
}
public bool IsExpanded { get; set; } = false;
public string SystemName { get; set; } = string.Empty;
public List<Objective> Objectives { get; set; } = new();
public int CompareTo(SystemObjectives other) {
if (other == null) return 1;
return string.Compare(SystemName, other.SystemName, StringComparison.OrdinalIgnoreCase);
}
}
public class Report { public class Report {
public List<Objective> Objectives { get; set; } = new List<Objective>(); public List<SystemObjectives> SystemObjectives { get; set; } = new();
public Report() { } public Report() { }
@@ -12,29 +40,35 @@ public class Report {
Populate(transactions); Populate(transactions);
} }
public List<Objective> Objectives {
get {
return SystemObjectives
.Where(t => t.IsEnabled)
.SelectMany(x => x.Objectives)
.ToList()
;
}
}
private void Populate(List<Transaction> transactions) { private void Populate(List<Transaction> transactions) {
if (transactions == null || transactions.Count == 0) { if (transactions == null || transactions.Count == 0) {
return; return;
} }
foreach (Transaction t in transactions) { foreach (Transaction t in transactions) {
Objective o; var o = SystemObjectives.Find(x => string.Compare(x.SystemName, t.System) == 0);
if (t.SystemContribution) {
o = Objectives.Find(x => x.Matches(t.System));
} else {
o = Objectives.Find(x => x.Matches(t.System, t.Faction));
}
if (o == null) { if (o == null) {
if (t.SystemContribution) { o = new SystemObjectives() { SystemName = t.System };
o = new Objective() { System = t.System }; SystemObjectives.Add(o);
} else {
o = new Objective() { Faction = t.Faction, System = t.System };
} }
Objectives.Add(o); var objective = o.Objectives.Find(x => x.Matches(t.System, t.Faction));
if (objective == null) {
objective = new Objective() { Faction = t.Faction, System = t.System };
o.Objectives.Add(objective);
}
objective.UITransactions.Add(new UITransaction(t));
} }
o.UITransactions.Add(new UITransaction(t)); SystemObjectives.Sort();
}
} }
} }

BIN
EliteBGS/combatzone.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

View File

@@ -20,13 +20,13 @@ command line:
winget install Microsoft.DotNet.DesktopRuntime.7 winget install Microsoft.DotNet.DesktopRuntime.7
``` ```
You can download the **latest** version **0.3.5** at CodeBerg: You can download the **latest** version **0.3.7** at CodeBerg:
* [https://codeberg.org/nola/EDBGS/releases](https://codeberg.org/nola/EDBGS/releases) * [https://codeberg.org/nola/EDBGS/releases](https://codeberg.org/nola/EDBGS/releases)
Or alternatively from my server: Or alternatively from my server:
* [https://bgs.n0la.org/elitebgs-0.3.5.zip](https://bgs.n0la.org/elitebgs-0.3.5.zip) * [https://bgs.n0la.org/elitebgs-0.3.7.zip](https://bgs.n0la.org/elitebgs-0.3.7.zip)
## Old Versions ## Old Versions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 74 KiB

View File

@@ -1,15 +0,0 @@
site_name: EliteBGS
markdown_extensions:
- pymdownx.snippets:
check_paths: true
theme:
name: lumen
nav:
- Overview: 'index.md'
- "Detailed Description": 'description.md'
- "Combat Zones": 'combatzones.md'
- FAQ: 'faq.md'
- Changelog: 'CHANGELOG.md'

View File

@@ -3,7 +3,7 @@
EDBGS is a project containing the EliteBGS BGS application. It also contains the dotnet EDBGS is a project containing the EliteBGS BGS application. It also contains the dotnet
class library EDPlayerJournal, which reads and parses Elite Dangerous player journals. class library EDPlayerJournal, which reads and parses Elite Dangerous player journals.
See [https://bgs.n0la.org/](https://bgs.n0la.org) for further details. See [https://salusinvicta.org/bgstool/](https://salusinvicta.org/bgstool/) for further details.
The tool helps with creating BGS reports for squadrons that support factions in The tool helps with creating BGS reports for squadrons that support factions in
Elite: Dangerous that can be copy and pasted into a Discord server. It finds all BGS Elite: Dangerous that can be copy and pasted into a Discord server. It finds all BGS