Skip to content

Commit 5a0ffcc

Browse files
HandyS11claude
andcommitted
fix(6c): render sub-minute raid times in seconds (not 0m)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a7e881b commit 5a0ffcc

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

src/RustPlusBot.Features.Commands/Formatting/DurabilityLine.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,25 @@ private static string FormatCost(RaidCost cost, IItemNameResolver names)
3333
? string.Create(CultureInfo.InvariantCulture, $" — {s} sulfur")
3434
: string.Empty;
3535
var time = cost.TimeSeconds is { } t and > 0
36-
? string.Create(CultureInfo.InvariantCulture, $" ({DurationFormat.Compact(TimeSpan.FromSeconds(t))})")
36+
? string.Create(CultureInfo.InvariantCulture, $" ({FormatTime(t)})")
3737
: string.Empty;
3838
var caption = string.IsNullOrEmpty(cost.Caption)
3939
? string.Empty
4040
: string.Create(CultureInfo.InvariantCulture, $" · {cost.Caption}");
4141
return string.Create(CultureInfo.InvariantCulture, $"{tool} ×{quantity}{side}{sulfur}{time}{caption}");
4242
}
43+
44+
private static string FormatTime(double seconds)
45+
{
46+
if (seconds < 60)
47+
{
48+
return string.Create(CultureInfo.InvariantCulture, $"{seconds:0.#}s");
49+
}
50+
51+
var span = TimeSpan.FromSeconds(seconds);
52+
var minutes = (int)span.TotalMinutes;
53+
return span.Seconds == 0
54+
? string.Create(CultureInfo.InvariantCulture, $"{minutes}m")
55+
: string.Create(CultureInfo.InvariantCulture, $"{minutes}m {span.Seconds}s");
56+
}
4357
}

tests/RustPlusBot.Features.Commands.Tests/Formatting/DurabilityFormatterTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,23 @@ public void DurabilityLine_RoundsQuantityUp_AndShowsCaption()
5454
Assert.Contains("×173", line, StringComparison.Ordinal); // 172.5 rounded up
5555
Assert.Contains("Semi-Automatic Rifle", line, StringComparison.Ordinal);
5656
}
57+
58+
[Fact]
59+
public void DurabilityLine_RendersSubMinuteTimeInSeconds()
60+
{
61+
var target = new RaidTarget("Stone Wall", "Stone Wall", RaidTargetKind.BuildingBlock,
62+
[new RaidCost(1, null, null, 2, 11.5, 4400, 120)]);
63+
var line = DurabilityLine.Format(target, _names);
64+
Assert.Contains("11.5s", line, StringComparison.Ordinal);
65+
Assert.DoesNotContain("0m", line, StringComparison.Ordinal);
66+
}
67+
68+
[Fact]
69+
public void DurabilityLine_RendersOverMinuteTimeAsMinutesAndSeconds()
70+
{
71+
var target = new RaidTarget("X", "X", RaidTargetKind.Item,
72+
[new RaidCost(1, null, null, 46, 175.125, 5520, null)]);
73+
var line = DurabilityLine.Format(target, _names);
74+
Assert.Contains("2m 55s", line, StringComparison.Ordinal);
75+
}
5776
}

0 commit comments

Comments
 (0)