예제 #1
0
        public async Task <ActionResult> Edit([Bind(Include = "PostGroupID,ParentId,PostGroupTitle,ImageUrl")] PostGroup postGroup, HttpPostedFileBase ImageUrl)
        {
            if (ModelState.IsValid)
            {
                if (ImageUrl != null)
                {
                    var    fileName    = Path.GetFileName(ImageUrl.FileName);
                    string newFilename = Guid.NewGuid().ToString()
                                         .Replace("-", string.Empty) +
                                         Path.GetExtension(fileName);
                    newFilename = "/Uploads/PostGroups/" + newFilename;
                    var physicalPath = Server.MapPath(newFilename);
                    ImageUrl.SaveAs(physicalPath);
                    if (System.IO.File.Exists(Server.MapPath("~/" + postGroup.ImageUrl)))
                    {
                        System.IO.File.Delete(Server.MapPath("~/" + postGroup.ImageUrl));
                    }
                    postGroup.ImageUrl = newFilename;
                }
                db.Entry(postGroup).State = EntityState.Modified;
                await db.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }
            ViewBag.ParentId = new SelectList(db.PostGroups, "PostGroupID", "PostGroupTitle", postGroup.ParentId);
            return(View(postGroup));
        }
예제 #2
0
        public async Task <ActionResult <Group> > PostGroup(PostGroup data)
        {
            var user = await _userManager.GetCurrentUserAsync(HttpContext);

            var group = new Group()
            {
                Name        = data.Name,
                IsPrivate   = data.IsPrivate,
                IsProtected = data.IsProtected,
                DateCreated = DateTime.UtcNow
            };

            var groupUser = new GroupUser()
            {
                GroupId     = group.Id,
                UserId      = user.Id,
                DateCreated = DateTime.UtcNow,
                DateActive  = DateTime.UtcNow
            };

            _context.Groups.Add(group);
            _context.GroupUsers.Add(groupUser);
            await _context.SaveChangesAsync();

            return(CreatedAtAction("GetGroup", new { id = group.Id }, group));
        }
예제 #3
0
        public async Task <ActionResult> DeleteConfirmed(int id)
        {
            PostGroup postGroup = await db.PostGroups.FindAsync(id);

            db.PostGroups.Remove(postGroup);
            await db.SaveChangesAsync();

            return(RedirectToAction("Index"));
        }
예제 #4
0
 public JsonPostGroup(PostGroup group)
 {
     // Set...
     if (group != null)
     {
         Id      = group.Id;
         PostId  = group.Post?.Id ?? 0;
         GroupId = group.GroupId;
     }
 }
예제 #5
0
        // GET: AdminPostGroups/Details/5
        public async Task <ActionResult> Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            PostGroup postGroup = await db.PostGroups.FindAsync(id);

            if (postGroup == null)
            {
                return(HttpNotFound());
            }
            return(View(postGroup));
        }
예제 #6
0
        // GET: AdminPostGroups/Edit/5
        public async Task <ActionResult> Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            PostGroup postGroup = await db.PostGroups.FindAsync(id);

            if (postGroup == null)
            {
                return(HttpNotFound());
            }
            ViewBag.ParentId = new SelectList(db.PostGroups, "PostGroupID", "PostGroupTitle", postGroup.ParentId);
            return(View(postGroup));
        }
예제 #7
0
        public async void LoadPosts()
        {
            Posts.Clear();

            var posts = await _repo.GetPosts(App.CurrentUser.Id);

            var dates = posts.Select(x => x.PostAdded).Distinct().ToList();

            foreach (var date in dates)
            {
                var postsByDate = posts.Where(x => x.PostAdded == date).ToList();

                var postGroup = new PostGroup(date, postsByDate);
                Posts.Insert(0, postGroup);
            }
        }
예제 #8
0
 private void home_deawer()
 {
     // change the layout to the main app
     Status.Invoke((MethodInvoker) delegate
     {
         Status.Visible = false;
     });
     logo.Invoke((MethodInvoker) delegate
     {
         logo.Visible = true;
     });
     PostGroup.Invoke((MethodInvoker) delegate
     {
         PostGroup.Visible = true;
     });
     Controle.Invoke((MethodInvoker) delegate
     {
         Controle.Visible = true;
     });
 }
예제 #9
0
        static void Main(string[] args)
        {
            Console.WriteLine("Google Analytics Reports and ADSense revenue analyser");

            try
            {
                DateTime now     = DateTime.Now;
                int      lastDay = DateTime.DaysInMonth(now.Year, now.Month);

                DateTime startDate = new DateTime(now.Year, now.Month, 01);
                DateTime endDate   = new DateTime(now.Year, now.Month, lastDay);

                Console.WriteLine("Report from {0} to {1}", startDate, endDate);

                string gaViewID = "142868091";                  //View ID in Google Analytics

                string jsonAPIFile = Environment.GetEnvironmentVariable(ENV_VAR_JSON_SECRET_FILE);
                if (string.IsNullOrEmpty(jsonAPIFile))
                {
                    Console.WriteLine("Environment variable not found:" + ENV_VAR_JSON_SECRET_FILE);
                }

                UriBuilder uri       = new UriBuilder(Assembly.GetExecutingAssembly().CodeBase);
                string     startPath = Path.GetDirectoryName(Uri.UnescapeDataString(uri.Path));

                string jsonAPIAuth = Path.Combine(startPath, jsonAPIFile);

                UserCredential credential;

                using (var stream = new FileStream(jsonAPIAuth, FileMode.Open, FileAccess.Read))
                {
                    //в этой подпапке будут сохраняться "подтвержденные" данные авторизации. До тех пор, пока эта вещь живая, спрашивать в браузере не будут
                    //А вот если ее удалить, то запустят браузер и спросят подтверждение через gmail
                    string credPath = Path.Combine(startPath, "creds.json");

                    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.Load(stream).Secrets,
                        _SCOPES,
                        "user",
                        CancellationToken.None,
                        new FileDataStore(credPath, true)).Result;
                }

                var init = new BaseClientService.Initializer
                {
                    ApplicationName       = "kawaiimobile-ga2",
                    HttpClientInitializer = credential
                };

                //https://developers.google.com/analytics/devguides/reporting/core/v4/samples?hl=ru#c

                var service = new Google.Apis.AnalyticsReporting.v4.AnalyticsReportingService(init);

                bool buildRevenueReport = true;
                bool buildPagesReport   = true;

                //URL => сведения о показах и доходе с него
                Dictionary <string, RevenueReportRow> urlToRevenueRow = new Dictionary <string, RevenueReportRow>();

                if (buildRevenueReport)
                {
                    var publisherRevenueReport = new PublisherRevenueReportBuilder(service, gaViewID);
                    var revenueReport          = publisherRevenueReport.Build(startDate, endDate);

                    var reportRows = revenueReport.Rows;

                    if (reportRows != null)
                    {
                        Dictionary <string, PostGroup> urlToRows = new Dictionary <string, PostGroup>();

                        foreach (var item in reportRows)
                        {
                            urlToRevenueRow[item.URL] = item;

                            if (!urlToRows.TryGetValue(item.MainPostURL, out PostGroup postGroup))
                            {
                                postGroup = new PostGroup(item.MainPostURL);
                                urlToRows[item.MainPostURL] = postGroup;
                            }

                            postGroup.Add(item);
                        }

                        //теперь сгруппируем по доходу

                        var ord = (from x in urlToRows orderby x.Value.TotalRevenue descending select x.Value).ToArray();

                        string reportFileName = Path.Combine(startPath, "Revenue report full.txt");
                        _SaveRevenueReport(reportFileName, ord, revenueReport.TotalRevenue, false);

                        //и еще краткий отчет - где исключено все, что мало смысленно
                        string reportFileNameOpt = Path.Combine(startPath, "Revenue report optimized.txt");
                        _SaveRevenueReport(reportFileNameOpt, ord, revenueReport.TotalRevenue, true);
                    }

                    Console.WriteLine("ADSense revenue report done...");
                }

                if (buildPagesReport)
                {
                    var pagesReportBuilder = new PagesReport.VisitedPagesReportBuilder(service, gaViewID);
                    var pagesReport        = pagesReportBuilder.Build(startDate, endDate);

                    var pagesReportRows = pagesReport.Rows;

                    string reportPagesFileName = Path.Combine(startPath, "Pages report.txt");

                    _SavePagesReport(reportPagesFileName, pagesReportRows);

                    Console.WriteLine("Visited pages report done...");

                    //теперь можно найти все страницы с более-менее приличной посещаемостью, но без показов ADSense - это значит у них "проблемы"
                    int minViews = 10;                      //это минимальный порог просмотров для анализа

                    string badPagesFileReport = Path.Combine(startPath, "Failed pages report.txt");

                    using (var failedLog = File.CreateText(badPagesFileReport))
                    {
                        foreach (var row in pagesReportRows)
                        {
                            int views = row.PageViews;
                            if (views < minViews)
                            {
                                continue;
                            }

                            //смотрим по этому же урлу статус отчета ADSense - показов должно быть больше 0. Если 0 - это страница под "баном"
                            string url = row.URL;

                            //в корне сайта нет баннеров
                            if (url == "/")
                            {
                                continue;
                            }

                            //баннеров нет на страницах (1-2-3...) , на тегах, категориях, библиотеке и архиве
                            if (url.StartsWith("/page/") || url.StartsWith("/tag/") || url.StartsWith("/category/") || url.StartsWith("/library/") || url.StartsWith("/anime-by-genres/") || url.StartsWith("/archives/") || url.StartsWith("/?source=pwa") || url.StartsWith("/?s="))
                            {
                                continue;
                            }

                            string adsViews = "NO ADS";
                            if (urlToRevenueRow.TryGetValue(url, out RevenueReportRow foundRev))
                            {
                                if (foundRev.Impressions > 0)
                                {
                                    //показы были, но может это единичные вещи - а посещаемость страницы весьма неплохая?
                                    //какой процент показов ?
                                    float percent      = views / 100;
                                    float viewsPercent = foundRev.Impressions / percent;

                                    if (viewsPercent > 35)                                      //35% от общего числа просмотров страницы считаем плохим показателем
                                    {
                                        continue;
                                    }

                                    adsViews = $"Impressions: {foundRev.Impressions}   Revenue: {foundRev.Revenue}";
                                }
                            }

                            failedLog.WriteLine($"{url} - Page views: {row.PageViews} - {adsViews}");
                        }
                    }                    //using failedLog
                }



                Console.WriteLine("Done");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }