static void Main(string[] args) { bool forceSave = false; Console.WriteLine("Wikipédia cikkértékelés v{0}, készítette: Tar Dániel, 2008-2010", GetVersion()); Console.WriteLine("================================================"); // Autentikációs adatok beolvasása var loginDataPath = Path.Combine(Path.GetDirectoryName(typeof(Program).Assembly.Location), "Cache", "Defaults.dat"); string[] loginContents = null; try { loginContents = File.ReadAllText(loginDataPath) .Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); } catch (Exception ex) { Console.WriteLine("Nem sikerült beolvasni a bejelentkezési adatokat."); } if (loginContents == null || loginContents.Length < 3) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Hiba: hiányzik a Cache/Defaults.dat fájl"); Console.ReadKey(); return; } if (loginContents[0].StartsWith("https://") == false) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Hiba: a Cache/Defaults.dat fájlban a wikipédia elérési útja nem HTTPS-sel kezdődik\n (pl. https://hu.wikipedia.org/ )"); Console.ReadKey(); return; } // Inicializáció try { huwiki = new Site(loginContents[0], loginContents[1], loginContents[2]); Console.WriteLine("Sikeresen bejelentkeztél " + huwiki.userName + " néven."); } catch (WebException) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Valami probléma van az internetkapcsolatoddal. A bot működése nem folytatható"); Console.ReadKey(); Environment.Exit(0); } catch (WikiBotException e) { Console.WriteLine("Hiba lépett fel: " + e.Message + " A bot működése nem folytatható."); Console.ReadKey(); Environment.Exit(0); } try { bool programEnabled = false; updateList = new List <string>(); categories = new Dictionary <string, AssessmentCategoryInfo>(); allCounter = new int[QualityCategories.Count, ImportanceCategories.Count]; artCounter = new Dictionary <string, int>(); // Botjogok feldolgozása GetBotFlags(ref programEnabled); if ((updateList.Contains("*") || updateList.Contains("initCat")) && args.Length > 0 && args[0].StartsWith("-init:")) { string[] quals = { "Besorolatlan", "Születő besorolású", "Vázlatos besorolású", "Bővítendő besorolású", "Jól használható besorolású", "Teljes besorolású", "Színvonalas besorolású", "Kitüntetett besorolású" }; string[] imps = { "Kevéssé fontos", "Közepesen fontos", "Nagyon fontos", "Nélkülözhetetlen" }; string xCat = args[0].Substring(6); Console.WriteLine(xCat + " szócikkek kategóriáinak létrehozása..."); Page xMainCat = new Page(huwiki, "Kategória:" + xCat + " szócikkek minőség szerint"); xMainCat.SaveWithRetries("[[Kategória:Wikipédia-cikkértékelés]]", "Bot: Cikkértékelési kategória létrehozása", true); Page xImpCat = new Page(huwiki, "Kategória:" + xCat + " szócikkek fontosság szerint"); xImpCat.SaveWithRetries("[[Kategória:Wikipédia-cikkértékelés]]", "Bot: Cikkértékelési kategória létrehozása", true); for (int i = 0; i < 8; i++) { Page xQualSubCat = new Page(huwiki, "Kategória:" + quals[i] + " " + xCat + " szócikkek"); xQualSubCat.SaveWithRetries("[[Kategória:" + xCat + " szócikkek minőség szerint|" + i.ToString() + "]]", "Bot: Cikkértékelési kategória létrehozása", true); } for (int i = 1; i <= 4; i++) { Page xImpSubCat = new Page(huwiki, "Kategória:" + imps[i - 1] + " " + xCat + " szócikkek"); xImpSubCat.SaveWithRetries("[[Kategória:" + xCat + " szócikkek fontosság szerint|" + i.ToString() + "]]", "Bot: Cikkértékelési kategória létrehozása", true); } Page dataPage = new Page("Wikipédia:Cikkértékelési műhely/" + xCat.ToUpperFirst() + " szócikkek/Beállítások"); dataPage.SaveWithRetries(@"{{#switch:{{{1}}} | ikon = Antialias Icon.svg | műhely = | portál = | nagybetűs = <!-- E FÖLÉ ÍRD AZ ADATOKAT, ALATTA NE MÓDOSÍTS --> | {{{1}}} = {{Cikkértékelés/Beállítások}} }}", "Bot: Cikkértékelési kategória létrehozása", true); updateList = new List <string>() { xCat.ToUpperFirst() }; //Console.ReadKey(); //return; } else if (args.Length > 0 && args[0].StartsWith("-init:")) { Console.WriteLine("Nincs jogod kategóriákat létrehozni."); Console.ReadKey(); return; } else if (args.Length > 0 && args[0] == "-forcesave") { forceSave = true; } // Cikkértékelési kategóriák betöltése LoadCategories(); // Botadatok betöltése, következő mentés előkészítése XmlDocument savedBotData = new XmlDocument(); XmlDocument botData = new XmlDocument(); XmlElement botDRoot = botData.CreateElement("Cikkértékelés"); if (!updateList.Contains("*")) { Console.WriteLine("Korábban elmentett adatok betöltése..."); string bf = WebHelpers.GetUrlContent("https://hu.wikipedia.org/w/index.php?title=Wikip%E9dia:Cikk%E9rt%E9kel%E9si_m%FBhely/Botadatok&action=raw&ctype=text/x-wiki"); savedBotData.LoadXml(bf); } foreach (string key in categories.Keys) { // Megnézzük, hogy a botnak van-e jogosultsága frissíteni a témakört. // Ha nem, akkor az előző bot által mentett adatokat használjuk fel (ha vannak, és nem új a témakör) if (!updateList.Contains("*") && !updateList.Contains(key)) //if (key!="Első világháborús témájú") { // TODO: adat kód int allArt = 0, assArt = 0; XmlElement oldCatRoot = CopyOldData(key, savedBotData, botData, ref allArt, ref assArt); if (oldCatRoot != null) // A kategória még nem lett feldolgozva, mert üres vagy új { // A lekorlátozott jogú bot ekkor semmit sem tud tenni botDRoot.AppendChild(oldCatRoot); categories[key].AllArticles = allArt; categories[key].AssessedArticles = assArt; } continue; } Console.WriteLine("\n\n== " + key + " szócikkek ==\n"); // Beállítások oldal letöltése // Jelenleg csak arra vagyunk innen kíváncsiak, hogy nagybetűvel kezdődik-e a témakör neve Console.Write("Beállítások letöltése... "); Page optionsPage = new Page(huwiki, "Wikipédia:Cikkértékelési műhely/" + key + " szócikkek/Beállítások"); optionsPage.Load(); if (optionsPage.Exists()) { Console.WriteLine(" kész."); string capt = Regex.Match(optionsPage.text, CapitalStartRegex).Groups["capital"].Value; categories[key].CapitalStart = (capt == "true" || capt == "igen" || capt == "yes") ? true : false; } else { Console.WriteLine(" az oldal nem létezik."); } // Egy kis inicializáció. // oldArts: szócikkek listája a Wikipédián megtalálható lapokról, kiindulási alapnak // newArts: a kategóriákból begyűjtött szócikklista // counter: az egyes értékelési párokhoz (besorolás, fontosság) tartozó szócikkek száma Dictionary <string, Article> oldArts = new Dictionary <string, Article>(); Dictionary <string, Article> newArts = new Dictionary <string, Article>(); int[,] counter = new int[QualityCategories.Count, ImportanceCategories.Count]; // oldArts feltöltése a Wikipédiára elmentett lapokból // - vagy - ha nem létezik a főlap (Wikipédia:Cikkértékelési műhely/{0} szócikkek) // akkor megjegyezzük, hogy új kategóriát találtunk Page catMain = new Page(huwiki, string.Format(WPAssessmentCore, key)); catMain.Load(); if (catMain.Exists()) { LoadOldAssessment(key, ref oldArts, ref catMain); } else { categories[key].NewCat = true; } // Begyűjtjük a szócikkek jelenlegi besorolását és fontosságát, oldid-t nem CollectArticlesFromCategories((categories[key].CapitalStart ? key : key.ToLower()), newArts); // Az oldArts és a newArts közötti különbségek megtekintése // és az érvénytelen szócikkek (nincs laptörténetük) invalidnak jelölése // Futtatási napló elkészítése int diffs = 0; string log = Diff(oldArts, ref newArts, out diffs); // Ha a szócikkek száma nulla, nem mentjük el a semmit sem tartalmazó listát, hanem a következő témakörre ugrunk if (newArts.Count == 0) { Console.WriteLine("A kategória egyetlen szócikket sem tartalmaz, ezért nem kerül feldolgozásra."); continue; } // Eltároljuk az összes szócikk számát, valamint a besorolt szócikkek számát, egyúttal megszámoljuk, // hogy az egyes (besorolás, fontosság) párokhoz mennyi szócikk tartozik categories[key].AllArticles = newArts.Count; categories[key].AssessedArticles = CountArticles(newArts, counter); // Változtatások elmentése, ha van változás // - vagy - kényszerített mentés van if (forceSave || diffs > 0) { // Statisztika elmentése Console.WriteLine("Statisztika elmentése ..."); Page catStat = new Page(huwiki, string.Format(WPAssessmentCore, key) + StatisticsPage); //catStat.Load(); catStat.SaveWithRetries(PrintStat(counter, key), "Bot: statisztika " + DateTime.Today.ToString("yyyy-MM-dd") + "-i frissítése", false); // Szócikklisták és index elmentése if (newArts.Keys.Count > 80) { string index = "{{Sablon:Cikkértékelés/Fejléc|téma=" + key + "}}\n" + "<div style=\"float:right\">{{Wikipédia:Cikkértékelési műhely/" + key + " szócikkek/Statisztika}}</div>\n" + PrintQualityList(newArts, key) + "\n{{Cikkértékelés/Indexlábléc | összesen = " + newArts.Count.ToString() + "}}"; Page botSavePage = new Page(huwiki, "Wikipédia:Cikkértékelési műhely/" + key + " szócikkek/Bot"); botSavePage.SaveWithRetries( "{{#switch:{{{1|}}}\n |bot=" + huwiki.userName + "\n |dátum=" + DateTime.Today.ToString("yyyy-MM-dd") + "\n}}", "Bot: lap frissítése", false); Console.WriteLine("A témakör indexének elmentése ..."); Page assessmentIndex = new Page(huwiki, string.Format(WPAssessmentCore, key)); assessmentIndex.SaveWithRetries(index, "Bot: témakör indexének frissítése", false); } else { Console.WriteLine("Szócikklista elmentése ..."); PrintQualityList(newArts, key); } } // Napló elmentése, ha nem új a cikkértékelési kategória if (categories[key].NewCat != true) { Console.WriteLine("Napló elmentése ..."); Page logPage = new Page(huwiki, string.Format(WPAssessmentCore + LogPage, key)); logPage.SaveWithRetries(log, "Bot: futtatás naplózása", false); } // Adatok elmentése XML-be XmlElement catRoot = botData.CreateElement("Témakör"); XmlAttribute catName = botData.CreateAttribute("név"); catName.Value = key; catRoot.Attributes.Append(catName); for (int i = 0; i < QualityCategories.Count; i++) { for (int j = 0; j < ImportanceCategories.Count; j++) { XmlAttribute curVal = botData.CreateAttribute("d" + i.ToString() + "_" + j.ToString()); curVal.Value = counter[i, j].ToString(); catRoot.Attributes.Append(curVal); } } botDRoot.AppendChild(catRoot); } // Összesített statisztika elmentése Console.WriteLine("Összesített statisztika elmentése ..."); Page allStat = new Page(huwiki, WPAssessment + StatisticsPage); allStat.SaveWithRetries(PrintStat(allCounter, ""), "Bot: összesített statisztika " + DateTime.Today.ToString("yyyy-MM-dd") + "-i frissítése", false); // Index elmentése Console.WriteLine("Cikkértékelés indexének elmentése ..."); Page p = new Page(huwiki, "Wikipédia:Cikkértékelési műhely/Index"); p.Load(); Match m = Regex.Match(p.text, IndexRegex, RegexOptions.Singleline); string list = ""; int validCats = 0; foreach (string s in categories.Keys) { if (categories[s].AllArticles > 0) { validCats++; list += "{{Cikkértékelés/Index | téma = " + s + " | ellenőrzött = " + categories[s].AssessedArticles + " | összesen = " + categories[s].AllArticles + "}}\n"; } } p.SaveWithRetries(m.Groups["pre"].Value + validCats + m.Groups["inner"].Value + list + m.Groups["after"].Value, "Bot: index frissítése", false); // TöbbWP elintézése //if (updateList.Contains("*")) //{ // PageList moreWPs = new PageList(huwiki); // List<string> moreWPList = new List<string>(); // moreWPs.FillFromCustomApiQuery("embeddedin", "eititle=Sablon:Több_WP&eilimit=5000", int.MaxValue); // //moreWPs.FillFromCustomBotQueryList("embeddedin", "eititle=Sablon:Több_WP&eilimit=5000", int.MaxValue); // // átrakjuk a lapok címeit egy listába, mert a Page-k közötti keresgélés kurva lassú // foreach (Page px in moreWPs) // { // moreWPList.Add(px.title); // } // string log = "==TöbbWP sablon nélküli, de több cikkértékelési kategóriába tartozó sablonok==\n"; // foreach (string s in artCounter.Keys) // { // if (artCounter[s] > 1 && !moreWPList.Contains("Vita:" + s)) // log += "* " + string.Format(ArticleLogLink, s) + " (" + artCounter[s] + " témakörben)\n"; // } // Page mwLog = new Page(huwiki, "Wikipédia:Cikkértékelési műhely/Több WP"); // mwLog.Save(log, "Bot: Több WP-napló frissítése", false); //} // Botadatok elmentése Console.WriteLine("Adatok elmentése ..."); botData.AppendChild(botDRoot); Page botDataP = new Page(huwiki, "Wikipédia:Cikkértékelési műhely/Botadatok"); botDataP.SaveWithRetries(botData.XmlToString(), "Bot: botadatok elmentése", false); } catch (Exception e) { Console.WriteLine("Hiba történt: "); Console.WriteLine(e.GetType().Name + " / " + e.Message); Console.WriteLine(); Console.WriteLine("Stack trace:"); Console.WriteLine(e.StackTrace); Console.ReadKey(); } //Console.ReadLine(); }
static void GetBotFlags(ref bool programEnabled) { XmlDocument botFlags = new XmlDocument(); string bf = WebHelpers.GetUrlContent("https://hu.wikipedia.org/w/index.php?title=Wikip%E9dia:Cikk%E9rt%E9kel%E9si_m%FBhely/Botjogok&action=raw&ctype=text/x-wiki"); botFlags.LoadXml(bf); if (botFlags.DocumentElement.HasAttribute("programVerzió") && GetVersion() == botFlags.DocumentElement.Attributes["programVerzió"].Value) { foreach (XmlNode n in botFlags.DocumentElement.ChildNodes) { if (n is XmlElement) { XmlElement e = n as XmlElement; if (e.Attributes["név"].Value == huwiki.userName) { programEnabled = true; if (e.Attributes["jogok"].Value != "*") { string consMess = "A bot számára a következő cikkértékelési kategóriák frissítése engedélyezett:\n"; int i = 1; foreach (string s in e.Attributes["jogok"].Value.Split(',')) { if (s != "initCat") { consMess += " " + i + ". " + s + "\n"; } else { consMess += " + új cikkértékelési kategória bevezetése"; } updateList.Add(s); i++; } Console.WriteLine(consMess); } else { updateList.Add("*"); Console.WriteLine("A bot számára az összes cikkértékelési kategória frissítése engedélyezve van."); } } } } if (!programEnabled) { Console.WriteLine("A botod számára nincs engedélyezve a cikkértékelő proram futtatása.\n" + "Ha futtatni szeretnéd, kérj engedélyt Szerkesztő:Danitól, vagy a Cikkértékelési műhely vitalapján"); Console.ReadKey(); Environment.Exit(0); } } else { Console.WriteLine("A cikkértékelő programnak új verziója érhető el (" + botFlags.DocumentElement.Attributes["programVerzió"].Value + ").\n" + "Ha továbbra is futtatni szeretnéd a botot, szerezd be az új változatot!"); Console.ReadKey(); Environment.Exit(0); } }