package com.supaham.commons.bukkit.utils.misc;
import com.google.common.base.Preconditions;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.supaham.commons.bukkit.ItemBuilder;
import com.supaham.commons.utils.StringUtils;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.block.banner.PatternType;
import org.bukkit.inventory.ItemStack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Nonnull;
/**
* MinersNeedCoolShoes' (offline) java banner generator.
*
* <table>
* <thead>
* <tr>
* <th>Code</th>
* <th>Color</th>
* </tr>
* <tr><td>a</td><td>{@link DyeColor#BLACK}</td></tr>
* <tr><td>i</td><td>{@link DyeColor#GRAY}</td></tr>
* <tr><td>h</td><td>{@link DyeColor#SILVER}</td></tr>
* <tr><td>p</td><td>{@link DyeColor#WHITE}</td></tr>
* <tr><td>j</td><td>{@link DyeColor#PINK}</td></tr>
* <tr><td>n</td><td>{@link DyeColor#MAGENTA}</td></tr>
* <tr><td>f</td><td>{@link DyeColor#PURPLE}</td></tr>
* <tr><td>e</td><td>{@link DyeColor#BLUE}</td></tr>
* <tr><td>g</td><td>{@link DyeColor#CYAN}</td></tr>
* <tr><td>m</td><td>{@link DyeColor#LIGHT_BLUE}</td></tr>
* <tr><td>c</td><td>{@link DyeColor#GREEN}</td></tr>
* <tr><td>l</td><td>{@link DyeColor#YELLOW}</td></tr>
* <tr><td>o</td><td>{@link DyeColor#ORANGE}</td></tr>
* <tr><td>d</td><td>{@link DyeColor#BROWN}</td></tr>
* <tr><td>b</td><td>{@link DyeColor#RED}</td></tr>
* </thead>
* </table>
*
* <table>
* <thead>
* <tr>
* <th>Code</th>
* <th>Pattern</th>
* </tr>
* <tr><td>a</td><td>{@link PatternType#BASE}</td></tr>
* <tr><td>p</td><td>{@link PatternType#GRADIENT}</td></tr>
* <tr><td>K</td><td>{@link PatternType#GRADIENT_UP}</td></tr>
* <tr><td>e</td><td>{@link PatternType#BRICKS}</td></tr>
* <tr><td>q</td><td>{@link PatternType#HALF_HORIZONTAL}</td></tr>
* <tr><td>L</td><td>{@link PatternType#HALF_HORIZONTAL_MIRROR}</td></tr>
* <tr><td>H</td><td>{@link PatternType#HALF_VERTICAL}</td></tr>
* <tr><td>M</td><td>{@link PatternType#HALF_VERTICAL_MIRROR}</td></tr>
* <tr><td>E</td><td>{@link PatternType#STRIPE_TOP}</td></tr>
* <tr><td>f</td><td>{@link PatternType#STRIPE_BOTTOM}</td></tr>
* <tr><td>s</td><td>{@link PatternType#STRIPE_LEFT}</td></tr>
* <tr><td>y</td><td>{@link PatternType#STRIPE_RIGHT}</td></tr>
* <tr><td>r</td><td>{@link PatternType#DIAGONAL_LEFT}</td></tr>
* <tr><td>J</td><td>{@link PatternType#DIAGONAL_RIGHT_MIRROR}</td></tr>
* <tr><td>I</td><td>{@link PatternType#DIAGONAL_LEFT_MIRROR}</td></tr>
* <tr><td>x</td><td>{@link PatternType#DIAGONAL_RIGHT}</td></tr>
* <tr><td>j</td><td>{@link PatternType#CROSS}</td></tr>
* <tr><td>m</td><td>{@link PatternType#STRIPE_DOWNLEFT}</td></tr>
* <tr><td>n</td><td>{@link PatternType#STRIPE_DOWNRIGHT}</td></tr>
* <tr><td>z</td><td>{@link PatternType#STRAIGHT_CROSS}</td></tr>
* <tr><td>l</td><td>{@link PatternType#STRIPE_CENTER}</td></tr>
* <tr><td>w</td><td>{@link PatternType#STRIPE_MIDDLE}</td></tr>
* <tr><td>C</td><td>{@link PatternType#SQUARE_TOP_LEFT}</td></tr>
* <tr><td>b</td><td>{@link PatternType#SQUARE_BOTTOM_LEFT}</td></tr>
* <tr><td>D</td><td>{@link PatternType#SQUARE_TOP_RIGHT}</td></tr>
* <tr><td>d</td><td>{@link PatternType#SQUARE_BOTTOM_RIGHT}</td></tr>
* <tr><td>F</td><td>{@link PatternType#TRIANGLE_TOP}</td></tr>
* <tr><td>g</td><td>{@link PatternType#TRIANGLE_BOTTOM}</td></tr>
* <tr><td>v</td><td>{@link PatternType#RHOMBUS_MIDDLE}</td></tr>
* <tr><td>t</td><td>{@link PatternType#CIRCLE_MIDDLE}</td></tr>
* <tr><td>h</td><td>{@link PatternType#TRIANGLES_BOTTOM}</td></tr>
* <tr><td>G</td><td>{@link PatternType#TRIANGLES_TOP}</td></tr>
* <tr><td>B</td><td>{@link PatternType#STRIPE_SMALL}</td></tr>
* <tr><td>c</td><td>{@link PatternType#BORDER}</td></tr>
* <tr><td>i</td><td>{@link PatternType#CURLY_BORDER}</td></tr>
* <tr><td>o</td><td>{@link PatternType#FLOWER}</td></tr>
* <tr><td>k</td><td>{@link PatternType#CREEPER}</td></tr>
* <tr><td>A</td><td>{@link PatternType#SKULL}</td></tr>
* <tr><td>u</td><td>{@link PatternType#MOJANG}</td></tr>
* </thead>
* </table>
*
* @author SupaHam
* @see #parseCode(String)
* @see #parseURL(String)
* @since 0.2.9.1
*/
public class MNCSBannerGenerator {
private static final BiMap<Character, DyeColor> COLOR_CODES = HashBiMap.create();
private static final BiMap<Character, PatternType> PATTERN_CODES = HashBiMap.create();
public static final Pattern MATCH_URL =
Pattern.compile("https?://www.needcoolshoes.com/banner\\?=(.*)");
static {
COLOR_CODES.put('a', DyeColor.BLACK);
COLOR_CODES.put('i', DyeColor.GRAY);
COLOR_CODES.put('h', DyeColor.SILVER);
COLOR_CODES.put('p', DyeColor.WHITE);
COLOR_CODES.put('j', DyeColor.PINK);
COLOR_CODES.put('n', DyeColor.MAGENTA);
COLOR_CODES.put('f', DyeColor.PURPLE);
COLOR_CODES.put('e', DyeColor.BLUE);
COLOR_CODES.put('g', DyeColor.CYAN);
COLOR_CODES.put('m', DyeColor.LIGHT_BLUE);
COLOR_CODES.put('c', DyeColor.GREEN);
COLOR_CODES.put('k', DyeColor.LIME);
COLOR_CODES.put('l', DyeColor.YELLOW);
COLOR_CODES.put('o', DyeColor.ORANGE);
COLOR_CODES.put('d', DyeColor.BROWN);
COLOR_CODES.put('b', DyeColor.RED);
PATTERN_CODES.put('a', PatternType.BASE);
PATTERN_CODES.put('p', PatternType.GRADIENT);
PATTERN_CODES.put('K', PatternType.GRADIENT_UP);
PATTERN_CODES.put('e', PatternType.BRICKS);
PATTERN_CODES.put('q', PatternType.HALF_HORIZONTAL);
PATTERN_CODES.put('L', PatternType.HALF_HORIZONTAL_MIRROR);
PATTERN_CODES.put('H', PatternType.HALF_VERTICAL);
PATTERN_CODES.put('M', PatternType.HALF_VERTICAL_MIRROR);
PATTERN_CODES.put('E', PatternType.STRIPE_TOP);
PATTERN_CODES.put('f', PatternType.STRIPE_BOTTOM);
PATTERN_CODES.put('s', PatternType.STRIPE_LEFT);
PATTERN_CODES.put('y', PatternType.STRIPE_RIGHT);
PATTERN_CODES.put('r', PatternType.DIAGONAL_LEFT);
PATTERN_CODES.put('J', PatternType.DIAGONAL_RIGHT_MIRROR);
PATTERN_CODES.put('I', PatternType.DIAGONAL_LEFT_MIRROR);
PATTERN_CODES.put('x', PatternType.DIAGONAL_RIGHT);
PATTERN_CODES.put('j', PatternType.CROSS);
PATTERN_CODES.put('m', PatternType.STRIPE_DOWNLEFT);
PATTERN_CODES.put('n', PatternType.STRIPE_DOWNRIGHT);
PATTERN_CODES.put('z', PatternType.STRAIGHT_CROSS);
PATTERN_CODES.put('l', PatternType.STRIPE_CENTER);
PATTERN_CODES.put('w', PatternType.STRIPE_MIDDLE);
PATTERN_CODES.put('C', PatternType.SQUARE_TOP_LEFT);
PATTERN_CODES.put('b', PatternType.SQUARE_BOTTOM_LEFT);
PATTERN_CODES.put('D', PatternType.SQUARE_TOP_RIGHT);
PATTERN_CODES.put('d', PatternType.SQUARE_BOTTOM_RIGHT);
PATTERN_CODES.put('F', PatternType.TRIANGLE_TOP);
PATTERN_CODES.put('g', PatternType.TRIANGLE_BOTTOM);
PATTERN_CODES.put('v', PatternType.RHOMBUS_MIDDLE);
PATTERN_CODES.put('t', PatternType.CIRCLE_MIDDLE);
PATTERN_CODES.put('h', PatternType.TRIANGLES_BOTTOM);
PATTERN_CODES.put('G', PatternType.TRIANGLES_TOP);
PATTERN_CODES.put('B', PatternType.STRIPE_SMALL);
PATTERN_CODES.put('c', PatternType.BORDER);
PATTERN_CODES.put('i', PatternType.CURLY_BORDER);
PATTERN_CODES.put('o', PatternType.FLOWER);
PATTERN_CODES.put('k', PatternType.CREEPER);
PATTERN_CODES.put('A', PatternType.SKULL);
PATTERN_CODES.put('u', PatternType.MOJANG);
}
/**
* Parses a MinersNeedCoolShoes Banner generator generated code into a Bukkit ItemStack of
* {@link Material#BANNER}. Code must have an even amount of characters, with the first of the
* pair being the color, and the second being the pattern. See {@link MNCSBannerGenerator} for
* a table of those.
*
* @param code code to parse
*
* @return banner itemstack
*/
public static ItemStack parseCode(@Nonnull String code) {
StringUtils.checkNotNullOrEmpty(code, "code");
Preconditions.checkArgument(code.length() % 2 == 0, "code must be even characters");
ItemBuilder builder = ItemBuilder.builder(Material.BANNER);
char[] chars = code.toCharArray();
for (int i = 0; i < chars.length; i++) {
DyeColor dyeColor = COLOR_CODES.get(chars[i]);
Preconditions.checkNotNull(dyeColor, "'" + chars[i] + " is not a valid color.");
PatternType patternType = PATTERN_CODES.get(chars[++i]);
Preconditions.checkNotNull(patternType, "'" + chars[i] + " is not a valid pattern.");
builder.bannerAdd(new org.bukkit.block.banner.Pattern(dyeColor, patternType));
}
return builder.build();
}
/**
* Parses a URL such as {@code http://www.needcoolshoes.com/banner?=naau} into a code, the
* trailing code, which is passed to {@link #parseCode(String)} to return an {@link ItemStack}.
*
* @param url url to parse
*
* @return banner itemstack
*
* @see #parseCode(String)
*/
public static ItemStack parseURL(@Nonnull String url) {
StringUtils.checkNotNullOrEmpty(url, "url");
Matcher matcher = MATCH_URL.matcher(url);
if (matcher.find()) {
return parseCode(matcher.group(1));
}
return null;
}
private MNCSBannerGenerator() {
throw new AssertionError("So... statics, yeah. Use them.");
}
}