private IObservable <TdApi.Message> GetPinnedMessage( TdApi.Chat chat) { return(_agent.Execute(new TdApi.GetChatPinnedMessage { ChatId = chat.Id })); }
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) }); }
public IObservable <Avatar> LoadAvatar(TdApi.Chat chat) { return(LoadBitmap(chat.Photo?.Small) .Select(bitmap => new Avatar { Bitmap = bitmap, Color = GetColor(chat), Label = GetLabel(chat) })); }
public IObservable <TdApi.Message> SendMessage( TdApi.Chat chat, TdApi.InputMessageContent.InputMessageText messageTextContent) { return(_agent.Execute(new TdApi.SendMessage { ChatId = chat.Id, InputMessageContent = messageTextContent })); }
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) }); }
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) })); }
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) }); }
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) })); }
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; }); }
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_)); }
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)); } } }
private string GetLabel(TdApi.Chat chat) { var title = chat.Title; return(string.IsNullOrWhiteSpace(title) ? null : title.Substring(0, 1).ToUpper()); }
private Color GetColor(TdApi.Chat chat) { return(Color.Parse("#" + _colorMapper[chat.Id])); }
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); }
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); } }