package org.buckit.datasource.flatfile;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.buckit.Config;
public class FileHandler {
private static Map<String, String> filenames = new HashMap<String, String>();
private static boolean loaded = false;
public final static String sep1 = "<-<-->->";
public final static String sep2 = ";";
public final static String sep3 = ",";
public final static String sep1Good = ":";
public static List<String> getLines(String file) {
if (!loaded)
load();
return readFile(new File(filenames.get(file.toLowerCase())));
}
public static boolean addLine(String file, String line) {
if (!loaded)
load();
//SECURITY!!
line = line.replace(sep1Good, "_");
line = line.replace(sep1, sep1Good);
File f = new File(filenames.get(file.toLowerCase()));
List<String> lines = defaultText(file);
lines.addAll(readFile(f));
lines.add(line);
return writeFile(f, lines);
}
public static boolean writeFile(String file, List<String> lines) {
if (!loaded)
load();
for(int i=0; i<lines.size(); i++) {
lines.set(i, lines.get(i).replace(sep1Good, "_").replace(sep1, sep1Good));
}
List<String> newLines = defaultText(file);
newLines.addAll(lines);
File f = new File(filenames.get(file.toLowerCase()));
return writeFile(f, newLines);
}
//read function
//@return error = null;
public static List<String> readFile(File file) {
if (!loaded)
load();
List<String> lines = null;
try {
lines = new ArrayList<String>();
FileInputStream fstream = new FileInputStream(file.getPath());
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) {
if (!strLine.startsWith("#") && !strLine.equals("")) {
lines.add(strLine.replace(sep1Good, sep1));
}
}
in.close();
} catch(Exception e) {
}
return lines;
}
//write function
//@return error = false;
public static boolean writeFile(File file, List<String> lines) {
boolean worked;
try {
BufferedWriter out = new BufferedWriter(new FileWriter(file.getPath()));
for (String line : lines) {
out.write(line);
out.newLine();
}
out.close();
worked = true;
} catch (IOException e) {
worked = false;
}
return worked;
}
private static void load() {
filenames.put("groups", Config.FLATFILE_ACCESSGROUPS_FILE);
filenames.put("accesslevels", Config.FLATFILE_ACCESS_FILE);
filenames.put("kits", Config.FLATFILE_KITS_FILE);
filenames.put("kitslast", Config.FLATFILE_KITS_DELAY_FILE);
filenames.put("reservelist", Config.FLATFILE_RESERVELIST_FILE);
filenames.put("user", Config.FLATFILE_USERS_FILE);
filenames.put("warps", Config.FLATFILE_WARPS_FILE);
filenames.put("whitelist", Config.FLATFILE_WHITELIST_FILE);
Collection<String> keys = filenames.keySet();
for (String k : keys) {
File temp = new File(filenames.get(k));
if (!temp.exists()) {
createFile(k);
}
}
loaded = true;
}
private static void createFile(String k) {
try {
File file = new File(filenames.get(k));
new File(file.getParent()).mkdirs();
file.createNewFile();
FFLog.newFile(file.getPath());
List<String> lines = defaultText(k);
lines.addAll(defaultSetting(k));
writeFile(file, lines);
} catch (IOException e) {
e.printStackTrace();
}
}
private static List<String> defaultText(String k) {
List<String> l = new ArrayList<String>();
l.add("#File: " + (new File(filenames.get(k)).getName()));
l.add("");
if (k.equals("groups")) {
l.add("#USAGE: ID:NAME:COMMANDS");
}
else if (k.equals("accesslevels")) {
l.add("#USAGE: ID:NAME:USERNAMEFORMAT:ACCESSGROUPS:ADMINGROUP:CANBUILD");
}
else if (k.equals("kits")) {
l.add("#USAGE: NAME:IDs:DELAY:ACCESSLEVEL");
}
else if (k.equals("kitslast")) {
l.add("#USAGE: USERID:KITNAME:TIME");
}
else if (k.equals("reservelist")) {
l.add("#USAGE: USERID:USERNAME");
}
else if (k.equals("user")) {
l.add("#USAGE: ID:USERNAME:USERNAMEFORMAT:FIRSTLOGIN:LASTLOGIN:ONLINETIME:BANTIME:MUTETIME:COMMANDS:CANBUILD:ISADMIN:ACCESSLEVELID");
}
else if (k.equals("warps")) {
l.add("#USAGE: ID:NAME:GROUPNAME:WORLD:X:Y:Z:ROTX:ROTY:MINACCESSLEVEL");
}
else if (k.equals("whitelist")) {
l.add("#USAGE: USERID:USERNAME");
}
return l;
}
private static List<String> defaultSetting(String k) {
List<String> l = new ArrayList<String>();
if (k.equals("groups")) {
l.add("0:none_group:/spawn");
l.add("1:default_group:/help,/sethome,/home,/spawn,/me,/msg,/kit,/playerlist,/warp,/motd,/compass");
l.add("2:vip_group:/tp,/tpchere");
l.add("3:mod_group:/ban,/kick,/item,/tp,/tphere,/s,/i,/give");
l.add("4:admin_group:*");
}
else if (k.equals("accesslevels")) {
l.add("0:nieuw:^f{$username}:none_group:false:false");
l.add("1:beunhaas:^8{$username}^f:default_group:false:false");
l.add("2:default:^a{$username}^f:default_group:false:true");
l.add("3:vip:^6{$username}^f:default_group,vip_group:false:true");
l.add("4:mod:^9{$username}^f:default_group,vip_group,mod_group:true:true");
l.add("5:admin:^4{$username}^f:admin_group:true:true");
}
return l;
}
}