* @param client
	 */
	private void cmd_party(final String arg, final Client client) {
		// party: list the members of your party (if you are in one)
		// party #create: create a new party with you as the leader (if you're not in a party)
		// party #delete: delete an existing party that you are the leader of
		// party #invite <player name> ...: invite a player or players to the party
		// party #join: join the party you were most recently invited to
		// party #kick <player name> ...: kick a player out of the party
		// party #leave: leave your current party

		final Player player = getPlayer(client);
		final Party party = getPartyContainingPlayer(player);

		if (arg.equals("")) {
			if (party != null) {
				final List<String> output = new LinkedList<String>();
				
				output.add("- Party -------- ");
				
				for (final Player player1 : party.getPlayers()) {
					String extra = "";
					String color = getDisplayColor("player");

					if ( party.isLeader(player1) ) extra = "L";

					// refresh player state info
					player1.updateCurrentState();

					// indicate whether we're alive or not
					switch (player.getState()) {
					case ALIVE:         color = "green";  break;
					case INCAPACITATED: color = "yellow"; break;
					case DEAD:          color = "red";    break;
					default:            color = "white";  break;
					}
					
					output.add(colors(player1.getName(), color) + " " + colors(extra, "green"));
				}
				
				send(output, client);
			}
			else {
				send("You are not in a party.", client);
			}
		}
		else if (arg.charAt(0) == '#') {
			String arg1;
			String[] params = new String[0];

			if (arg.indexOf(' ') == -1) {
				arg1 = arg.substring(1).toLowerCase();
			}
			else {
				arg1 = arg.substring(1, arg.indexOf(' ')).toLowerCase();
				params = arg.substring(arg.indexOf(' ')).split(" ");
			}

			debug(arg1);
			
			if ( arg1.equals("create") ) {
				// create a new party with you as the leader (if you're not in a party)
				if (party != null) send("You are already in a party.", client);
				else               this.parties.add( createParty(player) );
			}
			else if ( arg1.equals("delete") ) {
				// deletes the party if you have one and are the leader
				if (party != null && party.isLeader(player)) {
					for(final Player player1 : party.getPlayers()) {
						party.removePlayer(player1);
					}
					
					this.chan.destroyChannel( party.getChannel().getName() );
					
					party.setChannel(null);
					
					this.parties.remove(party);
				}
				else send("Only the party leader may delete the party.", client);
			}
			else if ( arg1.equals("invite") ) {
				// send an invite to join a party to one or more players (if you are the leader)
				if ( party != null ) {
					if ( party.isLeader(player) ) {
						if( params.length == 0 ) {
							send("No players to invite specified.", client);
							return;
						}
						
						for (final String playerName : params) {
							final Player player1 = getPlayer(playerName);

							// TODO establish difference between players that don't exist and ones that aren't logged in
							// ^ we shouldn't be able to invite players who aren't logged in/don't exist

							if (player1 != null) {
								// is that player logged in
								if ( sclients.containsValue(player1) ) {
									// send invite (overwrites previous invites)
									this.partyInvites.put(player1, getPartyContainingPlayer(player));

									notify(player1, player.getName() + " has invited you to their party!");
								}
								else send("That player is not logged-in.", client);
							}
							else send("No such player.", client);
						}
					}
					else send("Only the party leader may invite players!", client);
				}
			}
			else if ( arg1.equals("join") ) {
				// accept a standing invite to join a party
				if( party != null ) {
					send("You're already in a party. Leave that one first.", client);
				}
				else {
					final Party party1 = partyInvites.get(player);
					
					if (party1 != null) {
						party1.addPlayer(player);
						
						this.partyInvites.remove(player);

						send("You joined " + party1.getLeader().getName() + "'s party.", client);

						notify(party1.getLeader(), player.getName() + " accepted your party invitation!");
						notify(party1.getLeader(), player.getName() + " joined your party.");
					}
				}
			}
			else if ( arg1.equals("kick") ) {
				// kick named player from the party
				if ( party != null ) {
					if ( party.isLeader(player) ) {
						if( params.length == 0 ) {
							send("No players to kick specified.", client);
							return;
						}

						for (final String playerName : params) {
							final Player player1 = getPlayer(playerName);
							
							if (player1 != null) {
								party.removePlayer(player1);

								send("You kick " + player1.getName() + " from the party.", client);
								notify(player1, player.getName() + " kicked you from the party.");
							}
						}
					}
					else {
						send("Only the party leader may kick party members!", client);
					}
				}
				else send("You are not in a party.", client);
			}
			else if ( arg1.equals("leave") ) {
				// leave your current party, if you're in one
				if (party != null) {
					final Player leader = party.getLeader();

					party.removePlayer(player);

					send("You left " + leader.getName() + "'s party.", client);
					
					notify(leader, player.getName() + " left your party.");
				}
				else send("You are not in a party.", client);
			}
		}
	}