Example #1
0
 public RuleEditor(RuleGroup ruleGroup)
 {
     InitializeComponent();
     _ruleGroup = ruleGroup;
 }
Example #2
0
        /// <summary>
        /// Create a new rule.
        /// </summary>
        private void settingsNewRule_Click(object sender, EventArgs e)
        {
            RuleGroup newRuleGroup = new RuleGroup
            {
                title = "",
                active = true,
                type = RuleGroupType.Any,
                actionCode = RuleActionCodes.Unread | RuleActionCodes.Clear,
                rule = new[]
                {
                    new Rule
                    {
                        property = "Subject",
                        value = string.Empty,
                        op = PredicateBuilder.Op.Equals
                    }
                }
            };
            RuleEditor ruleEditor = new RuleEditor(newRuleGroup);
            if (ruleEditor.ShowDialog() == DialogResult.OK)
            {
                CIX.RuleCollection.AddRule(newRuleGroup);

                _arrayOfRules = CIX.RuleCollection.AllRules;
                ReloadRules(0);
            }
        }
Example #3
0
        /// <summary>
        /// Apply the specified rule group to the message. On completion, the flags
        /// in the message will be adjusted as per the rule.
        /// <para>
        /// The caller must persist both the message and the associated folder back
        /// to the database if the function returns true since both will likely have
        /// been altered.
        /// </para>
        /// </summary>
        /// <param name="ruleGroup">Rule group to apply</param>
        /// <param name="message">CIXMessage to which rule is applied</param>
        /// <returns>True if the rule changed the message, false otherwise</returns>
        internal static bool ApplyRule(RuleGroup ruleGroup, CIXMessage message)
        {
            bool changed = false;
            try
            {
                Func<CIXMessage, bool> evaluateCriteria = ruleGroup.Criteria.Compile();
                if (ruleGroup.active && evaluateCriteria(message))
                {
                    bool isUnread = message.Unread;
                    bool isClear = ruleGroup.actionCode.HasFlag(RuleActionCodes.Clear);

                    if (ruleGroup.actionCode.HasFlag(RuleActionCodes.Unread))
                    {
                        if (!message.ReadLocked)
                        {
                            message.Unread = !isClear;
                            if (isUnread != message.Unread)
                            {
                                message.ReadPending = true;
                                Folder folder = CIX.FolderCollection[message.TopicID];
                                folder.Unread += message.Unread ? 1 : -1;
                                if (folder.Unread < 0)
                                {
                                    folder.Unread = 0;
                                }
                                if (message.Priority)
                                {
                                    folder.UnreadPriority += message.Unread ? 1 : -1;
                                    if (folder.UnreadPriority < 0)
                                    {
                                        folder.UnreadPriority = 0;
                                    }
                                }
                                folder.MarkReadRangePending = !message.IsPseudo;

                                changed = true;
                            }
                        }
                    }
                    if (ruleGroup.actionCode.HasFlag(RuleActionCodes.Priority))
                    {
                        bool oldPriority = message.Priority;
                        message.Priority = !isClear;
                        changed = message.Priority != oldPriority;
                        if (changed && message.Unread)
                        {
                            Folder folder = CIX.FolderCollection[message.TopicID];
                            folder.UnreadPriority += message.Priority ? 1 : -1;
                            if (folder.UnreadPriority < 0)
                            {
                                folder.UnreadPriority = 0;
                            }
                        }
                    }
                    if (ruleGroup.actionCode.HasFlag(RuleActionCodes.Ignored))
                    {
                        message.Ignored = !isClear;
                        if (message.Ignored && message.Unread)
                        {
                            message.Unread = false;
                            message.ReadPending = true;
                            Folder folder = CIX.FolderCollection[message.TopicID];
                            folder.Unread -= 1;
                            if (message.Priority)
                            {
                                folder.UnreadPriority -= 1;
                                if (folder.UnreadPriority < 0)
                                {
                                    folder.UnreadPriority = 0;
                                }
                            }
                            folder.MarkReadRangePending = true;

                            changed = true;
                        }
                    }
                    if (ruleGroup.actionCode.HasFlag(RuleActionCodes.Flag))
                    {
                        bool oldStarred = message.Starred;
                        message.Starred = !isClear;
                        if (oldStarred != message.Starred)
                        {
                            message.StarPending = true;
                            changed = true;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                LogFile.WriteLine("Error: Exception processing rule \"{0}\" : {1}", ruleGroup.title, e.Message);
            }
            return changed;
        }
Example #4
0
 /// <summary>
 /// Delete the specified rule.
 /// </summary>
 /// <param name="ruleGroup">Rule to remove</param>
 public void DeleteRule(RuleGroup ruleGroup)
 {
     ruleGroups.Remove(ruleGroup);
 }
Example #5
0
        /// <summary>
        /// Add name to the block list if it is not already present.
        /// </summary>
        /// <param name="name">Name of user to block</param>
        public void Block(string name)
        {
            // ReSharper disable once LoopCanBeConvertedToQuery
            foreach (RuleGroup ruleGroup in ruleGroups)
            {
                if (ruleGroup.rule.Any(rule => rule.property == "Author" && rule.value.ToString() == name))
                {
                    return;
                }
            }
            RuleGroup newRuleGroup = new RuleGroup
            {
                type = RuleGroupType.Any,
                title = string.Format(Resources.BlockFrom, name),
                active = true,
                actionCode = RuleActionCodes.Unread | RuleActionCodes.Clear,
                rule = new[]
                {
                    new Rule
                    {
                        property = "Author",
                        value = name,
                        op = PredicateBuilder.Op.Equals
                    }
                }
            };
            AddRule(newRuleGroup);

            FolderCollection.ApplyRules(newRuleGroup);
        }
Example #6
0
 /// <summary>
 /// Add the specified rule group to the collection.
 /// </summary>
 /// <param name="newRuleGroup">The RuleGroup to add to the collection</param>
 public void AddRule(RuleGroup newRuleGroup)
 {
     ruleGroups.Add(newRuleGroup);
     CompileRules();
     Save();
 }