feat: 增加任务功能
This commit is contained in:
parent
b151de3f00
commit
bdeaa5aeb3
|
@ -0,0 +1,32 @@
|
||||||
|
package task
|
||||||
|
|
||||||
|
type (
|
||||||
|
TaskDoneEventHandle func(eventId int64, task *Task)
|
||||||
|
)
|
||||||
|
|
||||||
|
var taskDoneEventHandles = make(map[int64]map[int64]TaskDoneEventHandle)
|
||||||
|
|
||||||
|
// RegTaskDoneEvent 注册任务完成事件
|
||||||
|
func RegTaskDoneEvent(id int64, eventId int64, handle TaskDoneEventHandle) {
|
||||||
|
events, exist := taskDoneEventHandles[id]
|
||||||
|
if !exist {
|
||||||
|
events = map[int64]TaskDoneEventHandle{}
|
||||||
|
taskDoneEventHandles[id] = events
|
||||||
|
}
|
||||||
|
events[eventId] = handle
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnRegTaskDoneEvent 取消注册任务完成事件
|
||||||
|
func UnRegTaskDoneEvent(id int64, eventId int64) {
|
||||||
|
events, exist := taskDoneEventHandles[id]
|
||||||
|
if exist {
|
||||||
|
delete(events, eventId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnTaskDoneEvent 任务完成事件
|
||||||
|
func OnTaskDoneEvent(task *Task) {
|
||||||
|
for eventId, handle := range taskDoneEventHandles[task.id] {
|
||||||
|
handle(eventId, task)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package task
|
||||||
|
|
||||||
|
type Option func(task *Task)
|
||||||
|
|
||||||
|
// WithInitCount 通过初始化计数的方式创建任务
|
||||||
|
func WithInitCount(count int) Option {
|
||||||
|
return func(task *Task) {
|
||||||
|
task.count = count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDone 通过指定任务完成计数的方式创建任务
|
||||||
|
func WithDone(done int) Option {
|
||||||
|
return func(task *Task) {
|
||||||
|
task.done = done
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package task
|
||||||
|
|
||||||
|
const (
|
||||||
|
StateDoing State = iota // 进行中
|
||||||
|
StateDone // 已完成
|
||||||
|
StateReward // 已领取
|
||||||
|
)
|
||||||
|
|
||||||
|
// State 任务状态
|
||||||
|
type State byte
|
|
@ -0,0 +1,67 @@
|
||||||
|
package task
|
||||||
|
|
||||||
|
// NewTask 新建任务
|
||||||
|
func NewTask(id int64, options ...Option) *Task {
|
||||||
|
task := &Task{
|
||||||
|
id: id,
|
||||||
|
}
|
||||||
|
for _, option := range options {
|
||||||
|
option(task)
|
||||||
|
}
|
||||||
|
if task.count > task.done {
|
||||||
|
task.count = task.done
|
||||||
|
}
|
||||||
|
task.Add(0)
|
||||||
|
return task
|
||||||
|
}
|
||||||
|
|
||||||
|
type Task struct {
|
||||||
|
id int64 // 任务ID
|
||||||
|
count int // 任务计数
|
||||||
|
done int // 任务完成计数
|
||||||
|
reward bool // 是否已领取奖励
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset 重置任务
|
||||||
|
func (slf *Task) Reset() {
|
||||||
|
slf.count = 0
|
||||||
|
slf.reward = false
|
||||||
|
switch slf.GetState() {
|
||||||
|
case StateDone:
|
||||||
|
OnTaskDoneEvent(slf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add 增加任务计数
|
||||||
|
func (slf *Task) Add(count int) {
|
||||||
|
if count != 0 {
|
||||||
|
slf.count += count
|
||||||
|
if slf.count < 0 {
|
||||||
|
slf.count = 0
|
||||||
|
} else if slf.count > slf.done {
|
||||||
|
slf.count = slf.done
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch slf.GetState() {
|
||||||
|
case StateDone:
|
||||||
|
OnTaskDoneEvent(slf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetState 获取任务状态
|
||||||
|
func (slf *Task) GetState() State {
|
||||||
|
if slf.count >= slf.done {
|
||||||
|
if slf.reward {
|
||||||
|
return StateReward
|
||||||
|
}
|
||||||
|
return StateDone
|
||||||
|
}
|
||||||
|
return StateDoing
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reward 返回是否领取过奖励,并且设置任务为领取过奖励的状态
|
||||||
|
func (slf *Task) Reward() bool {
|
||||||
|
reward := slf.reward
|
||||||
|
slf.reward = true
|
||||||
|
return reward
|
||||||
|
}
|
Loading…
Reference in New Issue