package eu.univento.core.api.player; import com.github.theholywaffle.teamspeak3.TS3Api; import com.github.theholywaffle.teamspeak3.TS3Config; import com.github.theholywaffle.teamspeak3.TS3Query; import com.github.theholywaffle.teamspeak3.api.wrapper.Client; import com.github.theholywaffle.teamspeak3.api.wrapper.ClientInfo; import eu.univento.core.Core; import eu.univento.core.api.Config; import eu.univento.core.api.database.MySQL; import eu.univento.core.api.player.Perms.Ranks; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.UUID; import java.util.logging.Level; /** * basic functions for teamspeak communication * @author joethei * @version 1.0 */ public class TeamSpeak { private TS3Query query; private TS3Api api; int verified = 11; /** * inits class */ public TeamSpeak() { final TS3Config config = new TS3Config(); config.setHost(Config.readString("TS.IP")); config.setQueryPort(Config.readInt("TS.QueryPort")); config.setDebugLevel(Level.OFF); config.setLoginCredentials(Config.readString("TS.QueryUser"), Config.readString("TS.Query.Pass")); final TS3Query query = new TS3Query(config); query.connect(); final TS3Api api = query.getApi(); api.selectVirtualServerById(1); api.setNickname("Rechteverteiler von " + Bukkit.getServerName()); this.api = api; this.query = query; } public void disconnect() { query.exit(); } /** * gets teamspeak api * @return TS3Api */ TS3Api getAPI() { return api; } /** * gets client info for id * @param id database id * @return ClientInfo */ ClientInfo getClientInfo(int id) { return api.getClientInfo(id); } /** * gets database id from teamspeak for player * @param p CustomPlayer * @return Integer * @throws SQLException SQL server not available or throwing error * @throws ClassNotFoundException class couldn't be found */ public int getTsId(CustomPlayer p) throws ClassNotFoundException, SQLException { MySQL sql = Core.returnSQL(); sql.openConnection(); PreparedStatement st = sql.getConnection().prepareStatement("SELECT TS_ID FROM users WHERE ID='" + p.getID() + "'"); ResultSet rs = st.executeQuery(); rs.next(); if (rs.getInt("TS_ID") != 0) { int id = rs.getInt("TS_ID"); sql.closeConnection(); return id; } sql.closeConnection(); return 0; } public String getUUID(int id) throws SQLException, ClassNotFoundException { MySQL sql = Core.returnSQL(); sql.openConnection(); PreparedStatement st = sql.getConnection().prepareStatement("SELECT UUID FROM users WHERE TS_ID='" + id + "';"); ResultSet rs = st.executeQuery(); if(rs.next()) { String uuid = rs.getString("UUID"); sql.closeConnection(); return uuid; } sql.closeConnection(); return null; } /** * writes id of player to database * @param p CustomPlayer * @param id database id * @throws SQLException SQL server not available or throwing error * @throws ClassNotFoundException class couldn't be found */ void setTsId(CustomPlayer p, int id) throws ClassNotFoundException, SQLException { MySQL sql = Core.returnSQL(); sql.openConnection(); PreparedStatement st = sql.getConnection().prepareStatement("UPDATE users SET TS_ID='" + id + "' WHERE UUID='" + p.getUniqueId().toString() + "';"); st.execute(); sql.closeConnection(); } /** * sets rank on teamspeak * @param p CustomPlayer * @throws SQLException SQL server not available or throwing error * @throws ClassNotFoundException class couldn't be found */ private void setRank(CustomPlayer p, Client client) throws ClassNotFoundException, SQLException { //for(ServerGroup groups : api.getServerGroupsByClient(client)) { // api.removeClientFromServerGroup(groups, client); //} api.addClientToServerGroup(getIdForRank(p.getRank()), client.getDatabaseId()); api.addClientToServerGroup(verified, client.getDatabaseId()); api.pokeClient(client.getId(), "Du wurdest von unserem freundlichem Bot verifiziert"); } public void verify(CustomPlayer p) throws SQLException, ClassNotFoundException { TS3Api api = getAPI(); if(hasVerified(p)) { p.sendMessage("§cDu hast bereits einen verknüpften Account"); }else { Client client = api.getClientByNameExact(p.getName(), false); if(client != null) { setRank(p, client); return; } p.sendMessage("§cDu bist gerade nicht im TS online oder dein Nickname entspricht nicht dem IGN"); } } private Client getClient(CustomPlayer p) throws SQLException, ClassNotFoundException { if(hasVerified(p)) { int id = getTsId(p); for (Client client : api.getClients()) { if (client.getDatabaseId() == id) { return client; } return null; } } return null; } private CustomPlayer getPlayer(Client client) throws SQLException, ClassNotFoundException { Player player = Bukkit.getPlayer(UUID.fromString(getUUID(client.getDatabaseId()))); return CustomPlayer.getPlayer(player); } public void checkVerifiyed(CustomPlayer p) throws SQLException, ClassNotFoundException { if(hasVerified(p)) { Client client = getClient(p); if(client != null) { //for(ServerGroup group : api.getServerGroupsByClient(client)) { // if(group.getId() == getIdForRank(p.getRank())) { // return; // } // setRank(p, client); //} } } } public boolean hasVerified(CustomPlayer p) throws SQLException, ClassNotFoundException { return getTsId(p) != 0; } /** * gets group id for rank * @param r Ranks * @return Integer */ public int getIdForRank(Ranks r) { switch(r) { case Admin: return 10; case Developer: return 13; case SrModerator: return 60; case Moderator: return 12; case HeadBuilder: return 19; case Builder: return 20; case Supporter: return 14; case Youtuber: return 21; case Premium: return 22; case Player: return 8; default: return 0; } } }