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); }
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); }
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); }
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); } }