diff --git a/Unigram/Unigram.Api/Services/Cache/InMemoryDatabase.cs b/Unigram/Unigram.Api/Services/Cache/InMemoryDatabase.cs index 8138e07de0..e6de88547e 100644 --- a/Unigram/Unigram.Api/Services/Cache/InMemoryDatabase.cs +++ b/Unigram/Unigram.Api/Services/Cache/InMemoryDatabase.cs @@ -527,7 +527,7 @@ private void AddMessageCommon(TLMessageBase message, bool notifyNewDialogs, bool { dialogBase.UnreadCount = dialogBase.UnreadCount + 1; - if (commonMessage.IsMentioned && dialog.With is TLChannel channelItem && channelItem.IsMegaGroup) + if (commonMessage.IsMentioned && commonMessage.IsMediaUnread) { dialogBase.UnreadMentionsCount = dialogBase.UnreadMentionsCount + 1; } @@ -613,7 +613,7 @@ private void AddMessageCommon(TLMessageBase message, bool notifyNewDialogs, bool TopMessageRandomId = commonMessage.RandomId, TopMessageItem = commonMessage, UnreadCount = isUnread ? 1 : 0, - UnreadMentionsCount = isUnread && commonMessage.IsMentioned && with is TLChannel channelItem && channelItem.IsMegaGroup ? 1 : 0, + UnreadMentionsCount = isUnread && commonMessage.IsMentioned && commonMessage.IsMediaUnread ? 1 : 0, ReadInboxMaxId = 0, ReadOutboxMaxId = 0, @@ -632,7 +632,7 @@ private void AddMessageCommon(TLMessageBase message, bool notifyNewDialogs, bool TopMessageRandomId = commonMessage.RandomId, TopMessageItem = commonMessage, UnreadCount = isUnread ? 1 : 0, - UnreadMentionsCount = isUnread && commonMessage.IsMentioned && with is TLChannel channelItem && channelItem.IsMegaGroup ? 1 : 0, + UnreadMentionsCount = isUnread && commonMessage.IsMentioned && commonMessage.IsMediaUnread ? 1 : 0, ReadInboxMaxId = 0, ReadOutboxMaxId = 0 }; @@ -1301,7 +1301,7 @@ public void DeleteUserHistory(TLPeerBase channel, TLPeerBase user) { dialog.UnreadCount = Math.Max(0, dialog.UnreadCount - 1); - if (commonMessage.IsMentioned && commonMessage.IsMediaUnread && dialog.With is TLChannel channelItem && channelItem.IsMegaGroup) + if (commonMessage.IsMentioned && commonMessage.IsMediaUnread) { dialog.UnreadMentionsCount = Math.Max(0, dialog.UnreadMentionsCount - 1); } @@ -1397,7 +1397,7 @@ public void DeleteMessages(IList messages, TLPeerBase peer) { dialog.UnreadCount = Math.Max(0, dialog.UnreadCount - 1); - if (commonMessage.IsMentioned && commonMessage.IsMediaUnread && dialog.With is TLChannel channelItem && channelItem.IsMegaGroup) + if (commonMessage.IsMentioned && commonMessage.IsMediaUnread) { dialog.UnreadMentionsCount = Math.Max(0, dialog.UnreadMentionsCount - 1); } @@ -1470,7 +1470,7 @@ public void DeleteMessage(TLMessageBase message) { dialog.UnreadCount = Math.Max(0, dialog.UnreadCount - 1); - if (commonMessage.IsMentioned && dialog.With is TLChannel channelItem && channelItem.IsMegaGroup) + if (commonMessage.IsMentioned && commonMessage.IsMediaUnread) { dialog.UnreadMentionsCount = Math.Max(0, dialog.UnreadMentionsCount - 1); } diff --git a/Unigram/Unigram.Api/Services/MTProtoService.cs b/Unigram/Unigram.Api/Services/MTProtoService.cs index 89301d8e2f..2f4ed124a3 100644 --- a/Unigram/Unigram.Api/Services/MTProtoService.cs +++ b/Unigram/Unigram.Api/Services/MTProtoService.cs @@ -217,6 +217,7 @@ public MTProtoService(IDeviceInfoService deviceInfo,IUpdatesService updatesServi _updatesService.GetFullChatAsync = GetFullChatAsync; _updatesService.GetFullUserAsync = GetFullUserAsync; _updatesService.GetChannelMessagesAsync = GetMessagesAsync; + _updatesService.GetMessagesAsync = GetMessagesAsync; } _transportService = transportService; diff --git a/Unigram/Unigram.Api/Services/Updates/IUpdatesService.cs b/Unigram/Unigram.Api/Services/Updates/IUpdatesService.cs index 1db948a541..19b30656ab 100644 --- a/Unigram/Unigram.Api/Services/Updates/IUpdatesService.cs +++ b/Unigram/Unigram.Api/Services/Updates/IUpdatesService.cs @@ -8,15 +8,16 @@ namespace Telegram.Api.Services.Updates { - public delegate void GetDifferenceAction(int pts, int date, int qts, Action callback, Action faultCallback); - public delegate void GetDHConfigAction(int version, int randomLength, Action callback, Action faultCallback); - public delegate void AcceptEncryptionAction(TLInputEncryptedChat peer, byte[] gb, long keyFingerprint, Action callback, Action faultCallback); - public delegate void SendEncryptedServiceAction(TLInputEncryptedChat peer, long randomkId, byte[] data, Action callback, Action faultCallback); - public delegate void UpdateChannelAction(int? channelId, Action callback, Action faultCallback); - public delegate void GetParticipantAction(TLInputChannelBase channelId, TLInputUserBase userId, Action callback, Action faultCallback); - public delegate void GetFullChatAction(int chatId, Action callback, Action faultCallback); - public delegate void GetFullUserAction(TLInputUserBase userId, Action callback, Action faultCallback); - public delegate void GetChannelMessagesAction(TLInputChannelBase channelId, TLVector id, Action callback, Action faultCallback); + public delegate void GetDifferenceAction(int pts, int date, int qts, Action callback, Action faultCallback = null); + public delegate void GetDHConfigAction(int version, int randomLength, Action callback, Action faultCallback = null); + public delegate void AcceptEncryptionAction(TLInputEncryptedChat peer, byte[] gb, long keyFingerprint, Action callback, Action faultCallback = null); + public delegate void SendEncryptedServiceAction(TLInputEncryptedChat peer, long randomkId, byte[] data, Action callback, Action faultCallback = null); + public delegate void UpdateChannelAction(int? channelId, Action callback, Action faultCallback = null); + public delegate void GetParticipantAction(TLInputChannelBase channelId, TLInputUserBase userId, Action callback, Action faultCallback = null); + public delegate void GetFullChatAction(int chatId, Action callback, Action faultCallback = null); + public delegate void GetFullUserAction(TLInputUserBase userId, Action callback, Action faultCallback = null); + public delegate void GetChannelMessagesAction(TLInputChannelBase channelId, TLVector id, Action callback, Action faultCallback = null); + public delegate void GetMessagesAction(TLVector id, Action callback, Action faultCallback = null); public delegate void SetMessageOnTimeAtion(double seconds, string message); @@ -41,6 +42,7 @@ public interface IUpdatesService GetFullChatAction GetFullChatAsync { get; set; } GetFullUserAction GetFullUserAsync { get; set; } GetChannelMessagesAction GetChannelMessagesAsync { get; set; } + GetMessagesAction GetMessagesAsync { get; set; } void SetInitState(); diff --git a/Unigram/Unigram.Api/Services/Updates/UpdatesService.cs b/Unigram/Unigram.Api/Services/Updates/UpdatesService.cs index 0ff5f7d4c3..0609716c9b 100644 --- a/Unigram/Unigram.Api/Services/Updates/UpdatesService.cs +++ b/Unigram/Unigram.Api/Services/Updates/UpdatesService.cs @@ -45,6 +45,7 @@ public class UpdatesService : IUpdatesService public GetFullChatAction GetFullChatAsync { get; set; } public GetFullUserAction GetFullUserAsync { get; set; } public GetChannelMessagesAction GetChannelMessagesAsync { get; set; } + public GetMessagesAction GetMessagesAsync { get; set; } private readonly Timer _lostSeqTimer; @@ -1324,53 +1325,110 @@ private bool ProcessUpdateInternal(TLUpdateBase update, bool notifyNewMessage = var updatedReadMessagesContents = update as TLUpdateReadMessagesContents; if (updatedReadMessagesContents != null) { - var messages = new List(updatedReadMessagesContents.Messages.Count); + var messages = new List(updatedReadMessagesContents.Messages.Count); + var messagesId = new TLVector(updatedReadMessagesContents.Messages.Count); + foreach (var readMessageId in updatedReadMessagesContents.Messages) { - var message = _cacheService.GetMessage(readMessageId) as TLMessage; - if (message != null) + var commonMessage = _cacheService.GetMessage(readMessageId) as TLMessageCommonBase; + if (commonMessage != null) { - messages.Add(message); + messages.Add(commonMessage); + } + else + { + messagesId.Add(readMessageId); } } Execute.BeginOnUIThread(() => { - foreach (var message in messages) + foreach (var commonMessage in messages) { - message.IsMediaUnread = false; - message.RaisePropertyChanged(() => message.IsMediaUnread); + commonMessage.IsMediaUnread = false; + commonMessage.RaisePropertyChanged(() => commonMessage.IsMediaUnread); - // TODO: Verify - //message.SetListened(); - //if (message.Media != null) - //{ - // message.Media.NotListened = false; - // message.Media.RaisePropertyChanged(() => message.Media.NotListened); - //} + var dialog = _cacheService.GetDialog(commonMessage); - // Self destruct if needed - if (message.Media is TLMessageMediaPhoto photoMedia && photoMedia.HasTTLSeconds) + if (commonMessage.IsMentioned && dialog != null) { - photoMedia.Photo = null; - photoMedia.Caption = null; - photoMedia.HasPhoto = false; - photoMedia.HasCaption = false; - - Execute.BeginOnThreadPool(() => _eventAggregator.Publish(new MessageExpiredEventArgs(message))); + dialog.UnreadMentionsCount = Math.Max(dialog.UnreadMentionsCount - 1, 0); + dialog.RaisePropertyChanged(() => dialog.UnreadMentionsCount); } - else if (message.Media is TLMessageMediaDocument documentMedia && documentMedia.HasTTLSeconds) + + // Self destruct if needed + if (commonMessage is TLMessage message) { - documentMedia.Document = null; - documentMedia.Caption = null; - documentMedia.HasDocument = false; - documentMedia.HasCaption = false; + if (message.Media is TLMessageMediaPhoto photoMedia && photoMedia.HasTTLSeconds) + { + photoMedia.Photo = null; + photoMedia.Caption = null; + photoMedia.HasPhoto = false; + photoMedia.HasCaption = false; + + Execute.BeginOnThreadPool(() => _eventAggregator.Publish(new MessageExpiredEventArgs(message))); + } + else if (message.Media is TLMessageMediaDocument documentMedia && documentMedia.HasTTLSeconds) + { + documentMedia.Document = null; + documentMedia.Caption = null; + documentMedia.HasDocument = false; + documentMedia.HasCaption = false; - Execute.BeginOnThreadPool(() => _eventAggregator.Publish(new MessageExpiredEventArgs(message))); + Execute.BeginOnThreadPool(() => _eventAggregator.Publish(new MessageExpiredEventArgs(message))); + } } } }); + if (messagesId.Count > 0) + { + GetMessagesAsync(messagesId, result => + { + Execute.BeginOnUIThread(() => + { + foreach (var commonMessage in result.Messages.OfType()) + { + commonMessage.IsMediaUnread = false; + commonMessage.RaisePropertyChanged(() => commonMessage.IsMediaUnread); + + var dialog = _cacheService.GetDialog(commonMessage); + + if (commonMessage.IsMentioned && dialog != null) + { + dialog.UnreadMentionsCount = Math.Max(dialog.UnreadMentionsCount - 1, 0); + dialog.RaisePropertyChanged(() => dialog.UnreadMentionsCount); + } + + // Self destruct if needed + if (commonMessage is TLMessage message) + { + if (message.Media is TLMessageMediaPhoto photoMedia && photoMedia.HasTTLSeconds) + { + photoMedia.Photo = null; + photoMedia.Caption = null; + photoMedia.HasPhoto = false; + photoMedia.HasCaption = false; + + Execute.BeginOnThreadPool(() => _eventAggregator.Publish(new MessageExpiredEventArgs(message))); + } + else if (message.Media is TLMessageMediaDocument documentMedia && documentMedia.HasTTLSeconds) + { + documentMedia.Document = null; + documentMedia.Caption = null; + documentMedia.HasDocument = false; + documentMedia.HasCaption = false; + + Execute.BeginOnThreadPool(() => _eventAggregator.Publish(new MessageExpiredEventArgs(message))); + } + } + } + }); + + _cacheService.AddMessagesToContext(result, (m) => { }); + }); + } + //Execute.BeginOnThreadPool(() => _eventAggregator.Publish(updatedReadMessagesContents)); return true; @@ -1387,10 +1445,10 @@ private bool ProcessUpdateInternal(TLUpdateBase update, bool notifyNewMessage = foreach (var readMessageId in updateChannelReadMessagesContents.Messages) { - var message = _cacheService.GetMessage(readMessageId, updateChannelReadMessagesContents.ChannelId) as TLMessageCommonBase; - if (message != null) + var commonMessage = _cacheService.GetMessage(readMessageId, updateChannelReadMessagesContents.ChannelId) as TLMessageCommonBase; + if (commonMessage != null) { - messages.Add(message); + messages.Add(commonMessage); } else { @@ -1405,7 +1463,7 @@ private bool ProcessUpdateInternal(TLUpdateBase update, bool notifyNewMessage = message.IsMediaUnread = false; message.RaisePropertyChanged(() => message.IsMediaUnread); - if (message.IsMentioned && dialog != null && channel != null && channel.IsMegaGroup) + if (message.IsMentioned && dialog != null) { dialog.UnreadMentionsCount = Math.Max(dialog.UnreadMentionsCount - 1, 0); dialog.RaisePropertyChanged(() => dialog.UnreadMentionsCount); @@ -1424,7 +1482,7 @@ private bool ProcessUpdateInternal(TLUpdateBase update, bool notifyNewMessage = message.IsMediaUnread = false; message.RaisePropertyChanged(() => message.IsMediaUnread); - if (message.IsMentioned && dialog != null && channel != null && channel.IsMegaGroup) + if (message.IsMentioned && dialog != null) { dialog.UnreadMentionsCount = Math.Max(dialog.UnreadMentionsCount - 1, 0); dialog.RaisePropertyChanged(() => dialog.UnreadMentionsCount); @@ -1433,9 +1491,6 @@ private bool ProcessUpdateInternal(TLUpdateBase update, bool notifyNewMessage = }); _cacheService.AddMessagesToContext(result, (m) => { }); - }, - fault => - { }); } } diff --git a/Unigram/Unigram/Controls/Media/VoiceMediaControl.xaml.cs b/Unigram/Unigram/Controls/Media/VoiceMediaControl.xaml.cs index bf65927e57..1b5b15557b 100644 --- a/Unigram/Unigram/Controls/Media/VoiceMediaControl.xaml.cs +++ b/Unigram/Unigram/Controls/Media/VoiceMediaControl.xaml.cs @@ -20,6 +20,7 @@ using Unigram.Common; using Windows.System.Display; using Telegram.Api.Services; +using Telegram.Api.Aggregator; namespace Unigram.Controls.Media { @@ -222,11 +223,25 @@ private async void Toggle_Click(object sender, RoutedEventArgs e) if (message.IsMediaUnread && !message.IsOut) { - MTProtoService.Current.ReadMessageContentsAsync(new TLVector { message.Id }, affected => + var vector = new TLVector { message.Id }; + if (message.Parent is TLChannel channel) { - message.IsMediaUnread = false; - message.RaisePropertyChanged(() => message.IsMediaUnread); - }); + TelegramEventAggregator.Instance.Publish(new TLUpdateChannelReadMessagesContents { ChannelId = channel.Id, Messages = vector }); + MTProtoService.Current.ReadMessageContentsAsync(channel.ToInputChannel(), vector, affected => + { + message.IsMediaUnread = false; + message.RaisePropertyChanged(() => message.IsMediaUnread); + }); + } + else + { + TelegramEventAggregator.Instance.Publish(new TLUpdateReadMessagesContents { Messages = vector }); + MTProtoService.Current.ReadMessageContentsAsync(vector, affected => + { + message.IsMediaUnread = false; + message.RaisePropertyChanged(() => message.IsMediaUnread); + }); + } } var settings = new AudioGraphSettings(AudioRenderCategory.Media); diff --git a/Unigram/Unigram/Themes/Media.xaml.cs b/Unigram/Unigram/Themes/Media.xaml.cs index b0bf2ba08b..4cfc5dafd9 100644 --- a/Unigram/Unigram/Themes/Media.xaml.cs +++ b/Unigram/Unigram/Themes/Media.xaml.cs @@ -170,13 +170,24 @@ public static async void SecretDownload(object sender, TransferCompletedEventArg if (message.IsMediaUnread && !message.IsOut) { var vector = new TLVector { message.Id }; - TelegramEventAggregator.Instance.Publish(new TLUpdateReadMessagesContents { Messages = vector }); - - MTProtoService.Current.ReadMessageContentsAsync(vector, result => + if (message.Parent is TLChannel channel) { - message.IsMediaUnread = false; - message.RaisePropertyChanged(() => message.IsMediaUnread); - }); + TelegramEventAggregator.Instance.Publish(new TLUpdateChannelReadMessagesContents { ChannelId = channel.Id, Messages = vector }); + MTProtoService.Current.ReadMessageContentsAsync(channel.ToInputChannel(), vector, result => + { + message.IsMediaUnread = false; + message.RaisePropertyChanged(() => message.IsMediaUnread); + }); + } + else + { + TelegramEventAggregator.Instance.Publish(new TLUpdateReadMessagesContents { Messages = vector }); + MTProtoService.Current.ReadMessageContentsAsync(vector, result => + { + message.IsMediaUnread = false; + message.RaisePropertyChanged(() => message.IsMediaUnread); + }); + } } var media = element.Ancestors().FirstOrDefault(x => x is FrameworkElement && ((FrameworkElement)x).Name.Equals("MediaControl")) as FrameworkElement; diff --git a/Unigram/Unigram/ViewModelLocator.cs b/Unigram/Unigram/ViewModelLocator.cs index 881bc9f4f7..6ed7fe4f05 100644 --- a/Unigram/Unigram/ViewModelLocator.cs +++ b/Unigram/Unigram/ViewModelLocator.cs @@ -249,6 +249,7 @@ public void LoadStateAndUpdate() updatesService.GetFullUserAsync = protoService.GetFullUserAsync; updatesService.GetFullChatAsync = protoService.GetFullChatAsync; updatesService.GetChannelMessagesAsync = protoService.GetMessagesAsync; + updatesService.GetMessagesAsync = protoService.GetMessagesAsync; updatesService.LoadStateAndUpdate(() => { }); protoService.AuthorizationRequired -= OnAuthorizationRequired; diff --git a/Unigram/Unigram/ViewModels/DialogViewModel.cs b/Unigram/Unigram/ViewModels/DialogViewModel.cs index 23b09a73bc..bfdb627c5c 100644 --- a/Unigram/Unigram/ViewModels/DialogViewModel.cs +++ b/Unigram/Unigram/ViewModels/DialogViewModel.cs @@ -694,6 +694,10 @@ private async void NextMentionExecute() { await ProtoService.ReadMessageContentsAsync(channel.ToInputChannel(), new TLVector { commonMessage.Id }); } + else + { + await ProtoService.ReadMessageContentsAsync(new TLVector { commonMessage.Id }); + } } } diff --git a/Unigram/Unigram/Views/DialogPage.Bubbles.xaml.cs b/Unigram/Unigram/Views/DialogPage.Bubbles.xaml.cs index 5560427b42..8a5b51052c 100644 --- a/Unigram/Unigram/Views/DialogPage.Bubbles.xaml.cs +++ b/Unigram/Unigram/Views/DialogPage.Bubbles.xaml.cs @@ -102,7 +102,6 @@ private async void OnViewChanged(object sender, ScrollViewerViewChangedEventArgs var messageIds = new TLVector(); var dialog = ViewModel.Dialog; - var channel = ViewModel.With as TLChannel; for (int i = index0; i <= index1; i++) { @@ -110,7 +109,7 @@ private async void OnViewChanged(object sender, ScrollViewerViewChangedEventArgs if (container != null) { var item = lvDialogs.ItemFromContainer(container); - if (item != null && item is TLMessageCommonBase commonMessage && !commonMessage.IsOut && commonMessage.IsMentioned && commonMessage.IsMediaUnread && channel.IsMegaGroup) + if (item != null && item is TLMessageCommonBase commonMessage && !commonMessage.IsOut && commonMessage.IsMentioned && commonMessage.IsMediaUnread) { commonMessage.IsMediaUnread = false; commonMessage.RaisePropertyChanged(() => commonMessage.IsMediaUnread); @@ -118,6 +117,7 @@ private async void OnViewChanged(object sender, ScrollViewerViewChangedEventArgs if (dialog != null) { dialog.UnreadMentionsCount = Math.Max(0, dialog.UnreadMentionsCount - 1); + dialog.RaisePropertyChanged(() => dialog.UnreadMentionsCount); } messageIds.Add(commonMessage.Id); @@ -127,7 +127,14 @@ private async void OnViewChanged(object sender, ScrollViewerViewChangedEventArgs if (messageIds.Count > 0) { - ViewModel.ProtoService.ReadMessageContentsAsync(channel.ToInputChannel(), messageIds, null); + if (ViewModel.With is TLChannel channel) + { + ViewModel.ProtoService.ReadMessageContentsAsync(channel.ToInputChannel(), messageIds, null); + } + else + { + ViewModel.ProtoService.ReadMessageContentsAsync(messageIds, null); + } } #region OLD