diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/soundchan/BotListener/MediaWatcher.java | 91 | 
1 files changed, 91 insertions, 0 deletions
| diff --git a/src/main/java/soundchan/BotListener/MediaWatcher.java b/src/main/java/soundchan/BotListener/MediaWatcher.java new file mode 100644 index 0000000..1f15cc1 --- /dev/null +++ b/src/main/java/soundchan/BotListener/MediaWatcher.java @@ -0,0 +1,91 @@ +package soundchan.BotListener; + +import soundchan.LocalAudioManager; + +import java.io.File; +import java.io.IOException; +import java.nio.file.*; + +import static java.lang.Thread.sleep; +import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; +import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; +import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; + +public class MediaWatcher implements Runnable { + +    private LocalAudioManager localAudioManager; +    private String mediaFilename; +    private Path mediaDir; +    private WatchService watchService; +    private WatchKey watchKey; +    private boolean isDirectory; + +    @SuppressWarnings("unchecked") +    static <T> WatchEvent<T> cast(WatchEvent<?> event) { +        return (WatchEvent<T>) event; +    } + +    /** +     * Creates a MediaWatcher, which monitors changes to files either within a directory or for a specific file. +     * If the given filepath is name of a directory, it is assumed that we want to monitor changes to the sound files. +     * If the given filepath is a single file, it is assumed that we want to monitor changes to the userSoundFile. +     * @param audioManager AudioManager for this bot instance +     * @param filepath Path to either directory or specific file +     */ +    public MediaWatcher(LocalAudioManager audioManager, String filepath) { +        this.localAudioManager = audioManager; +        File mediaFile = new File(filepath); +        this.mediaFilename = mediaFile.getName(); +        if(mediaFile.isFile()) { +            try { +                this.mediaDir = mediaFile.getCanonicalFile().getParentFile().toPath(); +            } catch (IOException e) { +                System.out.println("Error getting parent path of " + mediaFilename); +            } +            isDirectory = false; +        } else if(mediaFile.isDirectory()) { +            this.mediaDir = mediaFile.toPath(); +            isDirectory = true; +        } +        try { +            this.watchService = FileSystems.getDefault().newWatchService(); +            this.watchKey = mediaDir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); +        } catch (IOException e) { +            System.out.println("Error setting up watcher for " + filepath); +        } +    } + +    /** +     * Called by an executor, checks for changes in the directory +     */ +    public void run() { +        try { +            while(true) { +                WatchKey key = watchService.take(); +                if(this.watchKey != key) { +                    System.out.println("Error with WatchKey"); +                    continue; +                } + +                for(WatchEvent<?> event : key.pollEvents()) { +                    WatchEvent<Path> pathEvent = cast(event); +                    if(isDirectory) { +                        localAudioManager.UpdateFiles(); +                    } else { +                        if(pathEvent.context().endsWith(mediaFilename)) { +                            localAudioManager.UpdateUserAudio(); +                        } +                    } +                } + +                if(!key.reset()) { +                    break; +                } + +                sleep(5000); +            } +        } catch(InterruptedException e) { +            return; +        } +    } +} | 
