While I have made plenty of mistakes myself, I actually want to share the base code for a final project in one of my classes. The assignment was to make a generic networked game client, as well as a custom networked game server for a game. So you could host your game, but you could play anybody else's game from the class.
This was a bad idea for a lot of reasons, but the an easy one is code readability. To implement this, we end up with a lot of class and method declarations that look like this:
public abstract interface IExtVisitorHost<I, H extends IExtVisitorHost<I,? extends H>> extends Serializable
{
public <R, P> R execute(IExtVisitor<R, I, P, ? extends H> algo, P... params);
}
public abstract class AExtVisitor<R, I, P, H extends IExtVisitorHost<I, ? super H> > implements IExtVisitor<R,I,P, H>
{
}
Another is that in order to process these commands, we have to branch based on type. So the more different types of operations your program contains, the more overhead there is on each individual operation.
In the end, the whole premise doesn't make any sense. If everyone has to make a custom server, as might as well have them distribute a custom client as well, which can be optimized, updated, uninstalled, etc. more easily.