/** * Creates a text component with the content of {@link String#valueOf(long)}. * * @param value the long value * @return the component */ static @NonNull Component of(final long value) { return TextComponent.of(String.valueOf(value)); }
@Override TextComponent.Builder builder() { return TextComponent.builder("foo"); }
Builder(final @NonNull TextComponent component) { super(component); this.content = component.content(); }
@Override public @NonNull TextComponent append(final @NonNull Component component) { this.detectCycle(component); // detect cycle before modifying final List<Component> children = new ArrayList<>(this.children.size() + 1); children.addAll(this.children); children.add(component); return new TextComponent(children, this.color, this.obfuscated, this.bold, this.strikethrough, this.underlined, this.italic, this.clickEvent, this.hoverEvent, this.insertion, this.content); }
@Test void testFromColor() { final TextComponent component = TextComponent.builder("") .append(TextComponent.of("foo").color(TextColor.GREEN).decoration(TextDecoration.BOLD, TextDecoration.State.TRUE)) .append(TextComponent.of("bar").color(TextColor.BLUE)) .build(); assertEquals(component, LegacyComponentSerializer.INSTANCE.deserialize("&a&lfoo&9bar", '&')); }
@Test void testOf_color_decorations() { final TextComponent component = TextComponent.of("foo", TextColor.GREEN, ImmutableSet.of(TextDecoration.BOLD)); assertEquals("foo", component.content()); assertEquals(TextColor.GREEN, component.color()); assertEquals(TextDecoration.State.NOT_SET, component.decoration(TextDecoration.OBFUSCATED)); assertEquals(TextDecoration.State.TRUE, component.decoration(TextDecoration.BOLD)); assertEquals(TextDecoration.State.NOT_SET, component.decoration(TextDecoration.STRIKETHROUGH)); assertEquals(TextDecoration.State.NOT_SET, component.decoration(TextDecoration.UNDERLINED)); assertEquals(TextDecoration.State.NOT_SET, component.decoration(TextDecoration.ITALIC)); }
@Override public void execute(CommandSource source, String @NonNull [] args) { if (!(source instanceof Player)) { source.sendMessage(TextComponent.of("Only players may run this command.", TextColor.RED)); return; if (!toConnect.isPresent()) { player.sendMessage( TextComponent.of("Server " + serverName + " doesn't exist.", TextColor.RED)); return; .orElse("<unknown>"); player.sendMessage(TextComponent .of("You are currently connected to " + currentServer + ".", TextColor.YELLOW)); TextComponent.Builder serverListBuilder = TextComponent.builder("Available servers: ") .color(TextColor.YELLOW); List<RegisteredServer> infos = ImmutableList.copyOf(server.getAllServers()); for (int i = 0; i < infos.size(); i++) { RegisteredServer rs = infos.get(i); TextComponent infoComponent = TextComponent.of(rs.getServerInfo().getName()); String playersText = rs.getPlayersConnected().size() + " player(s) online"; if (rs.getServerInfo().getName().equals(currentServer)) { infoComponent = infoComponent.color(TextColor.GREEN) .hoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.of("Currently connected to this server\n" + playersText))); } else { infoComponent = infoComponent.color(TextColor.GRAY) .clickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/server " + rs.getServerInfo().getName()))
@Override public void execute(CommandSource source, String @NonNull [] args) { if (args.length != 0) { source.sendMessage(TextComponent.of("/velocity version", TextColor.RED)); return; TextComponent velocity = TextComponent.builder(version.getName() + " ") .decoration(TextDecoration.BOLD, true) .color(TextColor.DARK_AQUA) .append(TextComponent.of(version.getVersion()).decoration(TextDecoration.BOLD, false)) .build(); TextComponent copyright = TextComponent .of("Copyright 2018 " + version.getVendor() + ". " + version.getName() + " is freely licensed under the terms of the MIT License."); source.sendMessage(velocity); TextComponent velocityWebsite = TextComponent.builder() .content("Visit the ") .append(TextComponent.builder("Velocity website") .color(TextColor.GREEN) .clickEvent( new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.velocitypowered.com")) .build()) .append(TextComponent.of(" or the ").resetStyle()) .append(TextComponent.builder("Velocity GitHub") .color(TextColor.GREEN) .clickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL,
@Override public @NonNull Component render(final @NonNull Component component, final @NonNull C context) { if(component instanceof TranslatableComponent) { return this.render((TranslatableComponent) component, context); } else if(component instanceof TextComponent) { final TextComponent.Builder builder = TextComponent.builder(((TextComponent) component).content()); return this.deepRender(component, builder, context).build(); } else if(component instanceof KeybindComponent) { final KeybindComponent.Builder builder = KeybindComponent.builder(((KeybindComponent) component).keybind()); return this.deepRender(component, builder, context).build(); } else if(component instanceof ScoreComponent) { final ScoreComponent sc = (ScoreComponent) component; final ScoreComponent.Builder builder = ScoreComponent.builder() .name(sc.name()) .objective(sc.objective()) .value(sc.value()); return this.deepRender(component, builder, context).build(); } else if(component instanceof SelectorComponent) { final SelectorComponent.Builder builder = SelectorComponent.builder(((SelectorComponent) component).pattern()); return this.deepRender(component, builder, context).build(); } else { return component; } }
@Test void testCompound() { final TextComponent component = TextComponent.builder() .content("hi there ") .append(TextComponent.builder("this bit is green ") .color(TextColor.GREEN) .build()) .append(TextComponent.of("this isn't ").resetStyle()) .append(TextComponent.builder("and woa, this is again") .color(TextColor.GREEN) .build()) .build(); assertEquals("hi there &athis bit is green &rthis isn't &aand woa, this is again", LegacyComponentSerializer.INSTANCE.serialize(component, '&')); }
@Test void testDecorations() { TextComponent component = TextComponent.builder().content("Kittens!").build(); // The bold decoration should not be set at this point. assertFalse(component.hasDecoration(TextDecoration.BOLD)); assertEquals(TextDecoration.State.NOT_SET, component.decoration(TextDecoration.BOLD)); component = component.decoration(TextDecoration.BOLD, TextDecoration.State.TRUE); final Set<TextDecoration> decorations = component.decorations(); // The bold decoration should be set and true at this point. assertTrue(component.hasDecoration(TextDecoration.BOLD)); assertEquals(TextDecoration.State.TRUE, component.decoration(TextDecoration.BOLD)); assertEquals(component.decoration(TextDecoration.BOLD) == TextDecoration.State.TRUE, decorations.contains(TextDecoration.BOLD)); assertTrue(decorations.contains(TextDecoration.BOLD)); assertFalse(decorations.contains(TextDecoration.OBFUSCATED)); }
@Test void testMergeEvents() { final C c0 = this.builder().build(); assertNull(c0.color()); assertDecorations(c0, ImmutableMap.of()); assertNull(c0.clickEvent()); final C c1 = (C) c0.mergeEvents(TextComponent.of("xyz", TextColor.RED, ImmutableSet.of(TextDecoration.BOLD)).clickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/foo"))); assertNull(c1.color()); assertDecorations(c1, ImmutableMap.of()); assertNotNull(c1.clickEvent()); }
@Test void testCycleHoverChild() { assertThrows(IllegalStateException.class, () -> { final Component hoverComponent = TextComponent.builder().content("hover child").build(); final Component component = TextComponent.builder().content("cat") .hoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.builder().content("hover").build().append(hoverComponent))) .build(); // component's hover event value contains hoverComponent, we should not be able to add it hoverComponent.append(component); fail("A component was added to itself"); }); } }
@Override public @NonNull TextComponent decoration(final @NonNull TextDecoration decoration, final TextDecoration.@NonNull State state) { switch(decoration) { case BOLD: return new TextComponent(this.children, this.color, this.obfuscated, checkNotNull(state, "flag"), this.strikethrough, this.underlined, this.italic, this.clickEvent, this.hoverEvent, this.insertion, this.content); case ITALIC: return new TextComponent(this.children, this.color, this.obfuscated, this.bold, this.strikethrough, this.underlined, checkNotNull(state, "flag"), this.clickEvent, this.hoverEvent, this.insertion, this.content); case UNDERLINE: return new TextComponent(this.children, this.color, this.obfuscated, this.bold, this.strikethrough, checkNotNull(state, "flag"), this.italic, this.clickEvent, this.hoverEvent, this.insertion, this.content); case STRIKETHROUGH: return new TextComponent(this.children, this.color, this.obfuscated, this.bold, checkNotNull(state, "flag"), this.underlined, this.italic, this.clickEvent, this.hoverEvent, this.insertion, this.content); case OBFUSCATED: return new TextComponent(this.children, this.color, checkNotNull(state, "flag"), this.bold, this.strikethrough, this.underlined, this.italic, this.clickEvent, this.hoverEvent, this.insertion, this.content); default: throw new IllegalArgumentException(String.format("unknown decoration '%s'", decoration)); } }
@Test void testCopy() { final TextComponent.Builder component = TextComponent.builder().content("").color(TextColor.GRAY); component.append(TextComponent.builder().content("This is a test").color(TextColor.DARK_PURPLE).build()); component.append(TextComponent.builder().content(" ").build()); component.append(TextComponent.builder().content("A what?").color(TextColor.DARK_AQUA).clickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/what")).build()); assertEquals(component.build(), component.build().copy()); }
@Test void testResetOverride() { final TextComponent component = TextComponent.builder("") .append(TextComponent.of("foo").color(TextColor.GREEN).decoration(TextDecoration.BOLD, TextDecoration.State.TRUE)) .append(TextComponent.of("bar").color(TextColor.DARK_GRAY)) .build(); assertEquals(component, LegacyComponentSerializer.INSTANCE.deserialize("&a&lfoo&r&8bar", '&')); }