diff options
| author | Matt Kohls <mattkohls13@gmail.com> | 2018-10-16 19:09:12 -0400 | 
|---|---|---|
| committer | Matt Kohls <mattkohls13@gmail.com> | 2018-10-16 19:09:12 -0400 | 
| commit | 5789f36ca27d9082a1266207453d43f4ed87ef6e (patch) | |
| tree | 3aa15dfbc843c2865e34a29655dc49b66add8d6b /src/main/java | |
| parent | 2375afc8d0db70f829288586f5076e7da8684a87 (diff) | |
| download | SoundChan-5789f36ca27d9082a1266207453d43f4ed87ef6e.tar.gz SoundChan-5789f36ca27d9082a1266207453d43f4ed87ef6e.tar.bz2 SoundChan-5789f36ca27d9082a1266207453d43f4ed87ef6e.zip | |
Adding in watcher for changes to user sound file
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/soundchan/BotListener/BotListener.java | 15 | ||||
| -rw-r--r-- | src/main/java/soundchan/BotListener/UserSoundWatcher.java | 69 | ||||
| -rw-r--r-- | src/main/java/soundchan/LocalAudioManager.java | 28 | 
3 files changed, 101 insertions, 11 deletions
| diff --git a/src/main/java/soundchan/BotListener/BotListener.java b/src/main/java/soundchan/BotListener/BotListener.java index 0dad6c0..02c3acd 100644 --- a/src/main/java/soundchan/BotListener/BotListener.java +++ b/src/main/java/soundchan/BotListener/BotListener.java @@ -64,15 +64,20 @@ public class BotListener extends ListenerAdapter{          if(audioOnUserJoin) {              String userAudioPath = properties.getProperty("userAudioFilePath");              if(userAudioPath == null || userAudioPath.contentEquals("")) { -                localManager = new LocalAudioManager(localFilePath, "usersound.properties"); +                userAudioPath = "usersound.properties";              } -            else { -                localManager = new LocalAudioManager(localFilePath, userAudioPath); +            localManager = new LocalAudioManager(localFilePath, userAudioPath); + +            if(settingEnableCheck(properties.getProperty("watchUserSoundFile"))) { +                ExecutorService executorService = Executors.newSingleThreadExecutor(); +                UserSoundWatcher userSoundWatcher = new UserSoundWatcher(localManager, userAudioPath); +                future = executorService.submit(userSoundWatcher); +                executorService.shutdown();              }          }          else              localManager = new LocalAudioManager(localFilePath); -         +          if(settingEnableCheck(properties.getProperty("watchLocalFilePath"))) {              ExecutorService executorService = Executors.newSingleThreadExecutor();              DirectoryWatcher directoryWatcher = new DirectoryWatcher(localManager, localFilePath); @@ -379,6 +384,8 @@ public class BotListener extends ListenerAdapter{       * @return True if it matches a value to enable, False otherwise       */      private static boolean settingEnableCheck(String value) { +        if(value == null) +            return false;          value = value.toLowerCase();          if(value.contentEquals("true") || value.contentEquals("1") ||                  value.contentEquals("yes") || value.contentEquals("on") || diff --git a/src/main/java/soundchan/BotListener/UserSoundWatcher.java b/src/main/java/soundchan/BotListener/UserSoundWatcher.java new file mode 100644 index 0000000..4c10cef --- /dev/null +++ b/src/main/java/soundchan/BotListener/UserSoundWatcher.java @@ -0,0 +1,69 @@ +package soundchan.BotListener; + +import soundchan.LocalAudioManager; + +import java.io.File; +import java.io.IOException; +import java.nio.file.*; + +import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; + +public class UserSoundWatcher implements Runnable { + +    private LocalAudioManager localAudioManager; +    private String userSoundFile; +    private Path soundFileDirectory; +    private WatchService watchService; +    private WatchKey watchKey; + +    @SuppressWarnings("unchecked") +    static <T> WatchEvent<T> cast(WatchEvent<?> event) { +        return (WatchEvent<T>) event; +    } + +    public UserSoundWatcher(LocalAudioManager audioManager, String filepath) { +        this.localAudioManager = audioManager; +        File soundFile = new File(filepath); +        this.userSoundFile = soundFile.getName(); +        try { +            this.soundFileDirectory = soundFile.getCanonicalFile().getParentFile().toPath(); +        } catch(IOException e) { +            System.out.println("Error getting parent path of " + userSoundFile); +        } +        try { +            this.watchService = FileSystems.getDefault().newWatchService(); +            this.watchKey = soundFileDirectory.register(watchService, ENTRY_MODIFY); +        } catch(IOException e) { +            System.out.println(e.getMessage()); +            System.out.println("Error setting up watcher for " + filepath); +        } +    } + +    /** +     * Called by an executor, checks for changes of the userSoundFile +     */ +    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(pathEvent.context().endsWith(userSoundFile)) { +                        localAudioManager.UpdateUserAudio(); +                    } +                } + +                if(!key.reset()) { +                    break; +                } +            } +        } catch(InterruptedException e) { +            return; +        } +    } +} diff --git a/src/main/java/soundchan/LocalAudioManager.java b/src/main/java/soundchan/LocalAudioManager.java index 036b38d..b125e73 100644 --- a/src/main/java/soundchan/LocalAudioManager.java +++ b/src/main/java/soundchan/LocalAudioManager.java @@ -17,9 +17,11 @@ public class LocalAudioManager {      public Map<String, String> filenameDict;      public Map<String, String> usernameDict;      private String filepath; +    private String userSoundFilepath;      public LocalAudioManager(String filepath_in){          filepath = filepath_in; +        userSoundFilepath = null;          filenameDict = PopulateFiles();      } @@ -30,9 +32,9 @@ public class LocalAudioManager {       */      public LocalAudioManager(String filepath_in, String userSoundFile) {          filepath = filepath_in; +        userSoundFilepath = userSoundFile;          filenameDict = PopulateFiles(); -        usernameDict = new HashMap<>(); -        MapUserAudio(userSoundFile); +        usernameDict = MapUserAudio();      }      /** @@ -93,6 +95,15 @@ public class LocalAudioManager {      }      /** +     * Updates the map of usernames to sound files +     */ +    public void UpdateUserAudio() { +        if(userSoundFilepath != null | userSoundFilepath.contentEquals("")) { +            usernameDict = MapUserAudio(); +        } +    } + +    /**       * Creates a map of the sounds in the sound directory       * @return A map with the filename (without extension) is the key for the filename (with extension)       */ @@ -114,16 +125,19 @@ public class LocalAudioManager {      /**       * Reads in users and their respective sounds from file, then builds a map of users to the filenames. This assumes       * filenames for the sounds are valid, but doesn't check for them. -     * @param userSoundFile The file (with path if required) with listing of users and the sounds to play when they join +     * @return A map with the usernames as the keys for the filename of the sound       */ -    private void MapUserAudio(String userSoundFile) { -        Properties userSoundProp = LoadProperties(userSoundFile); +    private Map<String, String> MapUserAudio() { +        Properties userSoundProp = LoadProperties(userSoundFilepath);          Set<String> users = userSoundProp.stringPropertyNames(); + +        Map<String, String> userDict = new HashMap<>(); +          for(String user : users) {              String soundFile = userSoundProp.getProperty(user); -            usernameDict.put(user, soundFile); +            userDict.put(user, soundFile);          } - +        return userDict;      }      /** | 
