コード例 #1
0
        public IObservable <BaseMessage> Load(TD.Chat chat, long fromMessageId, int limit)
        {
            return(Observable.Create <BaseMessage>(async observer =>
            {
                var chatsToLoad = new HashSet <long>();
                var usersToLoad = new HashSet <int>();

                while (true)
                {
                    var messages = await _agent.ExecuteAsync(new TD.GetChatHistory
                    {
                        ChatId = chat.Id,
                        FromMessageId = fromMessageId,
                        Offset = 0,
                        Limit = limit,
                        OnlyLocal = false
                    });

                    foreach (var m in messages.Messages_)
                    {
                        MessageAuthor messageAuthor;
                        if (chat.Type is TD.ChatType.ChatTypeSupergroup cts && cts.IsChannel)
                        {
                            if (!_channelAuthorLoader.Retrieve(chat.Id, out var channelAuthor))
                            {
                                chatsToLoad.Add(chat.Id);
                            }

                            messageAuthor = channelAuthor;
                        }
コード例 #2
0
 public IObservable <TD.Message> SendText(TD.Chat chat, TD.InputMessageContent.InputMessageText messageText)
 {
     return(Observable.FromAsync(ct => _agent.ExecuteAsync(new TD.SendMessage
     {
         ChatId = chat.Id,
         InputMessageContent = messageText
     })));
 }
コード例 #3
0
 public IObservable <BaseMessage> Appends(TD.Chat chat)
 {
     return(Observable.FromEventPattern <TD.Structure>(
                h => _agent.Received += h,
                h => _agent.Received -= h)
            .Select(s => s.EventArgs as TD.Update.UpdateNewMessage)
            .Where(u => u != null && u.Message.ChatId == chat.Id)
            .Select(MapMessage));
 }
コード例 #4
0
        public bool IsAvatarReady(TD.Chat chat, Size size)
        {
            var localFilePath = chat.Photo?.Small?.Local?.Path;

            if (!File.Exists(localFilePath))
            {
                return(false);
            }

            var avatarFile = GetAvatarFilename(size, Path.GetFileNameWithoutExtension(localFilePath));

            return(File.Exists(avatarFile));
        }
コード例 #5
0
        public bool Retrieve(TD.Chat chat, out Conversation conversation)
        {
            var result = Retrieve(chat.Id, out conversation);

            switch (chat.Type)
            {
            case TD.ChatType.ChatTypeBasicGroup _:
                conversation.Kind = ExplorerEntityKind.Group;
                break;

            case TD.ChatType.ChatTypeSupergroup cts:
                conversation.Kind = cts.IsChannel ? ExplorerEntityKind.Channel : ExplorerEntityKind.Group;
                break;
            }

            conversation.Title = chat.Title;
            conversation.Chat  = chat;

            return(result);
        }
コード例 #6
0
        public bool Retrieve(TD.Chat chat, TD.User user, out Conversation conversation)
        {
            var result = Retrieve(chat.Id, out conversation);

            switch (user.Type)
            {
            case TD.UserType.UserTypeRegular _:
                conversation.Kind = ExplorerEntityKind.People;
                break;

            case TD.UserType.UserTypeBot _:
                conversation.Kind = ExplorerEntityKind.Bot;
                break;
            }

            conversation.Title = chat.Title;
            conversation.Chat  = chat;

            return(result);
        }
コード例 #7
0
        public ChatInteractor(
            TD.Chat chat,
            MessageLoader messageLoader,
            NewMessageProvider newMessageProvider
            )
        {
            _chat = chat;

            _messageLoader      = messageLoader;
            _newMessageProvider = newMessageProvider;

            _actionSubject  = new Subject <Action>();
            _appendSubject  = new Subject <ChatEntity>();
            _prependSubject = new Subject <ChatEntity>();

            _newMessageSubscription = _newMessageProvider
                                      .Appends(_chat)
                                      .Subscribe(_appendSubject);

            _actionsSubscription = _messageLoader
                                   .Actions()
                                   .Subscribe(_actionSubject);
        }
コード例 #8
0
        public async Task <IBitmap> LoadForChatAsync(TD.Chat chat, Size size, bool forceFallback = false)
        {
            string avatarFile;

            if (forceFallback)
            {
                avatarFile = await CreateFallbackAvatar(chat.Id, size);
            }
            else
            {
                var localFile = await _fileLoader.LoadFileAsync(chat.Photo?.Small);

                if (localFile?.Path != null)
                {
                    avatarFile = await CreateAvatar(localFile.Path, size);
                }
                else
                {
                    avatarFile = await CreateFallbackAvatar(chat.Id, size);
                }
            }

            return(await CreateBitmap(avatarFile));
        }
コード例 #9
0
 public Topic(TD.Chat chat)
 {
     Chat = chat;
 }
コード例 #10
0
 public IObservable <BaseMessage> LoadRecent(TD.Chat chat)
 {
     return(Load(chat, 0, 50));
 }