Wikipedia:Projekt DotNetWikiBot Framework/Innocent bot/Brister
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 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 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; } public static void Main() { Site site = new Site("http://sv.wikipedia.org", "Innocent bot", "********"); //Hämtar sidan som stödjer koden Page pstöd = new Page(site, "Användare:Innocent bot/Brist"); pstöd.Load(); //Hämtar lista över botar PageList plbot = new PageList(site); plbot.FillFromCategory("Wikipedia:Robotanvändare"); //Hämtar en lista över alla Brister-artiklar idag PageList pl = new PageList(site); pl.FillAllFromCategory("Artiklar med brister"); foreach(Page p in pl) { //Hämtar sidan med metadata p.LoadEx(); DateTime time = p.timestamp; //Om senaste användare är en bot if(plbot.Contains("Användare:"+p.lastUser)) { //Hämta versionerna för sidan PageList plh = new PageList(site); plh.FillFromPageHistoryEx(p.title, 50, true); //Sök i versionerna foreach(Page ph in plh) { //Om denna användare inte är bot if(!plbot.Contains("Användare:"+ph.lastUser)) { //Hämta tiden och avbryt sökning time = ph.timestamp; break; } } } string datum = ""; foreach(string s1 in p.GetTemplateParameter("Brister" , "datum")) datum += s1; if(islongdate(datum)) { //HÄmtar den mall som heter "Brister" string mallen = ""; foreach(string s3 in p.GetTemplatesWithParams()) { if(s3.ToLower().StartsWith("brister")) { mallen = s3; break; } } string orginalmallen = mallen; //Rensar från luft och radbrytningar som försvårar analysen av mallen int s1 = 0; int s2 = 0; do { s1 = mallen.Length; mallen = mallen.Replace(" =","="); mallen = mallen.Replace("= ","="); mallen = mallen.Replace("\n",""); s2 = mallen.Length; }while(s1 != s2); string[] mallArr = mallen.Split('|'); //Putsar lite till for(int i = 1; i<mallArr.Length ;i++) { mallArr[i] = mallArr[i].Trim(); } //Hämtar standardmotivering ur parameter 'motivering' string stdmotiv = ""; foreach(string s3 in p.GetTemplateParameter("Brister" , "motivering")) stdmotiv = s3; //Om den var tom, se parameter 'Motivering' if(stdmotiv=="") { foreach(string s3 in p.GetTemplateParameter("Brister" , "Motivering")) stdmotiv = s3; } //Om även den var tom, sök parameter {{{1}}} if(stdmotiv == "") { for(int i = 1; i<mallArr.Length; i++) { //Om detta är en parameter utan namn if(!isparameterwithname(mallArr[i])) { //Om parametern är ngt man känner igen, så hämtas det inte som parameter string motiv1 = ""; foreach(string s3 in pstöd.GetTemplateParameter("Användare:Innocent bot/Mallar", mallArr[i].ToLower())) motiv1 = s3; if(motiv1 == "") { stdmotiv=mallArr[i]; mallArr[i]=""; } break; } } } //Om fortfarande ingen motivering, hämta standard från "Användare:Innocent bot" if(stdmotiv == "") { foreach(string s3 in pstöd.GetTemplateParameter("Användare:Innocent bot/Standardmotivering", "0")) stdmotiv = s3; } //Räknar antal aktiva parametrar int antalparametrar = 0; for(int i = 1; i<mallArr.Length ;i++) { //motiveringsparametern och datum ska inte räknas if(!mallArr[i].ToLower().StartsWith("motivering=") && !mallArr[i].ToLower().StartsWith("datum=")) { //Parametern ska ha ngt innehåll if(mallArr[i].Length>0) { //Parametrar med namn, måste kontrolleras om de har ngt värde if(isparameterwithname(mallArr[i])) { if(mallArr[i].Length != mallArr[i].IndexOf("=")+1) antalparametrar++; } else antalparametrar++; } } } //Hämtar vilken väntetid mellan senaste redigering och extrahering som gäller för just detta antal parametrar int väntetid = 15; foreach(string s3 in pstöd.GetTemplateParameter("Användare:Innocent bot/Väntetid", antalparametrar.ToString())) väntetid = int.Parse(s3); DateTime nu = DateTime.Now; TimeSpan skillnad = nu.Subtract(time); double antalDagar = skillnad.TotalDays; string deffen = ""; foreach(string s3 in pstöd.GetTemplateParameter("Användare:Innocent bot/Mallar", "default")) deffen = s3; if(antalDagar > väntetid) { string editcom = "Bot byter [[Mall:Brister]] mot "; int n = 0; bool residual = false; string rest = "{{Brister|"; string ersättning = ""; for(int i = 1; i<mallArr.Length;i++) { if(!mallArr[i].ToLower().StartsWith("motivering=") && !mallArr[i].ToLower().StartsWith("datum=")) { if(mallArr[i].Length>0) { if(isparameterwithname(mallArr[i])) { string param = mallArr[i].Substring(0,mallArr[i].IndexOf("=")).ToLower(); string värdet = mallArr[i].Substring(mallArr[i].IndexOf("=")+1); string mall1 = ""; foreach(string s3 in pstöd.GetTemplateParameter("Användare:Innocent bot/Mallar", param)) mall1 = s3; if(mall1 != "") { if(n > 0) editcom += ", "; editcom += mall1; n++; ersättning += "{{"+mall1+"|"; if(värdet.ToLower()=="ja") ersättning += stdmotiv +"|datum="+datum.Substring(0,7)+"}}\n"; else ersättning += värdet +"|datum="+datum.Substring(0,7)+"}}\n"; } else { residual = true; rest += mallArr[i] +"|"; } } else { string param = mallArr[i].ToLower(); string mall1 = ""; foreach(string s3 in pstöd.GetTemplateParameter("Användare:Innocent bot/Mallar", param)) mall1 = s3; if(mall1 != "") { if(n > 0) editcom += ", "; editcom += mall1; n++; ersättning += "{{"+mall1+"|"; ersättning += stdmotiv +"|datum="+datum.Substring(0,7)+"}}\n"; } else { residual = true; rest += mallArr[i] +"|"; } } } } } if(n==0) { ersättning += "{{"+deffen+"|"+stdmotiv+"|datum="+datum.Substring(0,7)+"}}\n"; editcom += deffen; } if(residual) { ersättning += rest+"problemparameter|datum="+datum+"}}\n"; editcom += ". Tillsyn behövs!"; } p.text = p.text.Replace("{{"+orginalmallen+"}}", ersättning); Bot.editComment = editcom; Bot.isMinorEdit = !residual; p.Save(); Thread.Sleep(7000); Console.WriteLine(ersättning); Console.WriteLine(editcom); } } } } }