Exemplo n.º 1
0
        public async Task <bool> Retry(BasicDeliverEventArgs args, RepeatConfig config)
        {
            if (config == null)
            {
                return(false);
            }

            var delay = _delayConfig.GetDelay(config.Delay);

            if (delay == null)
            {
                _log.LogTrace("Delays not configured. Message go to default delay");

                return(false);
            }

            args.RoutingKey = delay.QueueName;

            if (config.Count > 0)
            {
                args.BasicProperties.AddRetry(config, delay);
                await Send(args);
                await Ack(args);

                return(true);
            }

            args.BasicProperties.Headers.Remove(RepeatConfig.RepeatCount);

            return(false);
        }
Exemplo n.º 2
0
        public static IBasicProperties AddRetry(this IBasicProperties properties, RepeatConfig config, RabbitDelayInfo delay)
        {
            var headers = properties.Headers;
            var ttl     = config.Strategy == RepeatStrategy.Const
                                ? delay.Option.Ttl
                                : delay.Next?.Option?.Ttl ?? delay.Option.Ttl;

            headers.TryAddToLowerCase(RepeatConfig.StrategyRepeatDelay, config.Strategy.ToString().ToLower(), true);
            headers.TryAddToLowerCase(RepeatConfig.RepeatDelay, ttl.ToString(), true);
            headers.TryAddToLowerCase(RepeatConfig.RepeatCount, (config.Count - 1).ToString(CultureInfo.InvariantCulture), true);

            return(properties);
        }
Exemplo n.º 3
0
        public static RepeatConfig ParseRepeat(this IDictionary <string, StringValues> headers)
        {
            if (headers == null)
            {
                throw new ArgumentNullException(nameof(headers));
            }

            if (!headers.TryGetValue(RepeatConfig.RepeatCount, out var repeatCountHeader))
            {
                return(null);
            }

            headers.TryGetValue(RepeatConfig.RepeatDelay, out var repeatDelayHeader);
            headers.TryGetValue(RepeatConfig.StrategyRepeatDelay, out var strategyHeader);


            if (!int.TryParse(repeatCountHeader.ToString(), out var repeatCount))
            {
                repeatCount = 1;
            }

            TimeSpan.TryParse(repeatDelayHeader.ToString(), out var delay);
            if (!Enum.TryParse <RepeatStrategy>(strategyHeader.ToString(), true, out var strategy))
            {
                strategy = RepeatStrategy.Progression;
            }

            var config = new RepeatConfig
            {
                Count    = repeatCount,
                Delay    = delay,
                Strategy = strategy
            };

            return(config);
        }
Exemplo n.º 4
0
        public override async Task ExecuteAsync(List <string> command, List <BaseMessage> originMessage, MessageSourceType sourceType, UserInfo qq, Group group, GroupMember member)
        {
            await Task.Yield();

            var fromQQ  = 0L;
            var toGroup = 0L;

            //var message = "";
            if (sourceType != MessageSourceType.Group)
            {
                return;
            }

            fromQQ  = member.QQ;
            toGroup = member.GroupNumber;
            var permit = member.PermitType;

            if (!command.Any())
            {
                if (!GroupRepeatConfig.TryGetValue(toGroup, out var config))
                {
                    MessageManager.SendTextMessage(MessageSourceType.Group, "当前群尚未开启复读功能", fromQQ, toGroup);
                }
                else
                {
                    MessageManager.SendTextMessage(MessageSourceType.Group, $"当前复读概率:{config.Percent}%", fromQQ, toGroup);
                }

                return;
            }

            if (command[0].Equals("on", StringComparison.CurrentCultureIgnoreCase))
            {
                if (permit == PermitType.None)
                {
                    MessageManager.SendTextMessage(MessageSourceType.Group, "只有群主或管理员才有权限开启复读功能", fromQQ, toGroup);
                    return;
                }
                RepeatConfig config;

                if (command.Count == 1)
                {
                    config = new RepeatConfig();
                }
                else
                {
                    if (int.TryParse(command[1], out var percent))
                    {
                        config = new RepeatConfig
                        {
                            Percent = percent > 100 ? 100 : percent
                        };
                    }
                    else
                    {
                        config = new RepeatConfig();
                    }
                }

                UpdateGroupRepeatConfig(toGroup, config);

                MessageManager.SendTextMessage(MessageSourceType.Group, $"复读已开启,复读概率:{config.Percent}%", fromQQ, toGroup);
            }
            else if (command[0].Equals("off", StringComparison.CurrentCultureIgnoreCase))
            {
                if (permit == PermitType.None)
                {
                    MessageManager.SendTextMessage(MessageSourceType.Group, "只有群主或管理员才有权限关闭复读功能", fromQQ, toGroup);
                    return;
                }

                UpdateGroupRepeatConfig(toGroup, null);
                MessageManager.SendTextMessage(MessageSourceType.Group, "复读已关闭", fromQQ, toGroup);
            }
            else if (command[0].Equals("repeat", StringComparison.CurrentCultureIgnoreCase) && command.Count > 1)
            {
                MessageManager.SendMessage(MessageSourceType.Group, originMessage, fromQQ, toGroup);
            }
        }