public void BuildMessage_PinnedJSON_TelegramPinnedMessage() { var expected = new PinnedMessage { From = _user, Message = _pinnedMessage }; AttachGeneralProperties3(expected); var actual = MessageBuilder.BuildMessage <PinnedMessage>(_messageToken); var compareLogic = new CompareLogic(_config); var comparisonResult = compareLogic.Compare(expected, actual); Assert.IsTrue(comparisonResult.AreEqual, comparisonResult.DifferencesString); }
public async Task CopyPinAsync(DiscordWebhook hook, DiscordMessage message, GuildInfo info, PinsDbContext db) { var content = new StringBuilder(); var attachments = message.Attachments.ToList(); var messageLink = $"https://discordapp.com/channels/{message.Channel.GuildId}/{message.ChannelId}/{message.Id}"; var embed = new DiscordEmbedBuilder() .WithAuthor($"{message.Author.Username}", messageLink, message.Author.GetAvatarUrl(ImageFormat.Png, 128)) .WithDescription(message.Content.Length <= 1000 ? message.Content : $"{message.Content.Substring(0, 997)}...") .WithTimestamp(message.Timestamp) .WithFooter($"In #{message.Channel.Name}"); if ((message.Author as DiscordMember).Color.Value != default) { embed.WithColor((message.Author as DiscordMember).Color); } foreach (var attachment in attachments) { var ext = Path.GetExtension(attachment.FileName.ToLowerInvariant()); if ((ext == ".jpg" || ext == ".png" || ext == ".gif" || ext == ".webp") && attachment.Width != 0 && embed.ImageUrl == null) { embed.WithImageUrl(attachment.Url); } else { content.AppendLine(attachment.Url); } } var currentMember = message.Channel.Guild.CurrentMember; await hook.ExecuteAsync(content.ToString(), currentMember.Username, currentMember.AvatarUrl, false, new[] { embed.Build() }, null); var dbPin = new PinnedMessage() { GuildId = info.Id, Id = (long)message.Id }; info.PinnedMessages.Add(dbPin); await db.AddAsync(dbPin); }
public void ViewVisibleMessages(bool intermediate) { var chat = ViewModel.Chat; if (chat == null) { return; } var panel = Messages.ItemsPanelRoot as ItemsStackPanel; if (panel == null || panel.FirstVisibleIndex < 0) { return; } var firstVisibleId = 0L; var lastVisibleId = 0L; var minItem = true; var minDate = true; var minDateIndex = panel.FirstVisibleIndex; var minDateValue = 0L; var messages = new List <long>(panel.LastVisibleIndex - panel.FirstVisibleIndex); var animations = new List <(SelectorItem, MessageViewModel)>(panel.LastVisibleIndex - panel.FirstVisibleIndex); for (int i = panel.FirstVisibleIndex; i <= panel.LastVisibleIndex; i++) { var container = Messages.ContainerFromIndex(i) as SelectorItem; if (container == null) { continue; } var message = Messages.ItemFromContainer(container) as MessageViewModel; if (message == null) { continue; } if (firstVisibleId == 0) { firstVisibleId = message.Id; } if (message.Id != 0) { lastVisibleId = message.Id; } if (minItem && i >= panel.FirstVisibleIndex) { var transform = container.TransformToVisual(DateHeaderRelative); var point = transform.TransformPoint(new Point()); if (point.Y + container.ActualHeight >= 0) { minItem = false; minDateValue = Math.Max(message.Id, message.Date); if (message.SchedulingState is MessageSchedulingStateSendAtDate sendAtDate) { DateHeader.CommandParameter = null; DateHeaderLabel.Text = string.Format(Strings.Resources.MessageScheduledOn, Converter.DayGrouping(Utils.UnixTimestampToDateTime(sendAtDate.SendDate))); } else if (message.SchedulingState is MessageSchedulingStateSendWhenOnline) { DateHeader.CommandParameter = null; DateHeaderLabel.Text = Strings.Resources.MessageScheduledUntilOnline; } else if (message.Date > 0) { DateHeader.CommandParameter = message.Date; DateHeaderLabel.Text = Converter.DayGrouping(Utils.UnixTimestampToDateTime(message.Date)); } } } if (message.Content is MessageHeaderDate && minDate && i >= panel.FirstVisibleIndex) { var transform = container.TransformToVisual(DateHeaderRelative); var point = transform.TransformPoint(new Point()); var height = DateHeader.ActualSize.Y; var offset = (float)point.Y + height; minDate = false; if (/*offset >= 0 &&*/ offset < height) { container.Opacity = 0; minDateIndex = int.MaxValue; // Force show } else { container.Opacity = 1; minDateIndex = i; } if (offset >= height && offset < height * 2) { _dateHeader.Offset = new Vector3(0, -height * 2 + offset, 0); } else { _dateHeader.Offset = Vector3.Zero; } } else { container.Opacity = 1; } // Read and play messages logic: if (message.Id == 0) { continue; } if (message.ContainsUnreadMention) { ViewModel.Mentions.SetLastViewedMessage(message.Id); } if (message.UnreadReactions?.Count > 0) { ViewModel.Reactions.SetLastViewedMessage(message.Id); var root = container.ContentTemplateRoot as FrameworkElement; if (root is MessageSelector selector && selector.Content is MessageBubble bubble) { bubble.UpdateMessageReactions(message, null); } } if (message.Content is MessageAlbum album) { messages.AddRange(album.Messages.Keys); } else { messages.Add(message.Id); animations.Add((container, message)); } while (ViewModel.RepliesStack.TryPeek(out long reply) && reply == message.Id) { ViewModel.RepliesStack.Pop(); } } if (minDate) { _dateHeader.Offset = Vector3.Zero; } _dateHeaderTimer.Stop(); ShowHideDateHeader(minDateValue > 0 && minDateIndex > 0, minDateValue > 0 && minDateIndex is > 0 and < int.MaxValue); // Read and play messages logic: if (messages.Count > 0 && !Messages.IsProgrammaticScrolling && _windowContext.ActivationMode == CoreWindowActivationMode.ActivatedInForeground) { ViewModel.ProtoService.Send(new ViewMessages(chat.Id, ViewModel.ThreadId, messages, false)); } if (animations.Count > 0 && !intermediate) { Play(animations, ViewModel.Settings.IsAutoPlayAnimationsEnabled, false); } // Pinned banner if (firstVisibleId == 0 || lastVisibleId == 0) { return; } if (ViewModel.LockedPinnedMessageId < firstVisibleId) { ViewModel.LockedPinnedMessageId = 0; } var thread = ViewModel.Thread; if (thread != null) { var message = thread.Messages.LastOrDefault(); if (message == null || (firstVisibleId <= message.Id && lastVisibleId >= message.Id) || Messages.ScrollingHost.ScrollableHeight == 0) { PinnedMessage.UpdateMessage(ViewModel.Chat, null, false, 0, 1, false); } else { PinnedMessage.UpdateMessage(ViewModel.Chat, ViewModel.CreateMessage(message), false, 0, 1, false); } } else if (ViewModel.PinnedMessages.Count > 0) { var currentPinned = ViewModel.LockedPinnedMessageId != 0 ? ViewModel.PinnedMessages.LastOrDefault(x => x.Id < firstVisibleId) ?? ViewModel.PinnedMessages.LastOrDefault() : ViewModel.PinnedMessages.LastOrDefault(x => x.Id <= lastVisibleId) ?? ViewModel.PinnedMessages.FirstOrDefault(); if (currentPinned != null) { //PinnedMessage.UpdateIndex(ViewModel.PinnedMessages.IndexOf(currentPinned), ViewModel.PinnedMessages.Count, intermediate); PinnedMessage.UpdateMessage(ViewModel.Chat, currentPinned, false, ViewModel.PinnedMessages.IndexOf(currentPinned), ViewModel.PinnedMessages.Count, intermediate); } else { PinnedMessage.UpdateMessage(ViewModel.Chat, null, false, 0, 1, false); } } }
private void UpdateHeaderDate(bool intermediate) { var panel = Messages.ItemsPanelRoot as ItemsStackPanel; if (panel == null || panel.FirstVisibleIndex < 0) { return; } var firstVisibleId = 0L; var lastVisibleId = 0L; var minItem = true; var minDate = true; var minDateIndex = panel.FirstVisibleIndex; for (int i = panel.FirstVisibleIndex; i <= panel.LastVisibleIndex; i++) { var container = Messages.ContainerFromIndex(i) as SelectorItem; if (container == null) { continue; } var message = Messages.ItemFromContainer(container) as MessageViewModel; if (message == null) { continue; } if (firstVisibleId == 0) { firstVisibleId = message.Id; } else if (message.Id != 0) { lastVisibleId = message.Id; } if (minItem && i >= panel.FirstVisibleIndex) { var transform = container.TransformToVisual(DateHeaderRelative); var point = transform.TransformPoint(new Point()); if (point.Y + container.ActualHeight >= 0) { minItem = false; if (message.SchedulingState is MessageSchedulingStateSendAtDate sendAtDate) { DateHeader.CommandParameter = null; DateHeaderLabel.Text = string.Format(Strings.Resources.MessageScheduledOn, BindConvert.DayGrouping(Utils.UnixTimestampToDateTime(sendAtDate.SendDate))); } else if (message.SchedulingState is MessageSchedulingStateSendWhenOnline) { DateHeader.CommandParameter = null; DateHeaderLabel.Text = Strings.Resources.MessageScheduledUntilOnline; } else { DateHeader.CommandParameter = message.Date; DateHeaderLabel.Text = BindConvert.DayGrouping(Utils.UnixTimestampToDateTime(message.Date)); } } } if (message.Content is MessageHeaderDate && minDate && i >= panel.FirstVisibleIndex) { var transform = container.TransformToVisual(DateHeaderRelative); var point = transform.TransformPoint(new Point()); var height = (float)DateHeader.ActualHeight; var offset = (float)point.Y + height; minDate = false; if (/*offset >= 0 &&*/ offset < height) { container.Opacity = 0; minDateIndex = int.MaxValue; // Force show } else { container.Opacity = 1; minDateIndex = i; } if (offset >= height && offset < height * 2) { _dateHeader.Offset = new Vector3(0, -height * 2 + offset, 0); } else { _dateHeader.Offset = Vector3.Zero; } } else { container.Opacity = 1; } } _dateHeaderTimer.Stop(); _dateHeaderTimer.Start(); ShowHideDateHeader(minDateIndex > 0, minDateIndex > 0 && minDateIndex < int.MaxValue); // Read and play messages logic: //TODO: //if (messages.Count > 0 && _windowContext.ActivationMode == CoreWindowActivationMode.ActivatedInForeground) //{ // ViewModel.ProtoService.Send(new ViewMessages(chat.Id, ViewModel.ThreadId, messages, false)); //} //if (animations.Count > 0 && !intermediate) //{ // Play(animations, ViewModel.Settings.IsAutoPlayAnimationsEnabled, false); //} // Pinned banner if (firstVisibleId == 0 || lastVisibleId == 0) { return; } if (ViewModel.LockedPinnedMessageId < firstVisibleId) { ViewModel.LockedPinnedMessageId = 0; } var thread = ViewModel.Thread; if (thread != null) { var message = thread.Messages.LastOrDefault(); if (message == null || (firstVisibleId <= message.Id && lastVisibleId >= message.Id)) { PinnedMessage.UpdateMessage(ViewModel.Chat, null, false, 0, 1, false); } else { PinnedMessage.UpdateMessage(ViewModel.Chat, ViewModel.CreateMessage(message), false, 0, 1, false); } } else if (ViewModel.PinnedMessages.Count > 0) { var currentPinned = ViewModel.LockedPinnedMessageId != 0 ? ViewModel.PinnedMessages.LastOrDefault(x => x.Id < firstVisibleId) ?? ViewModel.PinnedMessages.LastOrDefault() : ViewModel.PinnedMessages.LastOrDefault(x => x.Id <= lastVisibleId) ?? ViewModel.PinnedMessages.FirstOrDefault(); if (currentPinned != null) { //PinnedMessage.UpdateIndex(ViewModel.PinnedMessages.IndexOf(currentPinned), ViewModel.PinnedMessages.Count, intermediate); PinnedMessage.UpdateMessage(ViewModel.Chat, currentPinned, false, ViewModel.PinnedMessages.IndexOf(currentPinned), ViewModel.PinnedMessages.Count, intermediate); } else { PinnedMessage.UpdateMessage(ViewModel.Chat, null, false, 0, 1, false); } } }