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); } } }
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); } }