Files
narya/src/java/com/threerings/crowd/server/CrowdServer.java
T
Michael Bayne 176329e1ed Various updates to allow a system where a user's visible name is not the same
as their authentication name (which we leave in BodyObject.username). This
turns out to be simpler than the system we adopted for Yohoho wherein we
replace the player's user object after they select a character, but converting
to this sort of system is way more work than would be worth it.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3758 542714f4-19e9-0310-aa3c-eee0fc999fb1
2005-11-10 23:18:58 +00:00

152 lines
5.0 KiB
Java

//
// $Id$
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
// http://www.threerings.net/code/narya/
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package com.threerings.crowd.server;
import java.util.Iterator;
import com.threerings.util.Name;
import com.threerings.presents.dobj.RootDObjectManager;
import com.threerings.presents.server.InvocationManager;
import com.threerings.presents.server.PresentsServer;
import com.threerings.crowd.Log;
import com.threerings.crowd.chat.server.ChatProvider;
import com.threerings.crowd.data.BodyObject;
/**
* The crowd server extends the presents server by configuring it to use the
* extensions provided by the crowd layer to support crowd services.
*/
public class CrowdServer extends PresentsServer
{
/** The place registry. */
public static PlaceRegistry plreg;
/**
* Initializes all of the server services and prepares for operation.
*/
public void init ()
throws Exception
{
// do the presents server initialization
super.init();
// configure the client manager to use our client
clmgr.setClientClass(CrowdClient.class);
// configure the client manager to use our resolver
clmgr.setClientResolverClass(CrowdClientResolver.class);
// configure the dobject manager with our access controller
omgr.setDefaultAccessController(CrowdObjectAccess.DEFAULT);
// create our body locator
_lookup = createBodyLocator();
// create our place registry
plreg = createPlaceRegistry(invmgr, omgr);
// initialize the body services
BodyProvider.init(invmgr);
// initialize the chat services
ChatProvider.init(invmgr, omgr);
Log.info("Crowd server initialized.");
}
/**
* Allow derived instances to create a custom {@link PlaceRegistry}.
*/
protected PlaceRegistry createPlaceRegistry (
InvocationManager invmgr, RootDObjectManager omgr)
{
return new PlaceRegistry(invmgr, omgr);
}
/**
* Allow derived instances to create a custom {@link BodyLocator}. If the
* system opts not to use {@link BodyObject#username} as a user's visible
* name, it will need to provide a custom {@link BodyLocator}.
*/
protected BodyLocator createBodyLocator ()
{
return new BodyLocator() {
public BodyObject get (Name visibleName) {
// by default visibleName is username
return (BodyObject)clmgr.getClientObject(visibleName);
}
};
}
/**
* Enumerates the body objects for all active users on the server.
* This should only be called from the dobjmgr thread. The caller had
* best be certain they know what they're doing, since this should
* only be necessary for use in rather special circumstances.
*/
public static Iterator enumerateBodies ()
{
return clmgr.enumerateClientObjects();
}
/**
* Looks up the {@link BodyObject} for the user with the specified visible
* name, returns null if they are not online. This should only be called
* from the dobjmgr thread.
*/
public static BodyObject lookupBody (Name visibleName)
{
return _lookup.get(visibleName);
}
public static void main (String[] args)
{
CrowdServer server = new CrowdServer();
try {
server.init();
server.run();
} catch (Exception e) {
Log.warning("Unable to initialize server.");
Log.logStackTrace(e);
}
}
/** An interface that allows server extensions to reconfigure the body
* lookup process. See {@link #lookupBody}, {@link #createBodyLocator}. */
protected static interface BodyLocator
{
/** Returns the body object for the user with the specified visible
* name, or null if they are not online. This will only be called from
* the dobjmgr thread. */
public BodyObject get (Name visibleName);
}
/** Used to look up {@link BodyObject} instance for online users. See
* {@link #lookupBody}. */
protected static BodyLocator _lookup;
/** The config key for our list of invocation provider mappings. */
protected final static String PROVIDERS_KEY = "providers";
}