public static string GetSubscribersStatistics(Db db, TelegramChannel channel)
        {
            List <StatisticsChannel> statChanList =
                (from s in db.StatisticsChannels
                 where s.TelegramId == channel.TelegramId
                 select s)?.ToList() ?? new List <StatisticsChannel>();

            if (statChanList.Count == 0)
            {
                return("Нет данных!");
            }

            string res = $"Представлены данные на {statChanList.Last().CreateTime}\n\n" +
                         $"Cтатистика подписок на канал:\n";

            res += $"|Дата                     |Подписки\n";

            for (var i = 0; i < statChanList.Count; i++)
            {
                var stat = statChanList[i];

                int    subChange = i > 0 ? stat.SubscribersCount - statChanList[i - 1].SubscribersCount : stat.SubscribersCount;
                string change    = subChange > -1 ? $"+{subChange}" : subChange.ToString();
                res += $"|{stat.CreateTime.ToString(),-25}|{change}\n";
            }

            return(res);
        }
Beispiel #2
0
        /// <summary>
        /// Добавить сущность TelegramPost в базу без проверки на наличие.
        /// </summary>
        /// <param name="db"></param>
        /// <param name="channel"></param>
        /// <param name="post"></param>
        /// <returns></returns>
        public static TelegramPost AddTelegramPostToDb(Db db, TelegramChannel channel, TLMessage post)
        {
            //Добавить в базу сущность TelegramPost
            TelegramPost newPost = new TelegramPost()
            {
                ChannelTelegramId = channel.TelegramId,
                ChannelUsername   = channel.Username,
                TelegramId        = post.Id,
                WriteTime         = Const.StartDate.AddSeconds(post.Date),

                Content = post.Message ?? (post?.Media as TLMessageMediaPhoto)?.Caption ?? null,
            };

            if (post?.EditDate != null)
            {
                newPost.EditTime = Const.StartDate.AddSeconds((long)post.EditDate);
            }
            else
            {
                newPost.EditTime = Const.StartDate.AddSeconds((long)post.Date);
            }

            db.TelegramPosts.Add(newPost);
            db.SaveChanges();
            return(newPost);
        }
        public async Task <IActionResult> Edit(int id, [Bind("ChannelId,IntervalMins")] TelegramChannel telegramChannel)
        {
            if (id != telegramChannel.ChannelId)
            {
                return(NotFound());
            }


            try
            {
                var channel = _context.Channels.Where(c => c.ChannelId == telegramChannel.ChannelId).FirstOrDefault();



                _context.Update(channel);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!TelegramChannelExists(telegramChannel.ChannelId))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }
            return(RedirectToAction(nameof(Edit), new { id = telegramChannel.ChannelId }));
        }
Beispiel #4
0
        /// <summary>
        /// Обработка команды ShowStat
        /// </summary>
        /// <param name="command"></param>
        private void CommandShowStat(Command command)
        {
            string channelName = command.GetParam("name");

            if (string.IsNullOrWhiteSpace(channelName))
            {
                Debug.Error("Введите параметр [username=ChannelName]!");
                return;
            }

            using (Db db = new Db(HelperDatabase.DB_OPTIONS))
            {
                TelegramChannel channel = DbMethods.GetChannelFromDb(db, channelName);

                if (channel == null)
                {
                    Debug.Error($"В базе данных нет канала [{channelName}]");
                    return;
                }


                //Получить статистику по подписчикам
                string subsStat = DbMethods.GetSubscribersStatistics(db, channel);
                string postStat = DbMethods.GetViewsStatistics(db, channel);
                Debug.Log($"\n{subsStat}\n\n{postStat}\n");
            }
        }
Beispiel #5
0
        /// <summary>
        /// Добавить сущность TelegramChannel (проверка на наличие в базе)
        /// </summary>
        /// <param name="db"></param>
        /// <param name="channel"></param>
        /// <returns></returns>
        public static TelegramChannel AddTelegramChannelIfNeed(Db db, Channel channel)
        {
            TelegramChannel chan = GetTelegramChannelByTelegramId(db, channel.IdChannel);

            if (Equals(chan, null))
            {
                return(AddTelegramChannelToDb(db, channel));
            }

            return(chan);
        }
Beispiel #6
0
        /// <summary>
        /// Добавить сущность TelegramPost (Проверка на наличие в базе)
        /// </summary>
        /// <param name="db"></param>
        /// <param name="channel"></param>
        /// <param name="post"></param>
        /// <returns></returns>
        public static TelegramPost AddTelegramPostIfNeed(Db db, TelegramChannel channel, TLMessage post)
        {
            var p = GetTelegramPostByTelegramId(db, channel.TelegramId, post.Id);

            if (Equals(p, null))
            {
                return(AddTelegramPostToDb(db, channel, post));
            }

            return(p);
        }
Beispiel #7
0
        /// <summary>
        /// Добавить сущность StatisticsPost в базу данных
        /// </summary>
        /// <param name="db"></param>
        /// <param name="channel"></param>
        /// <param name="post"></param>
        public static void AddStatisticsPostToDb(Db db, TelegramChannel channel, TLMessage post)
        {
            StatisticsPost postStat = new StatisticsPost()
            {
                TelegramId        = post.Id,
                ChannelUsername   = channel.Username,
                ViewCount         = post.Views ?? 0,
                ChannelTelegramId = channel.TelegramId,
            };

            db.StatisticsPosts.Add(postStat);
            db.SaveChanges();
        }
Beispiel #8
0
        /// <summary>
        /// Добавить сущность TelegramChannel без проверки на наличие
        /// </summary>
        /// <param name="db"></param>
        /// <param name="channel"></param>
        /// <returns></returns>
        public static TelegramChannel AddTelegramChannelToDb(Db db, Channel channel)
        {
            TelegramChannel newChannel = new TelegramChannel()
            {
                Description = channel.Description,
                Status      = Const.TELEGRAM_CHANNEL_STATUS_ACTIVE,
                TelegramId  = channel.IdChannel,
                Username    = channel.ChannelName,
            };

            db.TelegramChannels.Add(newChannel);
            db.SaveChanges();
            return(newChannel);
        }
Beispiel #9
0
        private static void LaunchOscovaBot()
        {
            var telegramChannel = new TelegramChannel <OscovaBot>(TelegramAccessToken, new OscovaBot());

            telegramChannel.Bot.Dialogs.Add(new HelloBotDialog());
            telegramChannel.Bot.Trainer.StartTraining();
            telegramChannel.Client.StartReceiving();
            OscovaBot.Logger.LogReceived += (sender, args) =>
            {
                Console.WriteLine(args);
            };
            Console.WriteLine("OSCOVA Bot is now Online.");
            Console.WriteLine("Type \"Hello Bot\" in your Telegram client to check response.");
            Console.ReadLine();
            telegramChannel.Client.StopReceiving();
        }
Beispiel #10
0
        private static void LaunchSimlBot()
        {
            var          telegramChannel = new TelegramChannel <SimlBot>(TelegramAccessToken, new SimlBot());
            const string kbFilePath      = "SimlKB.simlpk";

            telegramChannel.Bot.PackageManager.LoadFromString(File.ReadAllText(kbFilePath));

            telegramChannel.Client.StartReceiving();
            SimlBot.Logger.LogReceived += (sender, args) =>
            {
                Console.WriteLine(args);
            };
            Console.WriteLine("SIML Bot is now Online.");
            Console.ReadLine();
            telegramChannel.Client.StopReceiving();
        }
        public async Task <IActionResult> Create([Bind("ChannelId,ChannelUserName,HasContainFilter,IntervalMins")] TelegramChannel telegramChannel)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    TelegramCollector.mustwait      = true;
                    TelegramCollector.mustwaittilme = 15000;
                    Thread.Sleep(5000);
                    var channel = TelegramClientManager.GetTChannelbyUsername(telegramChannel.ChannelUserName);
                    if (channel == null)
                    {
                        return(RedirectToAction(nameof(Index)));
                    }
                    Thread.Sleep(8000);
                    NewsConcentratorSystem.NewsScraper.TelegramClientManager
                    .JoinChannel(telegramChannel.ChannelUserName)
                    .Wait();
                    //Insert Entity in DB
                    telegramChannel.ChannelChatID   = channel.Id.ToString();
                    telegramChannel.AccessHash      = channel.AccessHash.ToString();
                    telegramChannel.ChannelUserName = channel.Username;
                    telegramChannel.ChannelTitle    = channel.Title;
                    _context.Add(telegramChannel);
                    await _context.SaveChangesAsync();

                    return(RedirectToAction(nameof(Index)));
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    return(NotFound());
                }
            }
            return(View(telegramChannel));
        }
        public static string GetViewsStatistics(Db db, TelegramChannel channel)
        {
            string res = null;

            StatisticsChannel lastChannelStat =
                (from c in db.StatisticsChannels
                 where c.TelegramId == channel.TelegramId
                 select c)?.ToList().LastOrDefault() ?? null;

            if (lastChannelStat == null)
            {
                return("Нет статистики по каналу");
            }

            List <TelegramPost> postList =
                (from p in db.TelegramPosts
                 where p.ChannelTelegramId == channel.TelegramId
                 select p)?.ToList() ?? new List <TelegramPost>();

            List <StatisticsPost> postStatList =
                (from s in db.StatisticsPosts
                 where s.ChannelTelegramId == channel.TelegramId
                 select s)?.ToList() ?? new List <StatisticsPost>();


            if (postList.Count == 0 || postStatList.Count == 0)
            {
                return("Нет статистики о постах!");
            }

            Dictionary <long, TelegramPost> allPosts = new Dictionary <long, TelegramPost>();

            foreach (var item in postList)
            {
                allPosts.Add(item.TelegramId, item);
            }

            Dictionary <long, StatisticsPost> lastStat = new Dictionary <long, StatisticsPost>();

            foreach (var item in postStatList)
            {
                if (lastStat.ContainsKey(item.TelegramId))
                {
                    lastStat[item.TelegramId] = item;
                }
                else
                {
                    lastStat.Add(item.TelegramId, item);
                }
            }

            long averagePostViewAllTime = GetAveragePostViewOnLastDays(lastStat, allPosts);
            long averagePostView30      = GetAveragePostViewOnLastDays(lastStat, allPosts, 30);
            long averagePostView7       = GetAveragePostViewOnLastDays(lastStat, allPosts, 7);
            long averagePostView3       = GetAveragePostViewOnLastDays(lastStat, allPosts, 3);


            res += $"Статистика постов:\n\n" +
                   $"В базе есть статистика по последним {postList.Count} постам\n\n" +
                   $"Среднее количество просмотров на каждый пост за последние:\n" +
                   $"По всем данным : {averagePostViewAllTime} просмотр/пост.\n" +
                   $"        30 дн. : {averagePostView30} просмотр/пост.\n" +
                   $"         7 дн. : {averagePostView7} просмотр/пост.\n" +
                   $"         3 дн. : {averagePostView3} просмотр/пост.\n\n" +
                   $"    На данный момент ER (за 30 дн.) = {((float)averagePostView30 / (float) lastChannelStat.SubscribersCount) * 100}%";

            return(res);
        }
Beispiel #13
0
        private static void Main()
        {
            try
            {
                OscovaBot.Logger.LogLevelThreshold = LogLevel.Info;

                var telegramChannel = new TelegramChannel <OscovaBot>("TELEGRAM_BOT_TOKEN", OscovaBot.Instance);
                WebApiChannel = new WebApiChannel <OscovaBot>(OscovaBot.Instance, "HOST_ADDRESS");

                Action <LogReceivedEventArgs> logAction = receivedEventArgs =>
                {
                    File.AppendAllText(LogFilePath, receivedEventArgs.Log.ToString() + Environment.NewLine);
                    Console.WriteLine(receivedEventArgs.Log);
                };

                Logger.LogReceived += (sender, receivedEventArgs) =>
                {
                    logAction.Invoke(receivedEventArgs);
                };

                telegramChannel.Logger.LogReceived += (sender, args) =>
                {
                    logAction.Invoke(args);
                };

                WebApiChannel.Logger.LogReceived += (sender, args) =>
                {
                    logAction.Invoke(args);
                };


                LogEvent("Start Saga Bot");
                Logger.Info("Initializing Saga Bot...");

                Bot.Configuration.RequiredRecognizersOnly = true;
                Bot.Configuration.RemoveContextOnFallback = false;
                Bot.Configuration.ContextLifespan         = 1;
                Bot.Configuration.Scoring.MinimumScore    = 0.4;

                Bot.Users.UserAdded += (sender, userAddedEventArgs) =>
                {
                    LogEvent($"USER {userAddedEventArgs.User.ID}");
                };

                EntitiesCreator.Initialize();
                DialogCreator.Initialize();

                //Load Word Vectors
                //Logger.Info("Loading word vectors...");
                //Saga.Language.WordVectors.Load(@"D:\Word Vectors\FastText\wiki-en.vec", VectorDataFormat.Text);
                //Saga.Language.WordVectors.Load(@"D:\pizzabot-wordvectors.vec", VectorDataFormat.Text);

                Bot.Language.WordVectors.Logger.LogReceived += (sender, logReceivedEventArgs) =>
                {
                    Logger.Log(logReceivedEventArgs.Log);
                };

                Bot.Trainer.StartTraining();

                //Save optimized Word Vectors
                //var optimizedWordVector = Bot.Language.WordVectors.Optimize(Saga);
                //optimizedWordVector.Save(@"/*D:\pizzabot-wordvectors.vec*/", VectorDataFormat.Text);
                //Logger.Info("Saved optimized Word Vectors.");

                telegramChannel.Start();
                WebApiChannel.Start();

                Console.WriteLine("Press any key to stop Saga bot server.");
                Console.ReadLine();

                telegramChannel.Stop();
                Logger.Info("Telegram channel stopped.");

                WebApiChannel.Stop();
                Logger.Info("Web API channel stopped.");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                Console.ReadLine();
            }
        }