Ejemplo n.º 1
0
 public HoxisConnection()
 {
     _extractor                   = new HoxisBytesExtractor(readBufferSize);
     user                         = new HoxisUser();
     user.onNetworkAnomaly       += ProcessNetworkAnomaly;
     _extractor.onBytesExtracted += user.ProtocolEntry;
     user.onPost                 += Send;
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Get the connection state if this user has already signed in
        /// </summary>
        /// <param name="handle"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        private bool QueryConnectionState(string handle, HoxisProtocolArgs args)
        {
            long uid = FF.StringToLong(args["uid"]);

            if (uid <= 0)
            {
                return(ResponseError(handle, C.RESP_ILLEGAL_ARGUMENT, FF.StringFormat("illegal argument: {0}", args["uid"])));
            }
            HoxisUser user = HoxisServer.Ins.GetUser(uid);

            if (user == null)
            {
                return(Response(handle, "QueryConnectionStateCb", new KVString("code", C.RESP_NO_USER_INFO)));
            }
            if (user == this)
            {
                return(Response(handle, "QueryConnectionStateCb", new KVString("code", C.RESP_NO_USER_INFO)));
            }
            return(ResponseSuccess(handle, "QueryConnectionStateCb", new KVString("state", user.connectionState.ToString())));
        }
        //public void UserJoin(HoxisUser user, out Ret ret)
        //{
        //    if (_users.Count >= maxUser) { ret = new Ret(LogLevel.Info, RET_ENOUGH_USERS, "Users are enough"); return; }
        //    if (_users.Contains(user)) { ret = new Ret(LogLevel.Warning, RET_USER_EXISTS, FF.StringFormat("User:{0} already exists", user.userID)); return; }
        //    _users.Add(user);
        //    user.realtimeData.parentCluster = this;
        //    ret = Ret.ok;
        //}

        //public void UserLeave(HoxisUser user, out Ret ret)
        //{
        //    if (!_users.Contains(user)) { ret = new Ret(LogLevel.Warning, RET_NO_USER, FF.StringFormat("User:{0} doesn't exist", user.userID)); return; }
        //    ManageTeam(ManageOperation.Leave, user);
        //    user.realtimeData.parentTeam = null;
        //    _users.Remove(user);
        //    if (_users.Count == 0) { ret = new Ret(LogLevel.Info, RET_ALL_USERS_LEAVE, "All users have left"); return; }
        //    ret = Ret.ok;
        //}

        public bool ManageTeam(ManageOperation op, HoxisUser sponsor)
        {
            switch (op)
            {
            case ManageOperation.Create:

                break;

            case ManageOperation.Join:

                break;

            case ManageOperation.Leave:

                break;

            case ManageOperation.Destroy:

                break;
            }
            return(true);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// **WITHIN THREAD**
        /// The entrance of protocol bytes
        /// </summary>
        /// <param name="data"></param>
        public void ProtocolEntry(byte[] data)
        {
            string        json  = FF.BytesToString(data);
            HoxisProtocol proto = FF.JsonToObject <HoxisProtocol>(json);

            switch (proto.type)
            {
            case ProtocolType.Synchronization:
                switch (proto.receiver.type)
                {
                case ReceiverType.Cluster:
                    if (realtimeData.parentCluster == null)
                    {
                        return;
                    }
                    realtimeData.parentCluster.ProtocolBroadcast(proto);
                    break;

                case ReceiverType.Team:
                    if (realtimeData.parentTeam == null)
                    {
                        return;
                    }
                    realtimeData.parentTeam.ProtocolBroadcast(proto);
                    break;

                case ReceiverType.User:
                    HoxisUser user = HoxisServer.Ins.GetUser(proto.receiver.uid);
                    // todo send
                    break;
                }
                break;

            case ProtocolType.Request:
                // Request check
                Ret ret;
                CheckRequest(proto, out ret);
                if (ret.code != 0)
                {
                    ResponseError(proto.handle, C.RESP_CHECK_FAILED, ret.desc);
                    return;
                }
                // Check ok
                if (!respTable.ContainsKey(proto.action.method))
                {
                    if (DebugRecorder.LogEnable(_logger))
                    {
                        _logger.LogError(FF.StringFormat("invalid request: {0}", proto.action.method), "", true);
                    }
                    ResponseError(proto.handle, C.RESP_CHECK_FAILED, FF.StringFormat("invalid request: {0}", proto.action.method));
                    return;
                }
                respTable[proto.action.method](proto.handle, proto.action.args);
                break;

            default:
                if (DebugRecorder.LogEnable(_logger))
                {
                    _logger.LogError(FF.StringFormat("invalid protocol type: {0}", proto.type), "");
                }
                break;
            }
        }