> For the complete documentation index, see [llms.txt](https://staffplusplus-minecraft.gitbook.io/tubing/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://staffplusplus-minecraft.gitbook.io/tubing/tubing-guis.md).

# Tubing Guis

Tubing GUIs is a framework for building Inventory GUIs easily.

It is build upon Tubing. So you need to build a Tubing plugin for this to work. \
Look into the [Tubing Setup](/tubing/setup.md) before continuing here.

### Setup

Begin by adding the Tubing GUI dependency

```xml
<dependency>
    <groupId>be.garagepoort.mcioc</groupId>
    <artifactId>tubing-bukkit-gui</artifactId>
    <version>${tubing.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
```

The basic GUI framework requires 3 main components. A [GUI Controller](#gui-controller), a [TubingGui](/tubing/tubing-guis/tubinggui.md) and the GuiActionService.

#### Resources

{% hint style="warning" %}
The below configuration is only needed if you are using tubing gui templates and the maven-resources-plugin.
{% endhint %}

It's best to exclude these files to prevent maven from injecting properties into the file.

```xml
<plugins>
    <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <configuration>
            <nonFilteredFileExtensions>
                <nonFilteredFileExtension>ftl</nonFilteredFileExtension>
            </nonFilteredFileExtensions>
        </configuration>
        ...
    </plugin>
</plugins>
```

### Example

#### config.yml

```yaml
tubing-example:
  # When enabled, the message broadcasted will be send across the bungee network
  broadcast-on-bungee: true
  broadcast-prefix: "&C[BROADCAST] &6"
  broadcast-messages:
    - Restart in 10 minutes
    - Restart in 5 minutes
    - Restart in 1 minutes
    - Network maintenance today
```

#### Gui Controller

The controller defines 2 actions. The message-select action will open the inventory which will show what message to broadcast.

```java
@IocBean
@GuiController
public class BroadcastGuiController {

    @ConfigProperty("tubing-example.broadcast-messages")
    private List<String> predefinedMessages;

    private final BroadcastingService broadcastingService;

    public BroadcastGuiController(BroadcastingService broadcastingService) {
        this.broadcastingService = broadcastingService;
    }

    @GuiAction("broadcast/message-select")
    public GuiTemplate viewMessageSelect() {
        HashMap<String, Object> params = new HashMap<>();
        params.put("messages", predefinedMessages);
        return template("gui/broadcast/message-select.ftl", params);
    }

    @GuiAction("broadcast/send-message")
    public void sendMessage(Player player, @GuiParam("message") String message) {
        broadcastingService.broadcast(player, message);
    }
}
```

#### Message select template

```xml
<#assign URLEncoder=statics['java.net.URLEncoder']>
<TubingGui size="54" id="broadcast-message-select">
    <title class="gui-title">Select message to broadcast</title>

    <#list messages as message >
        <GuiItem id="broadcast-message-${message?index}"
                 class="broadcast-message"
                 slot="${message?index}"
                 material="PAPER"
                 onLeftClick="broadcast/send-message?message=${URLEncoder.encode(message)}">
            <name class="item-name">${message}</name>
        </GuiItem>
    </#list>
</TubingGui>
```

#### Command

The broadcast command will open the select GUI if you do not provide it any argument.\
We can call any GUI action using the GuiActionService.

```java
@IocBean
@IocCommandHandler("broadcast")
public class BroadcastCmd implements CommandExecutor {

    private final MessageService messageService;
    private final BroadcastingService broadcastingService;
    private final GuiActionService guiActionService;

    public BroadcastCmd(MessageService messageService, BroadcastingService broadcastingService, GuiActionService guiActionService) {
        this.messageService = messageService;
        this.broadcastingService = broadcastingService;
        this.guiActionService = guiActionService;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) {
        try {
            if (args.length == 0) {
                if (sender instanceof Player) {
                    guiActionService.executeAction((Player) sender, "broadcast/message-select");
                    return true;
                } else {
                    throw new BusinessException("Invalid arguments given for broadcast. Must provide a message");
                }
            }

            String message = JavaUtils.compileWords(args, 0);
            broadcastingService.broadcast(sender, message);
            return true;
        } catch (BusinessException e) {
            messageService.sendMessage(sender, "&6[Broadcasts] &C" + e.getMessage());
            return false;
        }
    }
}
```
