-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathTaskService.java
More file actions
232 lines (184 loc) · 6.89 KB
/
TaskService.java
File metadata and controls
232 lines (184 loc) · 6.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
package com.logmaster.task;
import com.logmaster.LogMasterConfig;
import com.logmaster.domain.Task;
import com.logmaster.domain.TaskTier;
import com.logmaster.domain.TieredTaskList;
import com.logmaster.domain.savedata.SaveData;
import com.logmaster.domain.verification.clog.CollectionLogVerification;
import com.logmaster.ui.TaskmanCommandManager;
import com.logmaster.util.EventBusSubscriber;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Singleton
@Slf4j
public class TaskService extends EventBusSubscriber {
@Inject
private LogMasterConfig config;
@Inject
private SaveDataStorage saveDataStorage;
@Inject
private TaskListStorage taskListStorage;
@Inject
private TaskmanCommandManager taskmanCommandManager;
@Override
public void startUp() {
super.startUp();
saveDataStorage.startUp();
}
@Override
public void shutDown() {
super.shutDown();
saveDataStorage.shutDown();
}
public Task getActiveTask() {
return saveDataStorage.get().getActiveTask();
}
public int getRerolls() {
return config.rerollsEnabled() ? saveDataStorage.get().getRerolls() : 0;
}
public int setRerolls(int rerolls) {
SaveData data = saveDataStorage.get();
data.setRerolls(rerolls);
return rerolls;
}
public Task getTaskById(String taskId) {
for (TaskTier t : TaskTier.values()) {
List<Task> tasks = getTierTasks(t);
for (Task task : tasks) {
if (task.getId().equals(taskId)) {
return task;
}
}
}
return null;
}
public @NonNull TaskTier getCurrentTier() {
Map<TaskTier, Float> progress = getProgress();
return getVisibleTiers().stream()
.filter(t -> progress.get(t) < 100)
.findFirst()
.orElse(TaskTier.MASTER);
}
public List<Task> getTierTasks() {
return getTierTasks(getCurrentTier());
}
public List<Task> getTierTasks(TaskTier tier) {
return taskListStorage.get().getForTier(tier);
}
public List<Task> getIncompleteTierTasks() {
return getIncompleteTierTasks(getCurrentTier());
}
public List<Task> getIncompleteTierTasks(TaskTier tier) {
TieredTaskList taskList = taskListStorage.get();
return taskList.getForTier(tier).stream()
.filter(t -> !isComplete(t.getId()))
.collect(Collectors.toList());
}
public List<TaskTier> getVisibleTiers() {
TaskTier hideBelow = config.hideBelow();
return Arrays.stream(TaskTier.values())
.filter(t -> t.ordinal() >= hideBelow.ordinal())
.collect(Collectors.toList());
}
public @NonNull Map<TaskTier, Float> getProgress() {
SaveData data = saveDataStorage.get();
TieredTaskList taskList = taskListStorage.get();
Set<String> completedTasks = data.getCompletedTasks();
Map<TaskTier, Float> completionPercentages = new HashMap<>();
for (TaskTier tier : TaskTier.values()) {
Set<String> tierTasks = taskList.getForTier(tier).stream()
.map(Task::getId)
.collect(Collectors.toSet());
int totalTierTasks = tierTasks.size();
tierTasks.retainAll(completedTasks);
float tierPercentage = 100f * tierTasks.size() / totalTierTasks;
completionPercentages.put(tier, tierPercentage);
}
return completionPercentages;
}
public Task generate() {
SaveData data = saveDataStorage.get();
Task activeTask = data.getActiveTask();
if (activeTask != null) {
// We only count as a reroll if there is an active task
if (config.rerollsEnabled() && this.getRerolls() > 0) {
this.setRerolls(getRerolls() - 1);
} else {
log.warn("Tried to generate task when previous one wasn't completed yet, no rerolls left");
return null;
}
}
TaskTier currentTier = getCurrentTier();
List<Task> incompleteTierTasks = getIncompleteTierTasks(currentTier);
if (incompleteTierTasks.isEmpty()) {
log.warn("No tasks left");
return null;
}
Task generatedTask = pickRandomTask(incompleteTierTasks);
log.debug("New task generated: {}", generatedTask);
data.setActiveTask(generatedTask);
saveDataStorage.save();
taskmanCommandManager.updateServer();
return generatedTask;
}
public void complete() {
Task activeTask = getActiveTask();
if (activeTask == null) {
return;
}
complete(activeTask.getId());
}
public void complete(String taskId) {
SaveData data = saveDataStorage.get();
Set<String> completedTasks = data.getCompletedTasks();
completedTasks.add(taskId);
Task activeTask = getActiveTask();
if (activeTask != null && taskId.equals(activeTask.getId())) {
data.setActiveTask(null);
// Update our rerolls when we complete our active task
if (config.rerollsEnabled()) {
this.setRerolls(config.rerollsIncrement() > 0 ? Math.min(this.getRerolls() + config.rerollsIncrement(), config.rerollsMaximum()) : config.rerollsMaximum());
}
}
saveDataStorage.save();
taskmanCommandManager.updateServer();
}
public void uncomplete(String taskId) {
Set<String> completedTasks = saveDataStorage.get().getCompletedTasks();
completedTasks.remove(taskId);
saveDataStorage.save();
taskmanCommandManager.updateServer();
}
public void toggleComplete(String taskId) {
if (isComplete(taskId)) {
uncomplete(taskId);
} else {
complete(taskId);
}
}
public boolean isComplete(String taskId) {
Set<String> completedTasks = saveDataStorage.get().getCompletedTasks();
return completedTasks.contains(taskId);
}
private Task pickRandomTask(List<Task> tasks) {
int index = (int) Math.floor(Math.random() * tasks.size());
Task pickedTask = tasks.get(index);
if (!(pickedTask.getVerification() instanceof CollectionLogVerification)) {
return pickedTask;
}
// get first of similarly named tasks
String taskName = pickedTask.getName();
Stream<Task> similarTasks = tasks.stream()
.filter(t -> taskName.equals(t.getName()))
.filter(t -> t.getVerification() instanceof CollectionLogVerification);
//noinspection DataFlowIssue
return similarTasks.min(Comparator.comparingInt(
t -> ((CollectionLogVerification) t.getVerification()).getCount()
)).orElse(pickedTask);
}
}