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