package org.buckit.datasource.flatfile;
import java.util.List;
import org.buckit.Config;
import org.buckit.access.AccessLevel;
import org.buckit.datasource.DataSourceManager;
import org.buckit.datasource.type.UserDataSource;
import org.buckit.model.UserDataHolder;
public class FlatFileUserDataSource implements UserDataSource{
private DataSourceManager datasource;
private int lastId=0;
public FlatFileUserDataSource(DataSourceManager dataSource) {
datasource = dataSource;
}
public DataSourceManager getDataSource(){
return datasource;
}
@Override
public boolean load() {
List<String> lines = FileHandler.getLines("user");
LineReader r;
int id;
for (int i=0; i<lines.size(); i++) {
r = new LineReader(lines.get(i));
id = r.nextInt();
if (id > lastId)
lastId = id;
}
FFLog.newFound("Userdata", lines.size());
return true;
}
@Override
public UserDataHolder getUserData(String username) {
username = username.toLowerCase();
boolean exists = false;
UserDataHolder user = null;
List<String> lines = FileHandler.getLines("user");
LineReader r;
int id, firstlogin, uptime, ipbantime, bantime, mutetime, aLevel;
String name, format, commands, ip;
Boolean canbuild,isadmin;
AccessLevel level;
for (int i=0; i<lines.size(); i++) {
r = new LineReader(lines.get(i));
id = r.nextInt();
name = r.nextStr();
format = r.nextStr();
firstlogin = r.nextInt();
r.skip();
uptime = r.nextInt();
ipbantime = r.nextInt();
bantime = r.nextInt();
mutetime = r.nextInt();
commands = r.nextStr();
canbuild = r.nextBool();
isadmin = r.nextBool();
aLevel = r.nextInt();
level = getDataSource().getAccessDataSource().getAccessLevel(aLevel);
ip = r.nextStr();
if (username.equals(name)) {
user = new UserDataHolder(id, username, format, isadmin, canbuild, commands, firstlogin, currentTime(), uptime, ipbantime, bantime, mutetime, level,ip);
exists = true;
break;
}
}
if (!exists) {
user = new UserDataHolder((lastId+1), username.toLowerCase(), Config.DEFAULT_USER_FORMAT, false, false, "", currentTime(), currentTime(), 0, 0, 0, 0, getDataSource().getAccessDataSource().getAccessLevel(Config.DEFAULT_ACCESS_LEVEL),"0.0.0.0");
lastId++;
lines.add(user.getId()+FileHandler.sep1+
user.getUsername().toLowerCase()+FileHandler.sep1+
user.getUsernameformat()+FileHandler.sep1+
user.getFirstlogin()+FileHandler.sep1+
user.getLastlogin()+FileHandler.sep1+
user.getUptime()+FileHandler.sep1+
user.getIpBantime()+FileHandler.sep1+
user.getBantime()+FileHandler.sep1+
user.getMutetime()+FileHandler.sep1+
user.getCommands()+FileHandler.sep1+
user.canbuild()+FileHandler.sep1+
user.isAdmin()+FileHandler.sep1+
Config.DEFAULT_ACCESS_LEVEL+FileHandler.sep1+
user.getIp());
FFLog.newEdit("Userdata", "new user '"+username+"' with id "+user.getId());
FileHandler.writeFile("user", lines);
}
return user;
}
@Override
public boolean updateUser(UserDataHolder holder) {
List<String> lines = FileHandler.getLines("user");
LineReader r;
int id;
for (int i=0; i<lines.size(); i++) {
r = new LineReader(lines.get(i));
id = r.nextInt();
if (holder.getId() == id) {
lines.set(i, holder.getId()+FileHandler.sep1+
holder.getUsername().toLowerCase()+FileHandler.sep1+
holder.getUsernameformat()+FileHandler.sep1+
holder.getFirstlogin()+FileHandler.sep1+
holder.getLastlogin()+FileHandler.sep1+
holder.getUptime()+FileHandler.sep1+
holder.getIpBantime()+FileHandler.sep1+
holder.getBantime()+FileHandler.sep1+
holder.getMutetime()+FileHandler.sep1+
holder.getCommands()+FileHandler.sep1+
holder.canbuild()+FileHandler.sep1+
holder.isAdmin()+FileHandler.sep1+
holder.getAccessLevel().getId()+FileHandler.sep1+
holder.getIp());
break;
}
}
FFLog.newEdit("Userdata", "update user '"+holder.getUsername()+"'");
return FileHandler.writeFile("user", lines);
}
@Override
public boolean updateUserBanTime(UserDataHolder holder) {
return updateUser(holder);
}
@Override
public void updateUserDataOnDisconnect(UserDataHolder holder) {
holder.setUptime(holder.getUptime() + (currentTime() - holder.getLastlogin()));
updateUser(holder);
}
@Override
public boolean updateUserMuteTime(UserDataHolder holder) {
return updateUser(holder);
}
private static int currentTime() {
return (int) (System.currentTimeMillis() / 1000);
}
}