Core/src/eu/univento/core/api/player/TeamSpeak.java

210 lines
6.7 KiB
Java

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;
}
}
}