protected override void InnerRun() { var totalGroups = Writer.chat.Messages.GroupBy(p => p.Date.Hour).OrderBy(p => p.Key); Writer.WriteString(); Writer.WriteString(); var array1 = new List <string>(); var array2 = new List <List <string> >(); var specificGroups = Writer.chat.Messages.GroupBy(p => p.Date.Month).Select(p => new DataNode() { Month = p.Key, Messages = p.GroupBy(j => j.Date.Hour).OrderBy(j => j.Key).ToDictionary(j => j.Key, j => j.Count()) }) .ToList(); specificGroups.Insert(0, new DataNode() { Month = -1, Messages = totalGroups.ToDictionary(j => j.Key, j => j.Count()) }); foreach (var item in specificGroups) { array1.AddRange(new string[] { $"Час суток (за {item.Month} месяц)", "Сообщений", "" }); } for (int i = 0; i < 24; i++) { var tmp = new List <string>(); foreach (var a in specificGroups) { tmp.AddRange(new string[] { i.ToString(), a.Messages.ContainsKey(i) ? a.Messages[i].ToString() : "", "" }); } array2.Add(tmp); } Writer.WriteString(array1.ToArray()); foreach (var a in array2) { Writer.WriteString(a.ToArray()); } InnerEnd(); }
protected override void InnerRun() { var groups = Writer.chat.Messages.GroupBy(p => p.Date.DayOfWeek).OrderBy(p => p.Key); Writer.WriteString(); Writer.WriteString(); Writer.WriteString("День недели", "Сообщений"); foreach (var a in groups) { Writer.WriteString(a.Key.ToString(), a.Count()); } InnerEnd(); }
protected override void InnerRun() { var links = new List <string>(); Writer.chat.Messages.FindAll(p => p.HasLinks) .ForEach(p => links.AddRange(p.Links)); var groups = links.GroupBy(p => GetHost(p)).OrderBy(p => p.Key).OrderByDescending(p => p.Count()); Writer.WriteString(); Writer.WriteString(); Writer.WriteString("Домен", "Кол-во"); foreach (var a in groups) { Writer.WriteString(a.Key.ToString(), a.Count()); } InnerEnd(); }
protected override void InnerRun() { const int count = 200; List <char> splitChars = new List <char>(); for (char c = '\0'; c < (char)255; c++) { if (!char.IsLetterOrDigit(c)) { splitChars.Add(c); } } var groups = Writer.chat.Messages.GroupBy(p => p.From).OrderByDescending(p => p.Count()).ToList(); groups.InsertRange(0, Writer.chat.Messages.GroupBy(x => "TOTAL").ToList()); var allText = new List <string>(); int globalCounter = 0; List <Dictionary <string, int> > result = new List <Dictionary <string, int> >(); foreach (var a in groups) { int counter = 0; SubtaskName = a.Key; CurrentStep = (globalCounter++ / (float)groups.Count()) / 2f; allText = new List <string>(); foreach (var b in a) { SubTaskCurrentStep = (counter++ / (float)a.Count()) / 2f; allText.AddRange( b.Text.Split(splitChars.ToArray()) .ToList() .FindAll(p => !string.IsNullOrWhiteSpace(p)) .Select(p => p.ToLower())); } counter = 0; var groupedWords = new Dictionary <string, int>(); foreach (var word in allText) { SubTaskCurrentStep = .5f + (counter++ / (float)allText.Count()) / 2f; if (groupedWords.ContainsKey(word)) { groupedWords[word]++; } else { groupedWords.Add(word, 1); } } groupedWords = groupedWords.OrderByDescending(p => p.Value).ToDictionary(p => p.Key, p => p.Value); result.Add(groupedWords); } SubtaskName = "Outputting results"; Writer.WriteString(); Writer.WriteString(); const int rowsPerMember = 3; var array1 = new List <string>(); var array2 = new List <string>(); int chatCounter = 0; for (int i = 0; i < groups.Count(); i++) { array1.Add(groups.ElementAt(i).Key); array1.Add($"С-ний: {groups.ElementAt(i).Count()}"); array1.Add($"Слов: {result[chatCounter].Sum(p => p.Value)} ({string.Format("{0:.##}", result[chatCounter++].Sum(p => p.Value)/(float)groups.ElementAt(i).Count())})"); for (int j = 0; j < rowsPerMember - 2; j++) { array1.Add(""); } array2.AddRange(new List <string> { "Слово", "Кол-во", "% от всех", "" }); } Writer.WriteString(array1.ToArray()); Writer.WriteString(array2.ToArray()); for (int i = 0; i < count; i++) { chatCounter = 0; CurrentStep = .5f + (i / (float)count) / 2; SubTaskCurrentStep = i / (float)count; List <string> listToAdd = new List <string>(); foreach (var a in result) { if (i >= a.Count()) { listToAdd.AddRange(new List <string> { "", "", "", "" }); } else { listToAdd.AddRange(new List <string> { a.ElementAt(i).Key, a.ElementAt(i).Value.ToString(), string.Format("{0:0.###}%", a.ElementAt(i).Value / (float)a.Sum(p => p.Value)), "" }); } chatCounter++; } Writer.WriteString(listToAdd.ToArray()); } InnerEnd(); }
protected override void InnerRun() { /* * - кол-во сообщений * - кол-во медиа * - кол-во изм. сообщ * * - первое сообщение * - последнее сообщение */ int count = Writer.chat.Messages.Count; int countMedia = Writer.chat.Messages.Count(p => p.MediaType != MediaType.Null); int countEdited = Writer.chat.Messages.Count(p => p.IsEdited); int countForwarded = Writer.chat.Messages.Count(p => p.IsForwarded); DateTime first = Writer.chat.Messages.First().Date; DateTime last = Writer.chat.Messages.Last().Date; var photos = Writer.chat.Messages.FindAll(p => p.MediaType == MediaType.Photo); var voices = Writer.chat.Messages.FindAll(p => p.MediaType == MediaType.Voice_message); var videos = Writer.chat.Messages.FindAll(p => p.MediaType == MediaType.Video_file); var videoM = Writer.chat.Messages.FindAll(p => p.MediaType == MediaType.Video_message); var animms = Writer.chat.Messages.FindAll(p => p.MediaType == MediaType.Animation); var stickers = Writer.chat.Messages.FindAll(p => p.MediaType == MediaType.Sticker); IGrouping <string, Message> mostStricker = null; if (stickers.Count != 0) { mostStricker = stickers.GroupBy(p => (p.MediaInfo as StickerMediaData).Emoji). OrderByDescending(p => p.Count()).First(); } double widhtAv = photos.Count == 0 ? 0 : photos.Average(p => (p.MediaInfo as PhotoMediaData).Width); double heightAv = photos.Count == 0 ? 0 : photos.Average(p => (p.MediaInfo as PhotoMediaData).Height); double voiceAv = voices.Count == 0 ? 0 : voices.Average(p => (p.MediaInfo as VoiceMediaData).Duration); double videoAv = videos.Count == 0 ? 0 : videos.Average(p => (p.MediaInfo as VideoMediaData).Duration); double videoMessAv = videoM.Count == 0 ? 0 : videoM.Average(p => (p.MediaInfo as VideoMediaData).Duration); double animationAv = animms.Count == 0 ? 0 : animms.Average(p => (p.MediaInfo as VideoMediaData).Duration); Writer.WriteString("Количество сообщений", count); Writer.WriteString("Общее количество медиа", countMedia); Writer.WriteString("Количество измененных сообщений", countEdited); Writer.WriteString("Количество пересланных сообщений", countForwarded); Writer.WriteString("Первое сообщение", first.ToString()); Writer.WriteString("Последние сообщение", last.ToString()); Writer.WriteString("Средний рамер изображений", string.Format("W: {0:.0}.W:{1:0.}({2:0.} pixels)", widhtAv, heightAv, widhtAv * heightAv)); Writer.WriteString("Средняя длина войсов", string.Format("{0:.00}s", voiceAv)); Writer.WriteString("Средняя длина видео", string.Format("{0:.00}s", videoAv)); Writer.WriteString("Средняя длина видео-сообщений", string.Format("{0:.00}s", videoMessAv)); Writer.WriteString("Средняя длина гифок", string.Format("{0:.00}s", animationAv)); Writer.WriteString("Самый популярный стикер (его смайлик)", string.Format("{0} ({1} раз)", mostStricker.Key, mostStricker.Count()) ?? ""); InnerEnd(); }
protected override void InnerRun() { InnerEnd(); var users = Writer.chat.Messages.GroupBy(p => p.From).OrderByDescending(p => p.Count() / (float)Writer.chat.Messages.Count()); int counter = 0; Writer.WriteString(); Writer.WidhtOffset = 2; var start = Writer.Offset; Writer.Width = 24; Writer.WriteString( fill: Color.White, font: new Font("Tahoma", 12, FontStyle.Bold), foreColor: Color.Black, widhts: new int[] { 20, 21, 21, 21, 11, 18, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }, values: new string[] { "Имя", "Первое с-ние", "Последние с-ние", "В чате", "Сообщений", "Измененных с-ний", "% всех с-ний", "Изображений", "Войсов", "Видосов", "Гифок", "Аудио", "Файлов", "Видео с-ний", "Стикеров", "Ссылок", "С-ний в день" }); foreach (var item in users) { CurrentStep = counter++ / users.Count(); DateTime first = item.First().Date; DateTime last = item.Last().Date; Writer.WriteString( string.IsNullOrEmpty(item.Key) ? "[SERVICE_MSG]" : item.Key, first.ToString(), last.ToString(), ExcelWriter.ToPrettyFormat(last - first), item.Count().ToString(), item.Count(p => p.IsEdited).ToString(), string.Format("{0:0.##}%", item.Count() / (float)Writer.chat.Messages.Count() * 100), item.Count(p => p.IsPhoto).ToString(), item.Count(p => p.IsVoice).ToString(), item.Count(p => p.IsVideo).ToString(), item.Count(p => p.IsGIF).ToString(), item.Count(p => p.IsAudio).ToString(), item.Count(p => p.IsFile).ToString(), item.Count(p => p.IsVideoMessage).ToString(), item.Count(p => p.IsSticker).ToString(), item.Sum(p => p.HasLinks ? p.Links.Count : 0).ToString(), string.Format("{0:0.##}", item.Count() / (last - first).TotalDays)); } { CurrentStep = counter++ / users.Count(); DateTime first = Writer.chat.Messages.First().Date; DateTime last = Writer.chat.Messages.Last().Date; Writer.WriteString( "TOTAL", first.ToString(), last.ToString(), ExcelWriter.ToPrettyFormat(last - first), Writer.chat.Messages.Count().ToString(), Writer.chat.Messages.Count(p => p.IsEdited).ToString(), string.Format("{0:0.##}%", Writer.chat.Messages.Count() / (float)Writer.chat.Messages.Count() * 100), Writer.chat.Messages.Count(p => p.IsPhoto).ToString(), Writer.chat.Messages.Count(p => p.IsVoice).ToString(), Writer.chat.Messages.Count(p => p.IsVideo).ToString(), Writer.chat.Messages.Count(p => p.IsGIF).ToString(), Writer.chat.Messages.Count(p => p.IsAudio).ToString(), Writer.chat.Messages.Count(p => p.IsFile).ToString(), Writer.chat.Messages.Count(p => p.IsVideoMessage).ToString(), Writer.chat.Messages.Count(p => p.IsSticker).ToString(), Writer.chat.Messages.Sum(p => p.HasLinks ? p.Links.Count : 0).ToString(), string.Format("{0:0.##}", Writer.chat.Messages.Count() / (last - first).TotalDays)); } }