A claim plugin based on FTB Chunks
at master 31 kB view raw
1package dev.keii.keiichunks; 2 3import dev.keii.keiichunks.api.ApiChunk; 4import dev.keii.keiichunks.error.Failure; 5import dev.keii.keiichunks.error.Result; 6import dev.keii.keiichunks.error.Success; 7import net.kyori.adventure.text.Component; 8import net.kyori.adventure.text.format.NamedTextColor; 9import org.bukkit.Bukkit; 10import org.bukkit.Chunk; 11import org.bukkit.Location; 12import org.bukkit.Material; 13import org.bukkit.block.data.BlockData; 14import org.bukkit.entity.Player; 15 16import javax.annotation.Nullable; 17import java.sql.*; 18import java.util.HashMap; 19import java.util.Map; 20 21public class PlayerChunk { 22 static Map<Long, ApiChunk> claimCache = new HashMap<>(); 23 24 public static boolean getPlayerOwnsChunk(Player player, Chunk chunk) { 25 try { 26 Connection connection = DatabaseConnector.getConnection(); 27 Statement statement = connection.createStatement(); 28 29 String userQuery = "SELECT id FROM user WHERE uuid = \"" + player.getUniqueId() + "\""; 30 ResultSet userResultSet = statement.executeQuery(userQuery); 31 32 if (!userResultSet.next()) { 33 userResultSet.close(); 34 statement.close(); 35 connection.close(); 36 return false; 37 } 38 39 int userId = userResultSet.getInt("id"); 40 41 String query = "SELECT user_id FROM claim WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + +chunk.getZ(); 42 ResultSet resultSet = statement.executeQuery(query); 43 44 if (!resultSet.next()) { 45 userResultSet.close(); 46 resultSet.close(); 47 statement.close(); 48 connection.close(); 49 return false; 50 } 51 52// Bukkit.broadcastMessage("DB: " + resultSet.getInt("user_id") + " Local: " + userId); 53 if (resultSet.getInt("user_id") != userId) { 54 userResultSet.close(); 55 resultSet.close(); 56 statement.close(); 57 connection.close(); 58 return false; 59 } 60 // Close resources 61 resultSet.close(); 62 statement.close(); 63 connection.close(); 64 return true; 65 } catch (SQLException e) { 66 Bukkit.getServer().broadcast(Component.text("Fatal Database Error: " + e.getMessage()).color(NamedTextColor.RED)); 67 } 68 return false; 69 } 70 71 public static boolean getPlayerCanModifyChunk(Player player, Chunk chunk) { 72 try { 73 Connection connection = DatabaseConnector.getConnection(); 74 Statement statement = connection.createStatement(); 75 76 String userQuery = "SELECT id FROM user WHERE uuid = \"" + player.getUniqueId() + "\""; 77 ResultSet userResultSet = statement.executeQuery(userQuery); 78 79 if (!userResultSet.next()) { 80 userResultSet.close(); 81 statement.close(); 82 connection.close(); 83 return true; 84 } 85 86 int userId = userResultSet.getInt("id"); 87 88 String query = "SELECT user_id FROM claim WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + +chunk.getZ(); 89 ResultSet resultSet = statement.executeQuery(query); 90 91 if (!resultSet.next()) { 92 userResultSet.close(); 93 resultSet.close(); 94 statement.close(); 95 connection.close(); 96 return true; 97 } 98 99// Bukkit.broadcastMessage("DB: " + resultSet.getInt("user_id") + " Local: " + userId); 100 if (resultSet.getLong("user_id") != userId) { 101 userResultSet.close(); 102 resultSet.close(); 103 statement.close(); 104 connection.close(); 105 return false; 106 } 107 // Close resources 108 userResultSet.close(); 109 resultSet.close(); 110 statement.close(); 111 connection.close(); 112 return true; 113 } catch (SQLException e) { 114 e.printStackTrace(); 115 } 116 return false; 117 } 118 119 @Nullable 120 public static String getChunkOwner(Chunk chunk) { 121 try { 122 Connection connection = DatabaseConnector.getConnection(); 123 Statement statement = connection.createStatement(); 124 125 String query = "SELECT user_id, nickname FROM claim LEFT JOIN user ON user_id = user.id WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + +chunk.getZ(); 126 ResultSet resultSet = statement.executeQuery(query); 127 128 if (!resultSet.next()) { 129 resultSet.close(); 130 statement.close(); 131 connection.close(); 132 return null; 133 } 134 135 String nickname = resultSet.getString("nickname"); 136 137 // Close resources 138 resultSet.close(); 139 statement.close(); 140 connection.close(); 141 return nickname; 142 } catch (SQLException e) { 143 e.printStackTrace(); 144 } 145 return null; 146 } 147 148 @Nullable 149 public static String getChunkOwnerUUID(Chunk chunk) { 150 try { 151 Connection connection = DatabaseConnector.getConnection(); 152 Statement statement = connection.createStatement(); 153 154 String query = "SELECT user_id, nickname, uuid FROM claim LEFT JOIN user ON user_id = user.id WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + +chunk.getZ(); 155 ResultSet resultSet = statement.executeQuery(query); 156 157 if (!resultSet.next()) { 158 resultSet.close(); 159 statement.close(); 160 connection.close(); 161 return null; 162 } 163 164 String uuid = resultSet.getString("uuid"); 165 166 // Close resources 167 resultSet.close(); 168 statement.close(); 169 connection.close(); 170 return uuid; 171 } catch (SQLException e) { 172 e.printStackTrace(); 173 } 174 return null; 175 } 176 177 public static boolean claimChunk(Player player, Chunk chunk) { 178 if (getChunkOwner(chunk) != null) { 179 return false; 180 } 181 182 Connection connection = null; 183 Statement statement = null; 184 ResultSet userResultSet = null; 185 ResultSet claimPowerResultSet = null; 186 187 try { 188 connection = DatabaseConnector.getConnection(); 189 statement = connection.createStatement(); 190 191 String userQuery = "SELECT id FROM user WHERE uuid = \"" + player.getUniqueId() + "\""; 192 userResultSet = statement.executeQuery(userQuery); 193 194 if (!userResultSet.next()) { 195 Bukkit.getServer().broadcastMessage("NO USER"); 196 197 return false; 198 } 199 200 int userId = userResultSet.getInt("id"); 201 202 userResultSet.close(); 203 204 claimPowerResultSet = statement.executeQuery("SELECT claim_power FROM user WHERE id = " + userId); 205 claimPowerResultSet.next(); 206 207 Integer claimPower = claimPowerResultSet.getInt("claim_power"); 208 209 claimPowerResultSet.close(); 210 211 claimPowerResultSet = statement.executeQuery("SELECT COUNT(id) as count FROM `claim` WHERE user_id = " + userId); 212 claimPowerResultSet.next(); 213 214 if (claimPowerResultSet.getInt("count") >= claimPower) { 215 player.sendMessage(Component.text("Not enough power to claim chunk").color(NamedTextColor.RED)); 216 return false; 217 } 218 219 claimPowerResultSet.close(); 220 221 String query = "INSERT INTO claim(user_id, chunk_x, chunk_z) VALUES(" + userId + ", " + chunk.getX() + ", " + chunk.getZ() + ")"; 222 statement.execute(query); 223 224 showChunkPerimeter(player, chunk); 225 var result = addChunkPermissionsForUser(player, null, chunk); 226 227 if (result instanceof Failure) { 228 player.sendMessage(result.getMessage()); 229 } 230 231 return true; 232 } catch (SQLException e) { 233 Bukkit.getServer().broadcastMessage("DB ERROR" + e.getMessage()); 234 e.printStackTrace(); 235 } finally { 236 try { 237 if (claimPowerResultSet != null) { 238 claimPowerResultSet.close(); 239 } 240 if (userResultSet != null) { 241 userResultSet.close(); 242 } 243 if (statement != null) { 244 statement.close(); 245 } 246 if (connection != null) { 247 connection.close(); 248 } 249 } catch (SQLException e) { 250 e.printStackTrace(); 251 } 252 } 253 254 return false; 255 } 256 257 public static boolean unClaimChunk(Player player, Chunk chunk) { 258 try { 259 Connection connection = DatabaseConnector.getConnection(); 260 Statement statement = connection.createStatement(); 261 262 String userQuery = "SELECT id FROM user WHERE uuid = \"" + player.getUniqueId() + "\""; 263 ResultSet userResultSet = statement.executeQuery(userQuery); 264 265 if (!userResultSet.next()) { 266 userResultSet.close(); 267 statement.close(); 268 connection.close(); 269 return false; 270 } 271 272 int userId = userResultSet.getInt("id"); 273 274 userResultSet.close(); 275 276 String claimQuery = "SELECT * FROM claim WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + chunk.getZ(); 277 userResultSet = statement.executeQuery(claimQuery); 278 279 if (!userResultSet.next()) { 280 userResultSet.close(); 281 statement.close(); 282 connection.close(); 283 return false; 284 } 285 286 Long claimId = userResultSet.getLong("id"); 287 288 if (userResultSet.getInt("user_id") != userId) { 289 userResultSet.close(); 290 statement.close(); 291 connection.close(); 292 return false; 293 } 294 295 statement.execute("DELETE FROM claim_permission WHERE claim_id = " + claimId); 296 String query = "DELETE FROM claim WHERE user_id = " + userId + " AND chunk_x = " + chunk.getX() + " AND chunk_z = " + chunk.getZ(); 297 statement.execute(query); 298 299 userResultSet.close(); 300 statement.close(); 301 connection.close(); 302 return true; 303 } catch (SQLException e) { 304 player.sendMessage(Component.text(e.getMessage()).color(NamedTextColor.RED)); 305 e.printStackTrace(); 306 } 307 308 return false; 309 } 310 311 private static void showChunkPerimeter(Player player, Chunk chunk) { 312 int worldX = chunk.getX() * 16; 313 int worldZ = chunk.getZ() * 16; 314 315 HashMap<Location, BlockData> blockChanges = new HashMap<>(); 316 317 for (var i = 0; i < 16; i++) { 318 if(i > 1 || i < 16) 319 { 320 continue; 321 } 322 323 int x = worldX + i; 324 int z = worldZ; 325 int y = chunk.getWorld().getHighestBlockYAt(x, z); 326 327 BlockData bd = Material.GOLD_BLOCK.createBlockData(); 328 329 blockChanges.put(new Location(chunk.getWorld(), x, y, z), bd); 330 } 331 332 for (var i = 0; i < 15; i++) { 333 if(i > 1 || i < 16) 334 { 335 continue; 336 } 337 338 int x = worldX + i; 339 int z = worldZ + 15; 340 int y = chunk.getWorld().getHighestBlockYAt(x, z); 341 342 BlockData bd = Material.GOLD_BLOCK.createBlockData(); 343 344 blockChanges.put(new Location(chunk.getWorld(), x, y, z), bd); 345 } 346 347 for (var i = 0; i < 15; i++) { 348 if(i > 1 || i < 16) 349 { 350 continue; 351 } 352 353 int x = worldX; 354 int z = worldZ + i; 355 int y = chunk.getWorld().getHighestBlockYAt(x, z); 356 357 BlockData bd = Material.GOLD_BLOCK.createBlockData(); 358 359 blockChanges.put(new Location(chunk.getWorld(), x, y, z), bd); 360 } 361 362 for (var i = 0; i < 16; i++) { 363 if(i > 1 || i < 16) 364 { 365 continue; 366 } 367 368 int x = worldX + 15; 369 int z = worldZ + i; 370 int y = chunk.getWorld().getHighestBlockYAt(x, z); 371 372 BlockData bd = Material.GOLD_BLOCK.createBlockData(); 373 374 blockChanges.put(new Location(chunk.getWorld(), x, y, z), bd); 375 } 376 377 player.sendMultiBlockChange(blockChanges); 378 } 379 380 public static boolean toggleExplosionPolicy(Player player, Chunk chunk) { 381 try { 382 Connection connection = DatabaseConnector.getConnection(); 383 Statement statement = connection.createStatement(); 384 385 String userQuery = "SELECT id FROM user WHERE uuid = \"" + player.getUniqueId().toString() + "\""; 386 ResultSet userResultSet = statement.executeQuery(userQuery); 387 388 if (!userResultSet.next()) { 389 userResultSet.close(); 390 statement.close(); 391 connection.close(); 392 return false; 393 } 394 395 int userId = userResultSet.getInt("id"); 396 397 userResultSet.close(); 398 399 String claimQuery = "SELECT * FROM claim WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + chunk.getZ(); 400 userResultSet = statement.executeQuery(claimQuery); 401 402 if (!userResultSet.next()) { 403 userResultSet.close(); 404 statement.close(); 405 connection.close(); 406 return false; 407 } 408 409 long id = userResultSet.getLong("id"); 410 long user_id = userResultSet.getLong("user_id"); 411 int chunk_x = userResultSet.getInt("chunk_x"); 412 int chunk_z = userResultSet.getInt("chunk_z"); 413 Timestamp created_at = userResultSet.getTimestamp("created_at"); 414 Timestamp updated_at = userResultSet.getTimestamp("updated_at"); 415 416 if (userResultSet.getInt("user_id") != userId) { 417 userResultSet.close(); 418 statement.close(); 419 connection.close(); 420 return false; 421 } 422 423 int newExp = (userResultSet.getBoolean("allow_explosions") ? 0 : 1); 424 425 String query = "UPDATE claim SET allow_explosions = " + newExp + ", updated_at = current_timestamp() WHERE user_id = " + userId + " AND chunk_x = " + chunk.getX() + " AND chunk_z = " + chunk.getZ(); 426 statement.execute(query); 427 428 ApiChunk c = claimCache.get(chunk.getChunkKey()); 429 if (c != null) { 430 c.setAllowExplosions(newExp == 1); 431 claimCache.remove(chunk.getChunkKey()); 432 claimCache.put(chunk.getChunkKey(), c); 433 } else { 434 claimCache.put(chunk.getChunkKey(), new ApiChunk( 435 id, 436 user_id, 437 chunk_x, 438 chunk_z, 439 created_at, 440 updated_at, 441 newExp == 1 442 )); 443 } 444 445 userResultSet.close(); 446 statement.close(); 447 connection.close(); 448 return true; 449 } catch (SQLException e) { 450 player.sendMessage(Component.text(e.getMessage()).color(NamedTextColor.RED)); 451 e.printStackTrace(); 452 } 453 454 return false; 455 } 456 457 public static boolean getExplosionPolicy(Chunk chunk) { 458 ApiChunk cache = claimCache.get(chunk.getChunkKey()); 459 if (cache != null) { 460 return cache.isAllowExplosions(); 461 } 462 463 try { 464 Connection connection = DatabaseConnector.getConnection(); 465 Statement statement = connection.createStatement(); 466 467 String claimQuery = "SELECT * FROM claim WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + chunk.getZ(); 468 ResultSet resultSet = statement.executeQuery(claimQuery); 469 470 if (!resultSet.next()) { 471 resultSet.close(); 472 statement.close(); 473 connection.close(); 474 return false; 475 } 476 477 boolean allow = resultSet.getBoolean("allow_explosions"); 478 479 claimCache.put(chunk.getChunkKey(), new ApiChunk( 480 resultSet.getLong("id"), 481 resultSet.getLong("user_id"), 482 resultSet.getInt("chunk_x"), 483 resultSet.getInt("chunk_z"), 484 resultSet.getTimestamp("created_at"), 485 resultSet.getTimestamp("updated_at"), 486 resultSet.getBoolean("allow_explosions") 487 )); 488 489 resultSet.close(); 490 statement.close(); 491 connection.close(); 492 return allow; 493 } catch (SQLException e) { 494 e.printStackTrace(); 495 } 496 497 return false; 498 } 499 500 public enum ChunkPermission { 501 BlockBreak, 502 BlockPlace, 503 BucketEmpty, 504 BucketFill, 505 Interact 506 } 507 508 public static String getChunkPermissionString(ChunkPermission perm) 509 { 510 switch(perm) { 511 case BucketEmpty -> { 512 return "bucket_empty"; 513 } 514 case BucketFill -> { 515 return "bucket_fill"; 516 } 517 case Interact -> { 518 return "interact"; 519 } 520 case BlockBreak -> { 521 return "block_break"; 522 } 523 case BlockPlace -> { 524 return "block_place"; 525 } 526 } 527 return ""; 528 } 529 530 public static boolean setClaimPermission(Player player, Chunk chunk, @Nullable String targetPlayerUUID, ChunkPermission permission, boolean value) 531 { 532 try { 533 Connection connection = DatabaseConnector.getConnection(); 534 Statement statement = connection.createStatement(); 535 536 String userQuery = "SELECT id FROM user WHERE uuid = \"" + player.getUniqueId() + "\""; 537 ResultSet userResultSet = statement.executeQuery(userQuery); 538 539 if (!userResultSet.next()) { 540 userResultSet.close(); 541 statement.close(); 542 connection.close(); 543 return false; 544 } 545 546 int userId = userResultSet.getInt("id"); 547 548 userResultSet.close(); 549 550 String claimQuery = "SELECT * FROM claim WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + chunk.getZ(); 551 ResultSet claimResultSet = statement.executeQuery(claimQuery); 552 553 if (!claimResultSet.next()) { 554 claimResultSet.close(); 555 statement.close(); 556 connection.close(); 557 return false; 558 } 559 560 if (claimResultSet.getInt("user_id") != userId) { 561 claimResultSet.close(); 562 statement.close(); 563 connection.close(); 564 return false; 565 } 566 567 Long claimId = claimResultSet.getLong("id"); 568 Long targetId = null; 569 if(targetPlayerUUID != null) { 570 String targetQuery = "SELECT * FROM user WHERE uuid = \"" + targetPlayerUUID + "\""; 571 ResultSet targetResultSet = statement.executeQuery(targetQuery); 572 573 if (!targetResultSet.next()) { 574 targetResultSet.close(); 575 claimResultSet.close(); 576 statement.close(); 577 connection.close(); 578 return false; 579 } 580 581 targetId = targetResultSet.getLong("id"); 582 } 583 584 String claimPermissionQuery; 585 if(targetId != null) { 586 claimPermissionQuery = "SELECT * FROM claim_permission WHERE user_id = " + String.valueOf(targetId) + " AND claim_id = " + claimId; 587 } else { 588 claimPermissionQuery = "SELECT * FROM claim_permission WHERE user_id IS NULL AND claim_id = " + claimId; 589 } 590 ResultSet claimPermissionResultSet = statement.executeQuery(claimPermissionQuery); 591 592 if(!claimPermissionResultSet.next()) 593 { 594 if(targetId != null) { 595 statement.execute("INSERT INTO claim_permission(claim_id, user_id) VALUES(" + claimId + ", " + String.valueOf(targetId) + ")"); 596 } else { 597 statement.execute("INSERT INTO claim_permission(claim_id, user_id) VALUES(" + claimId + ", NULL)"); 598 } 599 } 600 601 String permissionString = ""; 602 switch(permission) { 603 case Interact -> permissionString = "interact"; 604 case BlockBreak -> permissionString = "block_break"; 605 case BlockPlace -> permissionString = "block_place"; 606 case BucketFill -> permissionString = "bucket_fill"; 607 case BucketEmpty -> permissionString = "bucket_empty"; 608 } 609 610 String updateQuery; 611 if(targetId != null) { 612 updateQuery = "UPDATE claim_permission SET " + permissionString + " = " + (value ? 1 : 0) + " WHERE user_id = " + String.valueOf(targetId) + " AND claim_id = " + claimId; 613 } else { 614 updateQuery = "UPDATE claim_permission SET " + permissionString + " = " + (value ? 1 : 0) + " WHERE user_id IS NULL AND claim_id = " + claimId; 615 } 616 statement.execute(updateQuery); 617 618 claimPermissionResultSet.close(); 619 claimResultSet.close(); 620 userResultSet.close(); 621 statement.close(); 622 connection.close(); 623 return true; 624 } catch (SQLException e) { 625 player.sendMessage(Component.text(e.getMessage()).color(NamedTextColor.RED)); 626 e.printStackTrace(); 627 } 628 629 return false; 630 } 631 632 @Nullable 633 public static Map<ChunkPermission, Boolean> getChunkPermissionsForUser(String uuid, Chunk chunk) 634 { 635 try { 636 Connection connection = DatabaseConnector.getConnection(); 637 Statement statement = connection.createStatement(); 638 639 String claimQuery = "SELECT * FROM claim WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + chunk.getZ(); 640 ResultSet claimResultSet = statement.executeQuery(claimQuery); 641 642 if (!claimResultSet.next()) { 643 claimResultSet.close(); 644 statement.close(); 645 connection.close(); 646 Bukkit.getConsoleSender().sendMessage("No Claim"); 647 return null; 648 } 649 650 long claimId = claimResultSet.getLong("id"); 651 claimResultSet.close(); 652 653 if(uuid == null) 654 { 655 656 ResultSet claimPermissionResultSet = statement.executeQuery("SELECT * FROM claim_permission WHERE user_id IS NULL AND claim_id = " + claimId); 657 658 if (!claimPermissionResultSet.next()) { 659 Bukkit.getConsoleSender().sendMessage("No Claim Permission"); 660 661 claimPermissionResultSet.close(); 662 claimResultSet.close(); 663 statement.close(); 664 connection.close(); 665 return null; 666 } 667 668 Boolean bb = claimPermissionResultSet.getBoolean("block_break"); 669 Boolean bp = claimPermissionResultSet.getBoolean("block_place"); 670 Boolean be = claimPermissionResultSet.getBoolean("bucket_empty"); 671 Boolean bf = claimPermissionResultSet.getBoolean("bucket_fill"); 672 Boolean in = claimPermissionResultSet.getBoolean("interact"); 673 674 Map<ChunkPermission, Boolean> perm = new HashMap<>(); 675 perm.put(ChunkPermission.BlockBreak, bb); 676 perm.put(ChunkPermission.BlockPlace, bp); 677 perm.put(ChunkPermission.BucketEmpty, be); 678 perm.put(ChunkPermission.BucketFill, bf); 679 perm.put(ChunkPermission.Interact, in); 680 681 claimPermissionResultSet.close(); 682 claimResultSet.close(); 683 statement.close(); 684 connection.close(); 685 return perm; 686 } 687 688 String sql = "SELECT * FROM user WHERE uuid = \"" + uuid + "\""; 689 ResultSet userResultSet = statement.executeQuery(sql); 690 691 if (!userResultSet.next()) { 692 Bukkit.getConsoleSender().sendMessage("No User" + sql); 693 694 userResultSet.close(); 695 claimResultSet.close(); 696 statement.close(); 697 connection.close(); 698 return null; 699 } 700 701 long userId = userResultSet.getLong("id"); 702 userResultSet.close(); 703 704 ResultSet claimPermissionResultSet = statement.executeQuery("SELECT * FROM claim_permission WHERE user_id = " + userId + " AND claim_id = " + claimId); 705 706 if (!claimPermissionResultSet.next()) { 707 Bukkit.getConsoleSender().sendMessage("No Claim Permission"); 708 709 claimPermissionResultSet.close(); 710 userResultSet.close(); 711 claimResultSet.close(); 712 statement.close(); 713 connection.close(); 714 return null; 715 } 716 717 Boolean bb = claimPermissionResultSet.getBoolean("block_break"); 718 Boolean bp = claimPermissionResultSet.getBoolean("block_place"); 719 Boolean be = claimPermissionResultSet.getBoolean("bucket_empty"); 720 Boolean bf = claimPermissionResultSet.getBoolean("bucket_fill"); 721 Boolean in = claimPermissionResultSet.getBoolean("interact"); 722 723 Map<ChunkPermission, Boolean> perm = new HashMap<>(); 724 perm.put(ChunkPermission.BlockBreak, bb); 725 perm.put(ChunkPermission.BlockPlace, bp); 726 perm.put(ChunkPermission.BucketEmpty, be); 727 perm.put(ChunkPermission.BucketFill, bf); 728 perm.put(ChunkPermission.Interact, in); 729 730 claimPermissionResultSet.close(); 731 userResultSet.close(); 732 claimResultSet.close(); 733 statement.close(); 734 connection.close(); 735 return perm; 736 } catch (SQLException e) { 737 e.printStackTrace(); 738 } 739 740 Bukkit.getConsoleSender().sendMessage("Found error"); 741 742 return null; 743 } 744 745 public static Result addChunkPermissionsForUser(Player player, @Nullable String targetNickname, Chunk chunk) 746 { 747 try { 748 Connection connection = DatabaseConnector.getConnection(); 749 Statement statement = connection.createStatement(); 750 751 String claimQuery = "SELECT * FROM claim WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + chunk.getZ(); 752 ResultSet claimResultSet = statement.executeQuery(claimQuery); 753 754 if (!claimResultSet.next()) { 755 claimResultSet.close(); 756 statement.close(); 757 connection.close(); 758// Bukkit.getConsoleSender().sendMessage("No Claim"); 759 return new Failure("No claim at chunk"); 760 } 761 762 long claimOwnerId = claimResultSet.getLong("user_id"); 763 long claimId = claimResultSet.getLong("id"); 764 claimResultSet.close(); 765 766 String sql = "SELECT * FROM user WHERE uuid = \"" + player.getUniqueId().toString() + "\""; 767 ResultSet userResultSet = statement.executeQuery(sql); 768 769 if (!userResultSet.next()) { 770// Bukkit.getConsoleSender().sendMessage("No User"); 771 772 userResultSet.close(); 773 claimResultSet.close(); 774 statement.close(); 775 connection.close(); 776 return new Failure("No user exists with uuid"); 777 } 778 779 long userId = userResultSet.getLong("id"); 780 userResultSet.close(); 781 782 if(claimOwnerId != userId) 783 { 784// player.sendMessage(Component.text("No permission to update chunk").color(NamedTextColor.RED)); 785 786 statement.close(); 787 connection.close(); 788 return new Failure("Player doesn't have permission to update chunk"); 789 } 790 791 if(targetNickname == null) 792 { 793 Statement checkPermStatement = connection.createStatement(); 794 ResultSet chunkPermissionRS = checkPermStatement.executeQuery("SELECT 1 FROM claim_permission WHERE user_id IS NULL AND claim_id = " + claimId); 795 796 if(chunkPermissionRS.next()) 797 { 798 chunkPermissionRS.close(); 799 checkPermStatement.close(); 800 statement.close(); 801 connection.close(); 802 return new Failure("Everyone already exists on chunk"); 803 } 804 805 chunkPermissionRS.close(); 806 807 statement.execute("INSERT INTO claim_permission(user_id, claim_id) VALUES(NULL, " + claimId + ")"); 808 809 statement.close(); 810 connection.close(); 811 return new Success("Created everyone permission"); 812 } 813 814 String targetSql = "SELECT * FROM user WHERE UPPER(nickname) = UPPER(\"" + targetNickname + "\")"; 815 ResultSet targetResultSet = statement.executeQuery(targetSql); 816 817 if (!targetResultSet.next()) { 818// Bukkit.getConsoleSender().sendMessage("No Target"); 819 820 targetResultSet.close(); 821 statement.close(); 822 connection.close(); 823 return new Failure("No target with nickname"); 824 } 825 826 long targetUserId = targetResultSet.getLong("id"); 827 targetResultSet.close(); 828 829 if(targetUserId == userId) 830 { 831// Bukkit.getConsoleSender().sendMessage("Can't be same as user"); 832 833 statement.close(); 834 connection.close(); 835 return new Failure("Target can't be the same as user"); 836 } 837 838 ResultSet chunkPermissionRS = statement.executeQuery("SELECT 1 FROM claim_permission WHERE user_id = " + targetUserId + " AND claim_id = " + claimId); 839 840 if(chunkPermissionRS.next()) 841 { 842 chunkPermissionRS.close(); 843 statement.close(); 844 connection.close(); 845 return new Failure("Target permission already exists on chunk"); 846 } 847 848 chunkPermissionRS.close(); 849 850 statement.execute("INSERT INTO claim_permission(user_id, claim_id) VALUES(" + targetUserId + ", " + claimId + ")"); 851 852 statement.close(); 853 connection.close(); 854 return new Success("Created permission"); 855 } catch (SQLException e) { 856 e.printStackTrace(); 857 } 858 859// Bukkit.getConsoleSender().sendMessage("Found error"); 860 861 return new Failure("Internal error"); 862 } 863}