Skip to content

Commit 8a2762e

Browse files
committed
fix: multiple bugs in the execution logic
1 parent 79e537f commit 8a2762e

2 files changed

Lines changed: 110 additions & 82 deletions

File tree

src/main/java/me/playbosswar/com/tasks/TasksManager.java

Lines changed: 102 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -221,90 +221,79 @@ public void populateScheduleForTask(Task task) {
221221
}
222222

223223
if (!task.getTimes().isEmpty()) {
224+
List<TaskTime> rangeTimes = new ArrayList<>();
225+
List<TaskTime> nonRangeTimes = new ArrayList<>();
226+
224227
for (TaskTime taskTime : task.getTimes()) {
228+
if (taskTime.isRange()) {
229+
rangeTimes.add(taskTime);
230+
} else {
231+
nonRangeTimes.add(taskTime);
232+
}
233+
}
234+
235+
for (TaskTime taskTime : rangeTimes) {
225236
if (taskTime.isMinecraftTime()) {
226237
World world = Bukkit.getWorld(taskTime.getWorld() == null ? "world" : taskTime.getWorld());
227238
if (world == null) {
228239
continue;
229240
}
230241

231-
if (taskTime.isRange()) {
232-
LocalTime startRange = taskTime.getTime1();
233-
LocalTime endRange = taskTime.getTime2();
234-
235-
LocalTime currentMcTime = Tools.getMinecraftTimeAt(world, ZonedDateTime.now());
236-
boolean currentlyInWindow = isTimeInRange(currentMcTime, startRange, endRange);
237-
238-
int mcDay = 0;
239-
boolean firstIteration = true;
240-
while (maxToSchedule > 0) {
241-
ZonedDateTime windowStart;
242-
ZonedDateTime windowEnd;
243-
244-
if (firstIteration && currentlyInWindow) {
245-
windowStart = ZonedDateTime.now();
246-
windowEnd = Tools.getNextMinecraftTime(world, endRange, 0);
247-
if (windowEnd.isBefore(windowStart)) {
248-
windowEnd = Tools.getNextMinecraftTime(world, endRange, 1);
249-
}
250-
} else {
251-
int dayOffset = (firstIteration && currentlyInWindow) ? 1 : mcDay;
252-
if (firstIteration && !currentlyInWindow) {
253-
dayOffset = 0;
254-
}
255-
windowStart = Tools.getNextMinecraftTime(world, startRange, dayOffset);
256-
windowEnd = Tools.getNextMinecraftTime(world, endRange, dayOffset);
257-
if (windowEnd.isBefore(windowStart)) {
258-
windowEnd = Tools.getNextMinecraftTime(world, endRange, dayOffset + 1);
259-
}
260-
}
261-
firstIteration = false;
242+
LocalTime startRange = taskTime.getTime1();
243+
LocalTime endRange = taskTime.getTime2();
262244

263-
if (!task.getDays().contains(windowStart.toLocalDate().getDayOfWeek())) {
264-
mcDay++;
265-
continue;
266-
}
245+
LocalTime currentMcTime = Tools.getMinecraftTimeAt(world, ZonedDateTime.now());
246+
boolean currentlyInWindow = isTimeInRange(currentMcTime, startRange, endRange);
267247

268-
if (windowEnd.isBefore(latestScheduledDate)) {
269-
mcDay++;
270-
continue;
248+
int mcDay = 0;
249+
boolean firstIteration = true;
250+
while (maxToSchedule > 0) {
251+
ZonedDateTime windowStart;
252+
ZonedDateTime windowEnd;
253+
254+
if (firstIteration && currentlyInWindow) {
255+
windowStart = ZonedDateTime.now();
256+
windowEnd = Tools.getNextMinecraftTime(world, endRange, 0);
257+
if (windowEnd.isBefore(windowStart)) {
258+
windowEnd = Tools.getNextMinecraftTime(world, endRange, 1);
259+
}
260+
} else {
261+
int dayOffset = (firstIteration && currentlyInWindow) ? 1 : mcDay;
262+
if (firstIteration && !currentlyInWindow) {
263+
dayOffset = 0;
264+
}
265+
windowStart = Tools.getNextMinecraftTime(world, startRange, dayOffset);
266+
windowEnd = Tools.getNextMinecraftTime(world, endRange, dayOffset);
267+
if (windowEnd.isBefore(windowStart)) {
268+
windowEnd = Tools.getNextMinecraftTime(world, endRange, dayOffset + 1);
271269
}
270+
}
271+
firstIteration = false;
272272

273-
ZonedDateTime execTime = windowStart.isBefore(latestScheduledDate) ? latestScheduledDate : windowStart;
274-
long intervalSeconds = task.getInterval().toSeconds();
275-
if (intervalSeconds <= 0) intervalSeconds = 1;
273+
if (!task.getDays().contains(windowStart.toLocalDate().getDayOfWeek())) {
274+
mcDay++;
275+
continue;
276+
}
276277

277-
while (maxToSchedule > 0 && !execTime.isAfter(windowEnd)) {
278-
if (!execTime.isBefore(latestScheduledDate)) {
279-
scheduledTasks.add(new ScheduledTask(task, execTime));
280-
maxToSchedule--;
281-
}
282-
execTime = execTime.plusSeconds(intervalSeconds);
283-
}
278+
if (windowEnd.isBefore(latestScheduledDate)) {
284279
mcDay++;
280+
continue;
285281
}
286-
} else {
287-
LocalTime time = taskTime.getTime1();
288282

289-
int i = 0;
290-
while (maxToSchedule > 0) {
291-
ZonedDateTime nextMinecraftTime = Tools.getNextMinecraftTime(world, time, i);
292-
if (!task.getDays().contains(nextMinecraftTime.getDayOfWeek())) {
293-
i++;
294-
continue;
295-
}
283+
ZonedDateTime execTime = windowStart.isBefore(latestScheduledDate) ? latestScheduledDate : windowStart;
284+
long intervalSeconds = task.getInterval().toSeconds();
285+
if (intervalSeconds <= 0) intervalSeconds = 1;
296286

297-
if (nextMinecraftTime.isBefore(latestScheduledDate)) {
298-
i++;
299-
continue;
287+
while (maxToSchedule > 0 && !execTime.isAfter(windowEnd)) {
288+
if (!execTime.isBefore(latestScheduledDate)) {
289+
scheduledTasks.add(new ScheduledTask(task, execTime));
290+
maxToSchedule--;
300291
}
301-
302-
scheduledTasks.add(new ScheduledTask(task, nextMinecraftTime));
303-
maxToSchedule--;
304-
i++;
292+
execTime = execTime.plusSeconds(intervalSeconds);
305293
}
294+
mcDay++;
306295
}
307-
} else if (taskTime.isRange()) {
296+
} else {
308297
LocalTime startRange = taskTime.getTime1();
309298
LocalTime endRange = taskTime.getTime2();
310299

@@ -317,7 +306,8 @@ public void populateScheduleForTask(Task task) {
317306
continue;
318307
}
319308

320-
if (!(date.toLocalTime().isAfter(startRange) && date.toLocalTime().isBefore(endRange))) {
309+
boolean isInRange = Tools.isTimeInRange(date.toLocalTime(), startRange, endRange);
310+
if (!isInRange) {
321311
i++;
322312
continue;
323313
}
@@ -331,29 +321,59 @@ public void populateScheduleForTask(Task task) {
331321
maxToSchedule--;
332322
i++;
333323
}
334-
} else {
335-
LocalTime time = taskTime.getTime1();
336-
337-
int i = 0;
338-
while (maxToSchedule > 0) {
339-
ZonedDateTime date = ZonedDateTime.of(LocalDate.now(), time, ZoneId.systemDefault())
340-
.plusDays(i);
341-
if (!task.getDays().contains(date.getDayOfWeek())) {
342-
i++;
324+
}
325+
}
326+
327+
if (!nonRangeTimes.isEmpty()) {
328+
List<ZonedDateTime> allOccurrences = new ArrayList<>();
329+
330+
for (TaskTime taskTime : nonRangeTimes) {
331+
if (taskTime.isMinecraftTime()) {
332+
World world = Bukkit.getWorld(taskTime.getWorld() == null ? "world" : taskTime.getWorld());
333+
if (world == null) {
343334
continue;
344335
}
345336

346-
if (date.isBefore(latestScheduledDate)) {
337+
LocalTime time = taskTime.getTime1();
338+
int i = 0;
339+
int collected = 0;
340+
while (collected < maxToSchedule * 2) {
341+
ZonedDateTime nextMinecraftTime = Tools.getNextMinecraftTime(world, time, i);
342+
if (task.getDays().contains(nextMinecraftTime.getDayOfWeek())
343+
&& !nextMinecraftTime.isBefore(latestScheduledDate)) {
344+
allOccurrences.add(nextMinecraftTime);
345+
collected++;
346+
}
347347
i++;
348-
continue;
349348
}
350-
351-
scheduledTasks.add(new ScheduledTask(task, date));
352-
maxToSchedule--;
353-
i++;
349+
} else {
350+
LocalTime time = taskTime.getTime1();
351+
int i = 0;
352+
int collected = 0;
353+
while (collected < maxToSchedule * 2) {
354+
ZonedDateTime date = ZonedDateTime.of(LocalDate.now(), time, ZoneId.systemDefault())
355+
.plusDays(i);
356+
if (task.getDays().contains(date.getDayOfWeek())
357+
&& !date.isBefore(latestScheduledDate)) {
358+
allOccurrences.add(date);
359+
collected++;
360+
}
361+
i++;
362+
}
363+
}
364+
}
365+
366+
allOccurrences.sort(ZonedDateTime::compareTo);
367+
368+
for (ZonedDateTime date : allOccurrences) {
369+
if (maxToSchedule <= 0) {
370+
break;
354371
}
372+
scheduledTasks.add(new ScheduledTask(task, date));
373+
maxToSchedule--;
355374
}
356375
}
376+
357377
return;
358378
}
359379

@@ -363,7 +383,7 @@ public void populateScheduleForTask(Task task) {
363383
return;
364384
}
365385

366-
int i = 0;
386+
int i = 1;
367387
while (maxToSchedule > 0) {
368388
ZonedDateTime date = latestScheduledDate.plusSeconds(i * task.getInterval().toSeconds());
369389
if (!task.getDays().contains(date.getDayOfWeek())) {

src/main/java/me/playbosswar/com/utils/Tools.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,4 +211,12 @@ public static long minecraftTimeToTicks(LocalTime mcTime) {
211211
long ticks = (hours - 6) * 1000L + (minutes * 1000L / 60);
212212
return ticks % 24000;
213213
}
214+
215+
public static boolean isTimeInRange(LocalTime time, LocalTime startRange, LocalTime endRange) {
216+
if (startRange.isBefore(endRange) || startRange.equals(endRange)) {
217+
return !time.isBefore(startRange) && !time.isAfter(endRange);
218+
} else {
219+
return !time.isBefore(startRange) || !time.isAfter(endRange);
220+
}
221+
}
214222
}

0 commit comments

Comments
 (0)