public static async Task <IEnumerable <TLMessage> > GetChannelUnreadmessages(string channelUsername, TLDialogs dialogs) { IEnumerable <TLMessage> unreadMessages; foreach (TLDialog dialog in dialogs.Dialogs.Where(lambdaDialog => lambdaDialog.Peer is TLPeerChannel /* && lambdaDialog.UnreadCount > 0*/)) { TLPeerChannel peer = (TLPeerChannel)dialog.Peer; TLChannel channel = dialogs.Chats.OfType <TLChannel>().First(lambdaChannel => lambdaChannel.Id == peer.ChannelId); Console.WriteLine(channel.Username); if (channel.Username == channelUsername && dialog.UnreadCount > 0) { var target = new TLInputPeerChannel { ChannelId = channel.Id, AccessHash = channel.AccessHash ?? 0 }; TLChannelMessages hist = (TLChannelMessages)_client.GetHistoryAsync(target, 0, 0, 0).Result; int takecount = 25; if (dialog.UnreadCount < 25) { takecount = dialog.UnreadCount; } var hists = hist.Messages.OfType <TLMessage>().ToList(); unreadMessages = hist.Messages .Take(takecount).OfType <TLMessage>(); //MarkMessage as unread MarkMessagesasRead(channel, unreadMessages.ToList()[0]).Wait(); return(unreadMessages); } } return(null); }
private void OnPushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args) { if (args.NotificationType == PushNotificationType.Raw) { if (JsonValue.TryParse(args.RawNotification.Content, out JsonValue node)) { var notification = node.GetObject(); var data = notification.GetNamedObject("data"); if (data.ContainsKey("loc_key")) { var muted = data.GetNamedString("mute", "0") == "1"; if (muted) { return; } var custom = data.GetNamedObject("custom", null); if (custom == null) { return; } TLPeerBase peer = null; if (custom.ContainsKey("chat_id") && int.TryParse(custom.GetNamedString("chat_id"), out int chat_id)) { peer = new TLPeerChat { ChatId = chat_id }; } else if (custom.ContainsKey("channel_id") && int.TryParse(custom.GetNamedString("channel_id"), out int channel_id)) { peer = new TLPeerChannel { ChannelId = channel_id }; } else if (custom.ContainsKey("from_id") && int.TryParse(custom.GetNamedString("from_id"), out int from_id)) { peer = new TLPeerUser { UserId = from_id }; } else if (custom.ContainsKey("contact_id") && int.TryParse(custom.GetNamedString("contact_id"), out int contact_id)) { peer = new TLPeerUser { UserId = contact_id }; } if (peer == null) { return; } var service = WindowWrapper.Current().NavigationServices.GetByFrameId("Main"); if (service == null) { return; } Execute.BeginOnUIThread(() => { if (service.Frame.Content is DialogPage page && peer.Equals(service.CurrentPageParam)) { if (!page.ViewModel.IsActive || !App.IsActive || !App.IsVisible) { return; } args.Cancel = true; } }); } } } }
public async Task UnRead2() { var rnd = new Random(); while (true) { Task.Delay(rnd.Next(3000, 6000)).Wait(); var dialogs = telegramClient.GetUserDialogsAsync().Result as TLDialogs; if (dialogs == null) { Task.Delay(rnd.Next(3000, 6000)).Wait(); continue; } foreach (TLDialog dialog in dialogs.Dialogs.Where(lambdaDialog => lambdaDialog.Peer is TLPeerChannel && lambdaDialog.UnreadCount > 0)) { TLPeerChannel peer = (TLPeerChannel)dialog.Peer; TLChannel channel = dialogs.Chats.OfType <TLChannel>().First(lambdaChannel => lambdaChannel.Id == peer.ChannelId); TLInputPeerChannel target = new TLInputPeerChannel { ChannelId = channel.Id, AccessHash = channel.AccessHash ?? 0 }; Task.Delay(rnd.Next(3000, 6000)).Wait(); TLChannelMessages hist = (TLChannelMessages)telegramClient.GetHistoryAsync(target, 0, -1, dialog.UnreadCount).Result; if (hist == null) { continue; } var users = hist.Users.OfType <TLUser>().ToList(); var messages = hist.Messages.OfType <TLMessage>().ToList(); foreach (TLMessage message in messages) { TLUser sentUser = users.Single(lambdaUser => lambdaUser.Id == message.FromId); Console.WriteLine($"{channel.Title} {sentUser.FirstName} {sentUser.LastName} {sentUser.Username}: {message.Message}"); } TLInputChannel channelToMarkRead = new TLInputChannel { ChannelId = target.ChannelId, AccessHash = target.AccessHash }; var firstAbsMessage = hist.Messages[0]; int firstUnreadMessageId; if (firstAbsMessage is TLMessage) { firstUnreadMessageId = ((TLMessage)firstAbsMessage).Id; } else if (firstAbsMessage is TLMessageService) { firstUnreadMessageId = ((TLMessageService)firstAbsMessage).Id; } else { continue; } var markHistoryAsReadRequest = new TLSchema.Channels.TLRequestReadHistory { Channel = channelToMarkRead, MaxId = -1, ConfirmReceived = true, Dirty = true, MessageId = firstUnreadMessageId, Sequence = dialog.UnreadCount }; Task.Delay(rnd.Next(3000, 6000)).Wait(); telegramClient.SendRequestAsync <bool>(markHistoryAsReadRequest).Wait(); Console.WriteLine("Mark messages as read"); } } }
public override TLDialog this[long index] { get { if (TryGetValue(index, out TLDialog value)) { return(value); } Statement statement; Sqlite3.sqlite3_prepare_v2(_database, $"SELECT {_fields} FROM `Dialogs` WHERE `index` = {index}", out statement); TLDialog result = null; if (Sqlite3.sqlite3_step(statement) == SQLiteResult.Row) { var flags = (TLDialog.Flag)Sqlite3.sqlite3_column_int(statement, 0); var id = Sqlite3.sqlite3_column_int64(statement, 1); TLPeerBase peer = null; if (((ulong)id & PeerIdTypeMask) == PeerIdUserShift) { peer = new TLPeerUser { UserId = (int)(uint)((ulong)id & PeerIdMask) }; } else if (((ulong)id & PeerIdTypeMask) == PeerIdChatShift) { peer = new TLPeerChat { ChatId = (int)(uint)((ulong)id & PeerIdMask) }; } else if (((ulong)id & PeerIdTypeMask) == PeerIdChannelShift) { peer = new TLPeerChannel { ChannelId = (int)(uint)((ulong)id & PeerIdMask) }; } var top_message = Sqlite3.sqlite3_column_int(statement, 3); var read_inbox_max_id = Sqlite3.sqlite3_column_int(statement, 4); var read_outbox_max_id = Sqlite3.sqlite3_column_int(statement, 5); var unread_count = Sqlite3.sqlite3_column_int(statement, 6); TLPeerNotifySettingsBase notifySettings; var notifyType = Sqlite3.sqlite3_column_type(statement, 7); if (notifyType == 1) { notifySettings = new TLPeerNotifySettings { Flags = (TLPeerNotifySettings.Flag)Sqlite3.sqlite3_column_int(statement, 7), MuteUntil = Sqlite3.sqlite3_column_int(statement, 8), Sound = Sqlite3.sqlite3_column_text(statement, 9) }; } else { notifySettings = new TLPeerNotifySettingsEmpty(); } int?pts = null; if (flags.HasFlag(TLDialog.Flag.Pts)) { pts = Sqlite3.sqlite3_column_int(statement, 10); } //TLDraftMessageBase draft = null; //if (flags.HasFlag(TLDialog.Flag.Draft)) //{ // var draftFlags = (TLDraftMessage.Flag)Sqlite3.sqlite3_column_int(statement, 11); // int? replyToMsgId = null; // if (draftFlags.HasFlag(TLDraftMessage.Flag.ReplyToMsgId)) // { // replyToMsgId = Sqlite3.sqlite3_column_int(statement, 12); // } // var message = Sqlite3.sqlite3_column_text(statement, 13); // TLVector<TLMessageEntityBase> entities = null; // if (draftFlags.HasFlag(TLDraftMessage.Flag.Entities)) // { // entities = JsonConvert.DeserializeObject<TLVector<TLMessageEntityBase>>(Sqlite3.sqlite3_column_text(statement, 14), _settings); // } // draft = new TLDraftMessage // { // Flags = draftFlags, // ReplyToMsgId = replyToMsgId, // Message = message, // Entities = entities, // Date = Sqlite3.sqlite3_column_int(statement, 15) // }; //} var message = JsonConvert.DeserializeObject <TLMessageBase>(Sqlite3.sqlite3_column_text(statement, 14), _settings); result = new TLDialog { Flags = flags, Peer = peer, TopMessage = top_message, ReadInboxMaxId = read_inbox_max_id, ReadOutboxMaxId = read_outbox_max_id, UnreadCount = unread_count, NotifySettings = notifySettings, Pts = pts, //Draft = draft TopMessageItem = message }; base[index] = result; } Sqlite3.sqlite3_finalize(statement); return(result); } set { base[index] = value; if (value is TLDialog dialog) { Statement statement; Sqlite3.sqlite3_prepare_v2(_database, $"INSERT OR REPLACE INTO `Dialogs` ({_fields}) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", out statement); Sqlite3.sqlite3_bind_int(statement, 1, (int)dialog.Flags); if (dialog.Peer is TLPeerUser peerUser) { Sqlite3.sqlite3_bind_int64(statement, 2, (long)(PeerIdUserShift | (ulong)(uint)peerUser.UserId)); } else if (dialog.Peer is TLPeerChat peerChat) { Sqlite3.sqlite3_bind_int64(statement, 2, (long)(PeerIdChatShift | (ulong)(uint)peerChat.ChatId)); } if (dialog.Peer is TLPeerChannel peerChannel) { Sqlite3.sqlite3_bind_int64(statement, 2, (long)(PeerIdChannelShift | (ulong)(uint)peerChannel.ChannelId)); } Sqlite3.sqlite3_bind_int(statement, 3, dialog.Id); Sqlite3.sqlite3_bind_int(statement, 4, dialog.TopMessage); Sqlite3.sqlite3_bind_int(statement, 5, dialog.ReadInboxMaxId); Sqlite3.sqlite3_bind_int(statement, 6, dialog.ReadOutboxMaxId); Sqlite3.sqlite3_bind_int(statement, 7, dialog.UnreadCount); if (dialog.NotifySettings is TLPeerNotifySettings notifySettings) { Sqlite3.sqlite3_bind_int(statement, 8, (int)notifySettings.Flags); Sqlite3.sqlite3_bind_int(statement, 9, notifySettings.MuteUntil); Sqlite3.sqlite3_bind_text(statement, 10, notifySettings.Sound, -1); } else { Sqlite3.sqlite3_bind_null(statement, 8); Sqlite3.sqlite3_bind_null(statement, 9); Sqlite3.sqlite3_bind_null(statement, 10); } if (dialog.HasPts && dialog.Pts.HasValue) { Sqlite3.sqlite3_bind_int(statement, 11, dialog.Pts.Value); } else { Sqlite3.sqlite3_bind_null(statement, 11); } //if (dialog.HasDraft && dialog.Draft is TLDraftMessage draft) //{ // Sqlite3.sqlite3_bind_int(statement, 12, (int)dialog.Flags); // if (draft.HasReplyToMsgId && draft.ReplyToMsgId.HasValue) // { // Sqlite3.sqlite3_bind_int(statement, 13, draft.ReplyToMsgId.Value); // } // else // { // Sqlite3.sqlite3_bind_null(statement, 13); // } // Sqlite3.sqlite3_bind_text(statement, 14, draft.Message, -1); // if (draft.HasEntities && draft.Entities != null) // { // Sqlite3.sqlite3_bind_text(statement, 15, JsonConvert.SerializeObject(draft.Entities, _settings), -1); // } // else // { // Sqlite3.sqlite3_bind_null(statement, 15); // } // Sqlite3.sqlite3_bind_int(statement, 16, draft.Date); //} //else //{ // Sqlite3.sqlite3_bind_null(statement, 12); // Sqlite3.sqlite3_bind_null(statement, 13); // Sqlite3.sqlite3_bind_null(statement, 14); // Sqlite3.sqlite3_bind_null(statement, 15); // Sqlite3.sqlite3_bind_null(statement, 16); //} Sqlite3.sqlite3_bind_text(statement, 15, JsonConvert.SerializeObject(dialog.TopMessageItem, _settings), -1); Sqlite3.sqlite3_step(statement); Sqlite3.sqlite3_reset(statement); Sqlite3.sqlite3_finalize(statement); } } }
public void Load() { Statement statement; Sqlite3.sqlite3_prepare_v2(_database, $"SELECT {_fields} FROM `Dialogs`", out statement); while (Sqlite3.sqlite3_step(statement) == SQLiteResult.Row) { var flags = (TLDialog.Flag)Sqlite3.sqlite3_column_int(statement, 0); var id = Sqlite3.sqlite3_column_int64(statement, 1); TLPeerBase peer = null; if (((ulong)id & PeerIdTypeMask) == PeerIdUserShift) { peer = new TLPeerUser { UserId = (int)(uint)((ulong)id & PeerIdMask) }; } else if (((ulong)id & PeerIdTypeMask) == PeerIdChatShift) { peer = new TLPeerChat { ChatId = (int)(uint)((ulong)id & PeerIdMask) }; } else if (((ulong)id & PeerIdTypeMask) == PeerIdChannelShift) { peer = new TLPeerChannel { ChannelId = (int)(uint)((ulong)id & PeerIdMask) }; } var top_message = Sqlite3.sqlite3_column_int(statement, 3); var read_inbox_max_id = Sqlite3.sqlite3_column_int(statement, 4); var read_outbox_max_id = Sqlite3.sqlite3_column_int(statement, 5); var unread_count = Sqlite3.sqlite3_column_int(statement, 6); TLPeerNotifySettingsBase notifySettings; var notifyType = Sqlite3.sqlite3_column_type(statement, 7); if (notifyType == 1) { notifySettings = new TLPeerNotifySettings { Flags = (TLPeerNotifySettings.Flag)Sqlite3.sqlite3_column_int(statement, 7), MuteUntil = Sqlite3.sqlite3_column_int(statement, 8), Sound = Sqlite3.sqlite3_column_text(statement, 9) }; } else { notifySettings = new TLPeerNotifySettingsEmpty(); } int?pts = null; if (flags.HasFlag(TLDialog.Flag.Pts)) { pts = Sqlite3.sqlite3_column_int(statement, 10); } //TLDraftMessageBase draft = null; //if (flags.HasFlag(TLDialog.Flag.Draft)) //{ // var draftFlags = (TLDraftMessage.Flag)Sqlite3.sqlite3_column_int(statement, 11); // int? replyToMsgId = null; // if (draftFlags.HasFlag(TLDraftMessage.Flag.ReplyToMsgId)) // { // replyToMsgId = Sqlite3.sqlite3_column_int(statement, 12); // } // var message = Sqlite3.sqlite3_column_text(statement, 13); // TLVector<TLMessageEntityBase> entities = null; // if (draftFlags.HasFlag(TLDraftMessage.Flag.Entities)) // { // entities = JsonConvert.DeserializeObject<TLVector<TLMessageEntityBase>>(Sqlite3.sqlite3_column_text(statement, 14), _settings); // } // draft = new TLDraftMessage // { // Flags = draftFlags, // ReplyToMsgId = replyToMsgId, // Message = message, // Entities = entities, // Date = Sqlite3.sqlite3_column_int(statement, 15) // }; //} var message = JsonConvert.DeserializeObject <TLMessageBase>(Sqlite3.sqlite3_column_text(statement, 14), _settings); var result = new TLDialog { Flags = flags, Peer = peer, TopMessage = top_message, ReadInboxMaxId = read_inbox_max_id, ReadOutboxMaxId = read_outbox_max_id, UnreadCount = unread_count, NotifySettings = notifySettings, Pts = pts, //Draft = draft TopMessageItem = message }; base[result.Id] = result; } Sqlite3.sqlite3_finalize(statement); }
private TLDialog GetItemFromStatement(ref Statement statement) { var flags = (TLDialog.Flag)Sqlite3.sqlite3_column_int(statement, 0); var id = Sqlite3.sqlite3_column_int64(statement, 1); TLPeerBase peer = null; if (((ulong)id & PeerIdTypeMask) == PeerIdUserShift) { peer = new TLPeerUser { UserId = (int)(uint)((ulong)id & PeerIdMask) }; } else if (((ulong)id & PeerIdTypeMask) == PeerIdChatShift) { peer = new TLPeerChat { ChatId = (int)(uint)((ulong)id & PeerIdMask) }; } else if (((ulong)id & PeerIdTypeMask) == PeerIdChannelShift) { peer = new TLPeerChannel { ChannelId = (int)(uint)((ulong)id & PeerIdMask) }; } var top_message = Sqlite3.sqlite3_column_int(statement, 3); var read_inbox_max_id = Sqlite3.sqlite3_column_int(statement, 4); var read_outbox_max_id = Sqlite3.sqlite3_column_int(statement, 5); var unread_count = Sqlite3.sqlite3_column_int(statement, 6); TLPeerNotifySettingsBase notifySettings; var notifyType = Sqlite3.sqlite3_column_type(statement, 7); if (notifyType == 1) { notifySettings = new TLPeerNotifySettings { Flags = (TLPeerNotifySettings.Flag)Sqlite3.sqlite3_column_int(statement, 7), MuteUntil = Sqlite3.sqlite3_column_int(statement, 8), Sound = Sqlite3.sqlite3_column_text(statement, 9) }; } else { notifySettings = new TLPeerNotifySettingsEmpty(); } int?pts = null; if (flags.HasFlag(TLDialog.Flag.Pts)) { pts = Sqlite3.sqlite3_column_int(statement, 10); } TLDraftMessageBase draft = null; if (flags.HasFlag(TLDialog.Flag.Draft)) { var draftFlags = (TLDraftMessage.Flag)Sqlite3.sqlite3_column_int(statement, 11); int?replyToMsgId = null; if (draftFlags.HasFlag(TLDraftMessage.Flag.ReplyToMsgId)) { replyToMsgId = Sqlite3.sqlite3_column_int(statement, 12); } var message = Sqlite3.sqlite3_column_text(statement, 13); TLVector <TLMessageEntityBase> entities = null; if (draftFlags.HasFlag(TLDraftMessage.Flag.Entities)) { entities = JsonConvert.DeserializeObject <TLVector <TLMessageEntityBase> >(Sqlite3.sqlite3_column_text(statement, 14), _settings); } draft = new TLDraftMessage { Flags = draftFlags, ReplyToMsgId = replyToMsgId, Message = message, Entities = entities, Date = Sqlite3.sqlite3_column_int(statement, 15) }; } return(new TLDialog { Flags = flags, Peer = peer, TopMessage = top_message, ReadInboxMaxId = read_inbox_max_id, ReadOutboxMaxId = read_outbox_max_id, UnreadCount = unread_count, NotifySettings = notifySettings, Pts = pts, Draft = draft }); }
public static async Task UpdateCatched(Update update) { try { foreach (TLAbsMessage chnnelMessages in update.ChannelMessages) { switch (chnnelMessages) { case TLMessage newChannelMessage: { if (newChannelMessage.Out) { return; } TLPeerChannel chnl = (TLPeerChannel)newChannelMessage.ToId; TLChannel chat = update.Chats.Cast <TLChannel>() .FirstOrDefault(x => x.Id == chnl.ChannelId); TLUser sender = update.Users.Cast <TLUser>() .FirstOrDefault(x => x.Id == newChannelMessage.FromId); await Program.MessageHandler(new Message { TLChannel = chat, TLMessage = newChannelMessage, TLUser = sender }).ConfigureAwait(false); break; } case TLMessageService messageService: { if (messageService.Action is TLMessageActionChatAddUser) { TLPeerChannel chnl = (TLPeerChannel)messageService.ToId; TLChannel chat = update.Chats.Cast <TLChannel>() .FirstOrDefault(x => x.Id == chnl.ChannelId); TLUser sender = update.Users.Cast <TLUser>() .FirstOrDefault(x => x.Id == messageService.FromId); await Program.MessageHandler(new Message { TLChannel = chat, TLMessageService = messageService, TLUser = sender }).ConfigureAwait(false); } break; } default: break; } await Task.Delay(500); } foreach (TLAbsMessage item in update.Messages) { if (item is TLMessage message) { TLUser sender = update.Users.Cast <TLUser>() .FirstOrDefault(x => x.Id == message.FromId); await Program.MessageHandler(new Message { TLMessage = message, TLUser = sender }).ConfigureAwait(false); } } } catch (Exception ex) { Console.WriteLine(ex); } }