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 cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
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 gsonbuilder = (new GsonBuilder()).setPrettyPrinting();
gsonbuilder.registerTypeHierarchyAdapter(UserListEntry.class, new UserList.Serializer(null));
this.gson = gsonbuilder.create();
}
public boolean isLanServer()
{
return this.lanServer;
}
public void setLanServer(boolean state)
{
this.lanServer = state;
}
/**
* Adds an entry to the list
*/
public void addEntry(UserListEntry entry)
{
this.values.put(this.getObjectKey(entry.getValue()), entry);
try
{
this.writeChanges();
}
catch (IOException ioexception)
{
logger.warn("Could not save the list after adding a user.", ioexception);
}
}
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 ioexception)
{
logger.warn("Could not save the list after removing a user.", ioexception);
}
}
@SideOnly(Side.SERVER)
public File getSaveFile()
{
return this.saveFile;
}
public String[] getKeys()
{
return (String[])this.values.keySet().toArray(new String[this.values.size()]);
}
/**
* 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 arraylist = Lists.newArrayList();
Iterator iterator = this.values.values().iterator();
while (iterator.hasNext())
{
UserListEntry userlistentry = (UserListEntry)iterator.next();
if (userlistentry.hasBanExpired())
{
arraylist.add(userlistentry.getValue());
}
}
iterator = arraylist.iterator();
while (iterator.hasNext())
{
Object object = iterator.next();
this.values.remove(object);
}
}
protected UserListEntry createEntry(JsonObject entryData)
{
return new UserListEntry((Object)null, entryData);
}
protected Map getValues()
{
return this.values;
}
public void writeChanges() throws IOException
{
Collection collection = this.values.values();
String s = this.gson.toJson(collection);
BufferedWriter bufferedwriter = null;
try
{
bufferedwriter = Files.newWriter(this.saveFile, Charsets.UTF_8);
bufferedwriter.write(s);
}
finally
{
IOUtils.closeQuietly(bufferedwriter);
}
}
@SideOnly(Side.SERVER)
public boolean hasEntries()
{
return this.values.size() < 1;
}
@SideOnly(Side.SERVER)
public void readSavedFile() throws IOException
{
Collection collection = null;
BufferedReader bufferedreader = null;
try
{
bufferedreader = Files.newReader(this.saveFile, Charsets.UTF_8);
collection = (Collection)this.gson.fromJson(bufferedreader, saveFileFormat);
}
finally
{
IOUtils.closeQuietly(bufferedreader);
}
if (collection != null)
{
this.values.clear();
Iterator iterator = collection.iterator();
while (iterator.hasNext())
{
UserListEntry userlistentry = (UserListEntry)iterator.next();
if (userlistentry.getValue() != null)
{
this.values.put(this.getObjectKey(userlistentry.getValue()), userlistentry);
}
}
}
}
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 jsonobject = new JsonObject();
p_152751_1_.onSerialization(jsonobject);
return jsonobject;
}
public UserListEntry deserializeEntry(JsonElement p_152750_1_, Type p_152750_2_, JsonDeserializationContext p_152750_3_)
{
if (p_152750_1_.isJsonObject())
{
JsonObject jsonobject = p_152750_1_.getAsJsonObject();
UserListEntry userlistentry = UserList.this.createEntry(jsonobject);
return userlistentry;
}
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();
}
}
}