2021-08-08 03:13:29 +00:00
package com.alttd.chat.commands ;
import com.alttd.chat.ChatPlugin ;
2021-08-08 11:30:57 +00:00
import com.alttd.chat.config.Config ;
2021-08-08 03:13:29 +00:00
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 ;
2021-08-08 11:30:57 +00:00
import com.google.common.io.ByteArrayDataOutput ;
import com.google.common.io.ByteStreams ;
2021-08-08 09:36:06 +00:00
import net.kyori.adventure.text.Component ;
import net.kyori.adventure.text.minimessage.MiniMessage ;
2021-08-08 11:30:57 +00:00
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer ;
2021-08-08 09:36:06 +00:00
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 ;
2021-08-08 10:34:45 +00:00
import org.bukkit.command.TabCompleter ;
2021-08-08 03:13:29 +00:00
import org.bukkit.entity.Player ;
import org.bukkit.scheduler.BukkitRunnable ;
2021-08-08 10:34:45 +00:00
import org.jetbrains.annotations.NotNull ;
import org.jetbrains.annotations.Nullable ;
2021-08-08 03:13:29 +00:00
2021-08-08 16:27:30 +00:00
import java.util.* ;
2021-08-08 10:34:45 +00:00
import java.util.stream.Collectors ;
2021-08-08 09:36:06 +00:00
2021-08-08 10:46:56 +00:00
public class ChatParty implements CommandExecutor , TabCompleter {
2021-08-08 03:13:29 +00:00
@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 ) {
2021-08-08 11:30:57 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>A chat party with this name already exists.</red> " ) ) ;
2021-08-08 09:36:06 +00:00
break ;
}
2021-08-08 03:13:29 +00:00
Party party = Queries . addParty ( player . getUniqueId ( ) , args [ 1 ] , args [ 2 ] ) ;
2021-08-08 10:19:32 +00:00
// party.addUser(ChatUserManager.getChatUser(player.getUniqueId())); //Removed until we can get nicknames to translate to colors correctly
party . addUser ( ChatUserManager . getChatUser ( player . getUniqueId ( ) ) , player . getName ( ) ) ;
2021-08-08 03:13:29 +00:00
PartyManager . addParty ( party ) ;
2021-08-08 11:30:57 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <green>You created a chat party called: '<gold> " +
2021-08-08 09:36:06 +00:00
party . getPartyName ( ) + " </gold>' with the password: '<gold> " +
party . getPartyPassword ( ) + " </gold>'</green> " ) ) ;
2021-08-08 11:30:57 +00:00
update ( player , party . getPartyId ( ) ) ;
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 ) {
2021-08-08 11:30:57 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>You're not in a chat party.</red> " ) ) ;
2021-08-08 09:36:06 +00:00
break ;
}
if ( ! party . getOwnerUuid ( ) . equals ( player . getUniqueId ( ) ) ) {
2021-08-08 11:30:57 +00:00
sender . sendMessage ( " <red>You don't own this chat party.</red> " ) ;
2021-08-08 09:36:06 +00:00
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 ;
}
2021-08-08 11:30:57 +00:00
target . sendMessage ( MiniMessage . get ( ) . parse ( " <click:run_command:'/chatparty join " + party . getPartyName ( ) + " " + party . getPartyPassword ( ) +
2021-08-08 09:36:06 +00:00
" '><dark_aqua>You received an invite to join " + party . getPartyName ( ) + " click this message to accept.</dark_aqua></click> " ) ) ;
2021-08-08 11:30:57 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <green>You send a chat 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 ) {
2021-08-08 11:30:57 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>This chat party does not exist.</red> " ) ) ;
2021-08-08 09:36:06 +00:00
break ;
}
if ( ! party . getPartyPassword ( ) . equals ( args [ 2 ] ) ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>Invalid password.</red> " ) ) ;
break ;
}
2021-08-08 10:19:32 +00:00
// party.addUser(ChatUserManager.getChatUser(player.getUniqueId())); //Removed until we can get nicknames to translate to colors correctly
party . addUser ( ChatUserManager . getChatUser ( player . getUniqueId ( ) ) , player . getName ( ) ) ;
2021-08-08 09:36:06 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <green>You joined " + party . getPartyName ( ) + " !</green> " ) ) ;
2021-08-08 11:30:57 +00:00
update ( player , party . getPartyId ( ) ) ;
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 ) {
2021-08-08 11:30:57 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>You're not in a chat party.</red> " ) ) ;
2021-08-08 09:36:06 +00:00
break ;
}
party . removeUser ( player . getUniqueId ( ) ) ;
if ( party . getOwnerUuid ( ) . equals ( player . getUniqueId ( ) ) ) {
if ( party . getPartyUsers ( ) . size ( ) > 0 ) {
ChatUser chatUser = ChatUserManager . getChatUser ( party . newOwner ( ) ) ;
2021-08-08 11:30:57 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <dark_aqua>Since you own this chat party a new party owner will be chosen.<dark_aqua> " ) ) ;
2021-08-08 09:36:06 +00:00
ChatPlugin . getInstance ( ) . getChatHandler ( ) . partyMessage ( party , player , " <dark_aqua> " +
2021-08-08 11:30:57 +00:00
player . getName ( ) +
" left the chat party, the new party owner is " + chatUser . getDisplayName ( ) ) ;
2021-08-08 09:36:06 +00:00
} else {
party . delete ( ) ;
}
2021-08-08 11:30:57 +00:00
} else {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <green>You have left the chat party!</green> " ) ) ;
2021-08-08 09:36:06 +00:00
}
2021-08-08 11:30:57 +00:00
update ( player , party . getPartyId ( ) ) ;
2021-08-08 03:13:29 +00:00
}
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 ) {
2021-08-08 11:30:57 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>You're not in a chat party.</red> " ) ) ;
2021-08-08 09:36:06 +00:00
break ;
}
if ( ! party . getOwnerUuid ( ) . equals ( player . getUniqueId ( ) ) ) {
2021-08-08 11:30:57 +00:00
sender . sendMessage ( " <red>You don't own this chat party.</red> " ) ;
2021-08-08 09:36:06 +00:00
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 ( ) ) ) ;
2021-08-08 16:27:30 +00:00
if ( offlinePlayerIfCached . getUniqueId ( ) . equals ( party . getOwnerUuid ( ) ) ) {
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>You can't remove yourself, please leave instead.</red> " ) ) ;
return ;
}
2021-08-08 09:36:06 +00:00
if ( offlinePlayerIfCached . isOnline ( ) ) {
Objects . requireNonNull ( offlinePlayerIfCached . getPlayer ( ) )
2021-08-08 11:30:57 +00:00
. sendMessage ( MiniMessage . get ( ) . parse ( " <red>You were removed from the ' " + party . getPartyName ( ) + " ' chat party. " ) ) ;
2021-08-08 09:36:06 +00:00
}
2021-08-08 11:30:57 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <green>You removed " + offlinePlayerIfCached . getName ( ) + " from the chat party!</green> " ) ) ;
update ( player , party . getPartyId ( ) ) ;
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 ) {
2021-08-08 11:30:57 +00:00
sender . sendMessage ( MiniMessage . get ( ) . parse ( " <red>You're not in a chat party.</red> " ) ) ;
2021-08-08 09:36:06 +00:00
break ;
}
StringBuilder stringBuilder = new StringBuilder ( ) ;
2021-08-08 11:30:57 +00:00
stringBuilder . append ( " <gold><bold>Chat party info</bold>: \ n</gold> " )
. append ( " <green>Name: <dark_aqua> " ) . append ( party . getPartyName ( ) ) . append ( " </dark_aqua> \ n " )
. append ( party . getOwnerUuid ( ) . equals ( player . getUniqueId ( ) ) ? " Password: <dark_aqua> " + party . getPartyPassword ( ) + " </dark_aqua> \ n " : " " )
. append ( " Owner: " ) . append ( party . getUserDisplayName ( party . getOwnerUuid ( ) ) ) . append ( " \ n " )
. append ( " Members: " ) ;
2021-08-08 09:36:06 +00:00
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
}
2021-08-08 12:48:42 +00:00
// TODO: 08/08/2021 add a way to change the password and owner (and name?)
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 ( ) ;
2021-08-08 11:30:57 +00:00
stringBuilder . append ( " <dark_aqua>Chat party commands:</dark_aqua><green> " ) ;
2021-08-08 09:36:06 +00:00
for ( CommandUsage commandUsage : CommandUsage . values ( ) ) {
stringBuilder . append ( " \ n- " ) . append ( commandUsage . message ) ;
}
stringBuilder . append ( " </green> " ) ;
sender . sendMessage ( MiniMessage . get ( ) . parse ( stringBuilder . toString ( ) ) ) ;
}
2021-08-08 10:34:45 +00:00
@Override
public @Nullable List < String > onTabComplete ( @NotNull CommandSender sender , @NotNull Command command , @NotNull String label , @NotNull String [ ] args ) {
List < String > possibleValues = new ArrayList < > ( ) ;
String current = args . length > 0 ? args [ args . length - 1 ] . toLowerCase ( ) : " " ;
if ( args . length < = 1 ) {
possibleValues . add ( " create " ) ;
possibleValues . add ( " invite " ) ;
possibleValues . add ( " join " ) ;
possibleValues . add ( " leave " ) ;
possibleValues . add ( " remove " ) ;
possibleValues . add ( " info " ) ;
return finalizeSuggest ( possibleValues , current ) ;
}
switch ( args [ 0 ] . toLowerCase ( ) ) {
case " invite " , " remove " - > {
Bukkit . getOnlinePlayers ( ) . stream ( ) . filter ( p - > ! p . getName ( ) . equals ( sender . getName ( ) ) ) . forEach ( p - > possibleValues . add ( p . getName ( ) ) ) ;
}
}
return finalizeSuggest ( possibleValues , current . toLowerCase ( ) ) ;
}
public List < String > finalizeSuggest ( List < String > possibleValues , String remaining ) {
List < String > finalValues = new ArrayList < > ( ) ;
for ( String str : possibleValues ) {
if ( str . toLowerCase ( ) . startsWith ( remaining ) ) {
finalValues . add ( str ) ;
}
}
return finalValues ;
}
2021-08-08 11:30:57 +00:00
private void update ( Player player , int partyId ) { // FIXME: 08/08/2021 This only updates members btw and should be replaced with per change messages
ByteArrayDataOutput out = ByteStreams . newDataOutput ( ) ;
out . writeUTF ( " tmppartyupdate " ) ;
out . writeUTF ( String . valueOf ( partyId ) ) ;
player . sendPluginMessage ( ChatPlugin . getInstance ( ) , Config . MESSAGECHANNEL , out . toByteArray ( ) ) ;
}
2021-08-08 09:36:06 +00:00
private enum CommandUsage {
2021-08-08 11:30:57 +00:00
CREATE ( " <gold>/chatparty create <#FFE800><hover:show_text:'<gold>A chat party name must be 3-16 characters</gold>'><name></hover> " +
" <hover:show_text:'<gold>A chat party password must be 3-16 characters \ n</gold> " +
2021-08-08 09:36:06 +00:00
" <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> " ) ,
2021-08-08 11:30:57 +00:00
INVITE ( " <gold>/chatparty invite <username></gold> " ) ,
JOIN ( " <gold>/chatparty join <chat party name> <password></gold> " ) ,
LEAVE ( " <gold><hover:show_text:'<red>If the chat party owner leaves the server will choose a new chat party owner</red>'>/chatparty leave</hover></gold> " ) ,
REMOVE ( " <gold>/chatparty remove <username></gold> " ) ,
INFO ( " <gold>/chatparty info</gold> " ) ;
2021-08-08 09:36:06 +00:00
private final String message ;
CommandUsage ( String message ) {
this . message = message ;
}
}
}