//initialize player data (this happens after login)
    private void InitPlayerDataRequest(int connectionID, int recHostID, Net_InitPlayerDataRequest msg)
    {
        //fetch player from DB by token
        DB_Player player = mdb.FetchPlayerByToken(msg.token);

        if (player == null)
        {
            Debug.Log(string.Format("[Sector Server]: invalid token from connection id {0} on host {1}.", connectionID, recHostID));
            //TODO: force update this connection's token (be careful how you do this)
            return;
        }

        //fetch model_workers by player and convert to message_this_workers
        List <Message_This_Worker> messageThisWorkers = new List <Message_This_Worker>();
        List <DB_Worker>           modelWorkers       = mdb.FetchWorkersByPlayer(player);

        foreach (DB_Worker worker in modelWorkers)
        {
            switch (worker.location.CollectionName)
            {
            case COLLECTIONS.SHIPS:
                messageThisWorkers.Add(new Message_This_Worker(mdb.FetchShipByID(worker.location.Id.AsObjectId).shipName, worker.workerName, worker.activity));
                break;

            default:
                Debug.Log(string.Format("[Sector Server]: Unexpected worker location collection fetch ({0}).", worker.location.CollectionName));
                return;
            }
        }

        //send messsage_player
        SendClient(connectionID, recHostID, new Net_OnInitPlayerDataRequest(player.CreatedOn.ToString(), messageThisWorkers, player.ActiveWorkerIndex));

        //update player's connection id
        player.ActiveConnectionID = connectionID;
        player.ActiveHostID       = recHostID;
        mdb.updatePlayer(player);

        //update account's connection id
        DB_Account account = mdb.FetchAccountByToken(msg.token);

        account.ActiveConnectionID = connectionID;
        account.ActiveHostID       = recHostID;
        mdb.updateAccount(account);
    }