package me.vynder.commandlottery;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.logging.Logger;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
public class CommandLottery extends JavaPlugin {
File settingsConfigFile;
File languageConfigFile;
FileConfiguration settingsConfig;
FileConfiguration languageConfig;
Boolean IsRepeatable;
String messageLotteryStarts;
String messageTimeToStartLeft;
String messageWinToAll;
String messageWinToWinner;
String messageWinToAllMany;
String messagePrefix;
int amountOfWinners;
int delay;
int timeBeforeBegin;
int minimalOnline;
int timerTaskId;
int timeRepeatableTaskId;
List<?> commands;
int _DelayTime;
Logger log = getLogger();
@Override
public void onEnable() {
settingsConfigFile = new File(getDataFolder(), "config.yml");
languageConfigFile = new File(getDataFolder(), "language.yml");
try {
CreateConfigFiles();
} catch (Exception e) {
e.printStackTrace();
}
settingsConfig = new YamlConfiguration();
languageConfig = new YamlConfiguration();
try {
settingsConfig.load(settingsConfigFile);
languageConfig.load(languageConfigFile);
} catch(IOException|InvalidConfigurationException e) {
e.printStackTrace();
}
// Load all settings
commands = settingsConfig.getList("Commands");
IsRepeatable = settingsConfig.getBoolean("Global.RepeatEveryXTime");
amountOfWinners = settingsConfig.getInt("Global.WinnersAmount");
delay = settingsConfig.getInt("Global.Delay");
timeBeforeBegin = settingsConfig.getInt("Global.TimeBeforeBegin");
minimalOnline = settingsConfig.getInt("Global.MinimalOnline");
messageLotteryStarts = languageConfig.getString("Global.LotteryStarts");
messageLotteryStarts = messageLotteryStarts.replaceAll("(?i)&([a-k0-9])", "\u00A7$1");
messageTimeToStartLeft = languageConfig.getString("Global.LeftTime");
messageTimeToStartLeft = messageTimeToStartLeft.replaceAll("(?i)&([a-k0-9])", "\u00A7$1");
messageWinToAll = languageConfig.getString("Global.WinToAll");
messageWinToAll = messageWinToAll.replaceAll("(?i)&([a-k0-9])", "\u00A7$1");
messageWinToAllMany = languageConfig.getString("Global.WinToAllMany");
messageWinToAllMany = messageWinToAllMany.replaceAll("(?i)&([a-k0-9])", "\u00A7$1");
messageWinToWinner = languageConfig.getString("Global.WinWinner");
messageWinToWinner = messageWinToWinner.replaceAll("(?i)&([a-k0-9])", "\u00A7$1");
messagePrefix = languageConfig.getString("Global.Prefix");
messagePrefix = messagePrefix.replaceAll("(?i)&([a-k0-9])", "\u00A7$1");
if(IsRepeatable){
timeRepeatableTaskId = Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
@Override
public void run() {
DrawLottery(timeBeforeBegin, amountOfWinners);
}
}, delay*20);
}
}
@Override
public void onDisable() {
}
public void CreateConfigFiles(){
if(!settingsConfigFile.exists()){
settingsConfigFile.getParentFile().mkdirs();
copy(getResource("config.yml"), settingsConfigFile);
}
if(!languageConfigFile.exists()){
languageConfigFile.getParentFile().mkdirs();
copy(getResource("language.yml"), languageConfigFile);
}
}
private void copy(InputStream in, File file) {
try {
OutputStream out = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len;
while((len=in.read(buf))>0){
out.write(buf,0,len);
}
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
if(cmd.getName().equalsIgnoreCase("lotterydraw")){
if(args.length !=2) return false;
if(!args[0].isEmpty() && !args[1].isEmpty()){
int TimerToStart;
int WinrsAmt;
try{
TimerToStart = Integer.parseInt(args[0]);
WinrsAmt = Integer.parseInt(args[1]);
}
catch(NumberFormatException e){
sender.sendMessage("Invalid argument!");
return false;
}
if(WinrsAmt < 0) return false;
if(WinrsAmt > Bukkit.getServer().getOnlinePlayers().size()){
sender.sendMessage("Amount of winners is bigger than online players!");
return true;
}
if(minimalOnline > Bukkit.getOnlinePlayers().size()){
sender.sendMessage("Minimal online to draw is " + minimalOnline);
return true;
}
DrawLotteryWithoutTimer(TimerToStart, WinrsAmt);
}
else return false;
return true;
}
return false;
}
public void DrawLotteryWithoutTimer(final int DelayTime, final int WinnersAmount){
Bukkit.broadcastMessage(messagePrefix + messageLotteryStarts);
if(DelayTime > 0){
_DelayTime = DelayTime;
timerTaskId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){
@Override
public void run()
{
if(_DelayTime <= 0){
Bukkit.getServer().getScheduler().cancelTask(timerTaskId);
DrawLotteryBody(WinnersAmount);
return;
}
Bukkit.broadcastMessage(messagePrefix +
messageTimeToStartLeft.replace("<time>",
Integer.toString(_DelayTime)));
_DelayTime--;
}
}, 20L, 20L);
}
else DrawLotteryBody(WinnersAmount);
}
public void DrawLottery(final int DelayTime, final int WinnersAmount){
if(minimalOnline <= Bukkit.getOnlinePlayers().size()){
Bukkit.broadcastMessage(messagePrefix + messageLotteryStarts);
if(DelayTime > 0){
_DelayTime = DelayTime;
timerTaskId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){
@Override
public void run()
{
if(_DelayTime <= 0){
Bukkit.getServer().getScheduler().cancelTask(timerTaskId);
DrawLotteryBody(WinnersAmount);
return;
}
Bukkit.broadcastMessage(messagePrefix +
messageTimeToStartLeft.replace("<time>",
Integer.toString(_DelayTime)));
_DelayTime--;
}
}, 20L, 20L);
}
else DrawLotteryBody(WinnersAmount);
}
timeRepeatableTaskId = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
@Override
public void run() {
DrawLottery(timeBeforeBegin, amountOfWinners);
}
}, delay*20);
}
public void DrawLotteryBody(int WinnersAmount){
ArrayList<Player> players = new ArrayList<Player>();
for(Player player : Bukkit.getServer().getOnlinePlayers()){
players.add(player);
}
ArrayList<Player> winners = new ArrayList<Player>();
Random random = new Random();
for(int i = 0; i < WinnersAmount; i++){
try{
int randomIndex = random.nextInt(players.size());
winners.add(players.get(randomIndex));
players.remove(randomIndex);
}
catch(IllegalArgumentException e){
log.info("Draw is unsuccesseful, someone left the game!");
}
}
if(WinnersAmount == 1){
Bukkit.broadcastMessage(messagePrefix +
messageWinToAll.replace("<player>", winners.get(0).getDisplayName()));
}
else{
String formatted = "";
for(Player player : winners){
formatted = formatted + player.getDisplayName();
}
Bukkit.broadcastMessage(messagePrefix +
messageWinToAllMany.replace("<players>", formatted));
}
String targetCommand = (String)commands.get(new Random().nextInt(commands.size()));
for(Player player : winners){
player.sendMessage(messagePrefix + messageWinToWinner);
targetCommand = targetCommand.replace("<player>", player.getName());
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), targetCommand);
}
}
}