Skip to content

Commit 812d1b8

Browse files
committed
Fix guild storage and role permissions
1 parent d7b8963 commit 812d1b8

10 files changed

Lines changed: 632 additions & 46 deletions

File tree

‎src/main/java/dev/plex/Guilds.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public void enable()
4646
ModuleStorage storage = api().storage().forModule(this);
4747
try
4848
{
49-
storage.migrations().run(List.of("001_initial_schema", "002_guild_world_permissions"));
49+
storage.migrations().run(List.of("001_initial_schema", "002_guild_world_permissions", "003_role_permissions"));
5050
}
5151
catch (SQLException e)
5252
{

‎src/main/java/dev/plex/dialog/GuildDialogService.java‎

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@
2727

2828
public class GuildDialogService
2929
{
30-
private static final UUID MEMBER_PERMISSION_PROBE = new UUID(0L, 0L);
31-
3230
public void openHome(Player player, Guild guild)
3331
{
3432
player.showDialog(dialog(
@@ -40,7 +38,7 @@ public void openHome(Player player, Guild guild)
4038
List.of(
4139
button("Members", "View online status and manage members", audience -> player(audience, viewer -> openMembers(viewer, guild))),
4240
button("Guild World", "Load and enter your ASP guild world", audience -> player(audience, viewer -> enterWorld(viewer, guild))),
43-
button("Permissions", "Configure member block permissions", audience -> player(audience, viewer -> openPermissions(viewer, guild)))
41+
button("Permissions", "Configure role block permissions", audience -> player(audience, viewer -> openPermissions(viewer, guild)))
4442
),
4543
1
4644
));
@@ -102,27 +100,52 @@ public void openPermissions(Player player, Guild guild)
102100
return;
103101
}
104102
List<ActionButton> buttons = new ArrayList<>();
105-
for (GuildPermission permission : GuildPermission.values())
103+
for (GuildRole role : GuildRole.values())
106104
{
107-
boolean enabled = guild.hasPermission(MEMBER_PERMISSION_PROBE, permission);
108105
buttons.add(button(
109-
permission.displayName() + ": " + (enabled ? "Enabled" : "Disabled"),
110-
"Click to toggle " + permission.displayName().toLowerCase(),
111-
audience -> player(audience, viewer -> togglePermission(viewer, guild, permission))
106+
role.name(),
107+
"Edit " + role.name().toLowerCase() + " permissions",
108+
audience -> player(audience, viewer -> openRolePermissions(viewer, guild, role))
112109
));
113110
}
114111
buttons.add(button("Back", "Return to the guild menu", audience -> player(audience, viewer -> openHome(viewer, guild))));
115112
player.showDialog(dialog(
116-
title("Member Permissions"),
113+
title("Role Permissions"),
117114
List.of(
118-
body("These permissions apply to regular guild members in the guild world.", NamedTextColor.GRAY),
119-
body("Owners always bypass these restrictions.", NamedTextColor.GOLD)
115+
body("Choose a guild role to configure.", NamedTextColor.GRAY),
116+
body("Permissions apply inside the guild world.", NamedTextColor.DARK_AQUA)
120117
),
121118
buttons,
122119
1
123120
));
124121
}
125122

123+
private void openRolePermissions(Player player, Guild guild, GuildRole role)
124+
{
125+
if (!guild.isOwner(player.getUniqueId()))
126+
{
127+
player.sendMessage(Guilds.get().messageComponent("guildNotOwner"));
128+
return;
129+
}
130+
List<ActionButton> buttons = new ArrayList<>();
131+
for (GuildPermission permission : GuildPermission.values())
132+
{
133+
boolean enabled = guild.permissions(role).hasPermission(permission);
134+
buttons.add(button(
135+
permission.displayName() + ": " + (enabled ? "Enabled" : "Disabled"),
136+
"Click to toggle " + permission.displayName().toLowerCase(),
137+
audience -> player(audience, viewer -> togglePermission(viewer, guild, role, permission))
138+
));
139+
}
140+
buttons.add(button("Back", "Return to role list", audience -> player(audience, viewer -> openPermissions(viewer, guild))));
141+
player.showDialog(dialog(
142+
title(role.name() + " Permissions"),
143+
List.of(body("Configure " + role.name().toLowerCase() + " permissions for this guild world.", NamedTextColor.GRAY)),
144+
buttons,
145+
1
146+
));
147+
}
148+
126149
private void enterWorld(Player player, Guild guild)
127150
{
128151
player.sendMessage(Guilds.get().messageComponent("guildWorldLoading"));
@@ -151,6 +174,7 @@ private void kickMember(Player player, Guild guild, Member member)
151174
{
152175
if (throwable != null)
153176
{
177+
Guilds.get().getLogger().error("Failed to update guild role permission", throwable);
154178
player.sendMessage(Guilds.get().messageComponent("guildStorageFailed"));
155179
return;
156180
}
@@ -187,18 +211,18 @@ private void transferOwner(Player player, Guild guild, Member member)
187211
});
188212
}
189213

190-
private void togglePermission(Player player, Guild guild, GuildPermission permission)
214+
private void togglePermission(Player player, Guild guild, GuildRole role, GuildPermission permission)
191215
{
192-
boolean enabled = !guild.hasPermission(MEMBER_PERMISSION_PROBE, permission);
193-
guild.setPermission(permission, enabled);
194-
Guilds.get().getGuildRepository().updateMemberPermission(guild.getGuildUuid(), permission, enabled).whenComplete((unused, throwable) ->
216+
boolean enabled = !guild.permissions(role).hasPermission(permission);
217+
guild.setPermission(role, permission, enabled);
218+
Guilds.get().getGuildRepository().updateRolePermission(guild.getGuildUuid(), role, permission, enabled).whenComplete((unused, throwable) ->
195219
{
196220
if (throwable != null)
197221
{
198222
player.sendMessage(Guilds.get().messageComponent("guildStorageFailed"));
199223
return;
200224
}
201-
openPermissions(player, guild);
225+
openRolePermissions(player, guild, role);
202226
});
203227
}
204228

‎src/main/java/dev/plex/guild/Guild.java‎

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import dev.plex.Guilds;
66
import dev.plex.guild.data.GuildPermission;
77
import dev.plex.guild.data.GuildRole;
8+
import dev.plex.guild.data.GuildRolePermissions;
89
import dev.plex.guild.data.Member;
910
import dev.plex.api.player.PlexPlayerView;
1011
import dev.plex.util.CustomLocation;
@@ -19,6 +20,7 @@
1920
import java.util.Map;
2021
import java.util.Objects;
2122
import java.util.UUID;
23+
import java.util.EnumMap;
2224

2325
@Data
2426
public class Guild
@@ -27,6 +29,7 @@ public class Guild
2729
private final ZonedDateTime createdAt;
2830
private final List<Member> members = Lists.newArrayList();
2931
private final Map<String, CustomLocation> warps = Maps.newHashMap();
32+
private final Map<GuildRole, GuildRolePermissions> rolePermissions = new EnumMap<>(GuildRole.class);
3033
private String name;
3134
private UUID ownerUuid;
3235
private String prefix;
@@ -102,29 +105,39 @@ public String getWorldName()
102105

103106
public boolean hasPermission(UUID uuid, GuildPermission permission)
104107
{
105-
if (isOwner(uuid))
106-
{
107-
return true;
108-
}
109-
if (!isMember(uuid))
108+
Member member = getMember(uuid);
109+
if (member == null)
110110
{
111111
return false;
112112
}
113-
return switch (permission)
113+
return permissions(member.getRole()).hasPermission(permission);
114+
}
115+
116+
public GuildRolePermissions permissions(GuildRole role)
117+
{
118+
return rolePermissions.computeIfAbsent(role, GuildRolePermissions::defaults);
119+
}
120+
121+
public void setPermission(GuildRole role, GuildPermission permission, boolean enabled)
122+
{
123+
GuildRolePermissions updated = permissions(role).withPermission(permission, enabled);
124+
rolePermissions.put(role, updated);
125+
if (role == GuildRole.MEMBER)
114126
{
115-
case BLOCK_BREAKING -> memberBlockBreaking;
116-
case BLOCK_PLACING -> memberBlockPlacing;
117-
case INTERACTING -> memberInteracting;
118-
};
127+
memberBlockBreaking = updated.blockBreaking();
128+
memberBlockPlacing = updated.blockPlacing();
129+
memberInteracting = updated.interacting();
130+
}
119131
}
120132

121-
public void setPermission(GuildPermission permission, boolean enabled)
133+
public void setRolePermissions(GuildRole role, GuildRolePermissions permissions)
122134
{
123-
switch (permission)
135+
rolePermissions.put(role, permissions);
136+
if (role == GuildRole.MEMBER)
124137
{
125-
case BLOCK_BREAKING -> memberBlockBreaking = enabled;
126-
case BLOCK_PLACING -> memberBlockPlacing = enabled;
127-
case INTERACTING -> memberInteracting = enabled;
138+
memberBlockBreaking = permissions.blockBreaking();
139+
memberBlockPlacing = permissions.blockPlacing();
140+
memberInteracting = permissions.interacting();
128141
}
129142
}
130143
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package dev.plex.guild.data;
2+
3+
public record GuildRolePermissions(boolean blockBreaking, boolean blockPlacing, boolean interacting)
4+
{
5+
public static GuildRolePermissions defaults(GuildRole role)
6+
{
7+
return role == GuildRole.OWNER ? new GuildRolePermissions(true, true, true) : new GuildRolePermissions(false, false, false);
8+
}
9+
10+
public boolean hasPermission(GuildPermission permission)
11+
{
12+
return switch (permission)
13+
{
14+
case BLOCK_BREAKING -> blockBreaking;
15+
case BLOCK_PLACING -> blockPlacing;
16+
case INTERACTING -> interacting;
17+
};
18+
}
19+
20+
public GuildRolePermissions withPermission(GuildPermission permission, boolean enabled)
21+
{
22+
return switch (permission)
23+
{
24+
case BLOCK_BREAKING -> new GuildRolePermissions(enabled, blockPlacing, interacting);
25+
case BLOCK_PLACING -> new GuildRolePermissions(blockBreaking, enabled, interacting);
26+
case INTERACTING -> new GuildRolePermissions(blockBreaking, blockPlacing, enabled);
27+
};
28+
}
29+
}

‎src/main/java/dev/plex/storage/GuildRepository.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public interface GuildRepository
2626

2727
CompletableFuture<Void> transferOwner(UUID guildUuid, UUID newOwnerUuid, UUID oldOwnerUuid);
2828

29-
CompletableFuture<Void> updateMemberPermission(UUID guildUuid, GuildPermission permission, boolean enabled);
29+
CompletableFuture<Void> updateRolePermission(UUID guildUuid, GuildRole role, GuildPermission permission, boolean enabled);
3030

3131
CompletableFuture<Void> updatePrefix(UUID guildUuid, String prefix);
3232

0 commit comments

Comments
 (0)