Advertisement
Guest User

Untitled

a guest
Dec 21st, 2016
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.78 KB | None | 0 0
  1. MAIN KLASSE:
  2.  
  3. package de.crafterworld.nick;
  4.  
  5. import org.bukkit.plugin.java.*;
  6. import net.milkbowl.vault.chat.*;
  7. import java.io.*;
  8. import java.util.*;
  9. import org.bukkit.configuration.file.*;
  10. import de.crafterworld.nick.command.*;
  11. import org.bukkit.command.*;
  12. import org.bukkit.event.*;
  13. import de.crafterworld.nick.listener.*;
  14. import org.bukkit.plugin.*;
  15. import org.bukkit.*;
  16. import org.bukkit.entity.*;
  17. import de.crafterworld.nick.util.*;
  18. import java.util.concurrent.*;
  19. import java.sql.*;
  20.  
  21. public class NickAPI extends JavaPlugin
  22. {
  23. private final ExecutorService executorService;
  24. private static NickAPI instance;
  25. private Chat chat;
  26. private AsyncMySQL mySQL;
  27. private File file;
  28. private FileConfiguration yamlConfiguration;
  29. private Map<String, String> nicked;
  30.  
  31. public NickAPI() {
  32. this.executorService = Executors.newCachedThreadPool();
  33. this.file = new File(this.getDataFolder(), "config.yml");
  34. this.nicked = new HashMap<String, String>();
  35. }
  36.  
  37. public void onEnable() {
  38. NickAPI.instance = this;
  39. if (!this.file.exists()) {
  40. this.saveResource("config.yml", false);
  41. }
  42. this.yamlConfiguration = (FileConfiguration)YamlConfiguration.loadConfiguration(this.file);
  43. (this.mySQL = new AsyncMySQL((Plugin)this, this.ms("host"), this.mi("port"), this.ms("user"), this.ms("password"), this.ms("database"))).update("CREATE TABLE IF NOT EXISTS `nick_nicks` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `nick` varchar(64) NOT NULL DEFAULT '', `used_by` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;");
  44. this.getCommand("nick").setExecutor((CommandExecutor)new CommandNick(this));
  45. final PluginManager pm = Bukkit.getPluginManager();
  46. pm.registerEvents((Listener)new ListenerAsyncPlayerChat(this), (Plugin)this);
  47. pm.registerEvents((Listener)new ListenerPlayerJoin(this), (Plugin)this);
  48. pm.registerEvents((Listener)new ListenerPlayerLogin(this), (Plugin)this);
  49. pm.registerEvents((Listener)new ListenerPlayerQuit(this), (Plugin)this);
  50. if (Bukkit.getPluginManager().getPlugin("Vault") != null) {
  51. final RegisteredServiceProvider<Chat> chatProvider = (RegisteredServiceProvider<Chat>)this.getServer().getServicesManager().getRegistration((Class)Chat.class);
  52. if (chatProvider != null) {
  53. this.chat = (Chat)chatProvider.getProvider();
  54. }
  55. }
  56. }
  57.  
  58. public void onDisable() {
  59. super.onDisable();
  60. }
  61.  
  62. public static NickAPI getInstance() {
  63. return NickAPI.instance;
  64. }
  65.  
  66. public AsyncMySQL getMySQL() {
  67. return this.mySQL;
  68. }
  69.  
  70. public Chat getChat() {
  71. return this.chat;
  72. }
  73.  
  74. public FileConfiguration getConfiguration() {
  75. return this.yamlConfiguration;
  76. }
  77.  
  78. public Map<String, String> getNicked() {
  79. return this.nicked;
  80. }
  81.  
  82. private String ms(final String string) {
  83. return this.yamlConfiguration.getString("mysql." + string);
  84. }
  85.  
  86. private int mi(final String string) {
  87. return this.yamlConfiguration.getInt("mysql." + string);
  88. }
  89.  
  90. public String getMessage(final String path) {
  91. return ChatColor.translateAlternateColorCodes('&', this.yamlConfiguration.getString("messages." + path));
  92. }
  93.  
  94. public void nick(final Player player) {
  95. if (this.nicked.containsKey(player.getName())) {
  96. this.nick(player, this.nicked.get(player.getName()));
  97. player.sendMessage(this.getMessage("name").replace("{nick}", this.nicked.get(player)));
  98. return;
  99. }
  100. final PreparedStatement statement = this.mySQL.prepare("SELECT nick FROM nick_nicks WHERE used_by IS NULL ORDER BY RAND() LIMIT 1");
  101. String nickname;
  102. this.mySQL.query(statement, resultSet -> {
  103. try {
  104. if (resultSet.next()) {
  105. nickname = resultSet.getString(1);
  106. this.nick(player, nickname);
  107. player.sendMessage(this.getMessage("nick").replace("{nick}", nickname));
  108. }
  109. else {
  110. player.sendMessage(this.getMessage("noNicksAvailable"));
  111. }
  112. }
  113. catch (SQLException exc) {
  114. exc.printStackTrace();
  115. }
  116. });
  117. }
  118.  
  119. private void nick(final Player player, final String nickname) {
  120. final PreparedStatement statement = this.mySQL.prepare("UPDATE nick_nicks SET used_by = ? WHERE nick = ?");
  121. try {
  122. statement.setString(1, player.getUniqueId().toString());
  123. statement.setString(2, nickname);
  124. }
  125. catch (SQLException exc) {
  126. exc.printStackTrace();
  127. }
  128. this.mySQL.update(statement);
  129. this.nicked.put(player.getName(), nickname);
  130. Util.nick(player, nickname);
  131. }
  132.  
  133. public void unnick(final Player player) {
  134. final PreparedStatement statement = this.mySQL.prepare("UPDATE nick_nicks SET used_by = NULL WHERE nick = ?");
  135. try {
  136. statement.setString(1, this.nicked.get(player.getName()));
  137. }
  138. catch (SQLException exc) {
  139. exc.printStackTrace();
  140. }
  141. this.mySQL.update(statement);
  142. this.nicked.remove(player.getName());
  143. Util.nick(player, player.getName());
  144. player.sendMessage(this.getMessage("unnick"));
  145. }
  146.  
  147. public boolean isNickedSync(final Player player) {
  148. return this.nicked.containsKey(player.getName());
  149. }
  150.  
  151. public Future<Boolean> isNicked(final Player player) {
  152. final PreparedStatement statement;
  153. ResultSet resultSet;
  154. return this.executorService.submit(() -> {
  155. statement = this.mySQL.prepare("SELECT nick FROM nick_nicks WHERE used_by = ?");
  156. try {
  157. statement.setString(1, player.getUniqueId().toString());
  158. resultSet = this.mySQL.getMySQL().query(statement);
  159. if (resultSet.next()) {
  160. this.nicked.put(player.getName(), resultSet.getString(1));
  161. return true;
  162. }
  163. }
  164. catch (SQLException exc) {
  165. exc.printStackTrace();
  166. }
  167. return false;
  168. });
  169. }
  170. }
  171.  
  172. -------------------------------------------------------------------------------------------------------------------------------
  173. NICK COMMAND:
  174.  
  175. package de.crafterworld.nick.command;
  176.  
  177. import de.crafterworld.nick.*;
  178. import org.bukkit.command.*;
  179. import org.bukkit.entity.*;
  180.  
  181. public class CommandNick implements CommandExecutor
  182. {
  183. private NickAPI plugin;
  184.  
  185. public CommandNick(final NickAPI plugin) {
  186. this.plugin = plugin;
  187. }
  188.  
  189. public boolean onCommand(final CommandSender commandSender, final Command command, final String label, final String[] args) {
  190. if (!(commandSender instanceof Player)) {
  191. commandSender.sendMessage(this.plugin.getMessage("playerOnly"));
  192. return true;
  193. }
  194. final Player player = (Player)commandSender;
  195. player.sendMessage("DEBUG only nick");
  196. this.plugin.nick(player);
  197. return true;
  198. }
  199. }
  200. -------------------------------------------------------------------------------------------------------------------------------------
  201. ASyncChat Event:
  202.  
  203. package de.crafterworld.nick.listener;
  204.  
  205. import de.crafterworld.nick.*;
  206. import org.bukkit.event.player.*;
  207. import net.md_5.bungee.api.*;
  208. import org.bukkit.entity.*;
  209. import org.bukkit.event.*;
  210.  
  211. public class ListenerAsyncPlayerChat implements Listener
  212. {
  213. private NickAPI plugin;
  214.  
  215. public ListenerAsyncPlayerChat(final NickAPI plugin) {
  216. this.plugin = plugin;
  217. }
  218.  
  219. @EventHandler(priority = EventPriority.HIGHEST)
  220. public void event(final AsyncPlayerChatEvent event) {
  221. final Player player = event.getPlayer();
  222. String prefix = "§a";
  223. String name = player.getName();
  224. if (this.plugin.getChat() != null && this.plugin.getNicked().get(name) == null) {
  225. prefix = ChatColor.translateAlternateColorCodes('&', this.plugin.getChat().getPlayerPrefix(player)) + " ";
  226. }
  227. if (this.plugin.getNicked().containsKey(player.getName())) {
  228. name = this.plugin.getNicked().get(player.getName());
  229. }
  230. event.setFormat(prefix + name + "§7: §f" + event.getMessage());
  231. }
  232. }
  233.  
  234. -------------------------------------------------------------------------------------------------------------------------
  235. Join:
  236.  
  237.  
  238. import de.crafterworld.nick.*;
  239. import org.bukkit.event.player.*;
  240. import org.bukkit.*;
  241. import org.bukkit.entity.*;
  242. import java.util.concurrent.*;
  243. import org.bukkit.event.*;
  244.  
  245. public class ListenerPlayerJoin implements Listener
  246. {
  247. private NickAPI plugin;
  248.  
  249. public ListenerPlayerJoin(final NickAPI plugin) {
  250. this.plugin = plugin;
  251. }
  252.  
  253. @EventHandler(priority = EventPriority.HIGHEST)
  254. public void event(final PlayerJoinEvent event) throws ExecutionException, InterruptedException {
  255. final Player player = event.getPlayer();
  256. event.setJoinMessage((String)null);
  257. if (this.plugin.getConfiguration().getBoolean("modifyEvents.join")) {
  258. String name = player.getName();
  259. if (this.plugin.getNicked().get(name) != null) {
  260. name = this.plugin.getNicked().get(name);
  261. player.sendMessage(this.plugin.getMessage("name").replace("{nick}", name));
  262. }
  263. else {
  264. player.sendMessage("Nicht genickt? :c");
  265. }
  266. Bukkit.broadcastMessage(this.plugin.getMessage("join").replace("{player}", name));
  267. }
  268. }
  269. }
  270. --------------------------------------------------------------------------------------------------------
  271. Login:
  272.  
  273.  
  274. import de.crafterworld.nick.*;
  275. import org.bukkit.event.player.*;
  276. import org.bukkit.*;
  277. import org.bukkit.entity.*;
  278. import java.util.*;
  279. import java.util.concurrent.*;
  280. import org.bukkit.event.*;
  281.  
  282. public class ListenerPlayerLogin implements Listener
  283. {
  284. private NickAPI plugin;
  285.  
  286. public ListenerPlayerLogin(final NickAPI plugin) {
  287. this.plugin = plugin;
  288. }
  289.  
  290. @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
  291. public void event(final PlayerLoginEvent event) throws ExecutionException, InterruptedException {
  292. final Player player = event.getPlayer();
  293. if (this.plugin.isNicked(player).get()) {
  294. this.plugin.nick(player);
  295. }
  296. for (final String nicked : this.plugin.getNicked().keySet()) {
  297. if (Bukkit.getPlayer(nicked) != null && Bukkit.getPlayer(nicked).equals(player)) {
  298. return;
  299. }
  300. this.plugin.nick(Bukkit.getPlayer(nicked));
  301. }
  302. }
  303. }
  304.  
  305. --------------------------------------------------------------------------------------------------------------------------------------
  306. Kwit:
  307.  
  308. package de.crafterworld.nick.listener;
  309.  
  310. import de.crafterworld.nick.*;
  311. import org.bukkit.event.player.*;
  312. import org.bukkit.*;
  313. import org.bukkit.entity.*;
  314. import java.util.concurrent.*;
  315. import org.bukkit.event.*;
  316.  
  317. public class ListenerPlayerQuit implements Listener
  318. {
  319. private NickAPI plugin;
  320.  
  321. public ListenerPlayerQuit(final NickAPI plugin) {
  322. this.plugin = plugin;
  323. }
  324.  
  325. @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
  326. public void event(final PlayerQuitEvent event) throws ExecutionException, InterruptedException {
  327. final Player player = event.getPlayer();
  328. event.setQuitMessage((String)null);
  329. if (this.plugin.getConfiguration().getBoolean("modifyEvents.quit")) {
  330. String name = player.getName();
  331. if (this.plugin.isNickedSync(player)) {
  332. name = this.plugin.getNicked().get(name);
  333. }
  334. Bukkit.broadcastMessage(this.plugin.getMessage("quit").replace("{player}", name));
  335. }
  336. }
  337. }
  338. ---------------------------------------------------------------------------------------------------------------------------------
  339. ASynchMYSQL:
  340.  
  341.  
  342. import org.bukkit.plugin.*;
  343. import java.util.concurrent.*;
  344. import java.util.function.*;
  345. import org.bukkit.*;
  346. import java.sql.*;
  347.  
  348. public class AsyncMySQL
  349. {
  350. private ExecutorService executor;
  351. private Plugin plugin;
  352. private MySQL sql;
  353.  
  354. public AsyncMySQL(final Plugin owner, final String host, final int port, final String user, final String password, final String database) {
  355. try {
  356. this.sql = new MySQL(host, port, user, password, database);
  357. this.executor = Executors.newCachedThreadPool();
  358. this.plugin = owner;
  359. }
  360. catch (Exception e) {
  361. e.printStackTrace();
  362. }
  363. }
  364.  
  365. public void update(final PreparedStatement statement) {
  366. this.executor.execute(() -> this.sql.queryUpdate(statement));
  367. }
  368.  
  369. public void update(final String statement) {
  370. this.executor.execute(() -> this.sql.queryUpdate(statement));
  371. }
  372.  
  373. public void query(final PreparedStatement statement, final Consumer<ResultSet> consumer) {
  374. final ResultSet result;
  375. this.executor.execute(() -> {
  376. result = this.sql.query(statement);
  377. Bukkit.getScheduler().runTask(this.plugin, () -> consumer.accept(result));
  378. });
  379. }
  380.  
  381. public void query(final String statement, final Consumer<ResultSet> consumer) {
  382. final ResultSet result;
  383. this.executor.execute(() -> {
  384. result = this.sql.query(statement);
  385. Bukkit.getScheduler().runTask(this.plugin, () -> consumer.accept(result));
  386. });
  387. }
  388.  
  389. public PreparedStatement prepare(final String query) {
  390. try {
  391. return this.sql.getConnection().prepareStatement(query);
  392. }
  393. catch (Exception e) {
  394. e.printStackTrace();
  395. return null;
  396. }
  397. }
  398.  
  399. public MySQL getMySQL() {
  400. return this.sql;
  401. }
  402.  
  403. public static class MySQL
  404. {
  405. private String host;
  406. private String user;
  407. private String password;
  408. private String database;
  409. private int port;
  410. private Connection conn;
  411.  
  412. public MySQL(final String host, final int port, final String user, final String password, final String database) throws Exception {
  413. this.host = host;
  414. this.port = port;
  415. this.user = user;
  416. this.password = password;
  417. this.database = database;
  418. this.openConnection();
  419. }
  420.  
  421. public void queryUpdate(final String query) {
  422. this.checkConnection();
  423. try (final PreparedStatement statement = this.conn.prepareStatement(query)) {
  424. this.queryUpdate(statement);
  425. }
  426. catch (Exception e) {
  427. e.printStackTrace();
  428. }
  429. }
  430.  
  431. public void queryUpdate(final PreparedStatement statement) {
  432. this.checkConnection();
  433. try {
  434. statement.executeUpdate();
  435. }
  436. catch (Exception e) {
  437. e.printStackTrace();
  438. try {
  439. statement.close();
  440. }
  441. catch (Exception e) {
  442. e.printStackTrace();
  443. }
  444. }
  445. finally {
  446. try {
  447. statement.close();
  448. }
  449. catch (Exception e2) {
  450. e2.printStackTrace();
  451. }
  452. }
  453. }
  454.  
  455. public ResultSet query(final String query) {
  456. this.checkConnection();
  457. try {
  458. return this.query(this.conn.prepareStatement(query));
  459. }
  460. catch (Exception e) {
  461. e.printStackTrace();
  462. return null;
  463. }
  464. }
  465.  
  466. public ResultSet query(final PreparedStatement statement) {
  467. this.checkConnection();
  468. try {
  469. return statement.executeQuery();
  470. }
  471. catch (Exception e) {
  472. e.printStackTrace();
  473. return null;
  474. }
  475. }
  476.  
  477. public Connection getConnection() {
  478. return this.conn;
  479. }
  480.  
  481. private void checkConnection() {
  482. try {
  483. if (this.conn == null || !this.conn.isValid(10) || this.conn.isClosed()) {
  484. this.openConnection();
  485. }
  486. }
  487. catch (Exception e) {
  488. e.printStackTrace();
  489. }
  490. }
  491.  
  492. public Connection openConnection() throws Exception {
  493. Class.forName("com.mysql.jdbc.Driver");
  494. return this.conn = DriverManager.getConnection("jdbc:mysql://" + this.host + ":" + this.port + "/" + this.database, this.user, this.password);
  495. }
  496.  
  497. public void closeConnection() {
  498. try {
  499. this.conn.close();
  500. }
  501. catch (SQLException e) {
  502. e.printStackTrace();
  503. }
  504. finally {
  505. this.conn = null;
  506. }
  507. }
  508. }
  509. }
  510. ------------------------------------------------------------------------------------------------------------------------------------
  511. GameProfil:
  512.  
  513.  
  514. import com.mojang.authlib.*;
  515. import com.mojang.util.*;
  516. import java.net.*;
  517. import java.io.*;
  518. import org.yaml.snakeyaml.external.biz.base64Coder.*;
  519. import java.lang.reflect.*;
  520. import com.mojang.authlib.properties.*;
  521. import java.util.*;
  522. import com.google.gson.*;
  523.  
  524. public class GameProfileBuilder
  525. {
  526. private static final String SERVICE_URL = "https://sessionserver.mojang.com/session/minecraft/profile/%s?unsigned=false";
  527. private static final String JSON_SKIN = "{\"timestamp\":%d,\"profileId\":\"%s\",\"profileName\":\"%s\",\"isPublic\":true,\"textures\":{\"SKIN\":{\"url\":\"%s\"}}}";
  528. private static final String JSON_CAPE = "{\"timestamp\":%d,\"profileId\":\"%s\",\"profileName\":\"%s\",\"isPublic\":true,\"textures\":{\"SKIN\":{\"url\":\"%s\"},\"CAPE\":{\"url\":\"%s\"}}}";
  529. private static Gson gson;
  530. private static HashMap<UUID, CachedProfile> cache;
  531. private static long cacheTime;
  532.  
  533. public static GameProfile fetch(final UUID uuid) throws IOException {
  534. return fetch(uuid, false);
  535. }
  536.  
  537. public static GameProfile fetch(final UUID uuid, final boolean forceNew) throws IOException {
  538. if (!forceNew && GameProfileBuilder.cache.containsKey(uuid) && GameProfileBuilder.cache.get(uuid).isValid()) {
  539. return GameProfileBuilder.cache.get(uuid).profile;
  540. }
  541. final HttpURLConnection connection = (HttpURLConnection)new URL(String.format("https://sessionserver.mojang.com/session/minecraft/profile/%s?unsigned=false", UUIDTypeAdapter.fromUUID(uuid))).openConnection();
  542. connection.setReadTimeout(5000);
  543. if (connection.getResponseCode() == 200) {
  544. final String json = new BufferedReader(new InputStreamReader(connection.getInputStream())).readLine();
  545. final GameProfile result = (GameProfile)GameProfileBuilder.gson.fromJson(json, (Class)GameProfile.class);
  546. GameProfileBuilder.cache.put(uuid, new CachedProfile(result));
  547. return result;
  548. }
  549. if (!forceNew && GameProfileBuilder.cache.containsKey(uuid)) {
  550. return GameProfileBuilder.cache.get(uuid).profile;
  551. }
  552. final JsonObject error = (JsonObject)new JsonParser().parse(new BufferedReader(new InputStreamReader(connection.getErrorStream())).readLine());
  553. throw new IOException(error.get("error").getAsString() + ": " + error.get("errorMessage").getAsString());
  554. }
  555.  
  556. public static GameProfile getProfile(final UUID uuid, final String name, final String skin) {
  557. return getProfile(uuid, name, skin, null);
  558. }
  559.  
  560. public static GameProfile getProfile(final UUID uuid, final String name, final String skinUrl, final String capeUrl) {
  561. final GameProfile profile = new GameProfile(uuid, name);
  562. final boolean cape = capeUrl != null && !capeUrl.isEmpty();
  563. final List<Object> args = new ArrayList<Object>();
  564. args.add(System.currentTimeMillis());
  565. args.add(UUIDTypeAdapter.fromUUID(uuid));
  566. args.add(name);
  567. args.add(skinUrl);
  568. if (cape) {
  569. args.add(capeUrl);
  570. }
  571. profile.getProperties().put((Object)"textures", (Object)new Property("textures", Base64Coder.encodeString(String.format(cape ? GameProfileBuilder.JSON_CAPE : GameProfileBuilder.JSON_SKIN, args.toArray(new Object[args.size()])))));
  572. return profile;
  573. }
  574.  
  575. public static void setCacheTime(final long time) {
  576. GameProfileBuilder.cacheTime = time;
  577. }
  578.  
  579. static {
  580. GameProfileBuilder.gson = new GsonBuilder().disableHtmlEscaping().registerTypeAdapter((Type)UUID.class, (Object)new UUIDTypeAdapter()).registerTypeAdapter((Type)GameProfile.class, (Object)new GameProfileSerializer()).registerTypeAdapter((Type)PropertyMap.class, (Object)new PropertyMap.Serializer()).create();
  581. GameProfileBuilder.cache = new HashMap<UUID, CachedProfile>();
  582. GameProfileBuilder.cacheTime = -1L;
  583. }
  584.  
  585. private static class GameProfileSerializer implements JsonSerializer<GameProfile>, JsonDeserializer<GameProfile>
  586. {
  587. public GameProfile deserialize(final JsonElement json, final Type type, final JsonDeserializationContext context) throws JsonParseException {
  588. final JsonObject object = (JsonObject)json;
  589. final UUID id = object.has("id") ? ((UUID)context.deserialize(object.get("id"), (Type)UUID.class)) : null;
  590. final String name = object.has("name") ? object.getAsJsonPrimitive("name").getAsString() : null;
  591. final GameProfile profile = new GameProfile(id, name);
  592. if (object.has("properties")) {
  593. for (final Map.Entry<String, Property> prop : ((PropertyMap)context.deserialize(object.get("properties"), (Type)PropertyMap.class)).entries()) {
  594. profile.getProperties().put((Object)prop.getKey(), (Object)prop.getValue());
  595. }
  596. }
  597. return profile;
  598. }
  599.  
  600. public JsonElement serialize(final GameProfile profile, final Type type, final JsonSerializationContext context) {
  601. final JsonObject result = new JsonObject();
  602. if (profile.getId() != null) {
  603. result.add("id", context.serialize((Object)profile.getId()));
  604. }
  605. if (profile.getName() != null) {
  606. result.addProperty("name", profile.getName());
  607. }
  608. if (!profile.getProperties().isEmpty()) {
  609. result.add("properties", context.serialize((Object)profile.getProperties()));
  610. }
  611. return (JsonElement)result;
  612. }
  613. }
  614.  
  615. private static class CachedProfile
  616. {
  617. private long timestamp;
  618. private GameProfile profile;
  619.  
  620. public CachedProfile(final GameProfile profile) {
  621. this.timestamp = System.currentTimeMillis();
  622. this.profile = profile;
  623. }
  624.  
  625. public boolean isValid() {
  626. return GameProfileBuilder.cacheTime < 0L || System.currentTimeMillis() - this.timestamp < GameProfileBuilder.cacheTime;
  627. }
  628. }
  629. }
  630.  
  631. ------------------------------------------------------------------------------------------------------------------------------------
  632. UUIDFetcher:
  633.  
  634.  
  635. import java.util.function.*;
  636. import java.net.*;
  637. import java.io.*;
  638. import com.mojang.util.*;
  639. import com.google.gson.*;
  640. import java.lang.reflect.*;
  641. import java.util.*;
  642. import java.util.concurrent.*;
  643.  
  644. public class UUIDFetcher
  645. {
  646. public static final long FEBRUARY_2015 = 1422748800000L;
  647. private static Gson gson;
  648. private static final String UUID_URL = "https://api.mojang.com/users/profiles/minecraft/%s?at=%d";
  649. private static final String NAME_URL = "https://api.mojang.com/user/profiles/%s/names";
  650. private static Map<String, UUID> uuidCache;
  651. private static Map<UUID, String> nameCache;
  652. private static ExecutorService pool;
  653. private String name;
  654. private UUID id;
  655.  
  656. public static void getUUID(final String name, final Consumer<UUID> action) {
  657. UUIDFetcher.pool.execute(() -> action.accept(getUUID(name)));
  658. }
  659.  
  660. public static UUID getUUID(final String name) {
  661. return getUUIDAt(name, System.currentTimeMillis());
  662. }
  663.  
  664. public static void getUUIDAt(final String name, final long timestamp, final Consumer<UUID> action) {
  665. UUIDFetcher.pool.execute(() -> action.accept(getUUIDAt(name, timestamp)));
  666. }
  667.  
  668. public static UUID getUUIDAt(String name, final long timestamp) {
  669. name = name.toLowerCase();
  670. if (UUIDFetcher.uuidCache.containsKey(name)) {
  671. return UUIDFetcher.uuidCache.get(name);
  672. }
  673. try {
  674. final HttpURLConnection connection = (HttpURLConnection)new URL(String.format("https://api.mojang.com/users/profiles/minecraft/%s?at=%d", name, timestamp / 1000L)).openConnection();
  675. connection.setReadTimeout(5000);
  676. final UUIDFetcher data = (UUIDFetcher)UUIDFetcher.gson.fromJson((Reader)new BufferedReader(new InputStreamReader(connection.getInputStream())), (Class)UUIDFetcher.class);
  677. UUIDFetcher.uuidCache.put(name, data.id);
  678. UUIDFetcher.nameCache.put(data.id, data.name);
  679. return data.id;
  680. }
  681. catch (Exception e) {
  682. e.printStackTrace();
  683. return null;
  684. }
  685. }
  686.  
  687. public static void getName(final UUID uuid, final Consumer<String> action) {
  688. UUIDFetcher.pool.execute(() -> action.accept(getName(uuid)));
  689. }
  690.  
  691. public static String getName(final UUID uuid) {
  692. if (UUIDFetcher.nameCache.containsKey(uuid)) {
  693. return UUIDFetcher.nameCache.get(uuid);
  694. }
  695. try {
  696. final HttpURLConnection connection = (HttpURLConnection)new URL(String.format("https://api.mojang.com/user/profiles/%s/names", UUIDTypeAdapter.fromUUID(uuid))).openConnection();
  697. connection.setReadTimeout(5000);
  698. final UUIDFetcher[] nameHistory = (UUIDFetcher[])UUIDFetcher.gson.fromJson((Reader)new BufferedReader(new InputStreamReader(connection.getInputStream())), (Class)UUIDFetcher[].class);
  699. final UUIDFetcher currentNameData = nameHistory[nameHistory.length - 1];
  700. UUIDFetcher.uuidCache.put(currentNameData.name.toLowerCase(), uuid);
  701. UUIDFetcher.nameCache.put(uuid, currentNameData.name);
  702. return currentNameData.name;
  703. }
  704. catch (Exception e) {
  705. e.printStackTrace();
  706. return null;
  707. }
  708. }
  709.  
  710. static {
  711. UUIDFetcher.gson = new GsonBuilder().registerTypeAdapter((Type)UUID.class, (Object)new UUIDTypeAdapter()).create();
  712. UUIDFetcher.uuidCache = new HashMap<String, UUID>();
  713. UUIDFetcher.nameCache = new HashMap<UUID, String>();
  714. UUIDFetcher.pool = Executors.newCachedThreadPool();
  715. }
  716. }
  717.  
  718. -----------------------------------------------------------------------------------------------------------------------------------
  719. Util:
  720.  
  721.  
  722. import org.bukkit.entity.*;
  723. import org.bukkit.craftbukkit.v1_8_R3.entity.*;
  724. import org.bukkit.craftbukkit.v1_8_R3.util.*;
  725. import org.bukkit.*;
  726. import java.util.function.*;
  727. import java.util.stream.*;
  728. import com.mojang.authlib.*;
  729. import net.minecraft.server.v1_8_R3.*;
  730. import java.util.*;
  731. import java.lang.reflect.*;
  732. import java.util.concurrent.*;
  733.  
  734. public class Util
  735. {
  736. private static ExecutorService pool;
  737. private static Field modifiers;
  738. private static Field actionField;
  739. private static Field dataField;
  740. private static Field nameField;
  741. private static Field uuidField;
  742.  
  743. public static void nick(final Player player, final String name) {
  744. Util.pool.execute(new Runnable() {
  745. @Override
  746. public void run() {
  747. try {
  748. final GameProfile prof = GameProfileBuilder.fetch(UUIDFetcher.getUUID(ChatColor.stripColor(name)));
  749. Util.nameField.set(prof, name);
  750. Util.uuidField.set(prof, player.getUniqueId());
  751. final EntityPlayer entity = ((CraftPlayer)player).getHandle();
  752. final PacketPlayOutEntityDestroy despawn = new PacketPlayOutEntityDestroy(new int[] { entity.getId() });
  753. final PacketPlayOutPlayerInfo x0;
  754. final PacketPlayOutPlayerInfo removeProfile = x0 = new PacketPlayOutPlayerInfo();
  755. final PacketPlayOutPlayerInfo.EnumPlayerInfoAction remove_PLAYER = PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER;
  756. final PacketPlayOutPlayerInfo.PlayerInfoData[] x2 = { null };
  757. final int n = 0;
  758. final PacketPlayOutPlayerInfo packetPlayOutPlayerInfo = removeProfile;
  759. packetPlayOutPlayerInfo.getClass();
  760. x2[n] = new PacketPlayOutPlayerInfo.PlayerInfoData(packetPlayOutPlayerInfo, entity.getProfile(), -1, (WorldSettings.EnumGamemode)null, (IChatBaseComponent)null);
  761. setInfo(x0, remove_PLAYER, x2);
  762. final PacketPlayOutPlayerInfo x3;
  763. final PacketPlayOutPlayerInfo info = x3 = new PacketPlayOutPlayerInfo();
  764. final PacketPlayOutPlayerInfo.EnumPlayerInfoAction add_PLAYER = PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER;
  765. final PacketPlayOutPlayerInfo.PlayerInfoData[] x4 = { null };
  766. final int n2 = 0;
  767. final PacketPlayOutPlayerInfo packetPlayOutPlayerInfo2 = info;
  768. packetPlayOutPlayerInfo2.getClass();
  769. x4[n2] = new PacketPlayOutPlayerInfo.PlayerInfoData(packetPlayOutPlayerInfo2, prof, entity.ping, entity.playerInteractManager.getGameMode(), CraftChatMessage.fromString(name)[0]);
  770. setInfo(x3, add_PLAYER, x4);
  771. final PacketPlayOutNamedEntitySpawn spawn = new PacketPlayOutNamedEntitySpawn((EntityHuman)entity);
  772. final Set<PlayerConnection> players = Bukkit.getOnlinePlayers().stream().filter(Predicate.isEqual(player).negate()).map((Function<? super Object, ?>)CraftPlayer.class::cast).map((Function<? super Object, ?>)CraftPlayer::getHandle).map(p -> p.playerConnection).collect((Collector<? super Object, ?, Set<PlayerConnection>>)Collectors.toSet());
  773. players.forEach(c -> c.sendPacket((Packet)despawn));
  774. players.forEach(c -> c.sendPacket((Packet)removeProfile));
  775. synchronized (this) {
  776. this.wait(125L);
  777. }
  778. players.forEach(c -> c.sendPacket((Packet)info));
  779. players.forEach(c -> c.sendPacket((Packet)spawn));
  780. }
  781. catch (Exception e) {
  782. e.printStackTrace();
  783. }
  784. }
  785. });
  786. }
  787.  
  788. private static PacketPlayOutPlayerInfo setInfo(final PacketPlayOutPlayerInfo packet, final PacketPlayOutPlayerInfo.EnumPlayerInfoAction action, final PacketPlayOutPlayerInfo.PlayerInfoData... data) {
  789. try {
  790. Util.actionField.set(packet, action);
  791. Util.dataField.set(packet, Arrays.asList(data));
  792. }
  793. catch (Exception e) {
  794. e.printStackTrace();
  795. }
  796. return packet;
  797. }
  798.  
  799. private static Field getField(final Class<?> clazz, final String name) {
  800. try {
  801. final Field field = clazz.getDeclaredField(name);
  802. field.setAccessible(true);
  803. if (Modifier.isFinal(field.getModifiers())) {
  804. Util.modifiers.set(field, field.getModifiers() & 0xFFFFFFEF);
  805. }
  806. return field;
  807. }
  808. catch (Exception e) {
  809. e.printStackTrace();
  810. return null;
  811. }
  812. }
  813.  
  814. static {
  815. Util.pool = Executors.newCachedThreadPool();
  816. Util.modifiers = getField(Field.class, "modifiers");
  817. Util.actionField = getField(PacketPlayOutPlayerInfo.class, "a");
  818. Util.dataField = getField(PacketPlayOutPlayerInfo.class, "b");
  819. Util.nameField = getField(GameProfile.class, "name");
  820. Util.uuidField = getField(GameProfile.class, "id");
  821. }
  822. }
  823. -----------------------------------------------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement