154 Zeilen
5.4 KiB
Java
154 Zeilen
5.4 KiB
Java
|
/*
|
||
|
* This file is a part of the SteamWar software.
|
||
|
*
|
||
|
* Copyright (C) 2022 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 <https://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
package de.steamwar.sql;
|
||
|
|
||
|
import de.steamwar.sql.internal.*;
|
||
|
import lombok.Getter;
|
||
|
|
||
|
import java.util.*;
|
||
|
|
||
|
public class SteamwarUser {
|
||
|
|
||
|
static {
|
||
|
new SqlTypeMapper<>(UUID.class, "CHAR(36)", (rs, identifier) -> UUID.fromString(rs.getString(identifier)), (st, index, value) -> st.setString(index, value.toString()));
|
||
|
new SqlTypeMapper<>(Locale.class, "VARCHAR(32)", (rs, identifier) -> {
|
||
|
String l = rs.getString(identifier);
|
||
|
return l != null ? Locale.forLanguageTag(l) : null;
|
||
|
}, (st, index, value) -> st.setString(index, value.toLanguageTag()));
|
||
|
SqlTypeMapper.nameEnumMapper(UserGroup.class);
|
||
|
new SqlTypeMapper<>(SteamwarUser.class, null, (rs, identifier) -> { throw new SecurityException("SteamwarUser cannot be used as type (recursive select)"); }, (st, index, value) -> st.setInt(index, value.id));
|
||
|
}
|
||
|
|
||
|
private static final Table<SteamwarUser> table = new Table<>(SteamwarUser.class, "UserData");
|
||
|
private static final Statement insert = table.insertFields("UUID", "UserName");
|
||
|
private static final SelectStatement<SteamwarUser> byID = table.selectFields("id");
|
||
|
private static final SelectStatement<SteamwarUser> byUUID = table.selectFields("UUID");
|
||
|
private static final SelectStatement<SteamwarUser> byName = table.selectFields("UserName");
|
||
|
private static final SelectStatement<SteamwarUser> byDiscord = table.selectFields("DiscordId");
|
||
|
private static final SelectStatement<SteamwarUser> getServerTeam = new SelectStatement<>(table, "SELECT * FROM UserData WHERE UserGroup != 'Member' AND UserGroup != 'YouTuber'");
|
||
|
private static final Statement updateName = table.update(Table.PRIMARY, "UserName");
|
||
|
private static final Statement updateLocale = table.update(Table.PRIMARY, "Locale", "ManualLocale");
|
||
|
private static final Statement updateTeam = table.update(Table.PRIMARY, "Team");
|
||
|
private static final Statement updateLeader = table.update(Table.PRIMARY, "Leader");
|
||
|
private static final Statement updateDiscord = table.update(Table.PRIMARY, "DiscordId");
|
||
|
|
||
|
private static final Map<Integer, SteamwarUser> usersById = new HashMap<>();
|
||
|
private static final Map<UUID, SteamwarUser> usersByUUID = new HashMap<>();
|
||
|
private static final Map<String, SteamwarUser> usersByName = new HashMap<>();
|
||
|
private static final Map<Long, SteamwarUser> usersByDiscord = new HashMap<>();
|
||
|
public static void clear() {
|
||
|
usersById.clear();
|
||
|
usersByName.clear();
|
||
|
usersByUUID.clear();
|
||
|
usersByDiscord.clear();
|
||
|
}
|
||
|
|
||
|
public static void invalidate(int userId) {
|
||
|
SteamwarUser user = usersById.remove(userId);
|
||
|
if (user == null)
|
||
|
return;
|
||
|
usersByName.remove(user.getUserName());
|
||
|
usersByUUID.remove(user.getUUID());
|
||
|
}
|
||
|
|
||
|
@Getter
|
||
|
@Field(keys = {Table.PRIMARY}, autoincrement = true)
|
||
|
private final int id;
|
||
|
@Field(keys = {"uuid"})
|
||
|
private final UUID uuid;
|
||
|
@Getter
|
||
|
@Field
|
||
|
private String userName;
|
||
|
@Getter
|
||
|
@Field(def = "'Member'")
|
||
|
private final UserGroup userGroup;
|
||
|
@Getter
|
||
|
@Field(def = "0")
|
||
|
private int team;
|
||
|
@Field(def = "0")
|
||
|
private boolean leader;
|
||
|
@Field(nullable = true)
|
||
|
private Locale locale;
|
||
|
@Field(def = "0")
|
||
|
private boolean manualLocale;
|
||
|
@Field(keys = {"discordId"}, nullable = true)
|
||
|
private Long discordId;
|
||
|
|
||
|
public SteamwarUser(int id, UUID uuid, String userName, UserGroup userGroup, int team, boolean leader, Locale locale, boolean manualLocale, Long discordId) {
|
||
|
this.id = id;
|
||
|
this.uuid = uuid;
|
||
|
this.userName = userName;
|
||
|
this.userGroup = userGroup;
|
||
|
this.team = team;
|
||
|
this.leader = leader;
|
||
|
this.locale = locale;
|
||
|
this.manualLocale = manualLocale;
|
||
|
this.discordId = discordId != 0 ? discordId : null;
|
||
|
|
||
|
usersById.put(id, this);
|
||
|
usersByName.put(userName.toLowerCase(), this);
|
||
|
usersByUUID.put(uuid, this);
|
||
|
if (this.discordId != null) {
|
||
|
usersByDiscord.put(discordId, this);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public UUID getUUID() {
|
||
|
return uuid;
|
||
|
}
|
||
|
|
||
|
public Locale getLocale() {
|
||
|
if(locale != null)
|
||
|
return locale;
|
||
|
return Locale.getDefault(); //TODO test correct locale on join (z.B. FightSystem Hotbarkit)
|
||
|
}
|
||
|
|
||
|
public static SteamwarUser get(String userName){
|
||
|
SteamwarUser user = usersByName.get(userName.toLowerCase());
|
||
|
if(user != null)
|
||
|
return user;
|
||
|
return byName.select(userName);
|
||
|
}
|
||
|
|
||
|
public static SteamwarUser get(UUID uuid){
|
||
|
SteamwarUser user = usersByUUID.get(uuid);
|
||
|
if(user != null)
|
||
|
return user;
|
||
|
return byUUID.select(uuid);
|
||
|
}
|
||
|
|
||
|
public static SteamwarUser get(int id) {
|
||
|
SteamwarUser user = usersById.get(id);
|
||
|
if(user != null)
|
||
|
return user;
|
||
|
return byID.select(id);
|
||
|
}
|
||
|
|
||
|
public static SteamwarUser get(Long discordId) {
|
||
|
if(usersByDiscord.containsKey(discordId))
|
||
|
return usersByDiscord.get(discordId);
|
||
|
return byDiscord.select(discordId);
|
||
|
}
|
||
|
|
||
|
public static List<SteamwarUser> getServerTeam() {
|
||
|
return getServerTeam.listSelect();
|
||
|
}
|
||
|
}
|