Advertisement
FusionLord

Recording command

Sep 24th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.67 KB | None | 0 0
  1. package net.unidentifiedgaming.discord.bot.commands;
  2.  
  3. import org.apache.commons.lang3.ArrayUtils;
  4. import org.tritonus.share.sampled.file.AudioOutputStream;
  5. import sx.blah.discord.api.internal.OpusUtil;
  6. import sx.blah.discord.handle.audio.AudioEncodingType;
  7. import sx.blah.discord.handle.audio.IAudioReceiver;
  8. import sx.blah.discord.handle.impl.events.guild.channel.message.MessageEvent;
  9. import sx.blah.discord.handle.obj.IRole;
  10. import sx.blah.discord.handle.obj.IUser;
  11. import sx.blah.discord.handle.obj.IVoiceChannel;
  12.  
  13. import javax.sound.sampled.*;
  14. import java.io.*;
  15. import java.util.Arrays;
  16. import java.util.Date;
  17. import java.util.List;
  18.  
  19. public class RecordingCommand extends Command implements IAudioReceiver {
  20.     private static boolean recording = false;
  21.     private byte[] currentRecording;
  22.  
  23.     public RecordingCommand(List<IRole> permissions, String helpText) {
  24.         super(permissions, helpText);
  25.     }
  26.  
  27.     @Override
  28.     public boolean action(List<String> args, MessageEvent event) {
  29.         String arg1 = args.remove(0);
  30.         if (arg1.equals("start")) {
  31.             if (recording) {
  32.                 helpText = "I'm already recording in " + event.getClient().getOurUser().getVoiceStateForGuild(event.getGuild()).getChannel().getName() + ".";
  33.                 return false;
  34.             }
  35.             IVoiceChannel userVoiceChannel = event.getAuthor().getVoiceStateForGuild(event.getGuild()).getChannel();
  36.             if (userVoiceChannel == null) {
  37.                 helpText = "You need to be in a voice channel to do that.";
  38.                 return false;
  39.             }
  40.  
  41.             event.getClient().changePlayingText("Recording!");
  42.             recording = true;
  43.  
  44.             event.getGuild().getAudioManager().subscribeReceiver(this);
  45.             userVoiceChannel.join();
  46.             currentRecording = null;
  47.  
  48.             event.getMessage().reply("I have started recording!");
  49.             return true;
  50.         } else if (arg1.equals("stop")) {
  51.             if (!recording) {
  52.                 helpText = "I'm not recording!";
  53.                 return false;
  54.             }
  55.            
  56.             writeToFile();
  57.  
  58.             event.getGuild().getAudioManager().unsubscribeReceiver(this);
  59.             event.getClient().changePlayingText("");
  60.             event.getClient().getOurUser().getVoiceStateForGuild(event.getGuild()).getChannel().leave();
  61.             recording = false;
  62.             currentRecording = null;
  63.             event.getMessage().reply("I have stopped recording!");
  64.             return true;
  65.         }
  66.  
  67.         return false;
  68.     }
  69.  
  70.     private void writeToFile() {
  71.         InputStream b_stream = new ByteArrayInputStream(currentRecording);
  72.         System.out.println(Arrays.toString(currentRecording));
  73.         try {
  74.             AudioFormat format = new AudioFormat(8000f, 16, 1, true, true);
  75.             AudioInputStream stream = new AudioInputStream(b_stream, format, currentRecording.length);
  76.             File file = new File("D:/DiscordBot/recordings/meetings/" + new Date().getTime() + ".wav");
  77.             file.getParentFile().mkdirs();
  78.             AudioSystem.write(stream, AudioFileFormat.Type.WAVE, file);
  79.         } catch (IOException e) {
  80.             e.printStackTrace();
  81.         }
  82.     }
  83.  
  84.     @Override
  85.     public void receive(byte[] audio, IUser iUser, char sequence, int timestamp) {
  86. //        System.out.println("audio: " + Arrays.toString(audio));
  87. //        System.out.println("currentRecording: " + Arrays.toString(currentRecording));
  88.         currentRecording = ArrayUtils.addAll(currentRecording, audio);
  89.     }
  90.  
  91.     @Override
  92.     public AudioEncodingType getAudioEncodingType() {
  93.         return AudioEncodingType.OPUS;
  94.     }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement