From 469a504e489c48c18ce05c700c42c2f1cf039434 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 29 Aug 2023 15:03:39 +0200 Subject: [PATCH 1/4] UserPerm model Signed-off-by: Lixfel --- src/de/steamwar/sql/SteamwarUser.java | 53 ++++++++++++++---------- src/de/steamwar/sql/UserGroup.java | 1 + src/de/steamwar/sql/UserPerm.java | 59 +++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 21 deletions(-) create mode 100644 src/de/steamwar/sql/UserPerm.java diff --git a/src/de/steamwar/sql/SteamwarUser.java b/src/de/steamwar/sql/SteamwarUser.java index c2fcc29..d1070d2 100644 --- a/src/de/steamwar/sql/SteamwarUser.java +++ b/src/de/steamwar/sql/SteamwarUser.java @@ -82,27 +82,27 @@ public class SteamwarUser { SteamwarUser user = usersByName.get(userName.toLowerCase()); if(user != null) return user; - return loadPunishments(byName.select(userName)); + return byName.select(userName); } public static SteamwarUser get(UUID uuid){ SteamwarUser user = usersByUUID.get(uuid); if(user != null) return user; - return loadPunishments(byUUID.select(uuid)); + return byUUID.select(uuid); } public static SteamwarUser get(int id) { SteamwarUser user = usersById.get(id); if(user != null) return user; - return loadPunishments(byID.select(id)); + return byID.select(id); } public static SteamwarUser get(Long discordId) { if(usersByDiscord.containsKey(discordId)) return usersByDiscord.get(discordId); - return loadPunishments(byDiscord.select(discordId)); + return byDiscord.select(discordId); } public static SteamwarUser getOrCreate(UUID uuid, String name, Consumer newPlayer, BiConsumer nameUpdate) { @@ -124,11 +124,11 @@ public class SteamwarUser { } public static List getServerTeam() { - return loadPunishments(getServerTeam.listSelect()); + return getServerTeam.listSelect(); } public static List getTeam(int teamId) { - return loadPunishments(byTeam.listSelect(teamId)); + return byTeam.listSelect(teamId); } public static void batchCache(Set ids) { @@ -137,23 +137,10 @@ public class SteamwarUser { return; try (SelectStatement batch = new SelectStatement<>(table, "SELECT * FROM UserData WHERE id IN (" + ids.stream().map(Object::toString).collect(Collectors.joining(", ")) + ")")) { - loadPunishments(batch.listSelect()); + batch.listSelect(); } } - private static List loadPunishments(List users) { - users.forEach(user -> user.punishments = Punishment.getPunishmentsOfPlayer(user.getId())); - return users; - } - - private static SteamwarUser loadPunishments(SteamwarUser user) { - if(user == null) - return null; - - user.punishments = Punishment.getPunishmentsOfPlayer(user.getId()); - return user; - } - @Getter @Field(keys = {Table.PRIMARY}, autoincrement = true) private final int id; @@ -162,6 +149,7 @@ public class SteamwarUser { @Getter @Field private String userName; + @Deprecated @Getter @Field(def = "'Member'") private final UserGroup userGroup; @@ -179,7 +167,8 @@ public class SteamwarUser { @Field(keys = {"discordId"}, nullable = true) private Long discordId; - private Map punishments; + private Map punishments = null; + private Set permissions = null; public SteamwarUser(int id, UUID uuid, String userName, UserGroup userGroup, int team, boolean leader, Locale locale, boolean manualLocale, Long discordId) { this.id = id; @@ -211,10 +200,12 @@ public class SteamwarUser { } public Punishment getPunishment(Punishment.PunishmentType type) { + initPunishments(); return punishments.getOrDefault(type, null); } public boolean isPunished(Punishment.PunishmentType punishment) { + initPunishments(); if (!punishments.containsKey(punishment)) { return false; } @@ -228,6 +219,11 @@ public class SteamwarUser { return true; } + public boolean hasPerm(UserPerm perm) { + initPerms(); + return permissions.contains(perm); + } + public double getOnlinetime() { return getPlaytime.select(rs -> { if (rs.next() && rs.getBigDecimal("Playtime") != null) @@ -245,6 +241,7 @@ public class SteamwarUser { } public void punish(Punishment.PunishmentType punishment, Timestamp time, String banReason, int from, boolean perma) { + initPunishments(); punishments.remove(punishment); punishments.put(punishment, Punishment.createPunishment(id, from, punishment, banReason, time, perma)); } @@ -277,4 +274,18 @@ public class SteamwarUser { usersByDiscord.put(discordId, this); } } + + private void initPunishments() { + if(punishments != null) + return; + + punishments = Punishment.getPunishmentsOfPlayer(id); + } + + private void initPerms() { + if(permissions != null) + return; + + permissions = UserPerm.getPerms(id); + } } diff --git a/src/de/steamwar/sql/UserGroup.java b/src/de/steamwar/sql/UserGroup.java index aea2dba..6a2b1ad 100644 --- a/src/de/steamwar/sql/UserGroup.java +++ b/src/de/steamwar/sql/UserGroup.java @@ -22,6 +22,7 @@ package de.steamwar.sql; import lombok.AllArgsConstructor; import lombok.Getter; +@Deprecated @AllArgsConstructor public enum UserGroup { Admin("§4", "§e", "Admin", true, true, true, true), diff --git a/src/de/steamwar/sql/UserPerm.java b/src/de/steamwar/sql/UserPerm.java new file mode 100644 index 0000000..2f92048 --- /dev/null +++ b/src/de/steamwar/sql/UserPerm.java @@ -0,0 +1,59 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2023 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.sql; + +import de.steamwar.sql.internal.Field; +import de.steamwar.sql.internal.SelectStatement; +import de.steamwar.sql.internal.SqlTypeMapper; +import de.steamwar.sql.internal.Table; +import lombok.AllArgsConstructor; + +import java.util.Set; +import java.util.stream.Collectors; + +public enum UserPerm { + YOUTUBE, + GUIDE, + BUILD, + CHECK, + TEAM, + MODERATION, + DEVELOPMENT, + ADMIN; + + static { + SqlTypeMapper.nameEnumMapper(UserPerm.class); + } + + private static final Table table = new Table<>(UserPermTable.class, "UserPerm"); + private static final SelectStatement getPerms = table.selectFields("user"); + + public static Set getPerms(int user) { + return getPerms.listSelect(user).stream().map(up -> up.perm).collect(Collectors.toSet()); + } + + @AllArgsConstructor + private static class UserPermTable { + @Field(keys = {Table.PRIMARY}) + private final int user; + @Field(keys = {Table.PRIMARY}) + private final UserPerm perm; + } +} From 96d55a7ac671718fa1c562617cd4d203dac11a67 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 29 Aug 2023 16:01:13 +0200 Subject: [PATCH 2/4] Changed UserPerms Signed-off-by: Lixfel --- src/de/steamwar/sql/UserPerm.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/de/steamwar/sql/UserPerm.java b/src/de/steamwar/sql/UserPerm.java index 2f92048..35006f3 100644 --- a/src/de/steamwar/sql/UserPerm.java +++ b/src/de/steamwar/sql/UserPerm.java @@ -29,14 +29,18 @@ import java.util.Set; import java.util.stream.Collectors; public enum UserPerm { - YOUTUBE, - GUIDE, + PREFIX_YOUTUBER, + PREFIX_GUIDE, + PREFIX_BUILDER, + PREFIX_SUPPORTER, + PREFIX_MODERATOR, + PREFIX_DEVELOPER, + PREFIX_ADMIN, + + TEAM, BUILD, CHECK, - TEAM, - MODERATION, - DEVELOPMENT, - ADMIN; + MODERATION; static { SqlTypeMapper.nameEnumMapper(UserPerm.class); From fc1e7c60d7eed04aebc336c3c69de0dcdf1d002e Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 29 Aug 2023 17:46:46 +0200 Subject: [PATCH 3/4] Updated UserPerms Signed-off-by: Lixfel --- src/de/steamwar/sql/SteamwarUser.java | 12 +++++++++++ src/de/steamwar/sql/UserPerm.java | 29 +++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/de/steamwar/sql/SteamwarUser.java b/src/de/steamwar/sql/SteamwarUser.java index d1070d2..1c4c173 100644 --- a/src/de/steamwar/sql/SteamwarUser.java +++ b/src/de/steamwar/sql/SteamwarUser.java @@ -169,6 +169,7 @@ public class SteamwarUser { private Map punishments = null; private Set permissions = null; + private UserPerm.Prefix prefix = null; public SteamwarUser(int id, UUID uuid, String userName, UserGroup userGroup, int team, boolean leader, Locale locale, boolean manualLocale, Long discordId) { this.id = id; @@ -224,6 +225,16 @@ public class SteamwarUser { return permissions.contains(perm); } + public Set perms() { + initPerms(); + return permissions; + } + + public UserPerm.Prefix prefix() { + initPerms(); + return prefix; + } + public double getOnlinetime() { return getPlaytime.select(rs -> { if (rs.next() && rs.getBigDecimal("Playtime") != null) @@ -287,5 +298,6 @@ public class SteamwarUser { return; permissions = UserPerm.getPerms(id); + prefix = permissions.stream().filter(UserPerm.prefixes::containsKey).findAny().map(UserPerm.prefixes::get).orElse(UserPerm.emptyPrefix); } } diff --git a/src/de/steamwar/sql/UserPerm.java b/src/de/steamwar/sql/UserPerm.java index 35006f3..25d63b2 100644 --- a/src/de/steamwar/sql/UserPerm.java +++ b/src/de/steamwar/sql/UserPerm.java @@ -24,11 +24,13 @@ import de.steamwar.sql.internal.SelectStatement; import de.steamwar.sql.internal.SqlTypeMapper; import de.steamwar.sql.internal.Table; import lombok.AllArgsConstructor; +import lombok.Getter; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; public enum UserPerm { + PREFIX_NONE, // special value, not stored in database PREFIX_YOUTUBER, PREFIX_GUIDE, PREFIX_BUILDER, @@ -37,13 +39,29 @@ public enum UserPerm { PREFIX_DEVELOPER, PREFIX_ADMIN, + RESTRICTED_MODS, TEAM, BUILD, CHECK, - MODERATION; + MODERATION, + ADMINISTRATION; + public static final Map prefixes; + public static final Prefix emptyPrefix; static { SqlTypeMapper.nameEnumMapper(UserPerm.class); + Map p = new EnumMap<>(UserPerm.class); + emptyPrefix = new Prefix("§7", ""); + p.put(PREFIX_NONE, emptyPrefix); + p.put(PREFIX_YOUTUBER, new Prefix("§5", "YT")); + p.put(PREFIX_GUIDE, new Prefix("§f", "Guide")); + + p.put(PREFIX_BUILDER, new Prefix("§2", "Arch")); + p.put(PREFIX_SUPPORTER, new Prefix("§9", "Sup")); + p.put(PREFIX_MODERATOR, new Prefix("§6", "Mod")); + p.put(PREFIX_DEVELOPER, new Prefix("§b", "Dev")); + p.put(PREFIX_ADMIN, new Prefix("§4", "Admin")); + prefixes = Collections.unmodifiableMap(p); } private static final Table table = new Table<>(UserPermTable.class, "UserPerm"); @@ -53,6 +71,13 @@ public enum UserPerm { return getPerms.listSelect(user).stream().map(up -> up.perm).collect(Collectors.toSet()); } + @Getter + @AllArgsConstructor + public static class Prefix { + private final String colorCode; + private final String chatPrefix; + } + @AllArgsConstructor private static class UserPermTable { @Field(keys = {Table.PRIMARY}) From 4eadcb4b09c0747cd1726c7f6cfe86ff07e59ea2 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 29 Aug 2023 18:05:26 +0200 Subject: [PATCH 4/4] Update ColorChat Perm Signed-off-by: Lixfel --- src/de/steamwar/sql/UserPerm.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/de/steamwar/sql/UserPerm.java b/src/de/steamwar/sql/UserPerm.java index 25d63b2..386bfc5 100644 --- a/src/de/steamwar/sql/UserPerm.java +++ b/src/de/steamwar/sql/UserPerm.java @@ -40,6 +40,7 @@ public enum UserPerm { PREFIX_ADMIN, RESTRICTED_MODS, + COLOR_CHAT, TEAM, BUILD, CHECK,