3aefc93838
dependency resolution and management. Things are currently in a state of transition, but the important patterns have been established and I'll aim to sweep through all of Narya, Nenya and Vilya in the near future and do everything properly. Going through the other million-odd lines of code we have scattered across our various projects that use these libraries is not something I plan to do, so we'll be maintaining backward compatibility with the old static member method, though I hope to strive toward eradication of that usage entirely in MSOY while we still have a fighting chance. Given that some of our projects will continue to use the static member method in perpetuity, I'm not going to @Deprecate those fields because that would fill their logs with so much spam that they'd have to turn off deprecation warnings which would make life worse for them. So instead we'll settle for the big scary comment warning people away from the old bits. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5153 542714f4-19e9-0310-aa3c-eee0fc999fb1
180 lines
5.8 KiB
Java
180 lines
5.8 KiB
Java
//
|
|
// $Id$
|
|
//
|
|
// Narya library - tools for developing networked games
|
|
// Copyright (C) 2002-2007 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.google.inject.Guice;
|
|
import com.google.inject.Injector;
|
|
|
|
import com.threerings.util.Name;
|
|
|
|
import com.threerings.presents.dobj.RootDObjectManager;
|
|
import com.threerings.presents.net.AuthRequest;
|
|
import com.threerings.presents.server.ClientFactory;
|
|
import com.threerings.presents.server.ClientResolver;
|
|
import com.threerings.presents.server.InvocationManager;
|
|
import com.threerings.presents.server.PresentsClient;
|
|
import com.threerings.presents.server.PresentsServer;
|
|
|
|
import com.threerings.crowd.chat.server.ChatProvider;
|
|
import com.threerings.crowd.data.BodyObject;
|
|
|
|
import static com.threerings.crowd.Log.log;
|
|
|
|
/**
|
|
* 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
|
|
{
|
|
/** Configures dependencies needed by the Crowd services. */
|
|
public static class Module extends PresentsServer.Module
|
|
{
|
|
@Override protected void configure () {
|
|
super.configure();
|
|
// nada
|
|
}
|
|
}
|
|
|
|
/** The place registry. */
|
|
public static PlaceRegistry plreg;
|
|
|
|
/** Our chat provider. */
|
|
public static ChatProvider chatprov;
|
|
|
|
/**
|
|
* Initializes all of the server services and prepares for operation.
|
|
*/
|
|
public void init (Injector injector)
|
|
throws Exception
|
|
{
|
|
super.init(injector);
|
|
|
|
// configure the client manager to use our bits
|
|
clmgr.setClientFactory(new ClientFactory() {
|
|
public PresentsClient createClient (AuthRequest areq) {
|
|
return new CrowdClient();
|
|
}
|
|
public ClientResolver createClientResolver (Name username) {
|
|
return new CrowdClientResolver();
|
|
}
|
|
});
|
|
|
|
// 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
|
|
chatprov = createChatProvider();
|
|
chatprov.init(invmgr, omgr);
|
|
}
|
|
|
|
/**
|
|
* Allow derived instances to create a custom {@link PlaceRegistry}.
|
|
*/
|
|
protected PlaceRegistry createPlaceRegistry (
|
|
InvocationManager invmgr, RootDObjectManager omgr)
|
|
{
|
|
return new PlaceRegistry(invmgr, omgr);
|
|
}
|
|
|
|
/**
|
|
* Creates the {@link ChatProvider} we'll use to handle chat (or a
|
|
* derivation).
|
|
*/
|
|
protected ChatProvider createChatProvider ()
|
|
{
|
|
return new ChatProvider();
|
|
}
|
|
|
|
/**
|
|
* 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)
|
|
{
|
|
Injector injector = Guice.createInjector(new Module());
|
|
CrowdServer server = injector.getInstance(CrowdServer.class);
|
|
try {
|
|
server.init(injector);
|
|
server.run();
|
|
} catch (Exception e) {
|
|
log.warning("Unable to initialize server.", 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";
|
|
}
|