Exemple #1
0
        /// <summary>
        /// Finds or creates the love with the given peaces.
        /// </summary>
        /// <param name="db">The database connection.</param>
        /// <param name="light">The hash list of lights.</param>
        /// <param name="create">True (default) to create a new love if non-existant, otherwise false.</param>
        /// <returns>The love.</returns>
        public static Love FindLove(ISdwDatabase db, string light, bool create = true)
        {
            var hash   = new Hashids("GodisLove");
            var peaces = hash.Decode(light);

            if (peaces.Length <= 0)
            {
                return(null);
            }
            hash.Order = true;
            var orderPeace = hash.Encode(peaces);
            var love       = db.Love.Get(l => l.PeaceId == orderPeace).FirstOrDefault();

            if (love == null && create)
            {
                love = new Love {
                    Modified = DateTime.Now, PeaceId = orderPeace, Truths = new HashSet <Truth> (), Peaces = new HashSet <Peace> ()
                };
                int index = 0;
                foreach (var p in peaces)
                {
                    love.Peaces.Add(new Peace {
                        Order = index, Light = db.Light.Get(p)
                    });
                    index++;
                }
                db.Love.Insert(love);
                db.Save();
            }
            if (love != null && love.Truths == null)
            {
                love.Truths = new HashSet <Truth> ();
            }
            return(love);
        }
        public ActionResult TruthLinks(string lights)
        {
            var hash     = new Hashids("GodisLove");
            var lightIds = hash.Decode(lights).ToList();
            var combos   = GetCombinations(lightIds);
            var light    = this.Database.Light.Get(l => lightIds.Contains(l.Id)).ToList();
            var items    = new Dictionary <string, string> ();

            foreach (var combo in combos)
            {
                var hashId = hash.Encode(combo);
                var text   = string.Empty;
                foreach (var id in combo.OrderBy(lightIds.IndexOf))
                {
                    var li = light.FirstOrDefault(l => l.Id == id);
                    if (li != null)
                    {
                        if (!string.IsNullOrEmpty(text))
                        {
                            text += " | ";
                        }
                        text += li.Text;
                    }
                }
                items.Add(hashId, text);
            }
            if (lightIds.Count > 2)
            {
                var permus = new List <List <int> > ();
                foreach (var lId in lightIds)
                {
                    int id   = lId;
                    var perm = new List <int> {
                        id
                    };
                    perm.AddRange(lightIds.Where(i => i != id));
                    permus.Add(perm);
                }
                foreach (var perm in permus)
                {
                    perm.Insert(0, 0);
                    var hashId = hash.Encode(perm);
                    var text   = "P";
                    foreach (var id in perm)
                    {
                        var li = light.FirstOrDefault(l => l.Id == id);
                        if (li != null)
                        {
                            text += " | " + li.Text;
                        }
                    }
                    items.Add(hashId, text);
                }
            }
            return(PartialView(items));
        }
        public ActionResult VersionLinks(string lights)
        {
            var loves    = new List <Love> ();
            var hash     = new Hashids("GodisLove");
            var lightIds = hash.Decode(lights).ToList();

            if (lightIds.Count > 1)
            {
                var first = lightIds.First();
                lightIds.RemoveAt(0);
                var light      = this.Database.Light.Get(first);
                var testLights = new List <int> ();
                foreach (var truth in light.Truths)
                {
                    foreach (var test in truth.Love.Truths.Where(t => t.Light != null))
                    {
                        if (!testLights.Contains(test.Light.Id) && !lightIds.Contains(test.Light.Id) && test.Light.Id != first)
                        {
                            testLights.Add(test.Light.Id);
                        }
                    }
                }
                hash.Order = true;
                if (testLights.Count > 0)
                {
                    foreach (var testLight in testLights)
                    {
                        lightIds.Add(testLight);
                        var peaceId = hash.Encode(lightIds);
                        var love    = this.Database.Love.Get(l => l.PeaceId == peaceId).FirstOrDefault();
                        if (love != null)
                        {
                            loves.Add(love);
                        }
                        lightIds.Remove(testLight);
                    }
                }
            }
            return(PartialView(loves));
        }
        public ActionResult Love(string light, string truth, string versions, string truthLinks)
        {
            if (string.IsNullOrWhiteSpace(truth))
            {
                return(this.Fail("No truth given"));
            }
            var love = Helper.FindLove(this.Database, light);

            if (love == null)
            {
                return(this.Fail("No light given"));
            }
            var truths = truth.Trim().Split(new [] { '\n' }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var t in truths)
            {
                var truthData  = t.Split('|');
                var lightText  = truthData [2].Trim();
                var order      = string.IsNullOrWhiteSpace(truthData [0]) ? null : (int?)Convert.ToInt32(truthData [0]);
                var number     = string.IsNullOrWhiteSpace(truthData [1]) ? null : (int?)Convert.ToInt32(truthData [1]);
                var truthLight = this.Database.Light.Get(l => l.Text == lightText).FirstOrDefault() ??
                                 new Light {
                    Text = lightText, Modified = DateTime.Now
                };
                love.Truths.Add(new Truth {
                    Light = truthLight, Order = order, Number = number
                });
            }
            this.Database.Save();
            foreach (var t in love.Truths)
            {
                LightSearch.AddOrUpdateIndex(t.Light);
            }
            var hash = new Hashids("GodisLove");

            if (!string.IsNullOrEmpty(truthLinks))
            {
                var links = truthLinks.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (var t in love.Truths)
                {
                    var l = Helper.FindLove(this.Database, t.Light.Id);
                    foreach (var link in links)
                    {
                        var lightIds = hash.Decode(link).ToList();
                        if (lightIds [0] == 0)
                        {
                            lightIds.RemoveAt(0);
                            var li = this.Database.Light.Get(lightIds [0]);
                            lightIds.RemoveAt(0);
                            var lov = Helper.FindLove(this.Database, lightIds);
                            if (lov.Truths.Any(tr => tr.Light != null && tr.Light.Id == li.Id && !tr.ParentId.HasValue))
                            {
                                continue;
                            }
                            lov.Truths.Add(new Truth {
                                Light = li
                            });
                        }
                        else
                        {
                            if (lightIds.Count == 1)
                            {
                                if (l.Truths.Any(tr => tr.Light != null && tr.Light.Id == lightIds [0] && !tr.ParentId.HasValue))
                                {
                                    continue;
                                }
                                l.Truths.Add(new Truth {
                                    Light = this.Database.Light.Get(lightIds [0])
                                });
                            }
                            else
                            {
                                var lov = Helper.FindLove(this.Database, link);
                                if (l.Truths.Any(tr => tr.Light == null && tr.ParentId.HasValue && tr.ParentId == lov.Id))
                                {
                                    continue;
                                }
                                l.Truths.Add(new Truth {
                                    ParentId = lov.Id
                                });
                            }
                        }
                    }
                }
                this.Database.Save();
            }
            if (!string.IsNullOrEmpty(versions))
            {
                var loveIds = hash.Decode(versions);
                if (loveIds.Length > 0)
                {
                    foreach (var loveId in loveIds)
                    {
                        var linkedLove = this.Database.Love.Get(loveId);
                        foreach (var addTruth in love.Truths.Where(t => t.Number.HasValue))
                        {
                            var lt = linkedLove.Truths.FirstOrDefault(tr => tr.Number == addTruth.Number);
                            if (lt != null)
                            {
                                var truthLove = Helper.FindLove(this.Database, lt.Light.Id);
                                truthLove.Truths.Add(new Truth {
                                    Light = addTruth.Light, ParentId = love.Id
                                });
                                truthLove = Helper.FindLove(this.Database, addTruth.Light.Id);
                                truthLove.Truths.Add(new Truth {
                                    Light = lt.Light, ParentId = linkedLove.Id
                                });
                            }
                        }
                    }
                    this.Database.Save();
                }
            }
            return(this.Success());
        }
Exemple #5
0
        public ActionResult Love(int?id, string items, string history)
        {
            var model = new LoveModel();
            var hash  = new Hashids("GodisLove")
            {
                Order = true
            };
            var ids = hash.Decode(items).ToList();

            if (id == null)
            {
                var lights = this.Database.Light.All(q => q.OrderBy(l => Guid.NewGuid())).Take(25);
                foreach (var light in lights)
                {
                    model.ToAdd.Add(new SdwItem(light));
                }
            }
            else
            {
                var histIds = hash.Decode(history).ToList();
                histIds.Add(id.Value);
                history = hash.Encode(histIds);
                var light = this.Database.Light.Get(id.Value);
                ids.Add(id.Value);
                var loves = (from peace in light.Peaces
                             where peace.Love.Peaces.All(p => ids.Contains(p.Light.Id))
                             select peace.Love).ToList();
                if (loves.Count > 0)
                {
                    var max = loves.Where(l => l.Truths.Any()).Max(l => l.Peaces.Count);
                    foreach (var love in loves.Where(l => l.Peaces.Count == max))
                    {
                        foreach (var truth in love.Truths)
                        {
                            Love truthLove = null;
                            var  truthIds  = new List <int> ();
                            if (truth.Light != null)
                            {
                                truthIds.Add(truth.Light.Id);
                            }
                            if (truth.ParentId.HasValue && (!truth.Order.HasValue || truth.Order.Value > 0))
                            {
                                truthLove = this.Database.Love.Get(truth.ParentId.Value);
                                truthIds.AddRange(truthLove.Peaces.Select(p => p.Light.Id));
                            }
                            if ((truthLove == null && truthIds.All(ids.Contains)) ||
                                (truthIds.All(histIds.Contains) && !truth.Number.HasValue && (!truth.Order.HasValue || truth.Order.Value > 0)) ||
                                (truth.Light != null && truth.Order == null && model.ToAdd.Any(i => i.Id == truth.Light.Id)))
                            {
                                continue;
                            }

                            if (truthLove == null && truthIds.Count <= 0)
                            {
                                continue;
                            }
                            var item = new SdwItem(truth)
                            {
                                History = history
                            };
                            if (truthLove != null)
                            {
                                item.IsLink = true;
                                var text = GetTitle(truthLove.Peaces);
                                if (truth.Light != null)
                                {
                                    item.Title = text;
                                }
                                else
                                {
                                    item.Text = text;
                                    item.Id   = truthLove.Peaces.OrderBy(p => p.Order).Last().Light.Id;
                                }
                                item.Parents = hash.Encode(truthLove.Peaces.Select(p => p.Light.Id));
                            }
                            else if (truth.Light != null)
                            {
                                var parents     = new List <Peace> ();
                                var tempParents = (from peace in truth.Light.Peaces
                                                   from p in peace.Love.Peaces
                                                   where ids.Contains(p.Light.Id)
                                                   select p).ToList();
                                foreach (var tp in tempParents)
                                {
                                    if (parents.Any(p => p.Light.Id == tp.Light.Id))
                                    {
                                        continue;
                                    }
                                    parents.Add(tp);
                                }
                                var parentIds = parents.Select(p => p.Light.Id).ToList();
                                item.Parents    = hash.Encode(parentIds);
                                item.IsSelected = histIds.Contains(truth.Light.Id);
                                item.Title      = GetTitle((parents.Count > 0) ? parents : truth.Number.HasValue || love.Peaces.Count > 1 ? love.Peaces : new List <Peace> ());
                                if (string.IsNullOrEmpty(item.Title))
                                {
                                    item.History = string.Empty;
                                }
                            }
                            model.ToAdd.Add(item);
                        }
                    }
                    SetHeadersAndFooters(model);
                }
            }
            return(PartialView(model));
        }