public static List <IUser> GetUsersFromMessagesMessages(IMessagesMessages iMessagesMessages)
        {
            var messagesMessages        = iMessagesMessages as MessagesMessages;
            var messagesMessagesSlice   = iMessagesMessages as MessagesMessagesSlice;
            var messagesChannelMessages = iMessagesMessages as MessagesChannelMessages;

            if (messagesMessages != null)
            {
                return(messagesMessages.Users);
            }
            if (messagesMessagesSlice != null)
            {
                return(messagesMessagesSlice.Users);
            }
            if (messagesChannelMessages != null)
            {
                return(messagesChannelMessages.Users);
            }
            return(null);
        }
        public static List <IChat> GetChatsFromMessagesMessages(IMessagesMessages iMessagesMessages)
        {
            var messagesMessages        = iMessagesMessages as MessagesMessages;
            var messagesMessagesSlice   = iMessagesMessages as MessagesMessagesSlice;
            var messagesChannelMessages = iMessagesMessages as MessagesChannelMessages;

            if (messagesMessages != null)
            {
                return(messagesMessages.Chats);
            }
            if (messagesMessagesSlice != null)
            {
                return(messagesMessagesSlice.Chats);
            }
            if (messagesChannelMessages != null)
            {
                return(messagesChannelMessages.Chats);
            }
            return(null);
        }
Exemple #3
0
        private IMessagesMessages MergeMessagesMessages(IMessagesMessages iMessagesChannel, IMessagesMessages iMessagesChat)
        {
            var messagesChannel = iMessagesChannel as MessagesChannelMessages;

            if (messagesChannel != null)
            {
                var messagesChat      = iMessagesChat as MessagesMessages;
                var messagesChatSlice = iMessagesChat as MessagesMessagesSlice;

                if (messagesChat != null)
                {
                    messagesChannel.Chats.AddRange(messagesChat.Chats);
                    messagesChannel.Users.AddRange(messagesChat.Users);
                    messagesChannel.Messages.AddRange(messagesChat.Messages);
                }
                if (messagesChatSlice != null)
                {
                    messagesChannel.Chats.AddRange(messagesChatSlice.Chats);
                    messagesChannel.Users.AddRange(messagesChatSlice.Users);
                    messagesChannel.Messages.AddRange(messagesChatSlice.Messages);
                }
            }
            return(messagesChannel);
        }
Exemple #4
0
        private IMessagesMessages GetMessageHistory(BubbleGroup group, long fromTime, int max)
        {
            using (var client = new FullClientDisposable(this))
            {
                if (group.IsExtendedParty)
                {
                    IMessagesMessages finalMessages = MakeMessagesMessages(new List <IChat>(), new List <IUser>(), new List <IMessage>());

                    Func <BubbleGroup, bool> isNewBubbleGroup = bubbleGroup =>
                    {
                        var bubbles = BubbleGroupSync.ReadBubblesFromDatabase(group);
                        if (bubbles.Count() > 1)
                        {
                            return(false);
                        }
                        foreach (var bubble in bubbles)
                        {
                            if (bubble is NewBubble)
                            {
                                return(true);
                            }
                        }
                        return(false);
                    };

                    Func <IMessagesMessages, bool> hasSuperGroupCreatedMessage = messages =>
                    {
                        var messagesChannelMessages = messages as MessagesChannelMessages;
                        if (messagesChannelMessages != null)
                        {
                            foreach (var message in messagesChannelMessages.Messages)
                            {
                                var messageService = message as MessageService;
                                if (messageService == null)
                                {
                                    continue;
                                }
                                if (messageService.Action is MessageActionChannelMigrateFrom)
                                {
                                    return(true);
                                }
                            }
                        }
                        return(false);
                    };

                    Func <IMessagesMessages, int> getMessagesCount = messages =>
                    {
                        var messagesChats        = messages as MessagesMessages;
                        var messagesChatsSlice   = messages as MessagesMessagesSlice;
                        var messagesChatsChannel = messages as MessagesChannelMessages;
                        if (messagesChats != null)
                        {
                            return(messagesChats.Messages.Count);
                        }
                        if (messagesChatsSlice != null)
                        {
                            return(messagesChats.Messages.Count);
                        }
                        if (messagesChatsChannel != null)
                        {
                            return(messagesChatsChannel.Messages.Count);
                        }
                        return(0);
                    };

                    Action <List <IMessage>, string> changeAddress = (messages, address) =>
                    {
                        foreach (var message in messages)
                        {
                            var normalMessage  = message as Message;
                            var serviceMessage = message as MessageService;

                            if (normalMessage != null)
                            {
                                normalMessage.ToId = new PeerChannel
                                {
                                    ChannelId = uint.Parse(address)
                                };
                            }
                            if (serviceMessage != null)
                            {
                                serviceMessage.ToId = new PeerChannel
                                {
                                    ChannelId = uint.Parse(address)
                                };
                            }
                        }
                    };

                    Action <IMessagesMessages, string> updateChatMessageAddresses = (chatMessages, address) =>
                    {
                        var messagesChats      = chatMessages as MessagesMessages;
                        var messagesChatsSlice = chatMessages as MessagesMessagesSlice;

                        if (messagesChats != null)
                        {
                            changeAddress(messagesChats.Messages, address);
                        }
                        if (messagesChatsSlice != null)
                        {
                            changeAddress(messagesChatsSlice.Messages, address);
                        }
                    };


                    do
                    {
                        if (isNewBubbleGroup(group))
                        {
                            var newOffsetId = GetLastPtsForChannel(client.Client, group.Address);
                            SaveChannelState(uint.Parse(group.Address), newOffsetId); //save the state for this channel since it wount have any as its a new bubblegroup
                            finalMessages = GetChannelMessages(group, newOffsetId, max, client);
                            if (hasSuperGroupCreatedMessage(finalMessages))
                            {
                                var remainingCount = getMessagesCount(finalMessages);
                                if (max - remainingCount > 0)
                                {
                                    var chatMessages = GetChatMessagesForChannel(group, Time.GetNowUnixTimestamp(), max - remainingCount, client);
                                    updateChatMessageAddresses(chatMessages, group.Address);
                                    MergeMessagesMessages(finalMessages, chatMessages);
                                }
                            }
                            break;
                        }

                        bool queryChat;
                        bool lastMessageIsExtendedParty;

                        var offsetId = GetMessagePtsForTime(group, fromTime, out queryChat, out lastMessageIsExtendedParty);

                        if (queryChat)
                        {
                            if (lastMessageIsExtendedParty)
                            {
                                finalMessages = GetChannelMessages(group, 1, max, client);
                                SaveChannelState(uint.Parse(group.Address), 1); //this group was just upgraded to an extended party, we need to explicity save its state otherwise itll be zero
                            }
                            var chatMessages = GetChatMessagesForChannel(group, fromTime, max, client);
                            updateChatMessageAddresses(chatMessages, group.Address);
                            MergeMessagesMessages(finalMessages, chatMessages);
                            break;
                        }

                        finalMessages = GetChannelMessages(group, offsetId, max, client);
                        var finalMessagesCount = getMessagesCount(finalMessages);
                        if (max - finalMessagesCount > 0)
                        {
                            var chatMessages = GetChatMessagesForChannel(group, fromTime, max - finalMessagesCount, client);
                            updateChatMessageAddresses(chatMessages, group.Address);
                            MergeMessagesMessages(finalMessages, chatMessages);
                        }
                    } while (false);

                    return(finalMessages);
                }
                else
                {
                    var peer = GetInputPeer(group.Address, group.IsParty, group.IsExtendedParty);

                    bool queryChat;
                    bool lastMessageIsExtendedParty;

                    var offsetId = GetMessagePtsForTime(group, fromTime, out queryChat, out lastMessageIsExtendedParty);

                    if (offsetId != 1)
                    {
                        var response =
                            TelegramUtils.RunSynchronously(
                                client.Client.Methods.MessagesGetHistoryAsync(new MessagesGetHistoryArgs
                        {
                            Peer     = peer,
                            OffsetId = offsetId + 1,
                            Limit    = (uint)max
                        }));
                        return(response);
                    }
                    else
                    {
                        var response =
                            TelegramUtils.RunSynchronously(
                                client.Client.Methods.MessagesGetHistoryAsync(new MessagesGetHistoryArgs
                        {
                            Peer       = peer,
                            OffsetDate = (uint)fromTime,
                            Limit      = (uint)max
                        }));
                        return(response);
                    }
                }
            }
        }
Exemple #5
0
        private IMessagesMessages MergeMessagesMessages(IMessagesMessages iMessagesChannel, IMessagesMessages iMessagesChat)
        {
            var messagesChannel = iMessagesChannel as MessagesChannelMessages;
            if (messagesChannel != null)
            {
                var messagesChat = iMessagesChat as MessagesMessages;
                var messagesChatSlice = iMessagesChat as MessagesMessagesSlice;

                if (messagesChat != null)
                {
                    messagesChannel.Chats.AddRange(messagesChat.Chats);
                    messagesChannel.Users.AddRange(messagesChat.Users);
                    messagesChannel.Messages.AddRange(messagesChat.Messages);
                }
                if(messagesChatSlice != null)
                {
                    messagesChannel.Chats.AddRange(messagesChatSlice.Chats);
                    messagesChannel.Users.AddRange(messagesChatSlice.Users);
                    messagesChannel.Messages.AddRange(messagesChatSlice.Messages);
                }
            }
            return messagesChannel;
        }