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);
        }
Exemple #2
0
        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;
                            }
                        });
                    }
                }
            }
        }
Exemple #3
0
        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");
                }
            }
        }
Exemple #4
0
        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);
                }
            }
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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
            });
        }
Exemple #7
0
        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);
            }
        }