package com.nicewuerfel.blockown.importer;
import com.nicewuerfel.blockown.Ownable;
import com.nicewuerfel.blockown.OwnedBlock;
import com.nicewuerfel.blockown.OwnedEntity;
import com.nicewuerfel.blockown.Setting;
import com.nicewuerfel.blockown.User;
import com.nicewuerfel.blockown.database.Database;
import com.nicewuerfel.blockown.database.DatabaseAction;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.ItemFrame;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.UUID;
public class BlockOwn2 extends Importer {
public BlockOwn2(Setting settings, Database db, File pluginsFolder, Runnable runnable) {
super(settings, db, pluginsFolder, runnable);
}
@Override
public void run() {
File configFile = new File(getPluginsFolder(), "BlockOwn2/config.yml");
if (!configFile.exists()) {
throw new ImporterException("Old config.yml not found!");
}
FileConfiguration config = YamlConfiguration.loadConfiguration(configFile);
if (!config.getString("Settings-Version").equalsIgnoreCase("2.0.2")) {
throw new ImporterException("Old config must have version 2.0.2");
}
String url;
try {
if (config.getBoolean("ServerSettings.MySQL.enable")) {
String type = config.getString("ServerSettings.MySQL.type");
if (type.equalsIgnoreCase("network")) {
Class.forName("com.mysql.jdbc.Driver");
String host = config.getString("ServerSettings.MySQL.host");
int port = config.getInt("ServerSettings.MySQL.port");
String databaseName = config.getString("ServerSettings.MySQL.database");
String username = config.getString("ServerSettings.MySQL.user");
String password = config.getString("ServerSettings.MySQL.password");
url = "jdbc:mysql://" + host + ":" + port + "/" + databaseName + "?user=" + username
+ "&password=" + password + "&autoReconnect=true";
} else {
Class.forName("org.sqlite.JDBC");
url = "jdbc:sqlite:" + getPluginsFolder().getPath() + "/BlockOwn2/data.db";
}
} else {
importClassic();
return;
}
} catch (ClassNotFoundException e) {
throw new ImporterException("driver class not found");
}
try {
Connection con = DriverManager.getConnection(url);
Statement stmnt = con.createStatement();
ResultSet rs = stmnt
.executeQuery("SELECT * FROM block INNER JOIN player ON block.ownerid=player.playerid;");
Ownable ownable;
int count = 0;
int skipped = 0;
while (rs.next()) {
count++;
boolean isBlock = rs.getBoolean("isblock");
String worldName = rs.getString("world");
int x = rs.getInt("x");
int y = rs.getInt("y");
int z = rs.getInt("z");
User owner = User.getInstance(UUID.fromString(rs.getString("uuid")));
if (!isBlock) {
ItemFrame itemFrame = getItemFrame(worldName, x, y, z);
if (itemFrame == null) {
skipped++;
continue;
}
ownable = OwnedEntity.newInstance(itemFrame);
} else {
ownable = OwnedBlock.newInstance(worldName, x, y, z);
}
own(ownable, owner);
}
System.out.println("Import skipped " + skipped + " of " + count + " entries.");
stmnt.close();
con.close();
finished();
} catch (SQLException e) {
throw new ImporterException(e.getMessage());
}
}
private void own(Ownable ownable, User owner) {
if (!getDatabase().getOwner(ownable).isPresent()) {
DatabaseAction databaseAction = DatabaseAction.newOwnInstance(ownable, owner);
getDatabase().enqueue(databaseAction);
}
}
private void importClassic() throws ImporterException {
File file = new File(getPluginsFolder(), "BlockOwn2/blocks.dat");
if (!file.exists()) {
throw new ImporterException("Flat file database doesn't exist");
}
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line;
Ownable ownable;
int count = 0;
int skipped = 0;
while ((line = br.readLine()) != null) {
count++;
String[] owningDiv = line.split(":");
String worldName = owningDiv[0];
String[] blockCoordinates = owningDiv[1].split("#");
String playerId = owningDiv[2];
boolean isBlock = (owningDiv[3].equalsIgnoreCase("1"));
User owner = User.getInstance(UUID.fromString(playerId));
int x = Integer.parseInt(blockCoordinates[0]);
int y = Integer.parseInt(blockCoordinates[1]);
int z = Integer.parseInt(blockCoordinates[2]);
if (isBlock) {
ownable = OwnedBlock.newInstance(worldName, x, y, z);
} else {
ItemFrame itemFrame = getItemFrame(worldName, x, y, z);
if (itemFrame == null) {
skipped++;
continue;
} else {
ownable = OwnedEntity.newInstance(itemFrame);
}
}
own(ownable, owner);
count++;
}
System.out.println("Import skipped " + skipped + " of " + count + " entries.");
br.close();
finished();
} catch (IOException e) {
throw new ImporterException(e.getMessage());
}
}
}