private bool HasConflictsWithMemory(IScheduleGroup group, Dictionary <ScheduleGroupType, IScheduleGroup> memory)
        {
            if (group != null)
            {
                if (!memory.ContainsKey(group.GType))
                {
                    memory.Add(group.GType, group);
                    return(false);
                }

                return(!group.Equals(memory[group.GType]));
            }

            throw new ArgumentNullException("Name for group cannot be null");
        }
Example #2
0
        private void AddGroupToUserInMemory(long chatId, IScheduleGroup group)
        {
            var                    clearOther  = group.Name.StartsWith("11-");
            IScheduleGroup         duplicate   = null;
            IList <IScheduleGroup> otherGroups = null;

            usersGroups.AddOrUpdate(chatId, new List <IScheduleGroup> {
                group
            }, (id, oldList) =>
            {
                duplicate = oldList.FirstOrDefault(g =>
                                                   g.GType == group.GType);
                if (duplicate != null)
                {
                    if (!duplicate.Equals(group))
                    {
                        oldList.Remove(duplicate);
                        if (clearOther)
                        {
                            otherGroups = oldList.ToList();
                            oldList.Clear();
                        }

                        oldList.Add(group);
                    }
                }
                else
                {
                    oldList.Add(group);
                }

                return(oldList);
            });
            try
            {
                if (!groupToUsers.ContainsKey(group))
                {
                    group.ScheduleChanged += HandleGroupScheduleChanged;
                }
                groupToUsers.AddOrUpdate(group, new List <long> {
                    chatId
                }, (schGroup, oldList) =>
                {
                    if (!oldList.Contains(chatId))
                    {
                        oldList.Add(chatId);
                    }
                    return(oldList);
                });


                if (duplicate != null && !duplicate.Equals(group))
                {
                    RemoveIdFromGroup(duplicate, chatId);
                    if (clearOther && otherGroups != null && otherGroups.Any())
                    {
                        foreach (var otherGroup in otherGroups)
                        {
                            RemoveIdFromGroup(otherGroup, chatId);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                logger?.LogError(e, "Exc");
            }

            void RemoveIdFromGroup(IScheduleGroup rgroup, long id)
            {
                if (groupToUsers.TryGetValue(rgroup, out var list))
                {
                    list.Remove(id);
                    if (!list.Any())
                    {
                        groupToUsers.Remove(rgroup, out list);
                    }
                }

                if (!groupToUsers.ContainsKey(rgroup))
                {
                    rgroup.ScheduleChanged -= HandleGroupScheduleChanged;
                }
            }
        }