Wikipedia:Projekt DotNetWikiBot Framework/Innocent datumbot/Mallhantering
Utseende
using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Collections; using System.Xml; using System.Threading; using DotNetWikiBot; class MyBot : Bot { //Denna rutin ska avgöra om en sträng är ett parameteranrop med variabelnamn. public static bool isparameterwithname(string tmpStr) { bool help = true; if(tmpStr.IndexOf("=") == -1) help = false; else { string[] alt = {"http:", "https:", "ftp:", "irc:", "gopher:", "telnet:", "nntp:", "worldwind:", "mailto:", "news:", "svn:", "git"}; foreach(string protokoll in alt) { if(tmpStr.IndexOf(protokoll) != -1) { if(tmpStr.IndexOf(protokoll) < tmpStr.IndexOf("=")) help = false; } } } return help; } //Denna rutin ska returnera "true" om det är ett datum specifierat ner till dagnivå public static bool islongdate(string tmpStr) { //Känner igen fall där datumet är skrivet med "-" som separerare if(tmpStr.Split('-').Length == 3) { //Om första delen har 4 tecken och de följande 2 har 2 eller 1 tecken if(tmpStr.Split('-')[0].Length == 4 && (tmpStr.Split('-')[1].Length == 2 || tmpStr.Split('-')[1].Length == 1) && (tmpStr.Split('-')[2].Length == 2 || tmpStr.Split('-')[2].Length == 1)) { bool test = false; string benchmark = "0123456789"; foreach(string del in tmpStr.Split('-')) { foreach(char letter in del) { if(benchmark.IndexOf(letter) == -1) test = true; } } if(test) { //Här kan man lägga in fler test längre fram return false; } else { //Testar om datumet är korrupt (före år 2000 efter 2100 eller har en månad <1 el >12 eller ett datum <1 el >31 if(int.Parse(tmpStr.Split('-')[0]) >= 2000 && int.Parse(tmpStr.Split('-')[0]) <= 2100 && int.Parse(tmpStr.Split('-')[1]) >= 1 && int.Parse(tmpStr.Split('-')[1]) <= 12 && int.Parse(tmpStr.Split('-')[2]) >= 1 && int.Parse(tmpStr.Split('-')[2]) <= 31) return true; else return false; } } else return false; } else return false; } //Denna rutin ska returnera "true" om det är ett datum specifierat ner till månad public static bool isshortdate(string tmpStr) { //Känner igen fall där datumet är skrivet med "-" som separerare if(tmpStr.Split('-').Length == 2) { //Om första delen har 4 tecken och det följande har 2 if(tmpStr.Split('-')[0].Length == 4 && (tmpStr.Split('-')[1].Length == 2 )) { bool test = false; string benchmark = "0123456789"; foreach(string del in tmpStr.Split('-')) { foreach(char letter in del) { if(benchmark.IndexOf(letter) == -1) test = true; } } if(test) { //Här kan man lägga in fler test längre fram return false; } else { //Testar om datumet är korrupt (före år 2000 efter 2100 eller har en månad <1 el >12 eller ett datum <1 el >31 if(int.Parse(tmpStr.Split('-')[0]) >= 2000 && int.Parse(tmpStr.Split('-')[0]) <= 2100 && int.Parse(tmpStr.Split('-')[1]) >= 1 && int.Parse(tmpStr.Split('-')[1]) <= 12) return true; else return false; } } else return false; } else return false; } public static void Innocent_datumbot() { //Stöd för datering YYYY-MM eller YYYY-MM-DD int Totaltantalhittills = 0; string BotNamn = "Innocent datumbot"; DateTime time = DateTime.Now; Site site = new Site("http://sv.wikipedia.org", BotNamn, "********"); //Hämtar en lista på botkonton PageList plbot = new PageList(site); plbot.FillFromCategory("Wikipedia:Robotanvändare"); //Hämtar sidan med instruktioner Page mainPage = new Page(site, "Användare:" + BotNamn + "/Dateringar"); mainPage.Load(); string maintext = mainPage.text; maintext = maintext.Replace(" \n","\n"); maintext = maintext.Replace(" \n","\n"); int maincursor = 0; string numerisksträng = "123456789"; do { maincursor = maintext.IndexOf("\n*****", maincursor+1); //Hämta kategorierna från stödsidan string cat = maintext.Substring(maincursor + 6, maintext.IndexOf("\n", maincursor+1)-maincursor-6); //Hämta mallar och styrning för kategorin string cattext = ""; if(maintext.IndexOf("\n*****", maincursor + 1) == -1) cattext = maintext.Substring(maincursor + 6)+"\n"; else cattext = maintext.Substring(maincursor + 6, maintext.IndexOf("\n*****", maincursor+1)-maincursor-6)+"\n"; //Skapar en Pagelist med medlemmarna i kategori:'cat' PageList pl = new PageList(site); pl.FillAllFromCategory(cat); //Filtrera alltid bort mall-namnrymden av säkerhetsskäl pl.RemoveNamespaces(new int[] {10}); //Hämtar varje enskild artikel foreach (Page subPage in pl) { bool change2 = false; //Default redigeringskommentar string comment = "Daterar/underhåller åtgärdsmallar mm."; subPage.LoadEx(); string orginaltext = subPage.text; //Hämtar tidsstämpel från API string datum = subPage.timestamp.Year.ToString() + "-" + subPage.timestamp.Month.ToString().PadLeft(2,'0') + "-" + subPage.timestamp.Day.ToString().PadLeft(2,'0'); string månad = subPage.timestamp.Year.ToString() + "-" + subPage.timestamp.Month.ToString().PadLeft(2,'0'); //Om senaste redigering är en bot, kolla hisoriken if(plbot.Contains("Användare:"+subPage.lastUser)) { PageList pl2 = new PageList(site); pl2.FillFromPageHistoryEx(subPage.title, 50, true); foreach(Page p2 in pl2) { if(!plbot.Contains("Användare:"+p2.lastUser)) { datum = p2.timestamp.Year.ToString() + "-" + p2.timestamp.Month.ToString().PadLeft(2,'0') + "-" + p2.timestamp.Day.ToString().PadLeft(2,'0'); månad = p2.timestamp.Year.ToString() + "-" + p2.timestamp.Month.ToString().PadLeft(2,'0'); break; } } } if(cat.EndsWith("utan datum") || cat.EndsWith("-okänd") || cat.EndsWith("brister")) { string search = "[[Kategori:" + cat.Substring(0, cat.Length -11); string inläggare = ""; string version = ""; if(orginaltext.ToLower().IndexOf(search.ToLower()) != -1) { PageList pl2 = new PageList(site); pl2.FillFromPageHistoryEx(subPage.title, 50, true); for(int i=0;i<=pl2.Count()-2;i++) { Page p2 = pl2[i]; Page p3 = pl2[i+1]; string s1 = p2.text; string s2 = p3.text; if(s1.ToLower().IndexOf(search.ToLower()) != -1 && s2.ToLower().IndexOf(search.ToLower()) == -1) { version = p2.lastRevisionID; inläggare = p2.lastUser; break; } } } if(inläggare != "") { string felsubstare = File.ReadAllText("Felsubstare.txt"); if(felsubstare.IndexOf("'"+version+"'") == -1) { felsubstare += "\r\n" + "'" + version + "',[[" + subPage.title + "]], [[Användare:" + inläggare + "]]"; File.WriteAllText("Felsubstare.txt", felsubstare); Page pa = new Page(site, "Användardiskussion:" + inläggare); pa.LoadEx(); string typtext = ""; if(pa.Exists() && numerisksträng.IndexOf(inläggare.Substring(0,1)) == -1) { PageList pl2 = new PageList(site); pl2.FillFromUserContributions(inläggare, 2000); if(pl2.Count() > 1000) { if(pa.lastUser != BotNamn) { Page pa1 = new Page(site, "Användare:" + BotNamn + "/Meddelande1/" + inläggare); pa1.Load(); if(pa1.Exists()) { if(pa1.text.Length>5) typtext = pa1.text; } else { Page pa2 = new Page(site, "Användare:" + BotNamn + "/Meddelande1"); pa2.Load(); typtext = pa2.text; } } else { Page pa1 = new Page(site, "Användare:" + BotNamn + "/Meddelande1/" + inläggare); pa1.Load(); if(pa1.Exists()) { if(pa1.text.Length>5) { Page pa2 = new Page(site, "Användare:" + BotNamn + "/Meddelande2"); pa2.Load(); typtext = pa2.text; } } } } typtext = typtext.Replace("$1", subPage.title); typtext = typtext.Replace("$2", version); typtext = typtext.Replace("$3", "~~~~"); if(typtext.Length > 5) { pa.text = pa.text + "\n\n" + typtext; Bot.editComment = "En misstänkt felsubstning i sida: [["+subPage.title+"]]."; Bot.isMinorEdit = false; pa.Save(); } else { Page pa1 = new Page(site, "Användare:" + BotNamn + "/Meddelande3"); pa1.Load(); typtext = pa1.text; typtext = typtext.Replace("$1", subPage.title); typtext = typtext.Replace("$2", version); typtext = typtext.Replace("$3", "~~~~"); Page pa2 = new Page(site, "Wikipedia:Felsubstade mallar"); pa2.Load(); pa2.text = pa2.text+"\n"+typtext; Bot.editComment = "En misstänkt felsubstning i sida: [["+subPage.title+"]]."; Bot.isMinorEdit = false; pa2.Save(); } } } } } //Kosmetika subPage.text = subPage.text.Replace("{{ ","{{"); subPage.text = subPage.text.Replace("{{ ","{{"); subPage.text = subPage.text.Replace("{{\n","{{"); subPage.text = subPage.text.Replace("{{\n","{{"); subPage.text = subPage.text.Replace(" }}","}}"); subPage.text = subPage.text.Replace(" }}","}}"); subPage.text = subPage.text.Replace("{{Mall:","{{"); subPage.text = subPage.text.Replace("{{mall:","{{"); subPage.text = subPage.text.Replace("{{Template:","{{"); subPage.text = subPage.text.Replace("{{template:","{{"); foreach(string mallen in subPage.GetTemplatesWithParams()) { string mallstr = mallen; bool change = false; int s1 = mallen.Length; int s2 = s1; string addendum = ""; do { s1 = mallstr.Length; //Rensar bort överflödiga mellanslag runt '='-tecken för att förenkla tolkningen av mall-anropen mallstr = mallstr.Replace(" =","="); mallstr = mallstr.Replace("= ","="); s2 = mallstr.Length; } while(s1 != s2); //Repeterar ovantående tills det inte finns några fler 'onödiga mellanslag', hellre en runda för mycket... //Observera att detta inte har ngn mallteknisk funktion, utan bara finns för att förenkla tolkningen för boten //För att hindra mall/parseranrop inne i parametrar att tolkas fel, så ändras '|' inne i anrop till ngt annat för ett ögonblick int inremallanrop = 0; int räknare = mallstr.Length; for(int i=0; i < räknare;i++) { if(mallstr[i]=='{' || mallstr[i]=='[') inremallanrop++; if(mallstr[i]=='}' || mallstr[i]==']') inremallanrop = inremallanrop - 1; if(inremallanrop > 0 && mallstr[i]=='|') mallstr = mallstr.Substring(0,i)+"ụ"+mallstr.Substring(i+1); } string[] arrMallstr = mallstr.Split('|'); int i1 = 0; //Mallparametrarna trimmas och återställer "|" som finns i mall/parseranrop foreach(string paramslask in arrMallstr) { arrMallstr[i1] = paramslask.Trim().Replace("ụ", "|"); i1++; } //En för kategorin anpassad redigeringskommentar if(cattext.IndexOf("kommentar=") != -1) { string nyttnamn = cattext.Substring(cattext.IndexOf("kommentar=")+10); nyttnamn = nyttnamn.Substring(0, nyttnamn.IndexOf("\n")); comment = nyttnamn; } //Tar reda på om mallen ovan finns beskriven i textsidan ovan //Plockar fram mallnamnet både med initial versal och initial gemen string s3 = arrMallstr[0].Substring(0,1).ToUpper()+arrMallstr[0].Substring(1); string s4 = arrMallstr[0].Substring(0,1).ToLower()+arrMallstr[0].Substring(1); string malltext = ""; if(cattext.IndexOf("\n****"+s3+"\n") != -1 || cattext.IndexOf("\n****"+s4+"\n") != -1) { //Varje kategori kan hantera flera olika mallar med olika regler, identifiera reglerna för just denna mall malltext = ""; if(cattext.IndexOf("\n****"+s3+"\n") != -1) malltext = cattext.Substring(cattext.IndexOf("\n****" + s3 + "\n")); else malltext = cattext.Substring(cattext.IndexOf("\n****" + s4 + "\n")); //Om det finns en avskiljare (----) så begränsas sökområdet till den, annars hela kategorin malltext = (malltext.IndexOf("\n----\n") == -1) ? malltext+"\n" : malltext.Substring(0, malltext.IndexOf("\n----\n"))+"\n"; //Mallar som ska substas och vid mallnamnsbyten används parameter 'essrename=' i mallanropssidan if(malltext.IndexOf("essrename=") != -1) { string nyttnamn = malltext.Substring(malltext.IndexOf("essrename=")+10); nyttnamn = nyttnamn.Substring(0, nyttnamn.IndexOf("\n")); arrMallstr[0] = nyttnamn; change = true; //Sidan ska sparas när detta ändras, inte optional } //Mallar där ett namnbyte kan rekommenderas, tex från ett engelskt namn till ett svenskt, sparas inte om det är enda åtgärd för mallen if(malltext.IndexOf("rename=") != -1) { string nyttnamn = malltext.Substring(malltext.IndexOf("rename=")+7); nyttnamn = nyttnamn.Substring(0, nyttnamn.IndexOf("\n")); arrMallstr[0] = nyttnamn; } //Tar bort en parameter if(malltext.IndexOf("esstabortparameter=") != -1) { //Hämtar vilka parameterar som ska tas bort string nyttnamn = malltext.Substring(malltext.IndexOf("esstabortparameter=")+19); nyttnamn = nyttnamn.Substring(0, nyttnamn.IndexOf("\n")); int variabelfri = 0; //Räknar igenom de befintliga parametrarna for(int i = 1; i < arrMallstr.Length; i++) { if(!isparameterwithname(arrMallstr[i])) { //Räknare för variabelfria parametrar variabelfri++; foreach(string parameter in nyttnamn.Split('|')) { if(variabelfri.ToString() == parameter) { //Parameterpositionen ges ett namn som lätt känns igenom arrMallstr[i] = "Denhärparameternskabortbortbort"; change = true; //Sidan ska sparas när detta ändras, inte optional } } } else { foreach(string parameter in nyttnamn.Split('|')) { if(arrMallstr[i].Substring(0,arrMallstr[i].IndexOf("=")) == parameter) { arrMallstr[i] = "Denhärparameternskabortbortbort"; change = true; //Sidan ska sparas när detta ändras, inte optional } } } } } //Tar bort en parameter if(malltext.IndexOf("tabortparameter=") != -1) { //Hämtar vilka parameterar som ska tas bort string nyttnamn = malltext.Substring(malltext.IndexOf("tabortparameter=")+16); nyttnamn = nyttnamn.Substring(0, nyttnamn.IndexOf("\n")); int variabelfri = 0; //Räknar igenom de befintliga parametrarna for(int i = 1; i < arrMallstr.Length; i++) { if(!isparameterwithname(arrMallstr[i])) { //Räknare för variabelfria parametrar variabelfri++; foreach(string parameter in nyttnamn.Split('|')) { if(variabelfri.ToString() == parameter) { //Parameterpositionen ges ett namn som lätt känns igenom arrMallstr[i] = "Denhärparameternskabortbortbort"; } } } else { foreach(string parameter in nyttnamn.Split('|')) { if(arrMallstr[i].Substring(0,arrMallstr[i].IndexOf("=")) == parameter) { arrMallstr[i] = "Denhärparameternskabortbortbort"; } } } } } //Byter namn på en parameter int localcursor = 0; while(malltext.IndexOf("essbytparameternamn=", localcursor) != -1) { //Hämtar vilka parameterar som ska bytas string nyttnamn = malltext.Substring(malltext.IndexOf("essbytparameternamn=", localcursor)+20); nyttnamn = nyttnamn.Substring(0, nyttnamn.IndexOf("\n")); localcursor = malltext.IndexOf("essbytparameternamn=", localcursor) + 20; string från = nyttnamn.Substring(0, nyttnamn.IndexOf("|")); string till = nyttnamn.Substring(nyttnamn.IndexOf("|") + 1); int variabelfri = 0; for(int i = 1; i < arrMallstr.Length; i++) { if(isparameterwithname(arrMallstr[i])) { if(arrMallstr[i].Substring(0,arrMallstr[i].IndexOf("=")) == från) { arrMallstr[i] = till + arrMallstr[i].Substring(arrMallstr[i].IndexOf("=")); change = true; //Sidan ska sparas när detta ändras, inte optional } } else { variabelfri++; if(variabelfri.ToString() == från) { arrMallstr[i] = till + "=" + arrMallstr[i]; change = true; //Sidan ska sparas när detta ändras, inte optional } } } } //Byter namn på en parameter, frivillig localcursor = 0; while(malltext.IndexOf("bytparameternamn=", localcursor) != -1) { //Hämtar vilka parameterar som ska bytas string nyttnamn = malltext.Substring(malltext.IndexOf("bytparameternamn=", localcursor) + 17); nyttnamn = nyttnamn.Substring(0, nyttnamn.IndexOf("\n")); localcursor = malltext.IndexOf("bytparameternamn=", localcursor) + 17; string från = nyttnamn.Substring(0, nyttnamn.IndexOf("|")); string till = nyttnamn.Substring(nyttnamn.IndexOf("|") + 1); int variabelfri = 0; for(int i = 1; i < arrMallstr.Length; i++) { if(isparameterwithname(arrMallstr[i])) { //För positioner med parameter if(arrMallstr[i].Substring(0,arrMallstr[i].IndexOf("=")) == från) { arrMallstr[i] = till + arrMallstr[i].Substring(arrMallstr[i].IndexOf("=")); } } else { //För positioner som saknar parameter variabelfri++; if(variabelfri.ToString() == från) { arrMallstr[i] = till + "=" + arrMallstr[i]; } } } } //Lägger till eller ändrar en parameter localcursor = 0; while(malltext.IndexOf("esssetparameter=", localcursor) != -1) { //Hämtar vilka parameterar som ska tas bort string nyttnamn = malltext.Substring(malltext.IndexOf("esssetparameter=", localcursor) + 16); nyttnamn = nyttnamn.Substring(0, nyttnamn.IndexOf("\n")); localcursor = malltext.IndexOf("esssetparameter=", localcursor) + 16; string parameter = nyttnamn.Substring(0, nyttnamn.IndexOf("|")); string värde = nyttnamn.Substring(nyttnamn.IndexOf("|") + 1); int variabelfri = 0; bool klart = false; for(int i = 1; i < arrMallstr.Length; i++) { if(!isparameterwithname(arrMallstr[i])) { //För positioner med parameter if(arrMallstr[i].Substring(0,arrMallstr[i].IndexOf("=")) == parameter) { arrMallstr[i] = arrMallstr[i].Substring(0, arrMallstr[i].IndexOf("=") + 1) + värde; klart = true; change = true; //Sidan ska sparas när detta ändras, inte optional } } else { //För positioner som saknar parameter variabelfri++; if(variabelfri.ToString() == parameter) { arrMallstr[i] = värde; klart = true; change = true; //Sidan ska sparas när detta ändras, inte optional } } } if(!klart) { if(numerisksträng.IndexOf(parameter) == -1) { addendum += "|" + parameter + "=" + värde; change = true; //Sidan ska sparas när detta ändras, inte optional } else { for(int i = 0; i < numerisksträng.IndexOf(parameter) + 1; i++) addendum += "|"; addendum += värde; change = true; //Sidan ska sparas när detta ändras, inte optional } } } //Ändrar en tidsparameter localcursor = 0; while(malltext.IndexOf("tidsmodifiering=", localcursor) != -1) { //Hämtar vilka parameterar som ska tas bort string nyttnamn = malltext.Substring(malltext.IndexOf("tidsmodifiering=", localcursor) + 16); nyttnamn = nyttnamn.Substring(0, nyttnamn.IndexOf("\n")); localcursor = malltext.IndexOf("tidsmodifiering=", localcursor) + 16; string från = nyttnamn.Substring(0, nyttnamn.IndexOf("|")); string till = nyttnamn.Substring(nyttnamn.IndexOf("|") + 1); int variabelfri = 0; for(int i = 1; i < arrMallstr.Length; i++) { if(isparameterwithname(arrMallstr[i])) { //För positioner med parameter if(arrMallstr[i].Substring(0,arrMallstr[i].IndexOf("=")) == från) { DateTime dt = new DateTime(); string newDate; string oldDate = arrMallstr[i].Substring(arrMallstr[i].IndexOf("=")+1); try { dt = DateTime.Parse(oldDate); newDate = String.Format(till, dt); arrMallstr[i] = arrMallstr[i].Substring(0, arrMallstr[i].IndexOf("=") + 1) + newDate; } catch(FormatException) { arrMallstr[i] = arrMallstr[i]; } } } else { //För positioner som saknar parameter variabelfri++; if(variabelfri.ToString() == från) { try { DateTime dt = new DateTime(); string oldDate = arrMallstr[i]; dt = DateTime.Parse(oldDate); arrMallstr[i] = String.Format(till, dt); } catch(FormatException) { arrMallstr[i] = arrMallstr[i]; } } } } } //Lägger till eller ändrar en parameter, frivilligt localcursor = 0; while(malltext.IndexOf("setparameter=", localcursor) != -1) { //Hämtar vilka parameterar som ska tas bort string nyttnamn = malltext.Substring(malltext.IndexOf("setparameter=", localcursor) + 13); nyttnamn = nyttnamn.Substring(0, nyttnamn.IndexOf("\n")); localcursor = malltext.IndexOf("setparameter=", localcursor) + 13; string parameter = nyttnamn.Substring(0, nyttnamn.IndexOf("|")); string värde = nyttnamn.Substring(nyttnamn.IndexOf("|") + 1); int variabelfri = 0; bool klart = false; for(int i = 1; i < arrMallstr.Length; i++) { if(isparameterwithname(arrMallstr[i])) { //För positioner med parameter if(arrMallstr[i].Substring(0,arrMallstr[i].IndexOf("=")) == parameter) { arrMallstr[i] = arrMallstr[i].Substring(0, arrMallstr[i].IndexOf("=") + 1) + värde; klart = true; } } else { //För positioner som saknar parameter variabelfri++; if(variabelfri.ToString() == parameter) { arrMallstr[i] = värde; klart = true; } } } if(!klart) { if(numerisksträng.IndexOf(parameter) == -1) { addendum += "|" + parameter + "=" + värde; } else { for(int i = 0; i < numerisksträng.IndexOf(parameter) + 1; i++) addendum += "|"; addendum += värde; } } } //Mallar som alltid använder YYYY-MM-DD som datumparameter if(malltext.IndexOf("esslongdatum=") != -1) { string parameterlista = malltext.Substring(malltext.IndexOf("esslongdatum=")+13); parameterlista = parameterlista.Substring(0, parameterlista.IndexOf("\n")); //Om mallen saknar parametrar öht if(arrMallstr.Length == 1) { //Om parametern ska vara med variabelnamn if(numerisksträng.IndexOf(parameterlista.Split('|')[0]) == -1) { //Lägger man helt enkelt till: "parameternamn=datum" addendum += "|"+parameterlista.Split('|')[0] + "=" + datum; } else { //Om parametern ska vara variabelfri //Lägger till 'rätt' antal "|" for(int i = 0; i < numerisksträng.IndexOf(parameterlista.Split('|')[0]) + 1; i++) addendum += "|"; addendum += datum; } change = true; //Sidan ska sparas när detta ändras, inte optional } else { //Om mallen har parametrar, man behöver då kolla igenom de befintliga... int variabelfri = 0; bool fixat = false; for(int i = 1; i < arrMallstr.Length; i++) { //Hantering av variabelfria parametrar if(!isparameterwithname(arrMallstr[i])) { //Räknar upp för att bestämma 'namnet' på den variabelfria parametern variabelfri++; //Söker igenom alla möjliga parametrar foreach(string parameter in parameterlista.Split('|')) { //Om variabelfria parametern har rätt nummer if(parameter == variabelfri.ToString()) { if(islongdate(arrMallstr[i]) || fixat) { fixat = true; //Om parameterfri variabel är ett datum, så är allt frid och fröjd } else { arrMallstr[i]=datum; change = true; //Sidan ska sparas när detta ändras, inte optional fixat = true; //Inga fler ändringar behövs break; } } } } else { //Hantering av parametrar med variabelnamn //Söker igenom alla möjliga parameternamn foreach(string parameter in parameterlista.Split('|')) { //Om variabeln har 'rätt' namn if(parameter == arrMallstr[i].Substring(0,arrMallstr[i].IndexOf("="))) { if(islongdate(arrMallstr[i].Substring(arrMallstr[i].IndexOf("=")+1)) || fixat) { fixat = true; //Om parameterfri variabel är ett datum, så är allt frid och fröjd } else { arrMallstr[i] = parameter + "=" + datum; change = true; //Sidan ska sparas när detta ändras, inte optional fixat = true; //Inga fler ändringar behövs break; } } } } } //I de fall, ännu inget datum har skrivits in, och det bygger på en numerisk parameter if(!fixat && numerisksträng.IndexOf(parameterlista.Split('|')[0]) != -1) { for(int i2 = variabelfri; i2 < numerisksträng.IndexOf(parameterlista.Split('|')[0]) + 1; i2++) addendum += "|"; addendum += datum; change = true; } //För de fall, då inget datum skrivits in, och parametern bygger på en varibel if(!fixat && numerisksträng.IndexOf(parameterlista.Split('|')[0]) == -1) { addendum += "|"+parameterlista.Split('|')[0]+"="+datum; change = true; } } } // esslongdatum //Mallar som alltid använder YYYY-MM som datumparameter if(malltext.IndexOf("esskortdatum=") != -1) { string parameterlista = malltext.Substring(malltext.IndexOf("esskortdatum=")+13); parameterlista = parameterlista.Substring(0, parameterlista.IndexOf("\n")); //Om mallen saknar parametrar öht if(arrMallstr.Length == 1) { //Om parametern ska vara med variabelnamn if(numerisksträng.IndexOf(parameterlista.Split('|')[0]) == -1) { //Lägger man helt enkelt till: "parameternamn=månad" addendum += "|"+parameterlista.Split('|')[0] + "=" + månad; } else { //Om parametern ska vara variabelfri //Lägger till 'rätt' antal "|" for(int i = 0; i < numerisksträng.IndexOf(parameterlista.Split('|')[0]) + 1; i++) addendum += "|"; addendum += månad; } change = true; //Sidan ska sparas när detta ändras, inte optional } else { //Om mallen har parametrar, man behöver då kolla igenom de befintliga... int variabelfri = 0; bool fixat = false; for(int i = 1; i < arrMallstr.Length; i++) { //Hantering av variabelfria parametrar if(!isparameterwithname(arrMallstr[i])) { //Räknar upp för att bestämma 'namnet' på den variabelfria parametern variabelfri++; //Söker igenom alla möjliga parametrar foreach(string parameter in parameterlista.Split('|')) { //Om variabelfria parametern har rätt nummer if(parameter == variabelfri.ToString()) { if(isshortdate(arrMallstr[i]) || fixat) { fixat = true; //Om parameterfri variabel är ett datum, så är allt frid och fröjd } else { arrMallstr[i]=månad; change = true; //Sidan ska sparas när detta ändras, inte optional fixat = true; //Inga fler ändringar behövs break; } } } } else { //Hantering av parametrar med variabelnamn //Söker igenom alla möjliga parameternamn foreach(string parameter in parameterlista.Split('|')) { //Om variabeln har 'rätt' namn if(parameter == arrMallstr[i].Substring(0,arrMallstr[i].IndexOf("="))) { if(isshortdate(arrMallstr[i].Substring(arrMallstr[i].IndexOf("=")+1)) || fixat) { fixat = true; //Om parameterfri variabel är ett datum, så är allt frid och fröjd } else { arrMallstr[i] = parameter + "=" + månad; change = true; //Sidan ska sparas när detta ändras, inte optional fixat = true; //Inga fler ändringar behövs break; } } } } } //I de fall, ännu inget datum har skrivits in, och det bygger på en numerisk parameter if(!fixat && numerisksträng.IndexOf(parameterlista.Split('|')[0]) != -1) { for(int i2 = variabelfri; i2 < numerisksträng.IndexOf(parameterlista.Split('|')[0]) + 1; i2++) addendum += "|"; addendum += månad; change = true; } //För de fall, då inget datum skrivits in, och parametern bygger på en varibel if(!fixat && numerisksträng.IndexOf(parameterlista.Split('|')[0]) == -1) { addendum += "|"+parameterlista.Split('|')[0]+"="+månad; change = true; } } } // esskortdatum //Mallar som accepterar både YYYY-MM-DD och YYYY-MM för datum if(malltext.IndexOf("esslongkortdatum=") != -1) { string parameterlista = malltext.Substring(malltext.IndexOf("esslongkortdatum=")+17); parameterlista = parameterlista.Substring(0, parameterlista.IndexOf("\n")); //Om mallen saknar parametrar öht if(arrMallstr.Length == 1) { //Om parametern ska vara med variabelnamn if(numerisksträng.IndexOf(parameterlista.Split('|')[0]) == -1) { //Lägger man helt enkelt till: "parameternamn=datum" addendum += "|"+parameterlista.Split('|')[0] + "=" + datum; } else { //Om parametern ska vara variabelfri //Lägger till 'rätt' antal "|" for(int i = 0; i < numerisksträng.IndexOf(parameterlista.Split('|')[0]) + 1; i++) addendum += "|"; addendum += datum; } change = true; //Sidan ska sparas när detta ändras, inte optional } else { //Om mallen har parametrar, man behöver då kolla igenom de befintliga... int variabelfri = 0; bool fixat = false; for(int i = 1; i < arrMallstr.Length; i++) { //Hantering av variabelfria parametrar if(!isparameterwithname(arrMallstr[i])) { //Räknar upp för att bestämma 'namnet' på den variabelfria parametern variabelfri++; //Söker igenom alla möjliga parametrar foreach(string parameter in parameterlista.Split('|')) { //Om variabelfria parametern har rätt nummer if(parameter == variabelfri.ToString()) { if(islongdate(arrMallstr[i]) || isshortdate(arrMallstr[i]) || fixat) { fixat = true; //Om parameterfri variabel är ett datum, så är allt frid och fröjd } else { arrMallstr[i]=datum; change = true; //Sidan ska sparas när detta ändras, inte optional fixat = true; //Inga fler ändringar behövs break; } } } } else { //Hantering av parametrar med variabelnamn //Söker igenom alla möjliga parameternamn foreach(string parameter in parameterlista.Split('|')) { //Om variabeln har 'rätt' namn if(parameter == arrMallstr[i].Substring(0,arrMallstr[i].IndexOf("="))) { if(islongdate(arrMallstr[i].Substring(arrMallstr[i].IndexOf("=")+1)) || isshortdate(arrMallstr[i].Substring(arrMallstr[i].IndexOf("=")+1)) || fixat) { fixat = true; //Om parameterfri variabel är ett datum, så är allt frid och fröjd } else { arrMallstr[i] = parameter + "=" + datum; change = true; //Sidan ska sparas när detta ändras, inte optional fixat = true; //Inga fler ändringar behövs break; } } } } } //I de fall, ännu inget datum har skrivits in, och det bygger på en numerisk parameter if(!fixat && numerisksträng.IndexOf(parameterlista.Split('|')[0]) != -1) { for(int i2 = variabelfri; i2 < numerisksträng.IndexOf(parameterlista.Split('|')[0]) + 1; i2++) addendum += "|"; addendum += datum; change = true; } //För de fall, då inget datum skrivits in, och parametern bygger på en varibel if(!fixat && numerisksträng.IndexOf(parameterlista.Split('|')[0]) == -1) { addendum += "|"+parameterlista.Split('|')[0]+"="+datum; change = true; } } } // esslongkortdatum if(malltext.IndexOf("esskosmetika=") != -1) change = true; } //Hanterar mall //Sätter ihop mallen if(change) { string nyihopsattmall = arrMallstr[0]; for(int j = 1; j < arrMallstr.Length; j++) nyihopsattmall += "|" + arrMallstr[j]; nyihopsattmall += addendum; //En parameter som namngivits enbart för att tas bort nyihopsattmall = nyihopsattmall.Replace("|Denhärparameternskabortbortbort",""); if(malltext.IndexOf("esskosmetika=") != -1 || malltext.IndexOf("kosmetika=") != -1) { int inremallanrop2 = 0; int räknare2 = nyihopsattmall.Length; for(int i=0; i < räknare2;i++) { if(nyihopsattmall[i]=='{' || nyihopsattmall[i]=='[') inremallanrop2++; if(nyihopsattmall[i]=='}' || nyihopsattmall[i]==']') inremallanrop2 = inremallanrop2 - 1; if(inremallanrop2 > 0 && nyihopsattmall[i]=='|') nyihopsattmall = nyihopsattmall.Substring(0,i)+"ụ"+nyihopsattmall.Substring(i+1); } string[] arrMallstr2 = nyihopsattmall.Split('|'); int i3 = 0; //Mallparametrarna trimmas och återställer "|" som finns i mall/parseranrop foreach(string paramslask in arrMallstr2) { arrMallstr2[i3] = paramslask.Trim().Replace("ụ", "|"); i3++; } if(malltext.IndexOf("esskosmetika=enkel") != -1 || malltext.IndexOf("kosmetika=enkel") != -1) { int i2 = 0; foreach(string paramslask in arrMallstr2) { if(isparameterwithname(paramslask)) { arrMallstr2[i2] = arrMallstr2[i2].Substring(0, arrMallstr2[i2].IndexOf("=")) + " = " + arrMallstr2[i2].Substring(arrMallstr2[i2].IndexOf("=") + 1)+" "; } else { arrMallstr2[i2] += " "; } i2++; } } if(malltext.IndexOf("esskosmetika=avancerad") != -1 || malltext.IndexOf("kosmetika=avancerad") != -1) { int i2 = 0; int max = 0; foreach(string paramslask in arrMallstr2) { if(isparameterwithname(paramslask)) { if(paramslask.IndexOf("=") > max) max = paramslask.IndexOf("="); } } foreach(string paramslask in arrMallstr2) { if(isparameterwithname(paramslask)) { int i4 = max - paramslask.IndexOf("="); string likaslask = "=" ; arrMallstr2[i2] = arrMallstr2[i2].Substring(0, arrMallstr2[i2].IndexOf("=")) + likaslask.PadLeft(i4+2) + " " + arrMallstr2[i2].Substring(arrMallstr2[i2].IndexOf("=") + 1)+"\n"; } else { arrMallstr2[i2] += "\n"; } i2++; } } nyihopsattmall = ""; foreach(string paramslask in arrMallstr2) { nyihopsattmall += "|" + paramslask; } nyihopsattmall = nyihopsattmall.Substring(1); } //Gör själva redigeringen i artikeln subPage.text = subPage.text.Replace("{{" + mallen + "}}","{{" + nyihopsattmall + "}}"); change2 = true; } } //Hanterar sida if(change2) { Page pstopp = new Page(site, "Användare:" + BotNamn + "/Stopp"); pstopp.Load(); if(pstopp.Exists()) if(pstopp.text.Length>1) change2 = false; } if(change2) { //Hämtar befintlig logg string rednummer = File.ReadAllText("Räknare.txt"); int rednum = int.Parse(rednummer) + 1; string loggtext = File.ReadAllText("Logg.txt"); //Hämtar tid för loggen DateTime time2 = DateTime.Now; //Formulerar ny logg loggtext += "* #" + rednum.ToString().PadLeft(6,'0') + " " + time2.Year.ToString()+"-"+time2.Month.ToString().PadLeft(2,'0')+"-"+time2.Day.ToString().PadLeft(2,'0') + " " + time2.Hour.ToString().PadLeft(2,'0') + "." + time2.Minute.ToString().PadLeft(2,'0') + " " + " [[:Kategori:" + cat + "]], [[:"+subPage.title + "]]\r\n"; //Redigeringskommentar med löpnummer Bot.editComment = comment + " #" + rednum.ToString().PadLeft(6,'0'); Bot.isMinorEdit = true; //Sparar och laddar igen för att se om det skett ngt subPage.SortInterWikiLinks(); subPage.Save(); //Console.WriteLine(subPage.text); Page subPage2 = new Page(site, subPage.title); subPage2.Load(); //Om det skett en ändring if(subPage2.text != orginaltext) { Totaltantalhittills++; File.WriteAllText("Räknare.txt", rednum.ToString()); File.WriteAllText("Logg.txt", loggtext); if(rednum.ToString().EndsWith("00")) { Page loggPage = new Page(site, "Användare:" + BotNamn + "/Logg "+time2.Year.ToString()+"-"+time2.Month.ToString().PadLeft(2,'0')); loggPage.Load(); string logghistorik = ""; string loggorginal = ""; if(loggPage.Exists()) { logghistorik = loggPage.text; loggorginal = loggPage.text; } loggPage.text = logghistorik + "\n" + loggtext; Bot.editComment = "Sparar en logg"; Bot.isMinorEdit = false; loggPage.Save(); loggPage.Load(); if(loggPage.text != loggorginal) File.WriteAllText("Logg.txt", ""); } Thread.Sleep(9000); } } if(Totaltantalhittills >= 100) break; } //Hanterar kategori if(Totaltantalhittills >= 100) break; } while(maintext.IndexOf("\n*****", maincursor + 1) != -1); } public static void Main() { double antalTimmar = 0; while(true) { DateTime senast = DateTime.Now; Innocent_datumbot(); while(antalTimmar<6) { Thread.Sleep(300000); DateTime nu = DateTime.Now; TimeSpan skillnad = nu.Subtract(senast); antalTimmar = skillnad.TotalHours; Console.WriteLine(antalTimmar); } antalTimmar = 0; } } }