示例#1
0
        public void UpdateCachedBody(WorldBody worldBody, uint time)
        {
            if (worldBody == null || !worldBody.Exists)
            {
                return;
            }

            if (!Bodies.TryGetValue(worldBody.ID, out BucketBody bucket))
            {
                bucket = new BucketBody()
                {
                    Stale = false
                };
                Bodies.Add(worldBody.ID, bucket);
            }

            bucket.Stale = false;
            bucket.ReadBody(worldBody, time);

            if (worldBody.Group != null)
            {
                if (!Groups.TryGetValue(worldBody.Group.ID, out BucketGroup group))
                {
                    group = new BucketGroup();
                    Groups.Add(worldBody.Group.ID, group);
                    group.Stale = true;
                }

                if (group.Stale)
                {
                    group.Stale = false;
                    group.ReadGroup(worldBody.Group, time);
                }
            }
        }
示例#2
0
        internal async Task <Stream> SendAsync(WebSocketRequest request, BucketGroup group, int bucketId, ulong objId)
        {
            request.CancelToken = _cancelToken;
            var bucket = GetBucket(group, bucketId, objId);

            return(await bucket.SendAsync(request).ConfigureAwait(false));
        }
示例#3
0
        private void UpdateLocalGroups(IEnumerable <Group> groups)
        {
            foreach (var bucket in Groups.Values)
            {
                bucket.Stale = true;
            }

            foreach (var obj in groups)
            {
                BucketGroup bucket = null;

                if (Groups.ContainsKey(obj.ID))
                {
                    Groups[obj.ID].Stale = false;
                }
                else
                {
                    bucket = new BucketGroup
                    {
                        GroupUpdated = obj,
                        Stale        = false
                    };
                    Groups.Add(obj.ID, bucket);
                }
            }
        }
示例#4
0
    private void CreateBucketGroup(int sub_tick_count, float seconds_per_sub_tick, UpdateRate update_rate, List <BucketGroup> sub_group)
    {
        BucketGroup item = new BucketGroup(sub_tick_count, seconds_per_sub_tick, update_rate);

        bucketGroups.Add(item);
        sub_group.Add(item);
    }
示例#5
0
        private void UpdateLocalBodies(IEnumerable <Body> bodies)
        {
            foreach (var bucket in Groups.Values)
            {
                bucket.Stale = true;
            }

            foreach (var bucket in Bodies.Values)
            {
                bucket.Stale = true;
            }

            foreach (var obj in bodies)
            {
                if (Bodies.ContainsKey(obj.ID))
                {
                    Bodies[obj.ID].Stale       = false;
                    Bodies[obj.ID].BodyUpdated = obj;
                }
                else
                {
                    var bucket = new BucketBody
                    {
                        BodyUpdated = obj,
                        Stale       = false
                    };
                    Bodies.Add(obj.ID, bucket);
                }

                if (obj.Group != null)
                {
                    if (Groups.ContainsKey(obj.Group.ID))
                    {
                        Groups[obj.Group.ID].Stale = false;
                    }
                    else
                    {
                        var bucket = new BucketGroup
                        {
                            GroupUpdated = obj.Group,
                            Stale        = false
                        };
                        Groups.Add(obj.Group.ID, bucket);
                    }
                }
            }
        }
示例#6
0
        private RequestQueueBucket GetBucket(BucketGroup group, int bucketId, ulong objId)
        {
            switch (group)
            {
            case BucketGroup.Global:
                return(GetGlobalBucket((GlobalBucket)bucketId));

            case BucketGroup.Guild:
                return(GetGuildBucket((GuildBucket)bucketId, objId));

            case BucketGroup.Channel:
                return(GetChannelBucket((ChannelBucket)bucketId, objId));

            default:
                throw new ArgumentException($"Unknown bucket group: {group}", nameof(group));
            }
        }
示例#7
0
        //Core
        private async Task SendGatewayInternalAsync(GatewayOpCode opCode, object payload,
                                                    BucketGroup group, int bucketId, ulong guildId, RequestOptions options)
        {
            CheckState();

            //TODO: Add ETF
            byte[] bytes = null;
            payload = new WebSocketMessage {
                Operation = (int)opCode, Payload = payload
            };
            if (payload != null)
            {
                bytes = Encoding.UTF8.GetBytes(SerializeJson(payload));
            }
            await RequestQueue.SendAsync(new WebSocketRequest(_gatewayClient, bytes, true, options), group, bucketId, guildId).ConfigureAwait(false);

            await _sentGatewayMessageEvent.InvokeAsync(opCode).ConfigureAwait(false);
        }
示例#8
0
        private async Task <TResponse> SendRpcAsyncInternal <TResponse>(string cmd, object payload, BucketGroup group, int bucketId, ulong guildId,
                                                                        Optional <string> evt, bool ignoreState, RequestOptions options)
            where TResponse : class
        {
            if (!ignoreState)
            {
                CheckState();
            }

            byte[] bytes = null;
            var    guid  = Guid.NewGuid();

            payload = new API.Rpc.RpcMessage {
                Cmd = cmd, Event = evt, Args = payload, Nonce = guid
            };
            if (payload != null)
            {
                var json = SerializeJson(payload);
                bytes = Encoding.UTF8.GetBytes(json);
            }

            var requestTracker = new RpcRequest <TResponse>(options);

            _requests[guid] = requestTracker;

            await _requestQueue.SendAsync(new WebSocketRequest(_webSocketClient, bytes, true, options), group, bucketId, guildId).ConfigureAwait(false);

            await _sentRpcMessageEvent.InvokeAsync(cmd).ConfigureAwait(false);

            return(await requestTracker.Promise.Task.ConfigureAwait(false));
        }