Skip to content

Commit

Permalink
Mentions hotfix
Browse files Browse the repository at this point in the history
  • Loading branch information
FrayxRulez committed Sep 4, 2017
1 parent 83539a9 commit 1d3a0bf
Show file tree
Hide file tree
Showing 9 changed files with 160 additions and 64 deletions.
12 changes: 6 additions & 6 deletions Unigram/Unigram.Api/Services/Cache/InMemoryDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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,

Expand All @@ -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
};
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -1397,7 +1397,7 @@ public void DeleteMessages(IList<TLMessageBase> 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);
}
Expand Down Expand Up @@ -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);
}
Expand Down
1 change: 1 addition & 0 deletions Unigram/Unigram.Api/Services/MTProtoService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ public MTProtoService(IDeviceInfoService deviceInfo,IUpdatesService updatesServi
_updatesService.GetFullChatAsync = GetFullChatAsync;
_updatesService.GetFullUserAsync = GetFullUserAsync;
_updatesService.GetChannelMessagesAsync = GetMessagesAsync;
_updatesService.GetMessagesAsync = GetMessagesAsync;
}

_transportService = transportService;
Expand Down
20 changes: 11 additions & 9 deletions Unigram/Unigram.Api/Services/Updates/IUpdatesService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@

namespace Telegram.Api.Services.Updates
{
public delegate void GetDifferenceAction(int pts, int date, int qts, Action<TLUpdatesDifferenceBase> callback, Action<TLRPCError> faultCallback);
public delegate void GetDHConfigAction(int version, int randomLength, Action<TLMessagesDHConfig> callback, Action<TLRPCError> faultCallback);
public delegate void AcceptEncryptionAction(TLInputEncryptedChat peer, byte[] gb, long keyFingerprint, Action<TLEncryptedChatBase> callback, Action<TLRPCError> faultCallback);
public delegate void SendEncryptedServiceAction(TLInputEncryptedChat peer, long randomkId, byte[] data, Action<TLMessagesSentEncryptedMessage> callback, Action<TLRPCError> faultCallback);
public delegate void UpdateChannelAction(int? channelId, Action<TLMessagesChatFull> callback, Action<TLRPCError> faultCallback);
public delegate void GetParticipantAction(TLInputChannelBase channelId, TLInputUserBase userId, Action<TLChannelsChannelParticipant> callback, Action<TLRPCError> faultCallback);
public delegate void GetFullChatAction(int chatId, Action<TLMessagesChatFull> callback, Action<TLRPCError> faultCallback);
public delegate void GetFullUserAction(TLInputUserBase userId, Action<TLUserFull> callback, Action<TLRPCError> faultCallback);
public delegate void GetChannelMessagesAction(TLInputChannelBase channelId, TLVector<int> id, Action<TLMessagesMessagesBase> callback, Action<TLRPCError> faultCallback);
public delegate void GetDifferenceAction(int pts, int date, int qts, Action<TLUpdatesDifferenceBase> callback, Action<TLRPCError> faultCallback = null);
public delegate void GetDHConfigAction(int version, int randomLength, Action<TLMessagesDHConfig> callback, Action<TLRPCError> faultCallback = null);
public delegate void AcceptEncryptionAction(TLInputEncryptedChat peer, byte[] gb, long keyFingerprint, Action<TLEncryptedChatBase> callback, Action<TLRPCError> faultCallback = null);
public delegate void SendEncryptedServiceAction(TLInputEncryptedChat peer, long randomkId, byte[] data, Action<TLMessagesSentEncryptedMessage> callback, Action<TLRPCError> faultCallback = null);
public delegate void UpdateChannelAction(int? channelId, Action<TLMessagesChatFull> callback, Action<TLRPCError> faultCallback = null);
public delegate void GetParticipantAction(TLInputChannelBase channelId, TLInputUserBase userId, Action<TLChannelsChannelParticipant> callback, Action<TLRPCError> faultCallback = null);
public delegate void GetFullChatAction(int chatId, Action<TLMessagesChatFull> callback, Action<TLRPCError> faultCallback = null);
public delegate void GetFullUserAction(TLInputUserBase userId, Action<TLUserFull> callback, Action<TLRPCError> faultCallback = null);
public delegate void GetChannelMessagesAction(TLInputChannelBase channelId, TLVector<int> id, Action<TLMessagesMessagesBase> callback, Action<TLRPCError> faultCallback = null);
public delegate void GetMessagesAction(TLVector<int> id, Action<TLMessagesMessagesBase> callback, Action<TLRPCError> faultCallback = null);

public delegate void SetMessageOnTimeAtion(double seconds, string message);

Expand All @@ -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();

Expand Down
127 changes: 91 additions & 36 deletions Unigram/Unigram.Api/Services/Updates/UpdatesService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -1324,53 +1325,110 @@ private bool ProcessUpdateInternal(TLUpdateBase update, bool notifyNewMessage =
var updatedReadMessagesContents = update as TLUpdateReadMessagesContents;
if (updatedReadMessagesContents != null)
{
var messages = new List<TLMessage>(updatedReadMessagesContents.Messages.Count);
var messages = new List<TLMessageCommonBase>(updatedReadMessagesContents.Messages.Count);
var messagesId = new TLVector<int>(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<TLMessageCommonBase>())
{
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;
Expand All @@ -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
{
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -1433,9 +1491,6 @@ private bool ProcessUpdateInternal(TLUpdateBase update, bool notifyNewMessage =
});
_cacheService.AddMessagesToContext(result, (m) => { });
},
fault =>
{
});
}
}
Expand Down
Loading

0 comments on commit 1d3a0bf

Please sign in to comment.