/*
* This file is part of HoloAPI.
*
* HoloAPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HoloAPI 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HoloAPI. If not, see <http://www.gnu.org/licenses/>.
*/
package com.dsh105.holoapi.image;
import com.dsh105.commodus.GeneralUtil;
import com.dsh105.commodus.config.YAMLConfig;
import com.dsh105.holoapi.HoloAPI;
import com.dsh105.holoapi.HoloAPICore;
import com.dsh105.holoapi.config.Lang;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.scheduler.BukkitRunnable;
import java.io.File;
import java.util.HashMap;
import java.util.logging.Level;
public class SimpleImageLoader implements ImageLoader<ImageGenerator> {
private final HashMap<String, ImageGenerator> KEY_TO_IMAGE_MAP = new HashMap<>();
private final HashMap<String, UnloadedImageStorage> URL_UNLOADED = new HashMap<>();
private boolean loaded;
public void loadImageConfiguration(YAMLConfig config) {
KEY_TO_IMAGE_MAP.clear();
URL_UNLOADED.clear();
File imageFolder = new File(HoloAPI.getCore().getDataFolder() + File.separator + "images");
if (!imageFolder.exists()) {
imageFolder.mkdirs();
}
ConfigurationSection cs = config.getConfigurationSection("images");
if (cs != null) {
for (String key : cs.getKeys(false)) {
String path = "images." + key + ".";
String imagePath = config.getString(path + "path");
int imageHeight = config.getInt(path + "height", 10);
String imageChar = config.getString(path + "characterType", ImageChar.BLOCK.getHumanName());
String imageType = config.getString(path + "type", "FILE");
boolean requiresBorder = config.getBoolean(path + "requiresBorder", true);
if (!GeneralUtil.isEnumType(ImageLoader.ImageLoadType.class, imageType.toUpperCase())) {
HoloAPI.LOG.info("Failed to load image: " + key + ". Invalid image type.");
continue;
}
ImageLoader.ImageLoadType type = ImageLoader.ImageLoadType.valueOf(imageType.toUpperCase());
ImageGenerator generator = findGenerator(type, key, imagePath, imageHeight, imageChar, requiresBorder);
if (generator != null) {
this.KEY_TO_IMAGE_MAP.put(key, generator);
}
}
}
loaded = true;
if (!KEY_TO_IMAGE_MAP.isEmpty() || !URL_UNLOADED.isEmpty()) {
HoloAPI.LOG.info("Images loaded.");
}
}
private ImageGenerator findGenerator(ImageLoader.ImageLoadType type, String key, String imagePath, int imageHeight, String imageCharType, boolean requiresBorder) {
try {
ImageChar c = ImageChar.fromHumanName(imageCharType);
if (c == null) {
HoloAPI.LOG.info("Invalid image char type for " + key + ". Using default.");
c = ImageChar.BLOCK;
}
switch (type) {
case URL:
this.URL_UNLOADED.put(key, new UnloadedImageStorage(imagePath, imageHeight, c, requiresBorder));
return null;
case FILE:
File f = new File(HoloAPI.getCore().getDataFolder() + File.separator + "images" + File.separator + imagePath);
return new ImageGenerator(key, f, imageHeight, c, requiresBorder);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return null;
}
@Override
public ImageGenerator getGenerator(CommandSender sender, String key) {
ImageGenerator g = this.KEY_TO_IMAGE_MAP.get(key);
if (g == null) {
if (this.URL_UNLOADED.get(key) != null) {
if (sender != null) {
Lang.LOADING_URL_IMAGE.send(sender, "key", key);
}
this.prepareUrlGenerator(sender, key);
return null;
} else {
Lang.FAILED_IMAGE_LOAD.send(sender);
}
}
return g;
}
@Override
public ImageGenerator getGenerator(String key) {
ImageGenerator g = this.KEY_TO_IMAGE_MAP.get(key);
if (g == null) {
if (this.URL_UNLOADED.get(key) != null) {
this.prepareUrlGenerator(null, key);
return null;
}
}
return g;
}
private ImageGenerator prepareUrlGenerator(final CommandSender sender, final String key) {
UnloadedImageStorage data = this.URL_UNLOADED.get(key);
HoloAPI.LOG.info("Loading custom URL image of key " + key);
this.URL_UNLOADED.remove(key);
final ImageGenerator g = new ImageGenerator(key, data.getImagePath(), data.getImageHeight(), data.getCharType(), false, data.requiresBorder());
new BukkitRunnable() {
@Override
public void run() {
g.loadUrlImage();
if (sender != null) {
Lang.IMAGE_LOADED.send(sender, "key", key);
}
HoloAPI.LOG.info("Custom URL image '" + key + "' loaded.");
KEY_TO_IMAGE_MAP.put(key, g);
}
}.runTaskAsynchronously(HoloAPI.getCore());
return g;
}
@Override
public boolean exists(String key) {
return this.KEY_TO_IMAGE_MAP.containsKey(key);
}
@Override
public boolean existsAsUnloadedUrl(String key) {
return this.URL_UNLOADED.containsKey(key);
}
@Override
public boolean isLoaded() {
return loaded;
}
}