Hoppa till innehållet

Wikipedia:Projekt DotNetWikiBot Framework/Innocent bot/Brister

Från Wikipedia
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);
				}
			}
		}
	}
}