2022-09-08 10:42:57 +02:00
/ *
* 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 " ) ;
2022-09-20 16:41:07 +02:00
private static final SelectStatement < SteamwarUser > byTeam = table . selectFields ( " Team " ) ;
2022-09-08 10:42:57 +02:00
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 ;
2022-11-02 22:38:21 +01:00
this . discordId = discordId ! = null & & discordId ! = 0 ? discordId : null ;
2022-09-08 10:42:57 +02:00
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 ;
2022-11-02 22:38:21 +01:00
return Locale . getDefault ( ) ;
}
public void setLocale ( Locale locale , boolean manualLocale ) {
if ( locale = = null | | ( this . manualLocale & & ! manualLocale ) )
return ;
this . locale = locale ;
this . manualLocale = manualLocale ;
updateLocale . update ( locale . toLanguageTag ( ) , manualLocale , id ) ;
2022-09-08 10:42:57 +02:00
}
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 ) ;
}
2022-09-20 16:41:07 +02:00
public static void createOrUpdateUsername ( UUID uuid , String userName ) {
insert . update ( uuid , userName ) ;
}
2022-09-08 10:42:57 +02:00
public static List < SteamwarUser > getServerTeam ( ) {
return getServerTeam . listSelect ( ) ;
}
2022-09-20 16:41:07 +02:00
public static List < SteamwarUser > getTeam ( int teamId ) {
return byTeam . listSelect ( teamId ) ;
}
2022-09-08 10:42:57 +02:00
}