A claim plugin based on FTB Chunks
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}