- Ban booted players from a table

- Boot by sitting position, not oid


git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@713 c613c5cb-e716-0410-b11b-feb51c14d237
This commit is contained in:
Bruno Garcia
2008-08-06 22:52:41 +00:00
parent aa84c5055a
commit 7d75f0c760
3 changed files with 36 additions and 8 deletions
@@ -55,11 +55,14 @@ public interface ParlorCodes extends InvocationCodes
* occupied. */ * occupied. */
public static final String TABLE_POSITION_OCCUPIED = "m.table_position_occupied"; public static final String TABLE_POSITION_OCCUPIED = "m.table_position_occupied";
/** An error code returned when a user requests to creat or join a table but they're already /** An error code returned when a user requests to create or join a table but they're already
* sitting at another table. */ * sitting at another table. */
public static final String ALREADY_AT_TABLE = "m.already_at_table"; public static final String ALREADY_AT_TABLE = "m.already_at_table";
/** An error code returned when a user requests to leave a table that they were not sitting at /** An error code returned when a user requests to leave a table that they were not sitting at
* in the first place. */ * in the first place. */
public static final String NOT_AT_TABLE = "m.not_at_table"; public static final String NOT_AT_TABLE = "m.not_at_table";
/** An error code returned when a user requests to join a table they've been banned from. */
public static final String BANNED_FROM_TABLE = "m.banned_from_table";
} }
@@ -22,6 +22,7 @@
package com.threerings.parlor.data; package com.threerings.parlor.data;
import java.util.List; import java.util.List;
import java.util.HashSet;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@@ -228,6 +229,10 @@ public class Table
return TABLE_POSITION_OCCUPIED; return TABLE_POSITION_OCCUPIED;
} }
if (_bannedUsers != null && _bannedUsers.contains(player.username)) {
return BANNED_FROM_TABLE;
}
// otherwise all is well, stick 'em in // otherwise all is well, stick 'em in
setPlayerPos(position, player); setPlayerPos(position, player);
return null; return null;
@@ -244,6 +249,19 @@ public class Table
bodyOids[position] = player.getOid(); bodyOids[position] = player.getOid();
} }
/**
* Indicate to this table that a user was booted and should
* be prevented from rejoining.
*/
public void addBannedUser (Name username)
{
if (_bannedUsers == null) {
_bannedUsers = new HashSet<Name>();
}
_bannedUsers.add(username);
}
/** /**
* Requests that the specified user be removed from their seat at this table. * Requests that the specified user be removed from their seat at this table.
* *
@@ -423,4 +441,7 @@ public class Table
/** A counter for assigning table ids. */ /** A counter for assigning table ids. */
protected static int _tableIdCounter = 0; protected static int _tableIdCounter = 0;
/** On the server, the usernames that have been banned from this table. */
protected transient HashSet<Name> _bannedUsers;
} }
@@ -282,7 +282,7 @@ public class TableManager
} }
// from interface TableProvider // from interface TableProvider
public void bootPlayer (ClientObject caller, int tableId, int bodyId, public void bootPlayer (ClientObject caller, int tableId, int position,
TableService.InvocationListener listener) TableService.InvocationListener listener)
throws InvocationException throws InvocationException
{ {
@@ -291,20 +291,24 @@ public class TableManager
if (table == null) { if (table == null) {
throw new InvocationException(NO_SUCH_TABLE); throw new InvocationException(NO_SUCH_TABLE);
} else if (booter.getOid() != table.bodyOids[0]) { } else if (position == 0 || booter.getOid() != table.bodyOids[0]) {
// Must be head of the table, and can't self-boot
throw new InvocationException(INVALID_TABLE_POSITION); throw new InvocationException(INVALID_TABLE_POSITION);
} else if ( ! _allowBooting) { } else if ( ! _allowBooting) {
throw new InvocationException(INTERNAL_ERROR); throw new InvocationException(INTERNAL_ERROR);
} }
// Remember to keep him banned
table.addBannedUser(table.players[position]);
// Remove the player from the table // Remove the player from the table
if ( ! table.clearPlayerByOid(bodyId)) { table.clearPlayerPos(position);
throw new InvocationException(NOT_AT_TABLE); if (notePlayerRemoved(table.bodyOids[position]) == null) {
} log.warning("No body to table mapping to clear? [position=" + position +
if (notePlayerRemoved(bodyId) == null) {
log.warning("No body to table mapping to clear? [bodyId=" + bodyId +
", table=" + table + "]."); ", table=" + table + "].");
} }
_tlobj.updateTables(table);
} }
/** /**