001package org.intellimate.izou.system.sound;
002
003import org.intellimate.izou.addon.AddOnModel;
004
005import java.time.LocalTime;
006import java.time.temporal.ChronoUnit;
007import java.util.ArrayList;
008import java.util.List;
009import java.util.concurrent.Future;
010
011/**
012 * @author LeanderK
013 * @version 1.0
014 */
015public class MutingManager {
016    private final AddOnModel muting;
017    private final List<IzouSoundLine> mutingLines;
018    private final SoundManager soundManager;
019    private LocalTime limit = null;
020    private Future limitFuture;
021
022    public MutingManager(SoundManager soundManager, AddOnModel muting, IzouSoundLine line) {
023        this.muting = muting;
024        this.soundManager = soundManager;
025        mutingLines = new ArrayList<>();
026        mutingLines.add(line);
027        soundManager.muteOthers(muting);
028    }
029
030    public AddOnModel getMuting() {
031        return muting;
032    }
033
034    public synchronized void add(IzouSoundLine line) {
035        if (limit != null) {
036            limit = null;
037            limitFuture.cancel(true);
038        }
039        mutingLines.add(line);
040    }
041
042    public synchronized void cancel() {
043        soundManager.unmute();
044    }
045
046    public synchronized boolean isTimeOut() {
047        return limit != null && LocalTime.now().isAfter(limit);
048    }
049
050    public synchronized MutingManager remove(IzouSoundLine line) {
051        mutingLines.remove(line);
052        if (mutingLines.isEmpty()) {
053            limit = LocalTime.now().plus(2000L, ChronoUnit.MILLIS);
054            limitFuture = soundManager.getMain().getThreadPoolManager().getAddOnsThreadPool().submit(() -> {
055                try {
056                    Thread.sleep(2000);
057                    soundManager.unmute();
058                } catch (InterruptedException ignored) {
059                }
060            });
061            return this;
062        }
063        return this;
064    }
065}