Пример #1
0
        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();
        }
Пример #2
0
        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);
            }
        }