Skip to content
This repository was archived by the owner on Feb 9, 2022. It is now read-only.

Commit 1741428

Browse files
ExplvExplv
authored andcommitted
Added randomize task order option to loop task
1 parent 98ef3f2 commit 1741428

File tree

4 files changed

+72
-21
lines changed

4 files changed

+72
-21
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>org.explv.explv_osbot_manager</groupId>
88
<artifactId>explvs_aio</artifactId>
9-
<version>v3.0.1</version>
9+
<version>v3.1.0</version>
1010
<repositories>
1111
<repository>
1212
<id>local-repo</id>

src/main/java/gui/task_panels/LoopTaskPanel.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gui.task_panels;
22

33
import gui.fields.IntegerField;
4+
import gui.styled_components.StyledJCheckBox;
45
import gui.styled_components.StyledJComboBox;
56
import gui.styled_components.StyledJLabel;
67
import gui.styled_components.StyledJPanel;
@@ -16,6 +17,7 @@
1617
public class LoopTaskPanel extends TaskPanel {
1718

1819
private JTextField taskCountField;
20+
private JCheckBox randomizeTasksCheckBox;
1921
private JComboBox<LoopDurationType> loopDurationTypeSelector;
2022
private JTextField iterationCountField;
2123
private DurationPanel durationPanel;
@@ -36,6 +38,11 @@ public class LoopTaskPanel extends TaskPanel {
3638

3739
contentPanel.add(tasksPanel);
3840

41+
JPanel randomizeTasksPanel = new StyledJPanel(new FlowLayout(FlowLayout.LEFT, 5, 5));
42+
randomizeTasksCheckBox = new StyledJCheckBox("Randomize task order");
43+
randomizeTasksPanel.add(randomizeTasksCheckBox);
44+
contentPanel.add(randomizeTasksPanel);
45+
3946
JPanel loopTaskDurationPanel = new StyledJPanel(new FlowLayout(FlowLayout.LEFT, 5, 5));
4047
contentPanel.add(loopTaskDurationPanel);
4148

@@ -77,15 +84,16 @@ public Task toTask() {
7784
LoopDurationType loopDurationType = (LoopDurationType) loopDurationTypeSelector.getSelectedItem();
7885

7986
int taskCount = Integer.parseInt(taskCountField.getText());
87+
boolean randomize = randomizeTasksCheckBox.isSelected();
8088

8189
if (loopDurationType == LoopDurationType.ITERATIONS) {
82-
return LoopTask.forIterations(taskCount, Integer.parseInt(iterationCountField.getText()));
90+
return LoopTask.forIterations(taskCount, randomize, Integer.parseInt(iterationCountField.getText()));
8391
} else if (loopDurationType == LoopDurationType.INFINITE) {
84-
return LoopTask.forIterations(taskCount, LoopTask.INFINITE_ITERATIONS);
92+
return LoopTask.forIterations(taskCount, randomize, LoopTask.INFINITE_ITERATIONS);
8593
} else if (durationPanel.getSelectedTimeType() == DurationPanel.TimeType.MINUTES) {
86-
return LoopTask.forDuration(taskCount, durationPanel.getDurationMS());
94+
return LoopTask.forDuration(taskCount, randomize, durationPanel.getDurationMS());
8795
} else {
88-
return LoopTask.untilDateTime(taskCount, durationPanel.getSelectedDateTime());
96+
return LoopTask.untilDateTime(taskCount, randomize, durationPanel.getSelectedDateTime());
8997
}
9098
}
9199

@@ -94,6 +102,7 @@ public JSONObject toJSON() {
94102
JSONObject jsonObject = new JSONObject();
95103
jsonObject.put("type", TaskType.LOOP.name());
96104
jsonObject.put("taskCount", taskCountField.getText());
105+
jsonObject.put("randomize", randomizeTasksCheckBox.isSelected());
97106

98107
LoopDurationType loopDurationType = (LoopDurationType) loopDurationTypeSelector.getSelectedItem();
99108

@@ -114,6 +123,10 @@ public JSONObject toJSON() {
114123
public void fromJSON(JSONObject jsonObject) {
115124
taskCountField.setText((String) jsonObject.get("taskCount"));
116125

126+
if (jsonObject.containsKey("randomize")) {
127+
randomizeTasksCheckBox.setSelected((boolean) jsonObject.get("randomize"));
128+
}
129+
117130
if (jsonObject.containsKey("iterationCount")) {
118131
iterationCountField.setText((String) jsonObject.get("iterationCount"));
119132
loopDurationTypeSelector.setSelectedItem(LoopDurationType.ITERATIONS);

src/main/java/script/AIO.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
@ScriptManifest(author = "Explv", name = "Explv's AIO " + AIO.VERSION, info = "AIO", version = 0, logo = "http://i.imgur.com/58Zz0fb.png")
3131
public class AIO extends Script {
3232

33-
static final String VERSION = "v3.0.1";
33+
static final String VERSION = "v3.1.0";
3434

3535
private Gui gui;
3636
private Paint paint;

src/main/java/tasks/LoopTask.java

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package tasks;
22

3+
import tasks.break_task.BreakTask;
34
import tasks.task_executor.TaskChangeListener;
45
import tasks.task_executor.TaskExecutor;
56
import util.Copyable;
67

78
import java.time.LocalDateTime;
8-
import java.util.List;
9+
import java.util.*;
10+
import java.util.function.Predicate;
911
import java.util.stream.Collectors;
1012

1113
public class LoopTask extends Task {
1214

1315
public static final int INFINITE_ITERATIONS = -1;
1416

15-
private int taskCount;
17+
private final int taskCount;
18+
private final boolean randomize;
1619

1720
private int numIterations;
1821
private long startTimeMS = -1, durationMS = -1;
@@ -26,27 +29,26 @@ public class LoopTask extends Task {
2629

2730
private List<Task> loopTasks;
2831

29-
private LoopTask() {
32+
private LoopTask(final int taskCount, final boolean randomize) {
3033
super(TaskType.LOOP);
34+
this.taskCount = taskCount;
35+
this.randomize = randomize;
3136
}
3237

33-
public static LoopTask forIterations(final int taskCount, final int numIterations) {
34-
LoopTask loopTask = new LoopTask();
35-
loopTask.taskCount = taskCount;
38+
public static LoopTask forIterations(final int taskCount, final boolean randomize, final int numIterations) {
39+
LoopTask loopTask = new LoopTask(taskCount, randomize);
3640
loopTask.numIterations = numIterations;
3741
return loopTask;
3842
}
3943

40-
public static LoopTask forDuration(final int taskCount, final long durationMS) {
41-
LoopTask loopTask = new LoopTask();
42-
loopTask.taskCount = taskCount;
44+
public static LoopTask forDuration(final int taskCount, final boolean randomize, final long durationMS) {
45+
LoopTask loopTask = new LoopTask(taskCount, randomize);
4346
loopTask.durationMS = durationMS;
4447
return loopTask;
4548
}
4649

47-
public static LoopTask untilDateTime(final int taskCount, final LocalDateTime endDateTime) {
48-
LoopTask loopTask = new LoopTask();
49-
loopTask.taskCount = taskCount;
50+
public static LoopTask untilDateTime(final int taskCount, final boolean randomize, final LocalDateTime endDateTime) {
51+
LoopTask loopTask = new LoopTask(taskCount, randomize);
5052
loopTask.endDateTime = endDateTime;
5153
return loopTask;
5254
}
@@ -57,6 +59,12 @@ public void setup(final List<Task> allTasks,
5759
this.startTaskIndex = this.endTaskIndex - taskCount;
5860

5961
loopTasks = getLoopTasks(allTasks);
62+
63+
if (randomize) {
64+
randomizeTasks(loopTasks);
65+
log("Randomized tasks");
66+
}
67+
6068
taskExecutor = new TaskExecutor(loopTasks);
6169
taskExecutor.addTaskChangeListeners(taskChangeListeners);
6270
}
@@ -108,6 +116,36 @@ private List<Task> copyTasks(final List<Task> tasks) {
108116
.collect(Collectors.toList());
109117
}
110118

119+
private void randomizeTasks(final List<Task> tasks) {
120+
// Randomly shuffle any tasks that are not break tasks
121+
randomizeTasks(tasks, task -> !(task instanceof BreakTask));
122+
123+
// Then randomly shuffle all break tasks
124+
randomizeTasks(tasks, task -> task instanceof BreakTask);
125+
}
126+
127+
/**
128+
* Randomizes the order of tasks in a list of tasks
129+
* Only tasks that match the taskPredicate will be re-ordered
130+
* @param tasks List if tasks to be randomized
131+
* @param taskPredicate A task predicate to determine candidates for re-ordering
132+
*/
133+
private void randomizeTasks(final List<Task> tasks, final Predicate<Task> taskPredicate) {
134+
List<Task> breakTasks = tasks.stream()
135+
.filter(taskPredicate)
136+
.collect(Collectors.toList());
137+
138+
Collections.shuffle(breakTasks);
139+
140+
Queue<Task> randomBreakTaskQueue = new LinkedList<>(breakTasks);
141+
142+
for (int i = 0; i < tasks.size(); i ++) {
143+
if (taskPredicate.test(tasks.get(i))) {
144+
tasks.set(i, randomBreakTaskQueue.poll());
145+
}
146+
}
147+
}
148+
111149
@Override
112150
public boolean canExit() {
113151
return true;
@@ -116,11 +154,11 @@ public boolean canExit() {
116154
@Override
117155
public Task copy() {
118156
if (endDateTime != null) {
119-
return LoopTask.untilDateTime(taskCount, endDateTime);
157+
return LoopTask.untilDateTime(taskCount, randomize, endDateTime);
120158
} else if (durationMS != -1) {
121-
return LoopTask.forDuration(taskCount, durationMS);
159+
return LoopTask.forDuration(taskCount, randomize, durationMS);
122160
}
123-
return LoopTask.forIterations(taskCount, numIterations);
161+
return LoopTask.forIterations(taskCount, randomize, numIterations);
124162
}
125163

126164
@Override

0 commit comments

Comments
 (0)