Exemple #1
0
        /// <summary>
        /// 输入密码获取密码强度等级
        /// </summary>
        private static void CheckPasswordIsWeakly()
        {
            var arr = WeakPwdListReader.Read();

            PrintLine("请输入用于密码校验的用户名:");
            var username = Console.ReadLine();

Recycle:
            PrintLine("请输入要校验的密码,回车结束,输入 exit 退出过程:");
            var input    = Console.ReadLine();
            var password = string.IsNullOrEmpty(input) ? string.Empty : input;

            if (string.Equals("exit", password))
            {
                return;
            }
            PrintLine($"用户名:{username}和密码:{password}的最长交集:{StringSamePart.Get(username, password)}");
            PrintLine($"用户名:{username}和密码:{password}的相似度:{StringSimilarity.Get(username, password)}");
            var result = from p in arr where password.ToLower().Contains(p) select p;
            var values = result as string[] ?? result.ToArray();

            PrintLine($"命中的弱密码是: {string.Join(",", values)}");
            var count = values.Length;

            PrintLine(count > 0 ? "密码包含常用字符" : "密码不包含常用字符");
            goto Recycle;
        }
Exemple #2
0
 public ColumnAtt GetGreaterPath(List <DcColumn> path)
 {
     if (path == null)
     {
         return(null);
     }
     foreach (ColumnAtt p in GreaterPaths)
     {
         if (p.Segments == null)
         {
             continue;
         }
         if (p.Segments.Count != path.Count)
         {
             continue;                                 // Different lengths => not equal
         }
         bool equal = true;
         for (int seg = 0; seg < p.Segments.Count && equal; seg++)
         {
             if (!StringSimilarity.SameColumnName(p.Segments[seg].Name, path[seg].Name))
             {
                 equal = false;
             }
             // if (p.Path[seg] != path[seg]) equal = false; // Compare strings as objects
         }
         if (equal)
         {
             return(p);
         }
     }
     return(null);
 }
Exemple #3
0
            public void WHEN_ComputeSimilarityWhereString2Empty_THEN_ComputedString2ShowsGap()
            {
                testString1          = "1";
                testString2          = "";
                expectedResultString = "-";

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedResultString, StringSimilarity.GetComputedString2());
            }
Exemple #4
0
            public void WHEN_ComputeSimilarityWhereString2Empty_THEN_ComputedScoreHas1ScoreDeduction()
            {
                testString1   = "a";
                testString2   = "";
                expectedScore = 1;

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedScore, StringSimilarity.GetTotalDiff());
            }
Exemple #5
0
            public void WHEN_ComputeSimilarityWhereStringIs1000Characters_THEN_ComputedScoreIsCorrect()
            {
                testString1   = new string('a', 1000);
                testString2   = "a";
                expectedScore = 999;

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedScore, StringSimilarity.GetTotalDiff());
            }
Exemple #6
0
            public void WHEN_ComputeSimilarityWhereStringHasSymbolCharacters_THEN_ComputedScoreIsCorrect()
            {
                testString1   = "~`!@#$%^&*()_+-=[]\\{}|;':\",./<>?";
                testString2   = "a";
                expectedScore = 32;

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedScore, StringSimilarity.GetTotalDiff());
            }
Exemple #7
0
            public void WHEN_ComputeSimilarityOfTwoIdenticalStrings_THEN_ComputedString2IsOriginal()
            {
                testString1          = "abc";
                testString2          = "abc";
                expectedResultString = "abc";

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedResultString, StringSimilarity.GetComputedString2());
            }
Exemple #8
0
            public void WHEN_ComputeSimilarityWhereStringIsNumbers_THEN_ComputedScoreIsCorrect()
            {
                testString1   = "1234";
                testString2   = "1234";
                expectedScore = 0;

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedScore, StringSimilarity.GetTotalDiff());
            }
Exemple #9
0
            public void WHEN_ComputeSimilarityWhereString1Wrong2CharBetween_THEN_ComputedString1Shows2Gap()
            {
                testString1          = "aefd";
                testString2          = "abcd";
                expectedResultString = "aefd";

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedResultString, StringSimilarity.GetComputedString1());
            }
Exemple #10
0
            public void WHEN_ComputeSimilarityWhereString1Missing1CharAfter_THEN_ComputedString2ShowsSame()
            {
                testString1          = "a";
                testString2          = "ab";
                expectedResultString = "ab";

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedResultString, StringSimilarity.GetComputedString2());
            }
Exemple #11
0
            public void WHEN_ComputeSimilarityWhereString2Missing1CharBefore_THEN_ComputedString2Shows1Gap()
            {
                testString1          = "ab";
                testString2          = "b";
                expectedResultString = "-b";

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedResultString, StringSimilarity.GetComputedString2());
            }
Exemple #12
0
            public void WHEN_ComputeSimilarityWhereString2Missing2CharBetween_THEN_ComputedScoreHas2Deduction()
            {
                testString1   = "abcd";
                testString2   = "ad";
                expectedScore = 2;

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedScore, StringSimilarity.GetTotalDiff());
            }
Exemple #13
0
            public void WHEN_ComputeSimilarityWhereString2Wrong1CharBefore_THEN_ComputedScoreHas1Deduction()
            {
                testString1   = "ab";
                testString2   = "cb";
                expectedScore = 1;

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedScore, StringSimilarity.GetTotalDiff());
            }
Exemple #14
0
            public void WHEN_ComputeSimilarityWhereString1Wrong1CharBetween_THEN_ComputedString2ShowsSame()
            {
                testString1          = "adc";
                testString2          = "abc";
                expectedResultString = "abc";

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedResultString, StringSimilarity.GetComputedString2());
            }
Exemple #15
0
            public void WHEN_ComputeSimilarityOfTwoIdenticalStrings_THEN_ScoreIs0()
            {
                testString1   = "abc";
                testString2   = "abc";
                expectedScore = 0;

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedScore, StringSimilarity.GetTotalDiff());
            }
Exemple #16
0
            public void WHEN_ComputeSimilarityWhereString2Wrong1CharBefore_THEN_ComputedString1ShowsSame()
            {
                testString1          = "ab";
                testString2          = "cb";
                expectedResultString = "ab";

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedResultString, StringSimilarity.GetComputedString1());
            }
Exemple #17
0
            public void WHEN_ComputeSimilarityWhereString1Wrong1CharAfter_THEN_ComputedString1ShowsGap()
            {
                testString1          = "ac";
                testString2          = "ab";
                expectedResultString = "ac";

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedResultString, StringSimilarity.GetComputedString1());
            }
Exemple #18
0
            public void WHEN_ComputeSimilarityWhereString2Missing2CharBetween_THEN_ComputedString2Shows1Gap1Mismatch()
            {
                testString1          = "abcd";
                testString2          = "ad";
                expectedResultString = "a--d";

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedResultString, StringSimilarity.GetComputedString2());
            }
Exemple #19
0
            public void WHEN_ComputeSimilarityOfTwoEmptyStrings_THEN_ComputedString2IsEmpty()
            {
                testString1          = "";
                testString2          = "";
                expectedResultString = "";

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedResultString, StringSimilarity.GetComputedString2());
            }
Exemple #20
0
        private async Task <DialogTurnResult> InitializeStateAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var context = await this.accessors.StorySelectionState.GetAsync(stepContext.Context, () => null);

            if (context == null || StringSimilarity.IsSimilar(stepContext.Context.Activity.Text, this.DefaultOptions[1])) // new story
            {
                await this.accessors.StorySelectionState.SetAsync(stepContext.Context, new StorySelectionState(api.GetStartingSection(StoryId), api.GetStartingStats(StoryId)));
            }

            return(await stepContext.NextAsync());
        }
Exemple #21
0
            public void WHEN_ComputeSimilarityWhereStringHasEscapeCharacters_THEN_ComputedScoreIsCorrect()
            {
                // \' single quote, \" double quote, \\ backslash, \0 null character \a alert character \b backspace \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab
                testString1   = "\'\"\\\0\a\b\f\n\r\t\v";
                testString2   = "a";
                expectedScore = 11;

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedScore, StringSimilarity.GetTotalDiff());
            }
Exemple #22
0
        /// <summary>
        /// Expand one attribute by building its path segments as dimension objects.
        /// Use the provided list of attributes for expansion recursively. This list essentially represents a schema.
        /// Also, adjust path names in special cases like empty name or simple structure.
        /// </summary>
        public void ExpandAttribute(List <ColumnAtt> attributes, List <DcColumn> columns) // Add and resolve attributes by creating dimension structure from FKs
        {
            ColumnAtt att = this;

            if (att.Segments.Count > 0)
            {
                return;                         // Already expanded (because of recursion)
            }
            bool isKey = !string.IsNullOrEmpty(att.RelationalPkName) || att.IsKey;

            if (string.IsNullOrEmpty(att.RelationalFkName)) // No FK - primitive column - end of recursion
            {
                // Find or create a primitive dim segment
                DcColumn seg = columns.FirstOrDefault(c => c.Input == att.Input && StringSimilarity.SameColumnName(((ColumnRel)c).RelationalFkName, att.RelationalFkName));
                if (seg == null)
                {
                    seg = new ColumnRel(att.RelationalColumnName, att.Input, att.Output, isKey, false); // Maybe copy constructor?
                    ((ColumnRel)seg).RelationalFkName = att.RelationalFkName;
                    columns.Add(seg);
                }

                att.InsertLast(seg); // add it to this attribute as a single segment
            }
            else
            { // There is FK - non-primitive column
                // Find target set and target attribute (name resolution)
                ColumnAtt tailAtt = attributes.FirstOrDefault(a => StringSimilarity.SameTableName(a.Input.Name, att.RelationalTargetTableName) && StringSimilarity.SameColumnName(a.Name, att.RelationalTargetColumnName));
                DcTable   gTab    = tailAtt.Input;

                // Find or create a dim segment
                DcColumn seg = columns.FirstOrDefault(c => c.Input == att.Input && StringSimilarity.SameColumnName(((ColumnRel)c).RelationalFkName, att.RelationalFkName));
                if (seg == null)
                {
                    seg = new ColumnRel(att.RelationalFkName, att.Input, gTab, isKey, false);
                    ((ColumnRel)seg).RelationalFkName = att.RelationalFkName;
                    columns.Add(seg);
                }

                att.InsertLast(seg); // add it to this attribute as first segment

                //
                // Recursion. Expand tail attribute and add all segments from the tail attribute (continuation)
                //
                tailAtt.ExpandAttribute(attributes, columns);
                att.InsertLast(tailAtt);

                // Adjust name. How many attributes belong to the same FK as this attribute (FK composition)
                List <ColumnAtt> fkAtts = attributes.Where(a => a.Input == att.Input && StringSimilarity.SameColumnName(att.RelationalFkName, a.RelationalFkName)).ToList();
                if (fkAtts.Count == 1)
                {
                    seg.Name = att.RelationalColumnName; // Adjust name. For 1-column FK, name of the FK-dim is the column name (not the FK name)
                }
            }
        }
Exemple #23
0
        static void Main(string[] args)
        {
            while (true)
            {
                Console.CancelKeyPress += (sender, eventArgs) => { Environment.Exit(0); };

                Console.Write("String 1: ");
                string str1 = Console.ReadLine();
                Console.Write("String 2: ");
                string str2 = Console.ReadLine();
                Console.WriteLine("Score   : " + StringSimilarity.Calculate(str1, str2));
            }
        }
Exemple #24
0
            public void WHEN_ComputeSimilarityWhereStringHasUnicodeCharacters_THEN_ComputedScoreIsCorrect()
            {
                // Unicode character format: \uxxxx for a unicode character hex value such as \u0020
                // \x is the same as \u, but you dont need leading zeros \x20

                testString1   = "\u0020";
                testString2   = "a";
                expectedScore = 1;

                StringSimilarity.ComputeSimilarity(testString1, testString2);

                Assert.AreEqual(expectedScore, StringSimilarity.GetTotalDiff());
            }
Exemple #25
0
        public static UwcWindow FindMatchingWindow(string title)
        {
            if (UwcManager.windows.Count <= 0)
            {
                Debug.LogError("No windows!");
                return(null);
            }

            //TODO: option to prioritize starting charcters and use start of window title
            //We reverse the string so priority is on the last characters, most likely part of the app name
            //string reverseTitle = new string(title.ToCharArray().Reverse().ToArray());


            foreach (UwcWindow window in UwcManager.windows.Values)
            {
                if (window.title == "")
                {
                    continue;
                }
                if (window.title.Contains("DISPLAY"))
                {
                    continue;
                }

                string testTitle;

                //If the title is long enough, store the last characters
                if (window.title.Length > I.partialWindowTitleCharacters)
                {
                    testTitle = window.title.Substring(window.title.Length - I.partialWindowTitleCharacters);
                }
                else
                {
                    testTitle = window.title;
                }

                //string reverseTestTitle = new string(testTitle.ToCharArray().Reverse().ToArray());


                decimal accuracy = StringSimilarity.Calculate(title, testTitle);

                //It's a match!
                if (accuracy >= allowedAccuracyTitleMatch)
                {
                    return(window);
                }
            }

            return(null);
        }
    public static void SetActive(string name, bool state, bool only)
    {
        bool check = false;

        for (int i = 0; i < multiCanvas.Count; i++)
        {
            if (name == names[i])
            {
                multiCanvas[i].SetActive(true);
                multiCanvas[i].SendMessage("SetActive", state);
                check = true;
                if (!only)
                {
                    return;
                }
            }
            else if (only && multiCanvas[i].active)
            {
                multiCanvas[i].SendMessage("SetActive", false);
            }
        }
        if (check)
        {
            return;
        }
        double closest = 0;
        int    index   = 0;

        for (int i = 0; i < multiCanvas.Count; i++)
        {
            double cur = StringSimilarity.CalculateSimilarity(name, names[i]);
            if (cur > closest)
            {
                closest = cur;
                index   = i;
            }
        }

        if (closest == 0)
        {
            Debug.LogError("UILib could not find menu by name : " + name);
        }
        else
        {
            Debug.LogError("UILib could not find menu by name : " + name + ", did you think : " + names[index]);
        }
    }
Exemple #27
0
        public double ComputeSimilarity()
        {
            double sum = 0.0;

            foreach (PathMatch m in Matches)
            {
                m.Similarity = StringSimilarity.ComputePathSimilarity(m.SourcePath, m.TargetPath);
                sum         += m.Similarity;
            }

            if (Matches.Count > 0)
            {
                Similarity = sum / Matches.Count;
            }
            else
            {
                Similarity = 0.0;
            }

            return(Similarity);
        }
Exemple #28
0
        /// <summary>
        /// Find best path starting from the target set and corresponding to the source path.
        /// </summary>
        public ColumnPath MapCol(ColumnPath sourcePath, DcTable targetSet)
        {
            List <ColumnPath> targetPaths = (new PathEnumerator(targetSet, ColumnType.IDENTITY_ENTITY)).ToList();

            if (targetPaths.Count == 0)
            {
                return(null);
            }

            ColumnPath bestTargetPath = null;
            double     bestSimilarity = Double.MinValue;

            foreach (ColumnPath targetPath in targetPaths)
            {
                double similarity = StringSimilarity.ComputePathSimilarity(sourcePath, targetPath);
                if (similarity > bestSimilarity)
                {
                    bestSimilarity = similarity;
                    bestTargetPath = targetPath;
                }
            }

            return(bestTargetPath);
        }
Exemple #29
0
        private void GetVideoInfos(AnalyseVideo analyseVideo, List <string> referenceNames)
        {
            //var candidates = new SortedSet<Video>(new SimilarityComparer()); //sort candidates by their match score with the original filename and foldername

            //TODO 050 analyse name => predict movie or serie => execute suitable block of code blow here

            //if not certainly an episode => alsosearch for movie
            UniqueList <string> uniqueList = analyseVideo.GetTitleGuesses();

            if (analyseVideo.AnalyseType != VideoTypeEnum.Episode)
            {
                int guessIndex = 0;
                //search for videos
                UniqueList <string> titleGuesses = uniqueList;
                while (guessIndex < titleGuesses.Count && analyseVideo.MatchPercentage < Constants.GREAT_MATCH_FOUND_TRESHOLD)
                {
                    string       titleGuess = titleGuesses[guessIndex];
                    List <Video> foundCandidates;
                    if (_searchClient.SearchMovie(titleGuess, out foundCandidates))
                    {
                        int candidateIndex = 0;
                        while (candidateIndex < foundCandidates.Count &&
                               analyseVideo.MatchPercentage < Constants.GREAT_MATCH_FOUND_TRESHOLD)
                        {
                            var videoInfo = foundCandidates[candidateIndex];
                            //add pairs of similarity and videoInfo to the list
                            //similarity == max of similarity between to the original guesses for filename and foldername and the videoinfo name from the webservice
                            List <double> similarities = new List <double>();
                            foreach (string referenceName in referenceNames)
                            {
                                similarities.Add(StringSimilarity.GetSimilarity(videoInfo.Name + " " + videoInfo.Release.Year, referenceName));
                                similarities.Add(StringSimilarity.GetSimilarity(videoInfo.Name, referenceName));
                                //TODO 005 give bonus to videoinfo where eg: "men in black" --> original file name contains: mib (first letters of every word)
                            }
                            ;
                            videoInfo.TitleMatchRatio = similarities.Max();
                            FilterAddCandidate(videoInfo, analyseVideo.Candidates);

                            analyseVideo.NotYetAnalysed = false;

                            candidateIndex++;
                        }
                    }
                    analyseVideo.NotYetAnalysed = false;
                    guessIndex++;
                }
            }

            //if no suitable candidate
            //search for tv shows
            if (analyseVideo.MatchPercentage < Constants.GREAT_MATCH_FOUND_TRESHOLD)
            {
                int guessIndex = 0;
                while (guessIndex < uniqueList.Count && analyseVideo.MatchPercentage < Constants.GREAT_MATCH_FOUND_TRESHOLD)
                {
                    string       titleGuess = uniqueList[guessIndex];
                    List <Serie> foundCandidates;
                    if (_searchClient.SearchSerie(titleGuess, out foundCandidates))
                    {
                        int candidateIndex = 0;
                        while (candidateIndex < foundCandidates.Count &&
                               analyseVideo.MatchPercentage < Constants.GREAT_MATCH_FOUND_TRESHOLD)
                        {
                            Serie serie   = foundCandidates[candidateIndex];
                            Video episode = new Video();
                            if (_searchClient.GetEpisodeDetails(serie.IdTmdb, 1, 1, ref episode))
                            {
                                //add pairs of similarity and videoInfo to the list
                                //similarity == max of similarity between to the original guesses for filename and foldername and the videoinfo name from the webservice

                                List <double> similarities = new List <double>();
                                foreach (string referenceName in referenceNames)
                                {
                                    similarities.Add(StringSimilarity.GetSimilarity(serie.Name, referenceName));
                                    //TODO 005 give bonus to videoinfo where eg: "men in black" --> original file name contains: mib (first letters of every word)
                                }

                                episode.TitleMatchRatio = similarities.Max();
                                FilterAddCandidate(episode, analyseVideo.Candidates);

                                analyseVideo.NotYetAnalysed = false;
                            }
                            candidateIndex++;
                        }
                    }
                    guessIndex++;
                    analyseVideo.NotYetAnalysed = false;
                }
            }
            analyseVideo.NotYetAnalysed = false;
        }
Exemple #30
0
        public void Run(IrcMessage theMessage)
        {
            if (!theMessage.HasArgs)
            {
                theMessage.Answer(ModelPage);
                return;
            }

            string input = theMessage.CommandLine.ToLower();

            bool wildcard = false;

            if (theMessage.CommandArgs.LastOrDefault() == "all")
            {
                input    = theMessage.CommandArgs.Take(theMessage.CommandArgs.Count - 1).Join(" ");
                wildcard = true;
            }
            else if (input.EndsWith("*"))
            {
                input    = input.TrimEnd('*');
                wildcard = true;
            }

            string sharpSplit = String.Empty;

            if (input.Contains('#'))
            {
                string[] split = input.Split(new[] { '#' }, 2);
                Contract.Assume(split.Length == 2);
                sharpSplit = "#" + split[1];
                input      = split[0];
            }
            int inputLength = input.Length;

            TableBox        Box   = null;
            List <TableBox> Boxen = new List <TableBox>();

            Dictionary <string, TableBox> packages = PackagesCache.GetItem(true);

            if (packages != null)
            {
                if (wildcard || !packages.TryGetValue(input, out Box))
                {
                    List <TableBox> likelyKey = packages.Where(x => x.Key.StartsWith(input, StringComparison.OrdinalIgnoreCase)).Select(x => x.Value).ToList();
                    if (likelyKey.Count > 0)
                    {
                        Box   = likelyKey.FirstOrDefault();
                        Boxen = likelyKey;
                    }
                    else
                    {
                        int lowestDifference = 1000;
                        foreach (KeyValuePair <string, TableBox> one in packages)
                        {
                            int result = StringSimilarity.Compare(input, one.Key, true);
                            if (result < lowestDifference)
                            {
                                Box = one.Value;
                                lowestDifference = result;
                            }
                        }
                    }
                }
                if (!Boxen.Contains(Box))
                {
                    Boxen.Add(Box);
                }
            }

            if (Box == null)
            {
                theMessage.Answer("Da ist etwas fürchterlich schief gelaufen");
                return;
            }

            StringBuilder sb = new StringBuilder("Freetz Modell ");

            if (theMessage.CommandName == "ff")
            {
                sb.Append(Box.Name);

                if (NotEmpty(Box.CPU))
                {
                    sb.Append(", CPU: ");
                    sb.Append(Box.CPU);
                }

                if (NotEmpty(Box.RAM))
                {
                    sb.Append(", RAM: ");
                    sb.Append(Box.RAM);
                }

                if (NotEmpty(Box.Flash))
                {
                    sb.Append(", Flash: ");
                    sb.Append(Box.Flash);
                }

                if (NotEmpty(Box.USBHost))
                {
                    sb.Append(", USB-Host: ");
                    sb.Append(Box.USBHost);
                }

                if (NotEmpty(Box.Annex))
                {
                    sb.Append(", Annex: ");
                    sb.Append(Box.Annex);
                }

                if (NotEmpty(Box.FreetzVersion))
                {
                    sb.Append(", Unterstütze Freetz Version: ");
                    sb.Append(Box.FreetzVersion);
                    if (NotEmpty(Box.AngepassteFirmware))
                    {
                        sb.Append(" (");
                        sb.Append(Box.AngepassteFirmware);
                        sb.Append(")");
                    }
                }

                if (NotEmpty(Box.Sprache))
                {
                    sb.Append(", Sprachen: ");
                    sb.Append(Box.Sprache);
                }

                if (NotEmpty(Box.Url))
                {
                    sb.Append(", Detailseite(n): ");
                    sb.Append(Boxen.Select(x => "http://freetz.org" + x.Url).Join(" , "));
                }
                else
                {
                    sb.Append(", Noch keine Detailseite vorhanden");
                }
            }
            else
            {
                if (Boxen.Count > 0)
                {
                    sb.Append(Boxen.Select(x => x.FreetzType + " http://freetz.org" + x.Url).Join(" , "));
                }
                else
                {
                    sb.Append(Box.FreetzType);
                    sb.Append(" http://freetz.org");
                    sb.Append(Box.Url);
                }
            }

            theMessage.Answer(sb.ToString());
        }