From 5900429eaccd90a71c12f3eee987257c54a0f187 Mon Sep 17 00:00:00 2001 From: JernejTDO Date: Fri, 11 Jul 2025 21:21:26 +0200 Subject: [PATCH] UTD --- .../Spigot/LitePermissions.java | 107 +++++++++++++----- .../Spigot/Permissible/CustomPermissible.java | 43 +++++-- .../Spigot/data/GroupData.java | 58 ++++++++++ .../LitePermissions/Spigot/data/UserData.java | 85 ++++++++++++++ .../Spigot/LitePermissions.class | Bin 2998 -> 5168 bytes .../Permissible/CustomPermissible.class | Bin 2186 -> 4675 bytes 6 files changed, 256 insertions(+), 37 deletions(-) create mode 100644 src/main/java/si/jernejtdo/LitePermissions/Spigot/data/GroupData.java create mode 100644 src/main/java/si/jernejtdo/LitePermissions/Spigot/data/UserData.java diff --git a/src/main/java/si/jernejtdo/LitePermissions/Spigot/LitePermissions.java b/src/main/java/si/jernejtdo/LitePermissions/Spigot/LitePermissions.java index 4dc9115..a502ca0 100644 --- a/src/main/java/si/jernejtdo/LitePermissions/Spigot/LitePermissions.java +++ b/src/main/java/si/jernejtdo/LitePermissions/Spigot/LitePermissions.java @@ -6,43 +6,92 @@ import org.bukkit.plugin.java.JavaPlugin; import eu.triler.BukkitColors.ApplyColors; import si.jernejtdo.LitePermissions.Spigot.Permissible.onPlayerLoginInject; +import si.jernejtdo.LitePermissions.Spigot.data.GroupData; +import si.jernejtdo.LitePermissions.Spigot.data.UserData; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; public class LitePermissions extends JavaPlugin { - private static LitePermissions plugin; + private static LitePermissions plugin; - @Override - public void onEnable() { - plugin = this; - sendConsoleMessage("Plugin is starting."); + // Runtime user/group data storage + private final Map userDataMap = new HashMap<>(); + private final Map groupDataMap = new HashMap<>(); - registerEvents(onPlayerLoginInject.class); + @Override + public void onEnable() { + plugin = this; + sendConsoleMessage("Plugin is starting..."); - sendConsoleMessage("Plugin is enabled."); - } + // Register listeners + registerEvents(onPlayerLoginInject.class); - @Override - public void onDisable() { - sendConsoleMessage("Plugin is disabled."); - } + // TODO: Load groups and users from storage + sendConsoleMessage("Plugin is enabled."); + } - public static LitePermissions getPlugin() { - return plugin; - } + @Override + public void onDisable() { + // TODO: Save users/groups if needed + sendConsoleMessage("Plugin is disabled."); + } - public void registerEvents(Class listenerClass) { - try { - T listener = listenerClass.getDeclaredConstructor().newInstance(); - plugin.getServer().getPluginManager().registerEvents(listener, plugin); - sendConsoleMessage("Listener &a" + listenerClass.getSimpleName() + "&f is registered."); - } catch (Exception e) { - e.printStackTrace(); - } - } + public static LitePermissions getPlugin() { + return plugin; + } - public void sendConsoleMessage(String message) { - ApplyColors ac = new ApplyColors(); - String def = ac.applyColerCodes("&aLitePermissions &7| Message: &f" + message); - Bukkit.getConsoleSender().sendMessage(def); - } + public void registerEvents(Class listenerClass) { + try { + T listener = listenerClass.getDeclaredConstructor().newInstance(); + plugin.getServer().getPluginManager().registerEvents(listener, plugin); + sendConsoleMessage("Listener &a" + listenerClass.getSimpleName() + "&f is registered."); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void sendConsoleMessage(String message) { + ApplyColors ac = new ApplyColors(); + String formatted = ac.applyColerCodes("&aLitePermissions &7| &f" + message); + Bukkit.getConsoleSender().sendMessage(formatted); + } + + // --- USER DATA --- + + public UserData getUserData(UUID uuid) { + return userDataMap.get(uuid); + } + + public void setUserData(UUID uuid, UserData userData) { + userDataMap.put(uuid, userData); + } + + public boolean hasUserData(UUID uuid) { + return userDataMap.containsKey(uuid); + } + + // --- GROUP DATA --- + + public GroupData getGroupData(String name) { + return groupDataMap.get(name.toLowerCase()); + } + + public void setGroupData(String name, GroupData groupData) { + groupDataMap.put(name.toLowerCase(), groupData); + } + + public boolean hasGroupData(String name) { + return groupDataMap.containsKey(name.toLowerCase()); + } + + public Map getAllUserData() { + return userDataMap; + } + + public Map getAllGroupData() { + return groupDataMap; + } } diff --git a/src/main/java/si/jernejtdo/LitePermissions/Spigot/Permissible/CustomPermissible.java b/src/main/java/si/jernejtdo/LitePermissions/Spigot/Permissible/CustomPermissible.java index d8d5a74..1093d73 100644 --- a/src/main/java/si/jernejtdo/LitePermissions/Spigot/Permissible/CustomPermissible.java +++ b/src/main/java/si/jernejtdo/LitePermissions/Spigot/Permissible/CustomPermissible.java @@ -1,10 +1,15 @@ package si.jernejtdo.LitePermissions.Spigot.Permissible; +import java.util.Comparator; +import java.util.Optional; + import org.bukkit.entity.Player; import org.bukkit.permissions.PermissibleBase; import org.bukkit.permissions.ServerOperator; import si.jernejtdo.LitePermissions.Spigot.LitePermissions; +import si.jernejtdo.LitePermissions.Spigot.data.GroupData; +import si.jernejtdo.LitePermissions.Spigot.data.UserData; public class CustomPermissible extends PermissibleBase { @@ -30,16 +35,38 @@ public class CustomPermissible extends PermissibleBase { } public boolean checkPermissions(String inName) { - // You now have access to the player object - LitePermissions lp = LitePermissions.getPlugin(); - - // Example: Check RamData or other storage here - // return RamData.hasPermission(player.getUniqueId(), inName); - lp.sendConsoleMessage("&a"+player.getName()+"&f Permission(&a"+inName+"&f)"); - - return false; // default deny + LitePermissions plugin = LitePermissions.getPlugin(); + UserData user = plugin.getUserData(player.getUniqueId()); + + boolean result = false; + String source = "none"; + + if (user != null) { + // 1. User-defined permission ALWAYS overrides + if (user.getPermissions().containsKey(inName)) { + result = user.getPermissions().get(inName); // true or false + source = "user"; + } else { + // 2. Find highest-weight group that defines it + Optional groupWithPermission = user.getGroups().stream() + .filter(g -> g.getPermissions().containsKey(inName)) + .max(Comparator.comparingInt(GroupData::getWeight)); + + if (groupWithPermission.isPresent()) { + result = groupWithPermission.get().getPermissions().get(inName); + source = "group:" + groupWithPermission.get().getName(); + } + } + } + + plugin.sendConsoleMessage("&a" + player.getName() + + "&f permission (&e" + inName + "&f): &6" + result + " &7[source: " + source + "]"); + + return result; } + + public Player getPlayer() { return player; } diff --git a/src/main/java/si/jernejtdo/LitePermissions/Spigot/data/GroupData.java b/src/main/java/si/jernejtdo/LitePermissions/Spigot/data/GroupData.java new file mode 100644 index 0000000..fe74903 --- /dev/null +++ b/src/main/java/si/jernejtdo/LitePermissions/Spigot/data/GroupData.java @@ -0,0 +1,58 @@ +package si.jernejtdo.LitePermissions.Spigot.data; + +import java.util.HashMap; +import java.util.Map; + +public class GroupData { + private String name; + private String prefix; + private String suffix; + private int weight = 0; // Default weight + private Map permissions = new HashMap<>(); + + public GroupData(String name) { + this.name = name; + } + + public boolean hasPermission(String permission) { + return permissions.getOrDefault(permission, false); + } + + // --- Getters and setters --- + + public int getWeight() { + return weight; + } + + public void setWeight(int weight) { + this.weight = weight; + } + + public Map getPermissions() { + return permissions; + } + + public String getName() { + return name; + } + + public String getPrefix() { + return prefix; + } + + public String getSuffix() { + return suffix; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } + + public void setSuffix(String suffix) { + this.suffix = suffix; + } + + public void setPermission(String perm, boolean value) { + permissions.put(perm, value); + } +} \ No newline at end of file diff --git a/src/main/java/si/jernejtdo/LitePermissions/Spigot/data/UserData.java b/src/main/java/si/jernejtdo/LitePermissions/Spigot/data/UserData.java new file mode 100644 index 0000000..30b60f1 --- /dev/null +++ b/src/main/java/si/jernejtdo/LitePermissions/Spigot/data/UserData.java @@ -0,0 +1,85 @@ +package si.jernejtdo.LitePermissions.Spigot.data; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import java.util.*; + +public class UserData { + private UUID uuid; + private String prefix; + private String suffix; + private final Map permissions = new HashMap<>(); + private final Set groups = new HashSet<>(); + + public UserData(UUID uuid) { + this.uuid = uuid; + } + + // --- Group Management --- + + public void addGroup(GroupData group) { + groups.add(group); + } + + public void removeGroup(GroupData group) { + groups.remove(group); + } + + public Set getGroups() { + return groups; + } + + public GroupData getPrimaryGroup() { + return groups.stream() + .max(Comparator.comparingInt(GroupData::getWeight)) + .orElse(null); + } + + // --- Permission Logic --- + + public boolean hasPermission(String permission) { + // 1. User override + if (permissions.containsKey(permission)) { + return permissions.get(permission); + } + + // 2. Highest-weight group that defines the permission + return groups.stream() + .filter(g -> g.getPermissions().containsKey(permission)) + .max(Comparator.comparingInt(GroupData::getWeight)) + .map(g -> g.getPermissions().get(permission)) + .orElse(false); // default deny + } + + // --- Prefix/Suffix from Primary Group --- + + public String getPrefix() { + return prefix != null ? prefix : getPrimaryGroupPrefix(); + } + + public String getSuffix() { + return suffix != null ? suffix : getPrimaryGroupSuffix(); + } + + private String getPrimaryGroupPrefix() { + GroupData primary = getPrimaryGroup(); + return primary != null ? primary.getPrefix() : ""; + } + + private String getPrimaryGroupSuffix() { + GroupData primary = getPrimaryGroup(); + return primary != null ? primary.getSuffix() : ""; + } + + // --- Permission Map Access --- + + public Map getPermissions() { + return permissions; + } + + public void setPermission(String permission, boolean value) { + permissions.put(permission, value); + } +} diff --git a/target/classes/si/jernejtdo/LitePermissions/Spigot/LitePermissions.class b/target/classes/si/jernejtdo/LitePermissions/Spigot/LitePermissions.class index 812b9121a6451f9db20f5904c3a7ca1b11e99a91..79291eda92f852b7b0a8e019f7a40f93d3312816 100644 GIT binary patch literal 5168 zcmb_g>0cYi8GZ(^7sP@=7^v-%;Kaco2ugg!hpug}b`q?N!f@vmQ&(HzhFyyv{byZ^cQ4uC`Ww}A$M z{l1;PDm_PD4RUUJ$`0gt=`Gv7Z@Z44o+;XSH>jUB&?KF`8-geSg zt!q~LNq)}j-vV311%ZQ8_aG)C&|31PcghN^X{#u(ZAwch1$H6L39h%y*m=haN}d#$ ztz8|9{k(8t@>FJ16mpc6z7Pq`9H$5~@42O7g~NOdmK-7}1;6J=yA zXzQ5m*uimu#=)UEfu?acClhEyr-?SS8|V_~tm=Qp@)s#Tfh0OxAkbsNK(iXX&qOPl zm9=a~o-HjeNN?6!D9}R5DK~2s<}A-vzoW^fVA1vknq6nYQPT?IJ`-E8wHf^a-Jvi0 zZNJ|SEH9vjqobnLZKXl zB$RfY^95@~dQ&cgY|^Yq5%9aSOd4Z6fknoHuYz;Qko$Mq5>sJ}q!~FwU>e@A0J? z40>KUdB(&nE(o+KjqT-PL7ugiY1HjxT6INKf0C^3^CmusivqpN){>-WvsN%~2aDRr zmQIp^c&J4uHvmiEGCpkJL(Ge+po!OL@Dk5QVgk zH<~|2GYmmiobn!lU2y}{*+xL9dJ+Suh-XIi)RwfBV!5pK#13eQVJ5MbB5JZMcr_1)Mee}Wy{Iwv}9o&4}XT68GYBWV&HkERV@1M zcErTTRIP4RwYpNIjpcH=PR6Vi1%p6?l@-`C^}o$Rd$wG0y=5y1WR5}@rR6JBU?K`M zeQWEBcyraW_9kw{=kNsspQq<^9F}_k6JNxa=v0ansEO&jm6)#xJi3`%sD=Ztea4wDh^#ze1Bx(Mf{k%v#t|Zw&On~SL(WfvSTi(-bx0QCP?5+T)j$7 z+O(r8NSOqFj$a!1Ma?A^0-E@hs-&%fJLO(y!dkvG@Ed`B?_CT7!qH{e^lQ|Z+(3=Z zo4l%p>H=Hxunq3Yt!^5s&_HKzGo{oMbn%ib1B zkMX>C2T}2k@?H$0diunSTk^8bhi(YiiuRHYar=cMZfe&AWfX&EfKIhOU;@uq<{ zSQD#BXgk;3B^kB;;YEAeQjOP&x`9^(UW^Arv^xYm!}4B`{+=nNiXftlH9~-dh zjMP7H=!O1)D}v!Q>9BRxSFGf%_m03r>&&x}!Uk^hp>g-Ed_jiR!ERoUxjBM zK8_bCqM5<-34D@5y6EXoaZW|xr}3Fc{7J4T#_g#$&^^3{&o7TYE)D zJHCpq5l7(b_(p_xE^7v%HG%Kr z2NC$=5!u#=><=68GP%ctXfnpMwF28(VfqvNGy8uWBgkhWB^Y_!oBk7sH@N#{d8T delta 1278 zcmY*Z-%}e^6#nk+CO2$1AtV%}5C|zIWD{5`R4Ap?5>eX{0;1JgTN_}B%a5haF0|Ha zto6r(Po3+VGrsy-bS4!X9bcSrI?njypWu`KfzCLd-7+D~!#!v3{mys3bI!eaI9TtD zKK^h2X8>dPfc%I{gm{wBq2u4LknaI4r(6v>q7)#sh>y~SnJErX#vzFtUwpsNgj%zrD3Gthf z?wiCE#~FsUrhrAWx?@%~oW+YG95@}E#!DOpF&7x%J(!{JL2*y+7GDK=Lm9lH;Z>X$ z`+;2WqJ~)%#ovLM{t^~A=BY`Cf@f|on>So*%hvE3LSiBKt8$GYB~FA=?JBO~NQ{(S z^t>ev%fvI!+xtvZI98vQH|>|D;XPR5J}(51FrpEuvuPE}0xhkaaso-tg z;do!13uon7d>}T%-zc|2_(-%yQsW;}_H=pHa?N?Ox@kEMX>*e4vAfBl={V(zIgw1S zG6wCuO?~qxVmci6#r25JJ`-O?MrsVIcOU3B1xY+dh}IVRGRQKr0sRrwU2-I72Ov;L zn0)OC01-c&hTjNYAhZ|Useg~C9*fn{uE(CKRxJg1Vb1_yI)=j$?p?dG&dgel;lHA^MQK=K6a5V2_G< z7oX0a^$}@5^f5grnZD2DCN$K0-;f3!xAxJ1=^z4c^+B*sZxhBA&KjdAiOk@fZHgrlqn#dzK#UMHG3`tb%X zk;-vGyotBSyG+OqvQJQNH&9n-?;YBu|BYK5C8b6u^ww$hnsSp)y&Q=jarN>eyj#rY z_Ho_QU7q^^D?@u&lW;h_m=Dg=ScXW%Fty5P5}IfTO<)T*C`E{ddlOYk5~pE1v?mW! gCtb=YVH-PSBjnvB=!gDV!#&#b-uox`6rZE(e+rV)NdN!< diff --git a/target/classes/si/jernejtdo/LitePermissions/Spigot/Permissible/CustomPermissible.class b/target/classes/si/jernejtdo/LitePermissions/Spigot/Permissible/CustomPermissible.class index c6d072510f7c92f30255ecfb171769b3490a7d68..4bf023fd56f64d180a0964bcb09076295ef37c60 100644 GIT binary patch literal 4675 zcmcIo`Fk5z6+KUuHMTrSTqkzwG!(_8u9qZA>MX=c(>luLMovr}C&Zz^SQ^V?k7iWO zD8y_nrO>kPP?voTOG{hQIz=@bSxN=DqvQyUTg^-lwyO4nroL*y%z+cX*;LK(SQ~e3Yrvb5V&)#U78`VNkt=K3hof-n$fOk zNmH}($zjvf^O`wS%9jgN?8McqUUcb>CTteiyUPBAZJBckr(7)BCD%##HY5zoaWyNe zJ8`t4UFy>z(B6{?wi$CvhL!ge-;^;d{cO1~sh7@cbh1EO#?ETy1+8Sr@5*4*oi-eS zbmo7KnRKyT^tZZqogNn0Fy?C6*%7Vi>7(G?0{4X6yLNQAbXs$&T(GS*JTVbxOx~kn zCw2(5W~cS+Y_Nug#|-PNR`9&D%8jJpnp6ouQoY=x7ySzQ1a_>Udmyf27j_FMdENCl z-qO>%I)Wr#k(8(EYk4w2OvSMe0}AdF7+6mfR~$$c`*A>^nF@`X<-9>p9->OOfs|^2 zibE>ii^Bpf#2dGaN6Y$fj@+vnS#}LGIX*so+|xRx;t1}q2s?V|xaMjCCn}T*6Qwr%Q~6~`#XRGi1SfI8`qUC_)j>E6)OJJE!T^iY`&lODRHVgi?aBAhDOEA zSOY|j1qv!G*aC5_STyH`oMDT4@2oL%8S}i&*^?EWsp+F|6i|aLfu?D@P}ICSqryd* z0m^zK%-bEF>8QIOi24&E&!S7(Suk<2<#2 zy46_~pOkEBHXKI6VJVZ+k4w&eisn_l;nlolZho5aUH8HBs3-G498VxEAN_5J;3*YP z<8zF4L7UanwnYkDG~8*v$(rbrtIXBG0U*=7Lb!TJ<|raI;ENLRO9E%=tXsWoV)am+ zv@J97S5$me7Unj3CnxpeQ5?}7N6VA$Y*qXed*HSbEHnJN*43miS(q8CvPr&*33*2C zaw$t?Hs|Frmu?JF8-wUu>YajW)Ctj1+da$`s~yBcb>xq%U(4lqr;er+e2+zXWfZHm z$?x&DlVhPGyRyq`GPS~FPTRRxV7Ojj|9c)XFVk;%f&I5*6!XQH=kAk+?7=!#wR(G` zxwM)o+hx+xiX*x^ZRgnIUBj;w{IaHvG^{K3te(txHd0WV(z5JS=T!U}zhR9j1VaLE zhwZPd^ubSSR?gI&of+GnEf-U(sT~@rS$Ljd4~wsV(%PCK=r-wyzcvB-@ zx$S)kz7)qF@VbK6SUduzSIqU(mY?2ERzv$VZV5c|{|{y*XI>5kzfQ+dCosQn!k=VE zE3?UtbgxI^mOYS=^adT9~6o1Lzn#|G?);Nu=EXEmR?Gmn&ap! zlz-zLV3lj?F;~G`0(ZZ&DD$09bL=2@8rXU;HOng+-(q~{rH;>Lem&0F2!Ff!`fniK z{|3}~Z0zg51@#qdyoL?0qV-Z++YM}a{Uu5@U@M>7Jed5Lo`pAzT(3Qn`c>8S(N6@qGBhHAzhBt0nJoO~!TPcs!lUcZUGBfI)u z#>Pb)6j;FE*@lDBwxffMyWhlPyBF|a{~}ICFpuq(k4yx&FuH(;DRyD7@ft31;{A*G z0GYCcNnjCE5iG$3Zlbt|D-jIFI%5m?=sfnw-^Xs@i3L1K+z?bS@tGxjmM&|oDD`>5 zwnsY~m+%Epy)U;%rT?Oy{~l(HKrcn(S@C^AhPc)S-_eY-Ph-Axl$(FSIXMt?_u7Z6EhU6RY zPmELg`^5Ak?uQL%lo5K7OT)xDbDWk&c_yg|u7de1-OP0Gn^{#X1R|3K$|0KQ8# A`2YX_ delta 399 zcmXX>%T5A85UgQAmfdC7MF^|`gGLCiL^!BCeB%ogMLiqkfC&krVL!mT*FKpT{Q(b{ z7$Y3Gc=Koc17izj(o-4=iiTA(J(lEX-%`#~q)R1D5w$R}i+wltXwjRL3aC)S`;^_0aVQXsH$?m@T5oo* zTejW0=_E#jq<~iGbei3AyJ6c++l^zY>nZ1nzzlt>LF%b)depJ54yO9JTue-G~{NiQrq*bnHV#W^?; zXP!WaXVI}47N(hT3}UPb-U(n0>+BTRz$V`wRu>orqwDXT9yj!CYNgC5NgFHwNfNeL XcA$)HMwzuL*8ytG6z+~t$0@8|A^Sd=