questlog

package
v0.8.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 15, 2026 License: Apache-2.0 Imports: 1 Imported by: 0

Documentation

Overview

Package questlog 提供任务 / 成就的进度追踪:定义一组带目标值的任务,累加进度, 达标后可领取(一次),支持前置依赖与周期重置。纯内存、并发安全。

覆盖:每日任务、成就、活动进度、新手引导、通行证(battle pass)。这类系统的共性是 "目标 + 进度 + 状态机(进行中→已达成→已领取)+ 依赖 + 重置",questlog 把它抽象成 一个原语,业务只需定义任务与推进进度,状态流转和领取幂等由本包保证。

与相邻原语的区别:

  • counter 是"窗口内计数"(会过期、无目标/状态);questlog 是"朝目标累加 + 领取状态机", 进度不因时间流逝而减少(除非显式 Reset);
  • fsm 是通用状态机;questlog 内建了任务专用的三态流转与依赖门控,无需自己接线。

模型:一个 Log 持有任务定义(所有 owner 共享)+ 每个 owner 的进度快照。 任务状态:Locked(前置未完成)< InProgress(进行中)< Achieved(达标待领)< Claimed(已领)。 进度推进用 Advance(按任务专属计数器累加)或 Set(直接设定当前值)。

泛型 ID 为任务标识(comparable)。并发安全(单锁,任务数与 owner 数中等规模适用)。 零值不可用,用 New 构造。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Log

type Log[ID comparable] struct {
	// contains filtered or unexported fields
}

Log 任务日志:持有任务定义 + 各 owner 进度。零值不可用,用 New 构造。并发安全。

func New

func New[ID comparable](quests []Quest[ID], opts ...Option[ID]) *Log[ID]

New 创建任务日志并注册任务定义。重复 ID 后者覆盖前者。

func (*Log[ID]) Advance

func (l *Log[ID]) Advance(owner string, id ID, delta int64) (State[ID], bool)

Advance 给 owner 的任务 id 累加 delta 进度(delta 可为负,进度夹在 [0, Target])。 任务不存在或被锁定(前置未完成)时不生效。返回推进后的状态快照与是否发生变化。

func (*Log[ID]) Claim

func (l *Log[ID]) Claim(owner string, id ID) bool

Claim 领取 owner 的任务 id 奖励。仅当状态为 Achieved 时成功(返回 true), 幂等:已领取或未达标返回 false。成功时触发 OnClaim 回调(锁外)。

func (*Log[ID]) ClaimAll

func (l *Log[ID]) ClaimAll(owner string) []ID

ClaimAll 领取 owner 所有当前可领(Achieved)的任务,返回被领取的任务 ID 列表(按定义顺序)。

func (*Log[ID]) Claimable

func (l *Log[ID]) Claimable(owner string) []ID

Claimable 返回 owner 当前可领取(Achieved)的任务 ID(按定义顺序)。用于小红点/领取提示。

func (*Log[ID]) List

func (l *Log[ID]) List(owner string) []State[ID]

List 返回 owner 所有任务的状态快照(按定义顺序)。

func (*Log[ID]) Reset

func (l *Log[ID]) Reset(owner string, ids ...ID)

Reset 重置 owner 指定任务的进度与领取状态(周期任务刷新用)。ids 为空则重置全部。

func (*Log[ID]) Set

func (l *Log[ID]) Set(owner string, id ID, v int64) (State[ID], bool)

Set 直接设定 owner 的任务 id 进度为 v(夹在 [0, Target])。语义同 Advance 的门控。

func (*Log[ID]) StateOf

func (l *Log[ID]) StateOf(owner string, id ID) (State[ID], bool)

StateOf 返回 owner 在任务 id 上的状态快照。任务不存在返回零值 + false。

type Option

type Option[ID comparable] func(*Log[ID])

Option 配置 Log。

func WithOnClaim

func WithOnClaim[ID comparable](fn func(owner string, q Quest[ID])) Option[ID]

WithOnClaim 设置领取回调:Claim 成功时触发(用于发奖/打点)。回调在锁外执行。

type Quest

type Quest[ID comparable] struct {
	// ID 唯一标识。
	ID ID
	// Target 目标进度值(达到即视为完成,须 > 0)。
	Target int64
	// Requires 前置任务:这些任务全部 Claimed 后本任务才解锁(可空)。
	Requires []ID
	// Meta 业务自定义元数据(奖励内容、描述等),questlog 不解释。
	Meta any
}

Quest 一个任务/成就的定义(所有 owner 共享)。

type State

type State[ID comparable] struct {
	ID       ID
	Status   Status
	Progress int64 // 当前进度(<= Target)
	Target   int64
}

State 某 owner 在某任务上的状态快照。

type Status

type Status int

Status 任务状态。

const (
	// StatusLocked 前置任务未全部领取/达成,任务尚未解锁。
	StatusLocked Status = iota
	// StatusInProgress 已解锁,进度未达目标。
	StatusInProgress
	// StatusAchieved 进度已达目标,等待领取。
	StatusAchieved
	// StatusClaimed 已领取奖励(终态)。
	StatusClaimed
)

func (Status) String

func (s Status) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL