2021-08-08 03:13:29 +00:00
package com.alttd.chat.commands ;
import com.alttd.chat.ChatPlugin ;
import com.alttd.chat.database.Queries ;
2021-08-08 09:36:06 +00:00
import com.alttd.chat.managers.ChatUserManager ;
2021-08-08 03:13:29 +00:00
import com.alttd.chat.managers.PartyManager ;
2021-08-08 09:36:06 +00:00
import com.alttd.chat.objects.ChatUser ;
2021-08-08 03:13:29 +00:00
import com.alttd.chat.objects.Party ;
2021-08-08 09:36:06 +00:00
import com.alttd.chat.util.Utility ;
import net.kyori.adventure.text.Component ;
import net.kyori.adventure.text.minimessage.MiniMessage ;
import org.bukkit.Bukkit ;
import org.bukkit.OfflinePlayer ;
2021-08-08 03:13:29 +00:00
import org.bukkit.command.Command ;
import org.bukkit.command.CommandExecutor ;
import org.bukkit.command.CommandSender ;
import org.bukkit.entity.Player ;
import org.bukkit.scheduler.BukkitRunnable ;
2021-08-08 09:36:06 +00:00
import java.util.Objects ;
2021-08-08 03:13:29 +00:00
public class PartyCommand implements CommandExecutor {
@Override
public boolean onCommand ( CommandSender sender , Command command , String label , String [ ] args ) {
if ( ! ( sender instanceof Player player ) ) { // must be a player
return true ;
}
2021-08-08 09:36:06 +00:00
if ( args . length = = 0 ) {
helpMessage ( sender ) ;
return true ;
}
2021-08-08 03:13:29 +00:00
new BukkitRunnable ( ) {
@Override
public void run ( ) {
switch ( args [ 0 ] . toLowerCase ( ) ) {
case " create " - > {
2021-08-08 09:36:06 +00:00
if ( args . length < 3 | | ! args [ 1 ] . matches ( " [ \\ w]{3,16} " ) | | ! args [ 2 ] . matches ( " [ \\ w]{3,16} " ) ) {
invalidMessage ( sender , CommandUsage . CREATE ) ;
break ;
}
if ( PartyManager . getParty ( args [ 1 ] ) ! = null ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>A party with this name already exists.</red> " ) ) ;
break ;
}
2021-08-08 03:13:29 +00:00
Party party = Queries . addParty ( player . getUniqueId ( ) , args [ 1 ] , args [ 2 ] ) ;
2021-08-08 09:36:06 +00:00
party . addUser ( ChatUserManager . getChatUser ( player . getUniqueId ( ) ) ) ;
2021-08-08 03:13:29 +00:00
PartyManager . addParty ( party ) ;
2021-08-08 09:36:06 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <green>You created a party called: '<gold> " +
party . getPartyName ( ) + " </gold>' with the password: '<gold> " +
party . getPartyPassword ( ) + " </gold>'</green> " ) ) ;
2021-08-08 03:13:29 +00:00
}
case " invite " - > {
2021-08-08 09:36:06 +00:00
if ( args . length < 2 ) {
invalidMessage ( sender , CommandUsage . INVITE ) ;
break ;
}
Party party = PartyManager . getParty ( player . getUniqueId ( ) ) ;
if ( party = = null ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>You're not in a party.</red> " ) ) ;
break ;
}
if ( ! party . getOwnerUuid ( ) . equals ( player . getUniqueId ( ) ) ) {
sender . sendMessage ( " <red>You don't own this party.</red> " ) ;
break ;
}
Player target = Bukkit . getPlayer ( args [ 1 ] ) ;
if ( target = = null | | ! target . isOnline ( ) ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>The player must be on the same server to receive an invite.</red> " ) ) ;
break ;
}
target . sendMessage ( MiniMessage . get ( ) . parse ( " <click:run_command:'/party join " + party . getPartyName ( ) + " " + party . getPartyPassword ( ) +
" '><dark_aqua>You received an invite to join " + party . getPartyName ( ) + " click this message to accept.</dark_aqua></click> " ) ) ;
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <green>You send a party invite to " + target . getName ( ) + " !</green> " ) ) ;
2021-08-08 03:13:29 +00:00
}
case " join " - > {
2021-08-08 09:36:06 +00:00
if ( args . length < 3 | | ! args [ 1 ] . matches ( " [ \\ w]{3,16} " ) | | ! args [ 2 ] . matches ( " [ \\ w]{3,16} " ) ) {
invalidMessage ( sender , CommandUsage . JOIN ) ;
break ;
}
Party party = PartyManager . getParty ( args [ 1 ] ) ;
if ( party = = null ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>This party does not exist.</red> " ) ) ;
break ;
}
if ( ! party . getPartyPassword ( ) . equals ( args [ 2 ] ) ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>Invalid password.</red> " ) ) ;
break ;
}
party . addUser ( ChatUserManager . getChatUser ( player . getUniqueId ( ) ) ) ;
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <green>You joined " + party . getPartyName ( ) + " !</green> " ) ) ;
2021-08-08 03:13:29 +00:00
}
case " leave " - > {
2021-08-08 09:36:06 +00:00
Party party = PartyManager . getParty ( player . getUniqueId ( ) ) ;
if ( party = = null ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>You're not in a party.</red> " ) ) ;
break ;
}
party . removeUser ( player . getUniqueId ( ) ) ;
if ( party . getOwnerUuid ( ) . equals ( player . getUniqueId ( ) ) ) {
if ( party . getPartyUsers ( ) . size ( ) > 0 ) {
ChatUser chatUser = ChatUserManager . getChatUser ( party . newOwner ( ) ) ;
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <dark_aqua>Since you own this party a new party owner will be chosen.<dark_aqua> " ) ) ;
ChatPlugin . getInstance ( ) . getChatHandler ( ) . partyMessage ( party , player , " <dark_aqua> " +
ChatUserManager . getChatUser ( player . getUniqueId ( ) ) . getDisplayName ( ) +
" left the party, the new party owner is " + chatUser . getDisplayName ( ) ) ;
} else {
party . delete ( ) ;
}
}
2021-08-08 03:13:29 +00:00
// TODO: 07/08/2021 leave the party
}
case " remove " - > {
2021-08-08 09:36:06 +00:00
if ( args . length < 2 ) {
invalidMessage ( sender , CommandUsage . REMOVE ) ;
break ;
}
Party party = PartyManager . getParty ( player . getUniqueId ( ) ) ;
if ( party = = null ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>You're not in a party.</red> " ) ) ;
break ;
}
if ( ! party . getOwnerUuid ( ) . equals ( player . getUniqueId ( ) ) ) {
sender . sendMessage ( " <red>You don't own this party.</red> " ) ;
break ;
}
OfflinePlayer offlinePlayerIfCached = Bukkit . getOfflinePlayerIfCached ( ( args [ 1 ] ) ) ;
if ( offlinePlayerIfCached = = null ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>Unable to find this player.</red> " ) ) ;
return ;
}
party . removeUser ( ChatUserManager . getChatUser ( offlinePlayerIfCached . getUniqueId ( ) ) ) ;
if ( offlinePlayerIfCached . isOnline ( ) ) {
Objects . requireNonNull ( offlinePlayerIfCached . getPlayer ( ) )
. sendMessage ( MiniMessage . get ( ) . parse ( " <red>You were removed from the ' " + party . getPartyName ( ) + " ' party. " ) ) ;
}
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <green>You removed " + offlinePlayerIfCached . getName ( ) + " from the party!</green> " ) ) ;
2021-08-08 03:13:29 +00:00
}
2021-08-08 09:36:06 +00:00
case " info " - > {
Party party = PartyManager . getParty ( player . getUniqueId ( ) ) ;
if ( party = = null ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>You're not in a party.</red> " ) ) ;
break ;
}
StringBuilder stringBuilder = new StringBuilder ( ) ;
stringBuilder . append ( " <gold><bold>Party info</bold>:</gold> " )
. append ( " <green>Party name: <dark_aqua> " ) . append ( party . getPartyName ( ) ) . append ( " </dark_aqua> \ n " )
. append ( party . getOwnerUuid ( ) . equals ( player . getUniqueId ( ) ) ? " Party password: <dark_aqua> " + party . getPartyPassword ( ) + " </dark_aqua> \ n " : " " )
. append ( " Party owner: " ) . append ( party . getUserDisplayName ( party . getOwnerUuid ( ) ) ) . append ( " \ n " )
. append ( " Party members: " ) ;
for ( String displayName : party . getPartyUsers ( ) . values ( ) ) {
stringBuilder . append ( displayName ) . append ( " , " ) ;
}
stringBuilder . delete ( stringBuilder . length ( ) - 2 , stringBuilder . length ( ) ) ;
sender . sendMessage ( Utility . applyColor ( stringBuilder . toString ( ) ) ) ;
2021-08-08 03:13:29 +00:00
}
default - > {
2021-08-08 09:36:06 +00:00
helpMessage ( sender ) ;
2021-08-08 03:13:29 +00:00
}
}
}
} . runTaskAsynchronously ( ChatPlugin . getInstance ( ) ) ;
return false ;
}
2021-08-08 09:36:06 +00:00
private void invalidMessage ( CommandSender sender , CommandUsage commandUsage ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>Invalid command, proper usage: %command%.</red> " . replaceAll ( " %command% " , commandUsage . message ) ) ) ;
}
private void helpMessage ( CommandSender sender ) {
StringBuilder stringBuilder = new StringBuilder ( ) ;
stringBuilder . append ( " <dark_aqua>Party commands:</dark_aqua><green> " ) ;
for ( CommandUsage commandUsage : CommandUsage . values ( ) ) {
stringBuilder . append ( " \ n- " ) . append ( commandUsage . message ) ;
}
stringBuilder . append ( " </green> " ) ;
sender . sendMessage ( MiniMessage . get ( ) . parse ( stringBuilder . toString ( ) ) ) ;
}
private enum CommandUsage {
CREATE ( " <gold>/party create <#FFE800><hover:show_text:'<gold>A party name must be 3-16 characters</gold>'><name></hover> " +
" <hover:show_text:'<gold>A party password must be 3-16 characters \ n</gold> " +
" <red>When choosing a password keep in mind staff can see it and you might need to share it with other players!</red>'><password></#FFE800></hover></gold> " ) ,
INVITE ( " <gold>/party invite <username></gold> " ) ,
JOIN ( " <gold>/party join <party name> <password></gold> " ) ,
LEAVE ( " <gold><hover:show_text:'<red>If the party owner leaves the server will choose a new party owner</red>'>/party leave</hover></gold> " ) ,
REMOVE ( " <gold>/party remove <username></gold> " ) ;
private final String message ;
CommandUsage ( String message ) {
this . message = message ;
}
}
}