Beispiel #1
0
        private static async Task <InboundMessage> InternalRequest(string @event, [CanBeNull] IClient target, params object[] payloads)
        {
            var tcs = new TaskCompletionSource <InboundMessage>();

            var callback = new Action <byte[]>(data =>
            {
                var message = InboundMessage.From(data);

                logger.Trace($"Request Received: {PrintInboundMessage(message)}");

                tcs.SetResult(message);
            });

            var msg = new OutboundMessage
            {
                Id       = Guid.NewGuid(),
                Target   = target,
                Event    = @event,
                Payloads = payloads.Select(p => Serializer.Serialize(p)).ToList()
            };

            try
            {
                events[$"{msg.Id}:{@event}"] += callback;

                Emit(msg);

                return(await tcs.Task);
            }
            finally
            {
                events[$"{msg.Id}:{@event}"] -= callback;
            }
        }
Beispiel #2
0
        public static byte[] Pack(OutboundMessage message)
        {
            var json = Serialize(message);

            using (var compressedStream = new ZlibStream(new MemoryStream(json, false), CompressionMode.Compress, CompressionLevel.Default, false))
                using (var outputStream = new MemoryStream())
                {
                    compressedStream.CopyTo(outputStream);

                    return(outputStream.ToArray());
                }
        }
Beispiel #3
0
        public void Fire(OutboundMessage message)
        {
            this.logger.Debug($"Fire: \"{message.Event}\" with {message.Payloads.Count} payload(s): {string.Join(", ", message.Payloads)}");

            if (message.Target != null)
            {
                new PlayerList()[message.Target.Handle].TriggerEvent(message.Event, this.serializer.Serialize(message));
            }
            else
            {
                BaseScript.TriggerClientEvent(message.Event, this.serializer.Serialize(message));
            }
        }
Beispiel #4
0
        private static string PrintOutboundMessage(OutboundMessage message)
        {
            var str = $"\"{message.Event}\" with ";

            if (message.Target != null)
            {
                str += $"to {message.Target.Handle} ";
            }

            if (message.Payloads.Count < 1)
            {
                return(str + "no payloads");
            }

            return(str + $"{"payload".Pluralize(message.Payloads.Count)}:{Environment.NewLine}\t{string.Join($"{Environment.NewLine}\t", message.Payloads)}");
        }
Beispiel #5
0
        public async void Fire(OutboundMessage message)
        {
            // Marshall back to the main thread in order to use a native call.
            await BaseScript.Delay(0);

            this.logger.Trace($"Fire: \"{message.Event}\" with {message.Payloads.Count} payload(s): {string.Join(", ", message.Payloads)}");

            if (message.Target != null)
            {
                new PlayerList()[message.Target.Handle].TriggerEvent(message.Event, this.serializer.Serialize(message));
            }
            else
            {
                BaseScript.TriggerClientEvent(message.Event, this.serializer.Serialize(message));
            }
        }
Beispiel #6
0
        private static async void Emit(OutboundMessage message)
        {
            logger.Trace($"Fire: \"{PrintOutboundMessage(message)}\"");

            // Marshall back to the main thread in order to use a native call.
            await BaseScript.Delay(0);

            if (message.Target != null)
            {
                logger.Trace($"TriggerClientEvent: Using PlayerList with {"player".Pluralize(players.Count())}");
                BaseScript.TriggerClientEvent(players[message.Target.Handle], message.Event, message.Pack());
            }
            else
            {
                logger.Trace("TriggerClientEvent: All clients");
                BaseScript.TriggerClientEvent(message.Event, message.Pack());
            }
        }
Beispiel #7
0
        public static byte[] Pack(OutboundMessage message)
        {
            message.Sent = DateTime.UtcNow;

            var json = Serialize(message);

            using (var inputStream = new MemoryStream(json, false))
                using (var compressedStream = new ZlibStream(inputStream, CompressionMode.Compress, (CompressionLevel)Level, true))
                    using (var outputStream = new MemoryStream())
                    {
                        compressedStream.CopyTo(outputStream);

                        var r = outputStream.ToArray();
                        Logger.Trace($"Packed {new UnicodeEncoding(false, false).GetString(json).Length} chars, {inputStream.Length} bytes to {r.Length} bytes: {message.Event}");

                        return(r);
                    }
        }
Beispiel #8
0
        public async void Fire(OutboundMessage message)
        {
            // Marshall back to the main thread in order to use a native call.
            await BaseScript.Delay(0);

            if (message.Payloads.Count > 0)
            {
                this.logger.Trace($"Fire: \"{message.Event}\" {(message.Target != null ? $"to {message.Target.Handle} " : string.Empty)}with {message.Payloads.Count} payload{(message.Payloads.Count > 1 ? "s" : string.Empty)}:{Environment.NewLine}\t{string.Join($"{Environment.NewLine}\t", message.Payloads)}");
            }
            else
            {
                this.logger.Trace($"Fire: \"{message.Event}\" {(message.Target != null ? $"to {message.Target.Handle} " : string.Empty)}with no payloads");
            }

            if (message.Target != null)
            {
                BaseScript.TriggerClientEvent(new PlayerList()[message.Target.Handle], message.Event, message.Pack());
            }
            else
            {
                BaseScript.TriggerClientEvent(message.Event, message.Pack());
            }
        }