Skip to content

Commit b45dded

Browse files
committed
feat: show ticket-specific stats on exit (Ctrl+C)
Ticket mode shows: Ticker, Contributions, Tokens earned. CW mode unchanged: Inscriptions, CW earned, NFT hits, Challenges.
1 parent 7208c3b commit b45dded

2 files changed

Lines changed: 22 additions & 15 deletions

File tree

internal/miner/display.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,19 @@ func DisplayChallengePenalty(hint string) {
130130
}
131131

132132
// DisplayStats prints cumulative session statistics.
133-
func DisplayStats(state *State) {
133+
// If ticket is non-nil, shows ticket contribution stats instead of CW mining stats.
134+
func DisplayStats(state *State, ticket *TicketTarget) {
134135
fmt.Print(i18n.Tr("\n--- Session Stats ---\n", "\n--- 会话统计 ---\n"))
135-
fmt.Printf(i18n.Tr("Inscriptions: %d\n", "铭文次数: %d\n"), state.TotalInscriptions)
136-
fmt.Printf(i18n.Tr("CW earned: %s\n", "CW 收益: %s\n"), formatCW64(state.TotalCWEarned))
137-
fmt.Printf(i18n.Tr("NFT hits: %d\n", "NFT 命中: %d\n"), state.TotalHits)
138-
fmt.Printf(i18n.Tr("Challenges: %d passed / %d failed\n", "挑战题: %d 通过 / %d 失败\n"), state.ChallengesPassed, state.ChallengesFailed)
136+
if ticket != nil {
137+
fmt.Printf(i18n.Tr("Ticket: %s\n", "Ticket: %s\n"), ticket.Ticker)
138+
fmt.Printf(i18n.Tr("Contributions: %d\n", "贡献次数: %d\n"), state.TotalInscriptions)
139+
fmt.Printf(i18n.Tr("Tokens earned: %s\n", "代币收益: %s\n"), formatCW64(state.TotalCWEarned))
140+
} else {
141+
fmt.Printf(i18n.Tr("Inscriptions: %d\n", "铭文次数: %d\n"), state.TotalInscriptions)
142+
fmt.Printf(i18n.Tr("CW earned: %s\n", "CW 收益: %s\n"), formatCW64(state.TotalCWEarned))
143+
fmt.Printf(i18n.Tr("NFT hits: %d\n", "NFT 命中: %d\n"), state.TotalHits)
144+
fmt.Printf(i18n.Tr("Challenges: %d passed / %d failed\n", "挑战题: %d 通过 / %d 失败\n"), state.ChallengesPassed, state.ChallengesFailed)
145+
}
139146
fmt.Println()
140147
}
141148

internal/miner/loop.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func (m *Miner) Run(ctx context.Context) error {
111111
DisplayCooldown(secs)
112112
m.emit("cooldown", fmt.Sprintf("Resuming cooldown: %dm%02ds remaining", secs/60, secs%60), nil)
113113
if !m.runCooldown(ctx, remaining) {
114-
DisplayStats(m.State)
114+
DisplayStats(m.State, m.Ticket)
115115
return nil
116116
}
117117
}
@@ -124,7 +124,7 @@ func (m *Miner) Run(ctx context.Context) error {
124124
for {
125125
select {
126126
case <-ctx.Done():
127-
DisplayStats(m.State)
127+
DisplayStats(m.State, m.Ticket)
128128
m.emit("stats", fmt.Sprintf("Session ended: %d inscriptions, %d CW", m.State.TotalInscriptions, m.State.TotalCWEarned), nil)
129129
return nil
130130
default:
@@ -135,7 +135,7 @@ func (m *Miner) Run(ctx context.Context) error {
135135
m.emit("control", "Mining paused", nil)
136136
for m.Ctrl.IsPaused() {
137137
if !sleep(ctx, 1*time.Second) {
138-
DisplayStats(m.State)
138+
DisplayStats(m.State, m.Ticket)
139139
return nil
140140
}
141141
}
@@ -153,7 +153,7 @@ func (m *Miner) Run(ctx context.Context) error {
153153
resp, err := m.mineOnce(ctx)
154154
if err != nil {
155155
if ctx.Err() != nil {
156-
DisplayStats(m.State)
156+
DisplayStats(m.State, m.Ticket)
157157
return nil
158158
}
159159

@@ -163,7 +163,7 @@ func (m *Miner) Run(ctx context.Context) error {
163163

164164
slog.Info("retrying after backoff", "delay", networkBackoff)
165165
if !sleep(ctx, networkBackoff) {
166-
DisplayStats(m.State)
166+
DisplayStats(m.State, m.Ticket)
167167
return nil
168168
}
169169
networkBackoff = minDuration(networkBackoff*2, maxNetworkBackoff)
@@ -217,7 +217,7 @@ func (m *Miner) Run(ctx context.Context) error {
217217
m.emit("cooldown", fmt.Sprintf("Next inscription in %dm%02ds", wait/60, wait%60), nil)
218218
}
219219
if !sleep(ctx, time.Duration(wait)*time.Second) {
220-
DisplayStats(m.State)
220+
DisplayStats(m.State, m.Ticket)
221221
return nil
222222
}
223223
continue
@@ -227,7 +227,7 @@ func (m *Miner) Run(ctx context.Context) error {
227227
if resp.ErrorCode() == "INVALID_OUTCOME" && m.Ticket != nil {
228228
slog.Error("outcome not accepted by server, ticket outcomes may have changed — restart CLI to refresh", "outcome_pick", resp.ErrorMessage())
229229
m.emit("error", "Ticket outcomes changed — restart CLI to refresh", nil)
230-
DisplayStats(m.State)
230+
DisplayStats(m.State, m.Ticket)
231231
return nil
232232
}
233233

@@ -241,7 +241,7 @@ func (m *Miner) Run(ctx context.Context) error {
241241
DisplayCooldown(wait)
242242
m.emit("cooldown", fmt.Sprintf("Ticket cooldown: %dm%ds", wait/60, wait%60), nil)
243243
if !sleep(ctx, time.Duration(wait)*time.Second) {
244-
DisplayStats(m.State)
244+
DisplayStats(m.State, m.Ticket)
245245
return nil
246246
}
247247
continue
@@ -252,7 +252,7 @@ func (m *Miner) Run(ctx context.Context) error {
252252
slog.Warn("unhandled server error, retrying", "error", resp.ErrorCode(), "message", resp.ErrorMessage())
253253
m.emit("error", fmt.Sprintf("Server: %s — %s", resp.ErrorCode(), resp.ErrorMessage()), nil)
254254
if !sleep(ctx, networkBackoff) {
255-
DisplayStats(m.State)
255+
DisplayStats(m.State, m.Ticket)
256256
return nil
257257
}
258258
networkBackoff = minDuration(networkBackoff*2, maxNetworkBackoff)
@@ -292,7 +292,7 @@ func (m *Miner) Run(ctx context.Context) error {
292292
DisplayCooldown(cooldown)
293293
m.emit("cooldown", fmt.Sprintf("Next inscription in %dm", cooldown/60), nil)
294294
if !m.runCooldown(ctx, time.Duration(cooldown)*time.Second) {
295-
DisplayStats(m.State)
295+
DisplayStats(m.State, m.Ticket)
296296
return nil
297297
}
298298
}

0 commit comments

Comments
 (0)