Ejemplo n.º 1
0
        public void Execute(MediaWiki wiki, string[] commandLine)
        {
            var allTemplateNames = wiki.GetAllPageNames("Template:" + TemplateName);

            var titles = wiki.GetPagesInCategory(CategoryName, TemplateNamespaceId);

            foreach (var title in titles)
            {
                var history = Revision.FromHistory(wiki.GetHistory(title, DateTimeOffset.MinValue));

                LoadUsers(wiki, history);

                var page = new ParserUtils(wiki).FindTemplates(history.First().GetText(wiki), allTemplateNames);
                foreach (var dt in page.Select(t => new DewikifyTemplate(t)).ToArray())
                {
                    if (dt.Error != null)
                    {
                        page.Update(dt.Template, string.Format("<span style='color: red'>Ошибка в шаблоне <nowiki>{0}</nowiki>: '''{1}'''</span>", dt.Template.ToString(), dt.Error));
                        continue;
                    }

                    if (dt.IsDone)
                    {
                        continue;
                    }

                    var section = GetSectionName(page, dt.Template);
                    if (section != ClosingSectionName)
                    {
                        page.Update(dt.Template, string.Format("<span style='color: red'>Шаблон <nowiki>{0}</nowiki> должен находиться в секции '''Итоги'''.</span>", dt.Template.ToString()));
                        continue;
                    }

                    var user = GetUser(wiki, dt, allTemplateNames, history);
                    if (!_powerUsers[user])
                    {
                        page.Update(dt.Template, string.Format("<span style='color: red'>Шаблон <nowiki>{0}</nowiki> установлен пользователем {{{{u|{1}}}}}, не имеющим флага ПИ/А.</span>", dt.Template.ToString(), user));
                        continue;
                    }

                    var allTitles = wiki.GetAllPageNames(dt.Title);
                    Dewikify(wiki, allTitles, dt.Title);

                    foreach (var t in allTitles.Skip(1))
                    {
                        wiki.Delete(t, string.Format("[[ВП:КБУ#П1]] [[{0}]]", dt.Title));
                    }

                    dt.IsDone = true;
                    page.Update(dt.Template, dt.Template.ToString());
                }

                if (history.First().GetText(wiki) != page.Text)
                {
                    wiki.Edit(title, page.Text, Summary);
                }
            }
        }
Ejemplo n.º 2
0
        public void Execute(MediaWiki wiki, string[] commandLine)
        {
            var date = DateTime.UtcNow;

            if (commandLine.Length == 1)
            {
                date = DateTime.Parse(commandLine[0], Utils.DateTimeFormat, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
            }

            var rfdTitle = string.Format(Utils.DateTimeFormat, RfdTitle, date);
            var history  = Revision.FromHistory(wiki.GetHistory(rfdTitle, DateTimeOffset.MinValue) ?? new MediaWiki.RevisionInfo[0]);

            var rfdPage = history.FirstOrDefault()?.GetText(wiki);

            if (rfdPage == null)
            {
                wiki.Edit(rfdTitle, "{{КУ-Навигация}}", "Создание и оформление страницы нового дня");
                return;
            }

            var links      = GetArticles(rfdPage).Distinct().ToArray();
            var categories = wiki.GetPagesCategories(links, false);

            links = links.Where(title => !categories[title].Contains(CategoryName)).ToArray();

            var ts    = DateTime.UtcNow;
            var pages = wiki.GetPages(links, false);

            wiki.BotFlag = false;

            foreach (var link in pages)
            {
                var page = link.Value;
                if (page == null)
                {
                    continue;
                }

                // skip modules for now
                if (page.Title.StartsWith("Модуль:"))
                {
                    continue;
                }

                var createdBy = history.SkipWhile(wiki, text => GetArticles(text).Contains(link.Key)).Info;
                if (createdBy.Anonymous)
                {
                    continue;
                }

                var newText = string.Format("<noinclude>{{{{К удалению|{0:yyyy-MM-dd}}}}}</noinclude>", date);
                var match   = RfdTemplateRegex.Match(page.Text);

                if (!match.Success)
                {
                    // if a page starts with a table - add newline after the template or the table will break
                    if (page.Text.StartsWith("{|"))
                    {
                        newText += "\n";
                    }

                    wiki.Edit(page.Title, newText, EditSummary, false);
                    continue;
                }

                if (match.Groups["date"].Length == 0)
                {
                    wiki.Edit(page.Title, match.Replace(page.Text, newText), EditSummary);
                    continue;
                }

                if (!RequiresNoInclude(page.Title, categories[link.Key]))
                {
                    continue;
                }

                if (IsNoIncludeOpen(page.Text, match.Index))
                {
                    continue;
                }

                wiki.Edit(page.Title, match.Replace(page.Text, "<noinclude>" + match.Value + "</noinclude>"), EditSummary, null, ts);
            }
        }