コード例 #1
0
 private IObservable <TdApi.Message> GetPinnedMessage(
     TdApi.Chat chat)
 {
     return(_agent.Execute(new TdApi.GetChatPinnedMessage
     {
         ChatId = chat.Id
     }));
 }
コード例 #2
0
 public Avatar GetAvatar(TdApi.Chat chat, bool forceFallback = false)
 {
     return(new Avatar
     {
         Bitmap = forceFallback ? null : GetBitmap(chat.Photo?.Small),
         Color = GetColor(chat),
         Label = GetLabel(chat)
     });
 }
コード例 #3
0
 public IObservable <Avatar> LoadAvatar(TdApi.Chat chat)
 {
     return(LoadBitmap(chat.Photo?.Small)
            .Select(bitmap => new Avatar
     {
         Bitmap = bitmap,
         Color = GetColor(chat),
         Label = GetLabel(chat)
     }));
 }
コード例 #4
0
ファイル: MessageSender.cs プロジェクト: ForNeVeR/Smith
 public IObservable <TdApi.Message> SendMessage(
     TdApi.Chat chat,
     TdApi.InputMessageContent.InputMessageText messageTextContent)
 {
     return(_agent.Execute(new TdApi.SendMessage
     {
         ChatId = chat.Id,
         InputMessageContent = messageTextContent
     }));
 }
コード例 #5
0
 public Avatar GetAvatar(TdApi.Chat chat, AvatarSize size, bool forceFallback = false)
 {
     return(new Avatar
     {
         Bitmap = forceFallback ? null : GetBitmap(chat.Photo?.Small, chat.Id, size),
         BrushFactory = GetBrushFactory(chat),
         Size = size,
         Label = GetLabel(chat)
     });
 }
コード例 #6
0
 public IObservable <Avatar> LoadAvatar(TdApi.Chat chat, AvatarSize size)
 {
     return(LoadBitmap(chat.Photo?.Small, chat.Id, size)
            .Select(bitmap => new Avatar
     {
         Bitmap = bitmap,
         BrushFactory = GetBrushFactory(chat),
         Size = size,
         Label = GetLabel(chat)
     }));
 }
コード例 #7
0
        public Avatar GetAvatar(TdApi.Chat chat, AvatarSize size)
        {
            int s = _platform.PixelDensity * (int)size;

            return(new Avatar
            {
                Bitmap = GetBitmap(chat.Photo?.Small, s),
                Color = GetColor(chat),
                Label = GetLabel(chat)
            });
        }
コード例 #8
0
        public IObservable <Avatar> LoadAvatar(TdApi.Chat chat, AvatarSize size)
        {
            int s = _platform.PixelDensity * (int)size;

            return(LoadBitmap(chat.Photo?.Small, s)
                   .Select(bitmap => new Avatar
            {
                Bitmap = bitmap,
                Color = GetColor(chat),
                Label = GetLabel(chat)
            }));
        }
コード例 #9
0
        private Func <IBrush> GetBrushFactory(TdApi.Chat chat)
        {
            return(() =>
            {
                if (_brushCache.TryGetValue(chat.Id, out var brush))
                {
                    return brush;
                }

                brush = new SolidColorBrush(Color.Parse("#" + _colorMapper[chat.Id]));
                _brushCache.TryAdd(chat.Id, brush);
                return brush;
            });
        }
コード例 #10
0
 private IObservable <TdApi.Message> GetMessages(
     TdApi.Chat chat,
     long fromMessageId,
     int limit,
     int offset)
 {
     return(_agent.Execute(new TdApi.GetChatHistory
     {
         ChatId = chat.Id,
         FromMessageId = fromMessageId,
         Limit = limit,
         Offset = offset,
         OnlyLocal = false
     })
            .SelectMany(history => history.Messages_));
 }
コード例 #11
0
 private void SetChatOrder(TdApi.Chat chat, long order)
 {
     lock (_chatList)
     {
         if (chat.Order != 0)
         {
             _chatList.Remove(new OrderedChat()
             {
                 Id = chat.Id, Order = chat.Order
             });
             Chats.TryRemove(chat.Id, out _);
             chat.Order = order;
             _chatList.Add(new OrderedChat()
             {
                 Id = chat.Id, Order = chat.Order
             });
             Chats.TryAdd(chat.Id, new Chat(chat));
         }
     }
 }
コード例 #12
0
        private string GetLabel(TdApi.Chat chat)
        {
            var title = chat.Title;

            return(string.IsNullOrWhiteSpace(title) ? null : title.Substring(0, 1).ToUpper());
        }
コード例 #13
0
 private Color GetColor(TdApi.Chat chat)
 {
     return(Color.Parse("#" + _colorMapper[chat.Id]));
 }
コード例 #14
0
        private async Task <TelegramChat> GetChat(long chatId, TdApi.Chat chat = null)
        {
            if (_chats.TryGetValue(chatId, out var tg))
            {
                return(tg);
            }

            AutoResetEvent wait;

            if (_loadingChats.TryGetValue(chatId, out wait))
            {
                wait.WaitOne();
                return(_chats[chatId]);
            }

            wait = new AutoResetEvent(false);
            if (!_loadingChats.TryAdd(chatId, wait))
            {
                wait.WaitOne();
                return(_chats[chatId]);
            }

            int tryIndex = 0;

            while (tryIndex < 5)
            {
                tryIndex++;
                const string tdLibThrottlePrefix = "Too Many Requests: retry after";

                try
                {
                    if (chat == null)
                    {
                        chat = await _client.ExecuteAsync(new TdApi.GetChat {
                            ChatId = chatId
                        });
                    }

                    switch (chat.Type)
                    {
                    case TdApi.ChatType.ChatTypeBasicGroup existingBasicGroup:
                    {
                        if (chat.LastReadInboxMessageId != 0)
                        {
                            _logger.LogInformation("Known last read for chat {chat} {messageId}", chat.Id, chat.LastReadInboxMessageId);
                        }

                        tg = new TelegramChat()
                        {
                            ChatId       = chatId,
                            BasicGroupId = existingBasicGroup.BasicGroupId,
                            Title        = chat.Title
                        };
                        var basicGroupFullInfo = await _client.ExecuteAsync(new TdApi.GetBasicGroupFullInfo()
                            {
                                BasicGroupId = existingBasicGroup.BasicGroupId
                            });

                        var users   = basicGroupFullInfo.Members.Where(m => m.UserId != _serviceUserId).Select(m => m.UserId);
                        var members = new List <TelegramContact>();
                        foreach (var user in users)
                        {
                            var contact = await GetTelegramContact(user);

                            members.Add(contact);
                        }

                        tg.Members = members.ToArray();

                        break;
                    }

                    case TdApi.ChatType.ChatTypePrivate privateChat:
                    {
                        tg = new TelegramChat()
                        {
                            ChatId = chatId,
                            Title  = chat.Title
                        };
                        var members = new List <TelegramContact>();
                        var contact = await GetTelegramContact(privateChat.UserId);

                        members.Add(contact);

                        tg.Members = members.ToArray();

                        break;
                    }

                    case TdApi.ChatType.ChatTypeSupergroup superGroup:
                    {
                        tg = new TelegramChat()
                        {
                            ChatId = chatId,
                            Title  = chat.Title
                        };
                        var group = await _client.ExecuteAsync(new TdApi.GetSupergroup()
                            {
                                SupergroupId = superGroup.SupergroupId
                            });

                        try
                        {
                            var groupMember = await _client.ExecuteAsync(new TdApi.GetSupergroupMembers()
                                {
                                    SupergroupId = superGroup.SupergroupId, Limit = 1000, Offset = 0
                                });

                            var users   = groupMember.Members.Where(m => m.UserId != _serviceUserId).Select(m => m.UserId);
                            var members = new List <TelegramContact>();
                            foreach (var user in users)
                            {
                                var contact = await GetTelegramContact(user);

                                members.Add(contact);
                            }

                            tg.Members = members.ToArray();
                        }
                        catch (Exception ex)
                        {
                            _logger.LogInformation("Error loading supergroup members {group}, {message}", tg.Title, ex.Message);
                        }

                        break;
                    }

                    default:
                    {
                        tg = new TelegramChat()
                        {
                            ChatId       = chatId,
                            BasicGroupId = 0,
                            Title        = chat.Title,
                        };
                        break;
                    }
                    }

                    _chats.TryAdd(tg.ChatId, tg);
                    _loadingChats.Remove(chatId, out wait);
                    break;
                }
                catch (Exception ex) when(ex.Message.StartsWith(tdLibThrottlePrefix))
                {
                    var howLong = int.Parse(ex.Message.Substring(tdLibThrottlePrefix.Length));

                    _logger.LogWarning("TDLib throttling in progress waiting {howLong} seconds", howLong);
                    Thread.Sleep((howLong + 5) * 1000);
                }
            }
            wait.Set();
            _chatFeed.OnNext(tg);
            return(tg);
        }
コード例 #15
0
        private async void GetOldData()
        {
            try
            {
                var goldOptionsBuilder = new DbContextOptionsBuilder <TomorrowMeltedGoldContext>();
                goldOptionsBuilder.UseSqlServer(_connectionString);
                var dollarOptionsBuilder = new DbContextOptionsBuilder <TomorrowHeratDollarContext>();
                dollarOptionsBuilder.UseSqlServer(_connectionString);
                TdApi.Chat goldChannel   = null;
                TdApi.Chat dollarChannel = null;
                using var client = await DataReceiveHelper.NewClientAsync();

                await foreach (var chat in GetChannels(client))
                {
                    //DataReceiveHelper.Information.AppendLine($"{chat.Title} ID {chat.Id}");
                    if (chat.Title.Equals(GoldChannelName))
                    {
                        goldChannel = chat;
                    }
                    if (chat.Title.Equals(DollarChannelName))
                    {
                        dollarChannel = chat;
                    }
                }
                var goldMessageId   = goldChannel?.LastMessage.Id ?? 0;
                var dollarMessageId = dollarChannel?.LastMessage.Id ?? 0;
                for (var j = 0; j < 10000; j++)
                {
                    try
                    {
                        if (goldChannel != null)
                        {
                            var messages = await client.GetChatHistoryAsync(goldChannel.Id, goldMessageId, 0, 10);

                            foreach (var message in messages.Messages_)
                            {
                                goldMessageId = message.Id;
                                var messageText = "";
                                if (message.Content is TdApi.MessageContent.MessageText text)
                                {
                                    messageText = text.Text.Text;
                                }
                                var price = FindGoldPrice(messageText);
                                if (price <= 0)
                                {
                                    continue;
                                }
                                var tomorrowMeltedGold = new TomorrowMeltedGold
                                {
                                    MessageId   = message.Id,
                                    MessageText = messageText,
                                    Date        = UnixTimeStampToDateTime(message.Date),
                                    Price       = price
                                };
                                await using var goldContext = new TomorrowMeltedGoldContext(goldOptionsBuilder.Options);
                                if (goldContext.TomorrowMeltedGold.All(item =>
                                                                       item.MessageId != tomorrowMeltedGold.MessageId))
                                {
                                    goldContext.Add(tomorrowMeltedGold);
                                    await goldContext.SaveChangesAsync();
                                }
                            }
                        }

                        if (dollarChannel != null)
                        {
                            var messages =
                                await client.GetChatHistoryAsync(dollarChannel.Id, dollarMessageId, 0, 10);

                            foreach (var message in messages.Messages_)
                            {
                                dollarMessageId = message.Id;
                                var messageText = "";
                                if (message.Content is TdApi.MessageContent.MessageText text)
                                {
                                    messageText = text.Text.Text;
                                }
                                var price = FindDollarPrice(messageText);
                                if (price <= 0)
                                {
                                    continue;
                                }
                                var tomorrowHeratDollar = new TomorrowHeratDollar
                                {
                                    MessageId   = message.Id,
                                    MessageText = messageText,
                                    Date        = UnixTimeStampToDateTime(message.Date),
                                    Price       = price
                                };
                                await using var dollarContext =
                                                new TomorrowHeratDollarContext(dollarOptionsBuilder.Options);
                                if (dollarContext.TomorrowHeratDollar.All(item =>
                                                                          item.MessageId != tomorrowHeratDollar.MessageId))
                                {
                                    dollarContext.Add(tomorrowHeratDollar);
                                    await dollarContext.SaveChangesAsync();
                                }
                            }
                        }
                    }
                    catch (TdException e)
                    {
                        var error = e.Error;
                        DataReceiveHelper.Information.AppendLine("GetOldData-1-1 " + error.Message);
                    }
                    catch (Exception ex)
                    {
                        DataReceiveHelper.Information.AppendLine("GetOldData-1-2 " + ex.Message);
                    }

                    _logger.LogInformation("DataReceiver Service running at: {time}", DateTimeOffset.Now);
                    DataReceiveHelper.LoopCount++;
                    await Task.Delay(TimeSpan.FromSeconds(_random.Next(3, 7)));
                }
            }
            catch (TdException e)
            {
                var error = e.Error;
                DataReceiveHelper.Information.AppendLine("GetOldData-2-1 " + error.Message);
            }
            catch (Exception ex)
            {
                DataReceiveHelper.Information.AppendLine("GetOldData-2-2 " + ex.Message);
            }
        }