package org.buckit.datasource.database;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.buckit.Config;
import org.buckit.datasource.DataSourceManager;
import org.buckit.datasource.type.UserDataSource;
import org.buckit.model.UserDataHolder;
public class DatabaseUserDataSource implements UserDataSource{
private static String SELECT_USER = "SELECT * FROM " + Config.DATABASE_USERS_TABLE + " WHERE username = ?";
private static String INSERT_USER = "INSERT INTO " + Config.DATABASE_USERS_TABLE + " (username,usernameformat,firstlogin,lastlogin) VALUES (?,?,?,?) ";
private static String UPDATE_USER_LASTLOGIN = "UPDATE " + Config.DATABASE_USERS_TABLE + " SET lastlogin = ? WHERE id = ?";
private static String UPDATE_USER_UPTIME = "UPDATE " + Config.DATABASE_USERS_TABLE + " SET onlinetime = ? WHERE id = ?";
private static String UPDATE_USER_BANTIME = "UPDATE " + Config.DATABASE_USERS_TABLE + " SET bantime = ? WHERE id = ?";
private static String UPDATE_USER_MUTETIME = "UPDATE " + Config.DATABASE_USERS_TABLE + " SET mutetime = ? WHERE id = ?";
private static String UPDATE_USER = "UPDATE " + Config.DATABASE_USERS_TABLE + " SET username = ? , usernameformat = ? , firstlogin = ? , lastlogin = ? , onlinetime = ? , ipbantime = ?, bantime = ? , mutetime = ? , commands = ? , canbuild = ? , isadmin = ? , accesslevel = ? , ip = ? WHERE id = ?";
private DataSourceManager datasource;
public DatabaseUserDataSource(DataSourceManager dataSource) {
datasource = dataSource;
}
public DataSourceManager getDataSource(){
return datasource;
}
@Override
public UserDataHolder getUserData(String username) {
username = username.toLowerCase();
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
UserDataHolder rt = null;
try {
conn = DatabaseFactory.getInstance().getConnection();
st = conn.prepareStatement(SELECT_USER);
st.setString(1, username);
rs = st.executeQuery();
if (!rs.next()) {
st.close();
rs.close();
st = conn.prepareStatement(INSERT_USER, Statement.RETURN_GENERATED_KEYS);
st.setString(1, username);
st.setString(2, Config.DEFAULT_USER_FORMAT);
st.setInt(3, currentTime());
st.setInt(4, currentTime());
st.execute();
rs = st.getGeneratedKeys();
if (rs.next()) {
rt = new UserDataHolder(rs.getInt(1), username, Config.DEFAULT_USER_FORMAT, false, false, null, currentTime(), currentTime(), 0, 0, 0, 0, getDataSource().getAccessDataSource().getAccessLevel(Config.DEFAULT_ACCESS_LEVEL),"0.0.0.0");
}
} else {
rt = new UserDataHolder(rs.getInt("id"), username, rs.getString("usernameformat"), rs.getBoolean("isadmin"), rs.getBoolean("canbuild"), rs.getString("commands"), rs.getInt("firstlogin"), currentTime(), rs.getInt("onlinetime"),rs.getInt("ipbantime"), rs.getInt("bantime"), rs.getInt("mutetime"), getDataSource().getAccessDataSource().getAccessLevel(rs.getInt("accesslevel")),rs.getString("ip"));
st.close();
st = conn.prepareStatement(UPDATE_USER_LASTLOGIN);
st.setInt(1, rt.getLastlogin());
st.setInt(2, rt.getId());
st.execute();
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (conn != null)
conn.close();
if (st != null)
st.close();
if (rs != null)
rs.close();
} catch (Exception e) {
}
}
return rt;
}
@Override
public void updateUserDataOnDisconnect(UserDataHolder holder) {
Connection conn = null;
PreparedStatement st = null;
try {
conn = DatabaseFactory.getInstance().getConnection();
st = conn.prepareStatement(UPDATE_USER_UPTIME);
st.setInt(1, holder.getUptime() + (currentTime() - holder.getLastlogin()));
st.setInt(2, holder.getId());
st.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
if (st != null)
st.close();
} catch (Exception e) {
}
}
}
@Override
public boolean updateUserBanTime(UserDataHolder holder) {
Connection conn = null;
PreparedStatement st = null;
try {
conn = DatabaseFactory.getInstance().getConnection();
st = conn.prepareStatement(UPDATE_USER_BANTIME);
st.setInt(1, holder.getBantime());
st.setInt(2, holder.getId());
st.execute();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (conn != null)
conn.close();
if (st != null)
st.close();
} catch (Exception e) {
}
}
return true;
}
@Override
public boolean updateUserMuteTime(UserDataHolder holder) {
Connection conn = null;
PreparedStatement st = null;
try {
conn = DatabaseFactory.getInstance().getConnection();
st = conn.prepareStatement(UPDATE_USER_MUTETIME);
st.setInt(1, holder.getMutetime());
st.setInt(2, holder.getId());
st.execute();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (conn != null)
conn.close();
if (st != null)
st.close();
} catch (Exception e) {
}
}
return true;
}
private static int currentTime() {
return (int) (System.currentTimeMillis() / 1000);
}
@Override
public boolean load() {
return true;
// do nothing
}
@Override
public boolean updateUser(UserDataHolder holder) {
Connection conn = null;
PreparedStatement st = null;
try {
conn = DatabaseFactory.getInstance().getConnection();
st = conn.prepareStatement(UPDATE_USER);
st.setString(1, holder.getUsername());
st.setString(2, holder.getUsernameformat());
st.setInt(3, holder.getFirstlogin());
st.setInt(4, holder.getLastlogin());
st.setInt(5, holder.getUptime());
st.setInt(6, holder.getIpBantime());
st.setInt(7, holder.getBantime());
st.setInt(8, holder.getMutetime());
st.setString(9, holder.getCommands());
st.setBoolean(10, holder.canbuild());
st.setBoolean(11, holder.isAdmin());
st.setInt(12, holder.getAccessLevel().getId());
st.setString(13, holder.getIp());
st.setInt(14, holder.getId());
st.execute();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
if (conn != null)
conn.close();
if (st != null)
st.close();
} catch (Exception e) {
}
}
return true;
}
}