package tc.oc.pgm.broadcast; import java.util.List; import javax.inject.Inject; import com.google.common.collect.ImmutableList; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import tc.oc.commons.core.chat.Audience; import tc.oc.commons.core.scheduler.Task; import tc.oc.commons.core.stream.Collectors; import tc.oc.pgm.events.MatchBeginEvent; import tc.oc.pgm.events.MatchEndEvent; import tc.oc.pgm.match.MatchAudiences; import tc.oc.pgm.match.MatchScheduler; public class BroadcastScheduler implements Listener { private final List<Broadcast> broadcasts; private final MatchAudiences audiences; private final MatchScheduler scheduler; private List<BroadcastTask> tasks = ImmutableList.of(); @Inject BroadcastScheduler(List<Broadcast> broadcasts, MatchAudiences audiences, MatchScheduler scheduler) { this.broadcasts = broadcasts; this.audiences = audiences; this.scheduler = scheduler; } @EventHandler public void matchBegin(MatchBeginEvent event) { tasks = broadcasts.stream() .map(BroadcastTask::new) .collect(Collectors.toImmutableList()); } @EventHandler public void matchEnd(MatchEndEvent event) { tasks.forEach(BroadcastTask::cancel); } private class BroadcastTask { final Broadcast broadcast; final Task task; int count = 0; BroadcastTask(Broadcast broadcast) { this.broadcast = broadcast; this.task = scheduler.createRepeatingTask(broadcast.after, broadcast.every, this::send); } void cancel() { task.cancel(); } void send() { final Audience audience = audiences.filter(broadcast.filter); audience.sendMessage(broadcast.getFormattedMessage()); audience.playSound(broadcast.getSound()); if(++count >= broadcast.count) { cancel(); } } } }