33 Commits
0.3.6 ... 0.4.2

Author SHA1 Message Date
0203008202 make placement of colons consistent 2024-05-02 20:26:14 +02:00
03621721b8 bump version to 0.4.2.0 2024-05-02 20:13:02 +02:00
ccba55ac35 move colon into fixed with formatting 2024-05-02 20:12:23 +02:00
0708880284 don't add a newline after bot header for one line 2024-05-02 20:11:51 +02:00
18c3073635 update changelog 2024-05-02 20:09:19 +02:00
c43d2ff1d3 add a bot header for discord log parsing 2024-05-02 20:07:10 +02:00
a3b7623557 bump version 2024-04-28 12:48:42 +02:00
1c2fc1e2e6 update changelog 2024-04-28 12:47:00 +02:00
53da6b4bc2 add Ermeni Blue 2024-04-28 12:46:01 +02:00
bc44ceb205 update changelog 2024-04-28 12:42:12 +02:00
4d3048a37d add the market name to trading entries 2024-04-28 12:41:50 +02:00
463598c779 update changelog 2024-04-28 12:36:58 +02:00
bf56f3a2d5 add a filter for doubly redeemed vouchers 2024-04-28 12:35:14 +02:00
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
30 changed files with 480 additions and 212 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

@@ -0,0 +1,84 @@
using EDPlayerJournal.Entries;
namespace EDPlayerJournal.BGS.Parsers;
internal class RedeemVoucherParser : ITransactionParserPart {
public void Parse(Entry e, TransactionParserContext context, TransactionParserOptions options, TransactionList transactions) {
RedeemVoucherEntry? entry = e as RedeemVoucherEntry;
if (entry == null) {
throw new NotImplementedException();
}
if (context.CurrentSystem == null) {
transactions.AddIncomplete(new Vouchers(),
"Could not find out where the vouchers were redeemed", e
);
return;
}
List<Faction>? current_factions = context.GetFactions(context.CurrentSystem);
if (current_factions == null) {
transactions.AddIncomplete(new Vouchers(),
"Current system factions are unknown, so vouchers were ineffective", e);
}
foreach (string faction in entry.Factions) {
bool relevantBond = false;
string relevantFaction = faction;
if (string.Compare(faction, Factions.PilotsFederationVouchers) == 0) {
// Target faction is pilots' federation, so we assume thargoid bonks
// Also assign this combat bond to the Pilots Federation
relevantFaction = Factions.PilotsFederation;
relevantBond = true;
}
if (current_factions != null && !relevantBond) {
// If we have local factions, and it ain't thargoid bonds see if the bonds were
// useful in the current system
if (current_factions.Find(x => string.Compare(x.Name, faction, true) == 0) != null) {
relevantBond = true;
} else {
transactions.AddIncomplete(new Vouchers(),
string.Format("Vouchers for \"{0}\" had no effect in \"{1}\" since said " +
"faction is not present there", faction, context.CurrentSystem), e
);
}
}
if (!relevantBond) {
continue;
}
var voucher = new Vouchers(entry) {
System = context.CurrentSystem,
Station = context.CurrentStation,
Faction = relevantFaction,
ControllingFaction = context.ControllingFaction,
IsLegacy = context.IsLegacy,
};
if (options.FilterDoubleRedeemVouchers) {
// To filter out doubly redeemed vouchers, find another redeem voucher
// event that happened in the same system, same total sum, and also the
// same faction. If there is one, filter this one out.
var doubledEntry = transactions
.OfType<Vouchers>()
.Where(x => x.TotalSum == voucher.TotalSum &&
x.System == voucher.System &&
x.Faction == voucher.Faction)
.ToList()
;
if (doubledEntry.Count > 0) {
transactions.AddIncomplete(
voucher,
string.Format("A doubled redeem voucher for {0} valued {1} was detected",
voucher.Faction, Credits.FormatMillions(voucher.TotalSum)),
e);
return;
}
}
transactions.Add(voucher);
}
}
}

View File

@@ -49,10 +49,11 @@ public class SellCargo : Transaction {
} }
foreach (MarketSellEntry sell in sold) { foreach (MarketSellEntry sell in sold) {
builder.AppendFormat("Sold {0} {1} to the {2}", builder.AppendFormat("Sold {0} {1} to the {2} of {3}",
sell.Count, sell.Count,
Cargo, Cargo,
Market Market,
Station
); );
if (Profit != 0) { if (Profit != 0) {

View File

@@ -28,6 +28,14 @@ public class TransactionParserOptions {
/// Whether we should ignore things done for the fleet carrier faction. /// Whether we should ignore things done for the fleet carrier faction.
/// </summary> /// </summary>
public bool IgnoreFleetCarrierFaction { get; set; } = true; public bool IgnoreFleetCarrierFaction { get; set; } = true;
/// <summary>
/// Filter out double redeem vouchers that happen when you redeem a specific
/// voucher, and then redeem the rest of your vouchers (say from a KWS) in
/// bulk. The bulk redeem will also list the first voucher redeem again in
/// its bulk list.
/// </summary>
public bool FilterDoubleRedeemVouchers { get; set; } = true;
} }
public class TransactionList : List<Transaction> { public class TransactionList : List<Transaction> {
@@ -422,63 +430,6 @@ internal class MissionFailedParser : ITransactionParserPart {
} }
} }
internal class RedeemVoucherParser : ITransactionParserPart {
public void Parse(Entry e, TransactionParserContext context, TransactionParserOptions options, TransactionList transactions) {
RedeemVoucherEntry? entry = e as RedeemVoucherEntry;
if (entry == null) {
throw new NotImplementedException();
}
if (context.CurrentSystem == null) {
transactions.AddIncomplete(new Vouchers(),
"Could not find out where the vouchers were redeemed", e
);
return;
}
List<Faction>? current_factions = context.GetFactions(context.CurrentSystem);
if (current_factions == null) {
transactions.AddIncomplete(new Vouchers(),
"Current system factions are unknown, so vouchers were ineffective", e);
}
foreach (string faction in entry.Factions) {
bool relevantBond = false;
string relevantFaction = faction;
if (string.Compare(faction, Factions.PilotsFederationVouchers) == 0) {
// Target faction is pilots' federation, so we assume thargoid bonks
// Also assign this combat bond to the Pilots Federation
relevantFaction = Factions.PilotsFederation;
relevantBond = true;
}
if (current_factions != null && !relevantBond) {
// If we have local factions, and it ain't thargoid bonds see if the bonds were
// useful in the current system
if (current_factions.Find(x => string.Compare(x.Name, faction, true) == 0) != null) {
relevantBond = true;
} else {
transactions.AddIncomplete(new Vouchers(),
string.Format("Vouchers for \"{0}\" had no effect in \"{1}\" since said " +
"faction is not present there", faction, context.CurrentSystem), e
);
}
}
if (relevantBond) {
transactions.Add(new Vouchers(entry) {
System = context.CurrentSystem,
Station = context.CurrentStation,
Faction = relevantFaction,
ControllingFaction = context.ControllingFaction,
IsLegacy = context.IsLegacy,
});
}
}
}
}
internal class SellMicroResourcesParser : ITransactionParserPart { internal class SellMicroResourcesParser : ITransactionParserPart {
public void Parse(Entry e, TransactionParserContext context, TransactionParserOptions options, TransactionList transactions) { public void Parse(Entry e, TransactionParserContext context, TransactionParserOptions options, TransactionList transactions) {
SellMicroResourcesEntry? entry = e as SellMicroResourcesEntry; SellMicroResourcesEntry? entry = e as SellMicroResourcesEntry;
@@ -665,6 +616,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 +635,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) },

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

@@ -0,0 +1,7 @@
{"timestamp":"2024-04-27T13:27:08Z","event":"Fileheader","part":1,"language":"English/UK","Odyssey":true,"gameversion":"4.0.0.1803","build":"r301470/r0 "}
{"timestamp":"2024-04-27T13:27:34Z","event":"Commander","FID":"F9183790","Name":"Jeremaya"}
{"timestamp":"2024-04-27T15:06:31Z","event":"FSDJump","Taxi":false,"Multicrew":false,"StarSystem":"HIP 3318","SystemAddress":525890177387,"StarPos":[50.21875,-190.6875,37.5],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Refinery;","SystemEconomy_Localised":"Refinery","SystemSecondEconomy":"$economy_Extraction;","SystemSecondEconomy_Localised":"Extraction","SystemGovernment":"$government_Patronage;","SystemGovernment_Localised":"Patronage","SystemSecurity":"$SYSTEM_SECURITY_high;","SystemSecurity_Localised":"High Security","Population":239484,"Body":"HIP 3318 A","BodyID":2,"BodyType":"Star","JumpDist":27.495,"FuelUsed":3.115176,"FuelLevel":13.228082,"Factions":[{"Name":"HIP 3318 Autocracy","FactionState":"None","Government":"Dictatorship","Influence":0.119192,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Chakho Gold Galactic Limited","FactionState":"None","Government":"Corporate","Influence":0.09798,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"HIP 3318 Interstellar","FactionState":"None","Government":"Corporate","Influence":0.075758,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"HIP 3318 Values Party","FactionState":"None","Government":"Democracy","Influence":0.032323,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Nationalists of HIP 3318","FactionState":"None","Government":"Dictatorship","Influence":0.035354,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Nova Paresa","FactionState":"Boom","Government":"Patronage","Influence":0.434343,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","SquadronFaction":true,"MyReputation":100.0,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Empire Consulate Ltd","FactionState":"None","Government":"Patronage","Influence":0.20505,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":94.474998}],"SystemFaction":{"Name":"Nova Paresa","FactionState":"Boom"}}
{"timestamp":"2024-04-27T15:12:23Z","event":"ApproachSettlement","Name":"Koh Biological Installation","MarketID":3803792128,"StationFaction":{"Name":"Nova Paresa","FactionState":"Boom"},"StationGovernment":"$government_Patronage;","StationGovernment_Localised":"Patronage","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","refuel","repair","engineer","missionsgenerated","flightcontroller","stationoperations","searchrescue","stationMenu"],"StationEconomy":"$economy_HighTech;","StationEconomy_Localised":"High Tech","StationEconomies":[{"Name":"$economy_HighTech;","Name_Localised":"High Tech","Proportion":1.0}],"SystemAddress":525890177387,"BodyID":26,"BodyName":"HIP 3318 D 3","Latitude":-0.893061,"Longitude":-62.928345}
{"timestamp":"2024-04-27T15:14:08Z","event":"Docked","StationName":"Koh Biological Installation","StationType":"OnFootSettlement","Taxi":false,"Multicrew":false,"StarSystem":"HIP 3318","SystemAddress":525890177387,"MarketID":3803792128,"StationFaction":{"Name":"Nova Paresa","FactionState":"Boom"},"StationGovernment":"$government_Patronage;","StationGovernment_Localised":"Patronage","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","refuel","repair","engineer","missionsgenerated","flightcontroller","stationoperations","searchrescue","stationMenu"],"StationEconomy":"$economy_HighTech;","StationEconomy_Localised":"High Tech","StationEconomies":[{"Name":"$economy_HighTech;","Name_Localised":"High Tech","Proportion":1.0}],"DistFromStarLS":11972.63409,"LandingPads":{"Small":1,"Medium":0,"Large":1}}
{"timestamp":"2024-04-27T15:15:10Z","event":"RedeemVoucher","Type":"bounty","Amount":9449329,"Factions":[{"Faction":"Nova Paresa","Amount":9449329}]}
{"timestamp":"2024-04-27T15:15:51Z","event":"RedeemVoucher","Type":"bounty","Amount":18780130,"Factions":[{"Faction":"","Amount":224449},{"Faction":"","Amount":730880},{"Faction":"","Amount":1272764},{"Faction":"","Amount":580384},{"Faction":"","Amount":10180261},{"Faction":"","Amount":1413153},{"Faction":"","Amount":1365934},{"Faction":"","Amount":202193},{"Faction":"Nova Paresa","Amount":9449329},{"Faction":"","Amount":104412},{"Faction":"","Amount":2453443},{"Faction":"","Amount":252257}]}

View File

@@ -1,6 +1,37 @@
# EliteBGS changelog # EliteBGS changelog
# 0.3.6 on 25.10.2023 ## 0.4.2 on 02.05.2024
* Add a bot header for all generated logs that shows the tool version, as
well as the name of of the log format used. This makes it easier for bots
to parse these logs. Since the different formats have become popular, its
always good to make it easier for bots to parse the logs.
## 0.4.1 on 28.04.2024
* Filter out vouchers that are redeemed twice, due to bulk turn-in. If you
redeem a singular voucher for value X, and then redeem the rest of your
vouchers - say KWS vouchers - in bulk, the first voucher of value X will
appear again in the logs. It appears twice in the logs, but only counts
once.
* Add the market name to the trading log entries.
## 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 * 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 those and keep processing. This way players won't have to delete lines in their

View File

@@ -111,10 +111,6 @@ public class DiscordLogGenerator {
string summary = GenerateSummary(objective); string summary = GenerateSummary(objective);
log.AppendFormat("**Log Generated:** {0} by {1}\n",
DateTime.Now.ToString("dd/MM/yyyy"),
GetToolVersion()
);
var earliest = GetDateOfEarliestEntry(objective); var earliest = GetDateOfEarliestEntry(objective);
var latest = GetDateOfLatestEntry(objective); var latest = GetDateOfLatestEntry(objective);
if (earliest != null && latest != null) { if (earliest != null && latest != null) {
@@ -125,7 +121,7 @@ public class DiscordLogGenerator {
} }
log.AppendFormat("**Target:** {0}\n", location); log.AppendFormat("**Target:** {0}\n", location);
if (!string.IsNullOrEmpty(summary)) { if (!string.IsNullOrEmpty(summary)) {
log.AppendFormat("**Summary**: {0}\n", summary); log.AppendFormat("**Summary:** {0}\n", summary);
} }
if (legacycount > 0) { if (legacycount > 0) {
log.AppendFormat("**Warning:** Some actions were performed on ED Legacy\n"); log.AppendFormat("**Warning:** Some actions were performed on ED Legacy\n");
@@ -149,6 +145,16 @@ public class DiscordLogGenerator {
return log; return log;
} }
public virtual string Name {
get { return "GenericLog"; }
}
protected virtual string BotHeader() {
var sb = new StringBuilder();
sb.AppendFormat("**Bot-Header:** {0}; {1}\n", GetToolVersion(), this.Name);
return sb.ToString();
}
public virtual string GenerateDiscordLog(Report report) { public virtual string GenerateDiscordLog(Report report) {
StringBuilder log = new StringBuilder(); StringBuilder log = new StringBuilder();
@@ -164,6 +170,7 @@ public class DiscordLogGenerator {
return ""; return "";
} }
log.AppendFormat("{0}", BotHeader());
log.AppendFormat("{0}", GenerateHeader()); log.AppendFormat("{0}", GenerateHeader());
foreach (Objective objective in objectives) { foreach (Objective objective in objectives) {

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.6</Version> <Version>0.4.2</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

@@ -2,6 +2,10 @@
public class GenericDiscordLog : DiscordLogGenerator { public class GenericDiscordLog : DiscordLogGenerator {
public override string ToString() { public override string ToString() {
return "Generic Log"; return "Generic";
}
public override string Name {
get { return "Generic"; }
} }
} }

View File

@@ -9,15 +9,112 @@
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" />
<local:Report x:Key="ObjectivesBasedOnSystem" />
<HierarchicalDataTemplate DataType="{x:Type local:SystemObjectives}" ItemsSource="{Binding Path=Objectives}">
<Grid
HorizontalAlignment="Stretch"
Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
>
<Grid.ColumnDefinitions>
<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
HorizontalAlignment="Stretch"
Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" />
<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="Faction: " Margin="2,0,0,0"/>
<TextBlock Text="{Binding Faction}" FontWeight="DemiBold"/>
</StackPanel>
<Separator Visibility="Hidden" Grid.Column="1" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" />
<StackPanel Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Center" Orientation="Horizontal">
<ToggleButton x:Name="ToggleAll" Content="Toggle All" Click="ToggleAll_Click" IsChecked="True" IsThreeState="False"/>
<Separator Margin="2,0,2,0" />
<Button x:Name="AddCombatZone" Content="Add Combat Zone" Click="AddCombatZone_Click" />
</StackPanel>
</Grid>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type local:UITransaction}">
<!-- This will stretch out the width of the item-->
<Grid Initialized="Transaction_Initialized"
HorizontalAlignment="Left"
Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
Margin="0,2,0,2"
>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Center">
<CheckBox Focusable="False" IsChecked="{Binding IsEnabled}" VerticalAlignment="Center"/>
<TextBlock Text="{Binding CompletedAt}" Margin="2,0,2,0" HorizontalAlignment="Right" TextAlignment="Center"/>
<TextBlock Text="{Binding Name}" FontWeight="DemiBold" TextAlignment="Center"/>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" x:Name="CombatZone" Visibility="{Binding IsCombatZone}">
<Expander Header="Optional Objectives" Visibility="{Binding IsShipCombatZone}">
<StackPanel Orientation="Vertical">
<ToggleButton x:Name="CapitalShip" Margin="2,0,2,0" Content="Capital Ship" IsChecked="{Binding HasCapitalShip, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="AlliedCaptain" Margin="2,0,2,0" Content="Allied Captain" IsChecked="{Binding HasAlliedCaptain, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="EnemyCaptain" Margin="2,0,2,0" Content="Enemy Captain" IsChecked="{Binding HasEnemyCaptain, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="AlliedCorrespondent" Margin="2,0,2,0" Content="Allied Correspondent" IsChecked="{Binding HasAlliedCorrespondent, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="EnemyCorrespondent" Margin="2,0,2,0" Content="Enemy Correspondent" IsChecked="{Binding HasEnemyCorrespondent, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="SpecOps" Margin="2,0,2,0" Content="Spec Ops" IsChecked="{Binding HasSpecOps, Mode=TwoWay}" IsThreeState="False"/>
</StackPanel>
</Expander>
<Expander Header="Difficulty">
<StackPanel Orientation="Vertical">
<Button x:Name="Low" Content="Low" Click="Low_Click"/>
<Button x:Name="Med" Content="Med" Click="Med_Click"/>
<Button x:Name="High" Content="High" Click="High_Click"/>
<Button x:Name="VeryHigh" Content="Very High" Click="VeryHigh_Click" />
</StackPanel>
</Expander>
<Expander Header="Type">
<StackPanel Orientation="Vertical">
<Button Content="Ground" x:Name="Ground" Click="Ground_Click"/>
<Button Content="Ship" x:Name="Ship" Click="Ship_Click"/>
<Button Content="AX" x:Name="Thargoid" Click="Thargoid_Click"/>
</StackPanel>
</Expander>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" x:Name="SellCargo" Visibility="{Binding IsSellCargo}">
<TextBlock Text="Adjust Profit: " TextAlignment="Center" />
<TextBox x:Name="Profit" MinWidth="80" HorizontalContentAlignment="Right" Text="{Binding Profit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" LostFocus="Profit_LostFocus" KeyUp="Profit_KeyUp"/>
</StackPanel>
</Grid>
</DataTemplate>
</Window.Resources> </Window.Resources>
<mah:MetroWindow.RightWindowCommands> <mah:MetroWindow.RightWindowCommands>
<mah:WindowCommands ShowSeparators="False"> <mah:WindowCommands ShowSeparators="False">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0,5,0"> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0,5,0">
<Hyperlink x:Name="URL" NavigateUri="https://bgs.n0la.org/" RequestNavigate="URL_RequestNavigate">Homepage</Hyperlink> <Hyperlink x:Name="URL" NavigateUri="https://salusinvicta.org/bgstool/" RequestNavigate="URL_RequestNavigate">Homepage</Hyperlink>
</TextBlock> </TextBlock>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0,15,0"> <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> <Hyperlink x:Name="SRC" NavigateUri="https://codeberg.org/nola/EDBGS" RequestNavigate="URL_RequestNavigate">Source</Hyperlink>
@@ -63,95 +160,19 @@
<Button x:Name="GenerateDiscord" Content="Generate Discord Report" VerticalAlignment="Stretch" Margin="0,0,0,0" VerticalContentAlignment="Center" Click="GenerateDiscord_Click"/> <Button x:Name="GenerateDiscord" Content="Generate Discord Report" VerticalAlignment="Stretch" Margin="0,0,0,0" VerticalContentAlignment="Center" Click="GenerateDiscord_Click"/>
<Separator /> <Separator />
<ComboBox x:Name="LogType" VerticalAlignment="Stretch" Margin="0,3,0,3" Width="140" SelectionChanged="LogType_SelectionChanged" /> <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> </ToolBar>
<TreeView CheckBox.Checked="TreeView_CheckBox_Updated" <TreeView CheckBox.Checked="TreeView_CheckBox_Updated"
CheckBox.Unchecked="TreeView_CheckBox_Updated" CheckBox.Unchecked="TreeView_CheckBox_Updated"
x:Name="entries" Margin="0,0,0,0" x:Name="entries" Margin="0,0,0,0"
Grid.ColumnSpan="3" Grid.Row="2" Grid.ColumnSpan="3"
Grid.Row="2"
KeyUp="entries_KeyUp" KeyUp="entries_KeyUp"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"
ItemsSource="{Binding Source={StaticResource ObjectivesBasedOnSystem}}"
> >
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Objective}" ItemsSource="{Binding UITransactions}" ItemContainerStyle="{StaticResource StretchingTreeViewStyle}">
<Grid
HorizontalAlignment="Stretch"
Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" />
<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: " Visibility="{Binding HasSystem}" Margin="2,0,0,0"/>
<TextBlock Text="{Binding System}" FontWeight="DemiBold" Visibility="{Binding HasSystem}"/>
<TextBlock Text="Faction: " Visibility="{Binding HasFaction}" Margin="2,0,0,0"/>
<TextBlock Text="{Binding Faction}" FontWeight="DemiBold" Visibility="{Binding HasFaction}"/>
</StackPanel>
<Separator Visibility="Hidden" Grid.Column="1" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" />
<StackPanel Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Center" Orientation="Horizontal">
<ToggleButton x:Name="ToggleAll" Content="Toggle All" Click="ToggleAll_Click" IsChecked="True" IsThreeState="False"/>
<Separator Margin="2,0,2,0" />
<Button x:Name="AddCombatZone" Content="Add Combat Zone" Click="AddCombatZone_Click" />
</StackPanel>
</Grid>
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate>
<!-- This will stretch out the width of the item-->
<Grid Initialized="Transaction_Initialized"
HorizontalAlignment="Left"
Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
Margin="0,2,0,2"
>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Center">
<CheckBox Focusable="False" IsChecked="{Binding IsEnabled}" VerticalAlignment="Center"/>
<TextBlock Text="{Binding CompletedAt}" Margin="2,0,2,0" HorizontalAlignment="Right" TextAlignment="Center"/>
<TextBlock Text="{Binding Name}" FontWeight="DemiBold" TextAlignment="Center"/>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" x:Name="CombatZone" Visibility="{Binding IsCombatZone}">
<Expander Header="Optional Objectives" Visibility="{Binding IsShipCombatZone}">
<StackPanel Orientation="Vertical">
<ToggleButton x:Name="CapitalShip" Margin="2,0,2,0" Content="Capital Ship" IsChecked="{Binding HasCapitalShip, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="AlliedCaptain" Margin="2,0,2,0" Content="Allied Captain" IsChecked="{Binding HasAlliedCaptain, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="EnemyCaptain" Margin="2,0,2,0" Content="Enemy Captain" IsChecked="{Binding HasEnemyCaptain, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="AlliedCorrespondent" Margin="2,0,2,0" Content="Allied Correspondent" IsChecked="{Binding HasAlliedCorrespondent, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="EnemyCorrespondent" Margin="2,0,2,0" Content="Enemy Correspondent" IsChecked="{Binding HasEnemyCorrespondent, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="SpecOps" Margin="2,0,2,0" Content="Spec Ops" IsChecked="{Binding HasSpecOps, Mode=TwoWay}" IsThreeState="False"/>
</StackPanel>
</Expander>
<Expander Header="Difficulty">
<StackPanel Orientation="Vertical">
<Button x:Name="Low" Content="Low" Click="Low_Click"/>
<Button x:Name="Med" Content="Med" Click="Med_Click"/>
<Button x:Name="High" Content="High" Click="High_Click"/>
<Button x:Name="VeryHigh" Content="Very High" Click="VeryHigh_Click" />
</StackPanel>
</Expander>
<Expander Header="Type">
<StackPanel Orientation="Vertical">
<Button Content="Ground" x:Name="Ground" Click="Ground_Click"/>
<Button Content="Ship" x:Name="Ship" Click="Ship_Click"/>
<Button Content="AX" x:Name="Thargoid" Click="Thargoid_Click"/>
</StackPanel>
</Expander>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" x:Name="SellCargo" Visibility="{Binding IsSellCargo}">
<TextBlock Text="Adjust Profit: " TextAlignment="Center" />
<TextBox x:Name="Profit" MinWidth="80" HorizontalContentAlignment="Right" Text="{Binding Profit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" LostFocus="Profit_LostFocus" KeyUp="Profit_KeyUp"/>
</StackPanel>
</Grid>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<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

@@ -32,8 +32,8 @@ public partial class MainWindow : MetroWindow {
private LoadEntriesWindow loadentries = null; private LoadEntriesWindow loadentries = null;
private static readonly List<DiscordLogGenerator> logtypes = new List<DiscordLogGenerator>() { private static readonly List<DiscordLogGenerator> logtypes = new List<DiscordLogGenerator>() {
new NonaDiscordLog(),
new GenericDiscordLog(), new GenericDiscordLog(),
new NonaDiscordLog(),
new OneLineDiscordLog(), new OneLineDiscordLog(),
}; };
@@ -107,6 +107,10 @@ 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) },
// Official Blue in the Armenian Flag
{ "ArmeniaBlue", Color.FromRgb(0x00, 0x33, 0xA0) },
}; };
foreach (var colourtheme in colorThemes) { foreach (var colourtheme in colorThemes) {
@@ -192,7 +196,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:");
@@ -271,15 +275,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(Objective)) {
report
.SystemObjectives
.ForEach(x => {
if (x.Objectives.Remove(obj as Objective)) {
removed = true;
}
});
} else if (obj.GetType() == typeof(UITransaction) || } else if (obj.GetType() == typeof(UITransaction) ||
obj.GetType().IsSubclassOf(typeof(UITransaction))) { obj.GetType().IsSubclassOf(typeof(UITransaction))) {
foreach (Objective parent in report.Objectives) { report
if (parent.UITransactions.Remove(obj as UITransaction)) { .SystemObjectives
removed = true; .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) {
@@ -557,4 +573,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

@@ -7,6 +7,12 @@ using System.Linq;
namespace EliteBGS.BGS; namespace EliteBGS.BGS;
public class NonaDiscordLog : DiscordLogGenerator { public class NonaDiscordLog : DiscordLogGenerator {
protected override string BotHeader() {
var sb = new StringBuilder();
sb.AppendFormat(":robot: `Bot-Header:` {0}; {1}\n", GetToolVersion(), this.Name);
return sb.ToString();
}
private string FormatDate() { private string FormatDate() {
CultureInfo cultureInfo = CultureInfo.InvariantCulture; CultureInfo cultureInfo = CultureInfo.InvariantCulture;
StringBuilder date = new StringBuilder(); StringBuilder date = new StringBuilder();
@@ -79,6 +85,10 @@ public class NonaDiscordLog : DiscordLogGenerator {
} }
public override string ToString() { public override string ToString() {
return "Nova Navy Log"; return "Nova Navy";
}
public override string Name {
get { return "NovaNavy"; }
} }
} }

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

@@ -40,6 +40,8 @@ public class OneLineDiscordLog : DiscordLogGenerator {
return ""; return "";
} }
log.AppendFormat("{0}", BotHeader());
foreach (Objective objective in objectives) { foreach (Objective objective in objectives) {
log.AppendFormat("{0}", GenerateObjectiveHeader(objective)); log.AppendFormat("{0}", GenerateObjectiveHeader(objective));
@@ -60,6 +62,10 @@ public class OneLineDiscordLog : DiscordLogGenerator {
} }
public override string ToString() { public override string ToString() {
return "One Line Report"; return "One Line";
}
public override string Name {
get { return "OneLine"; }
} }
} }

View File

@@ -49,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.6.0")] [assembly: AssemblyVersion("0.4.2.0")]
[assembly: AssemblyFileVersion("0.3.6.0")] [assembly: AssemblyFileVersion("0.4.2.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));
o.UITransactions.Add(new UITransaction(t)); if (objective == null) {
objective = new Objective() { Faction = t.Faction, System = t.System };
o.Objectives.Add(objective);
}
objective.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.6** 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.6.zip](https://bgs.n0la.org/elitebgs-0.3.6.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