Hoppa till innehållet

Wikipedia:Projekt DotNetWikiBot Framework/Innocent datumbot/Mallhantering

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 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;
		}
	}
}