Exemplo n.º 1
0
        /// <summary>
        /// Запускаем ежечасно, желательно в отдельном потоке, поставить приоритет потока на высокий, а потом выполнять параллельно.
        /// </summary>
        public void Process(object intChannelDelaySeconds)
        {
            this.RequestsDelaySeconds = (int)intChannelDelaySeconds;


            using (Db db = new Db(HelperDatabase.DB_OPTIONS))
            {
                //1) Взять из базы список всех каналов.
                List <TelegramChannel> channels = DbMethods.GetAllChannels(db);

                if (channels == null || channels.Count == 0)
                {
                    Debug.Error("Нет каналов в базе для сбора статистики!");
                    return;
                }

                //Thread.Sleep(this.RequestsDelaySeconds);
                Thread.Sleep(new Random(Convert.ToInt32(DateTime.Now.Ticks % 100000)).Next(10, 20) * 1000);

                //Запускаем цикл по каналам
                //Получить запросом канал Добавить в базу кол-во подписчиков канала на текущий час.

                foreach (var channel in channels)
                {
                    Debug.Log($"Берем статистику канала [{channel.Username}]");

                    var channelInfo = ChannelMethods.GetAllInfoChannel(GlobalVars.Client, channel.Username).Result;
                    DbMethods.AddStatisticsChannelToDb(db, channelInfo);


                    //Взять все посты у канала, через запрос.
                    var posts = ChannelMethods.GetAllPosts(GlobalVars.Client, channel.Username).Result;
                    foreach (var post in posts)
                    {
                        var p = post as TLMessage;

                        if (Equals(p, null))
                        {
                            continue;
                        }

                        //Если пост новый и еще не добавлен в базу, то добавить в базу.
                        TelegramPost telePost = DbMethods.AddTelegramPostIfNeed(db, channel, p);
                        DbMethods.AddStatisticsPostToDb(db, channel, p);
                    }

                    //Делаем задержку по времени, чтобы не банили запросы за превыщение лимита
                    //Берем данные по каналу, по его постам и делаем задержку.
                    //Thread.Sleep(this.RequestsDelaySeconds * 1000);
                    Thread.Sleep(new Random(Convert.ToInt32(DateTime.Now.Ticks % 100000)).Next(10, 20) * 1000);
                }

                Debug.Log("Сбор статистики завершен!");
            }
        }