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.bukkit.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.bukkit.BukkitAudiences;
023import org.bukkit.command.CommandSender;
024import org.bukkit.entity.Player;
025import org.jetbrains.annotations.NotNull;
026
027import java.util.Objects;
028import java.util.UUID;
029
030/**
031 * A class that wraps {@link CommandSender}.
032 */
033public class BukkitSender implements Sender {
034
035    private final Audience audience;
036    private final CommandSender sender;
037
038    /**
039     * Create {@link Sender} to use in the library with a {@link CommandSender}.
040     *
041     * @param audiences the {@link BukkitAudiences} to get {@link Audience}
042     * @param sender    {@link CommandSender} to wrap
043     */
044    public BukkitSender(@NotNull BukkitAudiences audiences, @NotNull CommandSender sender) {
045        this.audience = audiences.sender(sender);
046        this.sender = sender;
047    }
048
049    @NotNull
050    @Override
051    public Audience getAudience() {
052        return audience;
053    }
054
055    /**
056     * {@inheritDoc}
057     */
058    @Override
059    @NotNull
060    public UUID getUUID() {
061        if (sender instanceof Player) {
062            return ((Player) sender).getUniqueId();
063        } else {
064            return ConsoleSender.CONSOLE_UUID;
065        }
066    }
067
068    /**
069     * {@inheritDoc}
070     */
071    @Override
072    @NotNull
073    public String getName() {
074        return sender.getName();
075    }
076
077    /**
078     * {@inheritDoc}
079     */
080    @Override
081    public boolean hasPermission(@NotNull String perm) {
082        return sender.hasPermission(perm);
083    }
084
085    /**
086     * {@inheritDoc}
087     */
088    @Override
089    public boolean isOnline() {
090        if (sender instanceof Player) {
091            return ((Player) sender).isOnline();
092        } else {
093            return true;
094        }
095    }
096
097    /**
098     * {@inheritDoc}
099     */
100    @Override
101    public @NotNull Object getOriginalSender() {
102        return sender;
103    }
104
105    /**
106     * Gets {@link CommandSender}.
107     *
108     * @return the wrapped {@link CommandSender}
109     */
110    public @NotNull CommandSender getCommandSender() {
111        return sender;
112    }
113
114    @Override
115    public int hashCode() {
116        return Objects.hash(sender);
117    }
118
119    @Override
120    public boolean equals(Object o) {
121        if (this == o) {
122            return true;
123        }
124
125        if (o instanceof BukkitSender) {
126            BukkitSender that = (BukkitSender) o;
127            return sender.equals(that.sender);
128        } else {
129            return false;
130        }
131    }
132}