package net.minecraft.server.management;
import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.io.Files;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class UserList
{
protected static final Logger logger = LogManager.getLogger();
protected final Gson gson;
private final File saveFile;
private final Map values = Maps.newHashMap();
private boolean lanServer = true;
private static final ParameterizedType saveFileFormat = new ParameterizedType()
{
private static final String __OBFID = "CL_00001875";
public Type[] getActualTypeArguments()
{
return new Type[] {UserListEntry.class};
}
public Type getRawType()
{
return List.class;
}
public Type getOwnerType()
{
return null;
}
};
private static final String __OBFID = "CL_00001876";
public UserList(File saveFile)
{
this.saveFile = saveFile;
GsonBuilder var2 = (new GsonBuilder()).setPrettyPrinting();
var2.registerTypeHierarchyAdapter(UserListEntry.class, new UserList.Serializer(null));
this.gson = var2.create();
}
public boolean isLanServer()
{
return this.lanServer;
}
public void setLanServer(boolean state)
{
this.lanServer = state;
}
public File getSaveFile()
{
return this.saveFile;
}
/**
* Adds an entry to the list
*/
public void addEntry(UserListEntry entry)
{
this.values.put(this.getObjectKey(entry.getValue()), entry);
try
{
this.writeChanges();
}
catch (IOException var3)
{
logger.warn("Could not save the list after adding a user.", var3);
}
}
public UserListEntry getEntry(Object obj)
{
this.removeExpired();
return (UserListEntry)this.values.get(this.getObjectKey(obj));
}
public void removeEntry(Object p_152684_1_)
{
this.values.remove(this.getObjectKey(p_152684_1_));
try
{
this.writeChanges();
}
catch (IOException var3)
{
logger.warn("Could not save the list after removing a user.", var3);
}
}
public String[] getKeys()
{
return (String[])this.values.keySet().toArray(new String[this.values.size()]);
}
public boolean hasEntries()
{
return this.values.size() < 1;
}
/**
* Gets the key value for the given object
*/
protected String getObjectKey(Object obj)
{
return obj.toString();
}
protected boolean hasEntry(Object entry)
{
return this.values.containsKey(this.getObjectKey(entry));
}
/**
* Removes expired bans from the list. Never actually does anything since UserListEntry#hasBanExpired always returns
* false. Appears to be an effort by Mojang to add temp ban functionality. (1.7.10)
*/
private void removeExpired()
{
ArrayList var1 = Lists.newArrayList();
Iterator var2 = this.values.values().iterator();
while (var2.hasNext())
{
UserListEntry var3 = (UserListEntry)var2.next();
if (var3.hasBanExpired())
{
var1.add(var3.getValue());
}
}
var2 = var1.iterator();
while (var2.hasNext())
{
Object var4 = var2.next();
this.values.remove(var4);
}
}
protected UserListEntry createEntry(JsonObject entryData)
{
return new UserListEntry((Object)null, entryData);
}
protected Map getValues()
{
return this.values;
}
public void writeChanges() throws IOException
{
Collection var1 = this.values.values();
String var2 = this.gson.toJson(var1);
BufferedWriter var3 = null;
try
{
var3 = Files.newWriter(this.saveFile, Charsets.UTF_8);
var3.write(var2);
}
finally
{
IOUtils.closeQuietly(var3);
}
}
public void readSavedFile() throws IOException
{
Collection var1 = null;
BufferedReader var2 = null;
try
{
var2 = Files.newReader(this.saveFile, Charsets.UTF_8);
var1 = (Collection)this.gson.fromJson(var2, saveFileFormat);
}
finally
{
IOUtils.closeQuietly(var2);
}
if (var1 != null)
{
this.values.clear();
Iterator var3 = var1.iterator();
while (var3.hasNext())
{
UserListEntry var4 = (UserListEntry)var3.next();
if (var4.getValue() != null)
{
this.values.put(this.getObjectKey(var4.getValue()), var4);
}
}
}
}
class Serializer implements JsonDeserializer, JsonSerializer
{
private static final String __OBFID = "CL_00001874";
private Serializer() {}
public JsonElement serializeEntry(UserListEntry p_152751_1_, Type p_152751_2_, JsonSerializationContext p_152751_3_)
{
JsonObject var4 = new JsonObject();
p_152751_1_.onSerialization(var4);
return var4;
}
public UserListEntry deserializeEntry(JsonElement p_152750_1_, Type p_152750_2_, JsonDeserializationContext p_152750_3_)
{
if (p_152750_1_.isJsonObject())
{
JsonObject var4 = p_152750_1_.getAsJsonObject();
UserListEntry var5 = UserList.this.createEntry(var4);
return var5;
}
else
{
return null;
}
}
public JsonElement serialize(Object p_serialize_1_, Type p_serialize_2_, JsonSerializationContext p_serialize_3_)
{
return this.serializeEntry((UserListEntry)p_serialize_1_, p_serialize_2_, p_serialize_3_);
}
public Object deserialize(JsonElement p_deserialize_1_, Type p_deserialize_2_, JsonDeserializationContext p_deserialize_3_)
{
return this.deserializeEntry(p_deserialize_1_, p_deserialize_2_, p_deserialize_3_);
}
Serializer(Object p_i1141_2_)
{
this();
}
}
}