001/*
002 *     Copyright 2021 Siroshun09
003 *
004 *     Licensed under the Apache License, Version 2.0 (the "License");
005 *     you may not use this file except in compliance with the License.
006 *     You may obtain a copy of the License at
007 *
008 *         http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *     Unless required by applicable law or agreed to in writing, software
011 *     distributed under the License is distributed on an "AS IS" BASIS,
012 *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *     See the License for the specific language governing permissions and
014 *     limitations under the License.
015 */
016
017package com.github.siroshun09.mccommand.bungee.sender;
018
019import com.github.siroshun09.mccommand.common.sender.ConsoleSender;
020import com.github.siroshun09.mccommand.common.sender.Sender;
021import net.kyori.adventure.audience.Audience;
022import net.kyori.adventure.platform.bungeecord.BungeeAudiences;
023import net.md_5.bungee.api.CommandSender;
024import net.md_5.bungee.api.ProxyServer;
025import net.md_5.bungee.api.connection.ProxiedPlayer;
026import org.jetbrains.annotations.NotNull;
027
028import java.util.Objects;
029import java.util.UUID;
030
031/**
032 * A class that wraps {@link CommandSender}.
033 */
034public class BungeeSender implements Sender {
035
036    private final Audience audience;
037    private final CommandSender sender;
038
039    /**
040     * Create {@link Sender} to use in the library with a {@link CommandSender}.
041     *
042     * @param audiences the {@link BungeeAudiences} to get {@link Audience}
043     * @param sender    {@link CommandSender} to wrap
044     */
045    public BungeeSender(@NotNull BungeeAudiences audiences, @NotNull CommandSender sender) {
046        this.audience = audiences.sender(sender);
047        this.sender = sender;
048    }
049
050    @NotNull
051    @Override
052    public Audience getAudience() {
053        return audience;
054    }
055
056    /**
057     * {@inheritDoc}
058     */
059    @Override
060    @NotNull
061    public UUID getUUID() {
062        if (sender instanceof ProxiedPlayer) {
063            return ((ProxiedPlayer) sender).getUniqueId();
064        } else {
065            return ConsoleSender.CONSOLE_UUID;
066        }
067    }
068
069    /**
070     * {@inheritDoc}
071     */
072    @Override
073    @NotNull
074    public String getName() {
075        return sender.getName();
076    }
077
078    /**
079     * {@inheritDoc}
080     */
081    @Override
082    public boolean hasPermission(@NotNull String perm) {
083        return sender.hasPermission(perm);
084    }
085
086    /**
087     * {@inheritDoc}
088     */
089    @Override
090    public boolean isOnline() {
091        if (sender instanceof ProxiedPlayer) {
092            return ((ProxiedPlayer) sender).isConnected();
093        } else {
094            return true;
095        }
096    }
097
098    /**
099     * {@inheritDoc}
100     */
101    @Override
102    public boolean isConsole() {
103        return sender.equals(ProxyServer.getInstance().getConsole());
104    }
105
106    /**
107     * {@inheritDoc}
108     */
109    @Override
110    public @NotNull Object getOriginalSender() {
111        return sender;
112    }
113
114    /**
115     * Gets {@link CommandSender}.
116     *
117     * @return the wrapped {@link CommandSender}
118     */
119    public @NotNull CommandSender getCommandSender() {
120        return sender;
121    }
122
123    @Override
124    public int hashCode() {
125        return Objects.hash(sender);
126    }
127
128    @Override
129    public boolean equals(Object o) {
130        if (this == o) {
131            return true;
132        }
133
134        if (o instanceof BungeeSender) {
135            BungeeSender that = (BungeeSender) o;
136            return sender.equals(that.sender);
137        } else {
138            return false;
139        }
140    }
141}