MediaWiki:Common.js: Difference between revisions

From Official Factorio Wiki
Jump to navigation Jump to search
(made updating techs newcontent into functions)
(Scripting, now with functions//Look mom, I cleaned my code)
Line 6: Line 6:
var version = "0.15.12";
var version = "0.15.12";


function UpdateTechPara(Para, PagePara, Name, NewPageParaStart, Length) {  //also needs TechName, version, Summary, NewContent!!
 
var Para = "";
function getInputPara(Item, Search, Length, Name, ItemName) {
var ParaStart = Item.search(Search) + Length; //finds the beginning of the para, is after para-name
if (ParaStart < Length) {
console.log(ItemName + ": No " + Name + " found.");
Para = "";
} else {
var ParaCut = Item.slice(ParaStart);  //lets the string begin after the parameter name
var ParaEnd = ParaCut.search(/\||}}/); //finds the end of the parameter definition
if (ParaEnd < 1) { //Para ends at para-end if it exists
Para = ParaCut;
} else {
Para = ParaCut.slice(0, ParaEnd);
}
}
return Para;
};
 
 
function getPage(Title) { //returns content
$.ajax({
url: 'https://wiki.factorio.com/api.php',
data: {
format: 'json',
action: 'query',
titles: Title,
prop: 'revisions',
rvprop: 'content'
},
async: false,
dataType: 'json',
type: 'GET',
success: function( data ) {
var pages = data.query.pages;
var revisions = pages[Object.keys(pages)[0]].revisions[0];
var content = revisions[Object.keys(revisions)[2]];
var title = pages[Object.keys(pages)[0]].title;
},
error: function( xhr ) {
alert( 'Error: Request failed.' );
content = "";
}
});
return content;
};
 
var PagePara = "";
function getOldPara(PageParaStart, Length, Name, ItemName) { //also uses OldContent
if (PageParaStart < Length) { //if the start is less than the length of the para name (Name) then the search was unsuccessful
console.log(ItemName + ": No " + Name + " found on page.");
PagePara = "";
} else {
var PageParaCut = OldContent.slice(PageParaStart);
PageParaStart = PageParaCut.search(/\w/);
PageParaCut = PageParaCut.slice(PageParaStart); //removes anything before the parameter that does not belong there, like = and \s
var PageParaEnd = PageParaCut.search(/\||}}/); //finds the end of the parameter definition
if (PageConsumersEnd < 1) { //Para ends at para-end if it exists
PagePara = PageParaCut;
} else {
PagePara = PageParaCut.slice(0, PagePara);
}
}
return PagePara;
};
 
 
function UpdatePara(Para, PagePara, Name, NewPageParaStart, Length, ItemName) {  //also needs version, Summary, NewContent!!
if (PagePara.length > 0) {
if (PagePara.length > 0) {
var NewPageParaCut = NewContent.slice(NewPageParaStart); //lets the string being after the parameter name
var NewPageParaCut = NewContent.slice(NewPageParaStart); //lets the string being after the parameter name
Line 12: Line 79:
if (Para.length > 0) {
if (Para.length > 0) {
NewContent = NewContent.slice(0, NewPageParaStart) + " = " + Para + "\n" + NewContent.slice(NewPageParaEnd);
NewContent = NewContent.slice(0, NewPageParaStart) + " = " + Para + "\n" + NewContent.slice(NewPageParaEnd);
console.log("Replaced " + TechName + " " + Name + ".");
console.log("Replaced " + ItemName + " " + Name + ".");
Summary = Summary + "Updated " + Name + " to " + version + ". ";
Summary = Summary + "Updated " + Name + " to " + version + ". ";
} else {
} else {
NewPageParaStart = NewPageParaStart - Length; //makes it so that the start of the para string if before the name, so that the name also gets deleted
NewPageParaStart = NewPageParaStart - Length; //makes it so that the start of the para string if before the name, so that the name also gets deleted
NewContent = NewContent.slice(0, NewPageParaStart) + NewContent.slice(NewPageParaEnd); //removes what is between parastart and paraend from newcontent
NewContent = NewContent.slice(0, NewPageParaStart) + NewContent.slice(NewPageParaEnd); //removes what is between parastart and paraend from newcontent
console.log("Removed " + TechName + " " + Name + ". ");
console.log("Removed " + ItemName + " " + Name + ". ");
Summary = Summary + "Removed " + Name + ". ";
Summary = Summary + "Removed " + Name + ". ";
}
}
Line 23: Line 90:
var InfoboxStart = NewContent.search(/{{Infobox/i) + 9; //finds the start of the infobox, excludes {{infobox from the resulting string
var InfoboxStart = NewContent.search(/{{Infobox/i) + 9; //finds the start of the infobox, excludes {{infobox from the resulting string
NewContent = NewContent.slice(0, InfoboxStart) + "\n|" + Name + " = " + Para + NewContent.slice(InfoboxStart);
NewContent = NewContent.slice(0, InfoboxStart) + "\n|" + Name + " = " + Para + NewContent.slice(InfoboxStart);
console.log("Added " + TechName + " " + Name + ". ");
console.log("Added " + ItemName + " " + Name + ". ");
Summary = Summary + "Added " + Name + ". ";
Summary = Summary + "Added " + Name + ". ";
}
}
}
};
 
 
function EditPage(Title, ItemName) { //also uses Summary, globalToken, NewContent
$.ajax({
url: 'https://wiki.factorio.com/api.php',
data: {
format: 'json',
action: 'edit',
title: Title,
text: NewContent,
token: globalToken,
summary: Summary,
bot: true,
nocreate: true
},
dataType: 'json',
type: 'POST',
success: function( data ) {
  console.log("Updated " + ItemName);
},
error: function( xhr ) {
console.log("Failed to update " + ItemName);
}
});
};




Line 57: Line 149:
if (ItemName == InfoboxName) {
if (ItemName == InfoboxName) {
console.log("Removed " + ItemName + " from output.");
console.log("Removed " + ItemName + " from output.");
ItemName = "";
return;
}
}
})
})
if (ItemName.length > 0) {
var Recipe = getInputPara(Recipes, "\\|recipe = ", 10, "recipe", ItemName);
var RecipeStart = Recipes.search("\\|recipe = ") + 10;
var TotalRaw = getInputPara(Recipes, "\\|total-raw = ", 13, "total-raw", ItemName);
if (RecipeStart < 10) {
var ExpRecipe = getInputPara(Recipes, "\\|expensive-recipe = ", 20, "expensive-recipe", ItemName);
console.log(ItemName + ": No normal recipe found.");
var ExpTotalRaw = getInputPara(Recipes, "\\|expensive-total-raw = ", 23, "expensive-total-raw", ItemName);
var Recipe = "";
} else {
//remove whitespace
var RecipeCut = Recipes.slice(RecipeStart);
Recipe = Recipe.trim();
var RecipeEnd = RecipeCut.search(/\||}}/);
TotalRaw = TotalRaw.trim();
if (RecipeEnd < 1) {
ExpRecipe = ExpRecipe.trim();
var Recipe = RecipeCut;
ExpTotalRaw = ExpTotalRaw.trim();
} else {
var Recipe = RecipeCut.slice(0, RecipeEnd);
}
}
var TotalRawStart = Recipes.search("\\|total-raw = ") + 13;
if (TotalRawStart < 13) {
console.log(ItemName + ": No total raw found.");
var TotalRaw = "";
} else {
var TotalRawCut = Recipes.slice(TotalRawStart);
var TotalRawEnd = TotalRawCut.search(/\||}}/);
if (TotalRawEnd < 1) {
var TotalRaw = TotalRawCut;
} else {
var TotalRaw = TotalRawCut.slice(0, TotalRawEnd);
}
}
var ExpRecipeStart = Recipes.search("\\|expensive-recipe = ") + 20;
if (ExpRecipeStart < 20) {
console.log(ItemName + ": No expensive recipe found.");
var ExpRecipe = "";
} else {
var ExpRecipeCut = Recipes.slice(ExpRecipeStart);
var ExpRecipeEnd = ExpRecipeCut.search(/\||}}/);
if (ExpRecipeEnd < 1) {
var ExpRecipe = ExpRecipeCut;
} else {
var ExpRecipe = ExpRecipeCut.slice(0, ExpRecipeEnd);
}
}
var ExpTotalRawStart = Recipes.search("\\|expensive-total-raw = ") + 23;
if (ExpTotalRawStart < 23) {
console.log(ItemName + ": No expensive total raw found.");
var ExpTotalRaw = "";
} else {
var ExpTotalRawCut = Recipes.slice(ExpTotalRawStart);
var ExpTotalRawEnd = ExpTotalRawCut.search(/\||}}/);
if (ExpTotalRawEnd < 1) {
var ExpTotalRaw = ExpTotalRawCut;
} else {
var ExpTotalRaw = ExpTotalRawCut.slice(0, ExpTotalRawEnd);
}
}
//remove whitespace
//ItemName = ItemName.trim(); this is done further up for asthestics
Recipe = Recipe.trim();
TotalRaw = TotalRaw.trim();
ExpRecipe = ExpRecipe.trim();
ExpTotalRaw = ExpTotalRaw.trim();
//remove duplicate recipes, but only if the recipe actually exists
//remove duplicate recipes, but only if the recipe actually exists
if ((ExpTotalRaw == ExpRecipe) && (ExpTotalRaw.length > 0)) {
if ((ExpTotalRaw == ExpRecipe) && (ExpTotalRaw.length > 0)) {
ExpTotalRaw = "";
ExpTotalRaw = "";
console.log(ItemName + ": Removed expensive-total-raw because it was a duplicate of expensive-recipe.");
console.log(ItemName + ": Removed expensive-total-raw because it was a duplicate of expensive-recipe.");
} else if ((ExpTotalRaw == TotalRaw) && (ExpTotalRaw.length > 0)) {
} else if ((ExpTotalRaw == TotalRaw) && (ExpTotalRaw.length > 0)) {
ExpTotalRaw = "";
ExpTotalRaw = "";
console.log(ItemName + ": Removed expensive-total-raw because it was a duplicate of total-raw.");
console.log(ItemName + ": Removed expensive-total-raw because it was a duplicate of total-raw.");
}
}
if ((ExpRecipe == Recipe) && (ExpRecipe.length > 0)) {
if ((ExpRecipe == Recipe) && (ExpRecipe.length > 0)) {
ExpRecipe = "";
ExpRecipe = "";
console.log(ItemName + ": Removed expensive-recipe because it was a duplicate of recipe.");
console.log(ItemName + ": Removed expensive-recipe because it was a duplicate of recipe.");
}
}
if ((TotalRaw == Recipe) && (TotalRaw.length > 0)) {
if ((TotalRaw == Recipe) && (TotalRaw.length > 0)) {
TotalRaw = "";
TotalRaw = "";
console.log(ItemName + ": Removed total-raw because it was a duplicate of recipe.");
console.log(ItemName + ": Removed total-raw because it was a duplicate of recipe.");
}
}
}
var OldContent = "";
if (ItemName.length > 0) {
//get page content of the item -> OldContent
//get page content of the item -> OldContent
var OldContent = getPage(ItemName + "/infobox")
$.ajax({
if (OldContent.length = 0) {
url: 'https://wiki.factorio.com/api.php',
console.log("No " + ItemName + " page found.");
data: {
return;
format: 'json',
action: 'query',
titles: ItemName + '/infobox',
prop: 'revisions',
rvprop: 'content'
},
async: false,
dataType: 'json',
type: 'GET',
success: function( data ) {
var pages = data.query.pages;
var revisions = pages[Object.keys(pages)[0]].revisions[0];
OldContent = revisions[Object.keys(revisions)[2]];
var title = pages[Object.keys(pages)[0]].title;
},
error: function( xhr ) {
alert( 'Error: Request failed.' );
OldContent = "";
}
});
} else {
OldContent = "";
}
}
if (OldContent.length > 0) {
//find recipes in page (OldContent)
//find recipes in page (OldContent)
var PageRecipeStart = OldContent.search(/(\s|\|)recipe/) + 7;
var PageRecipeStart = OldContent.search(/(\s|\|)recipe/) + 7;
var PageRecipe = getOldPara(PageRecipeStart, 7, "recipe", ItemName);
if (PageRecipeStart < 7) {
 
console.log(ItemName + ": No normal recipe found on page.");
var PageTotalRawStart = OldContent.search(/(\s|\|)total-raw/) + 10;
var PageRecipe = "";
var PageTotalRaw = getOldPara(PageTotalRawStart, 10, "total-raw", ItemName);
} else {
var PageRecipeCut = OldContent.slice(PageRecipeStart);
var PageExpRecipeStart = OldContent.search(/(\s|\|)expensive-recipe/) + 17;
PageRecipeStart = PageRecipeCut.search(/\w/);
var PageExpRecipe = getOldPara(PageExpRecipeStart, 17, "expensive-recipe", ItemName);
PageRecipeCut = PageRecipeCut.slice(PageRecipeStart); //removes anything before the recipe that does not belong there, like = and \s
var PageRecipeEnd = PageRecipeCut.search(/\||}}/);
if (PageRecipeEnd < 1) {
var PageRecipe = PageRecipeCut;
} else {
var PageRecipe = PageRecipeCut.slice(0, PageRecipeEnd);
}
}


var PageTotalRawStart = OldContent.search(/(\s|\|)total-raw/) + 10;
var PageExpTotalRawStart = OldContent.search(/(\s|\|)expensive-total-raw/) + 20;
if (PageTotalRawStart < 10) {
var PageExpTotalRaw = getOldPara(PageExpTotalRawStart, 20, "expensive-total-raw", ItemName);
console.log(ItemName + ": No total raw found on page.");
var PageTotalRaw = "";
} else {
var PageTotalRawCut = OldContent.slice(PageTotalRawStart);
PageTotalRawStart = PageTotalRawCut.search(/\w/);
PageTotalRawCut = PageTotalRawCut.slice(PageTotalRawStart); //removes anything before the recipe that does not belong there, like = and \s
var PageTotalRawEnd = PageTotalRawCut.search(/\||}}/);
if (PageTotalRawEnd < 1) {
var PageTotalRaw = PageTotalRawCut;
} else {
var PageTotalRaw = PageTotalRawCut.slice(0, PageTotalRawEnd);
}
}
var PageExpRecipeStart = OldContent.search(/(\s|\|)expensive-recipe/) + 17;
if (PageExpRecipeStart < 17) {
console.log(ItemName + ": No expensive recipe found on page.");
var PageExpRecipe = "";
} else {
var PageExpRecipeCut = OldContent.slice(PageExpRecipeStart);
PageExpRecipeStart = PageExpRecipeCut.search(/\w/);
PageExpRecipeCut = PageExpRecipeCut.slice(PageExpRecipeStart); //removes anything before the recipe that does not belong there, like = and \s
var PageExpRecipeEnd = PageExpRecipeCut.search(/\||}}/);
if (PageExpRecipeEnd < 1) {
var PageExpRecipe = PageExpRecipeCut;
} else {
var PageExpRecipe = PageExpRecipeCut.slice(0, PageExpRecipeEnd);
}
}


var PageExpTotalRawStart = OldContent.search(/(\s|\|)expensive-total-raw/) + 20;
if (PageExpTotalRawStart < 20) {
//remove whitespace
console.log(ItemName + ": No expensive total raw found on page.");
PageRecipe = PageRecipe.trim();
var PageExpTotalRaw = "";
PageTotalRaw = PageTotalRaw.trim();
} else {
PageExpRecipe = PageExpRecipe.trim();
var PageExpTotalRawCut = OldContent.slice(PageExpTotalRawStart);
PageExpTotalRaw = PageExpTotalRaw.trim();
PageExpTotalRawStart = PageExpTotalRawCut.search(/\w/);
PageExpTotalRawCut = PageExpTotalRawCut.slice(PageExpTotalRawStart); //removes anything before the recipe that does not belong there, like = and \s
var Summary = "";
var PageExpTotalRawEnd = PageExpTotalRawCut.search(/\||}}/);
if (PageExpTotalRawEnd < 1) {
//change page if anything is different (this INCLUDES different formatting)
var PageExpTotalRaw = PageExpTotalRawCut;
var NewContent = "";
} else {
if ((PageRecipe == Recipe) && (PageTotalRaw == TotalRaw) && (PageExpRecipe == ExpRecipe) && (PageExpTotalRaw == ExpTotalRaw)) {
var PageExpTotalRaw = PageExpTotalRawCut.slice(0, PageExpTotalRawEnd);
console.log(ItemName + " page was not changed.")
}
} else {
if (PageRecipe != Recipe) {
NewContent = OldContent;
var NewPageRecipeStart = NewContent.search(/(\s|\|)recipe/) + 7;
UpdatePara(Recipe, PageRecipe, "recipe", NewPageRecipeStart, 7, ItemName);
}
}
if (PageTotalRaw != TotalRaw) {
//remove whitespace
if (NewContent.length == 0) {
PageRecipe = PageRecipe.trim();
NewContent = OldContent
PageTotalRaw = PageTotalRaw.trim();
PageExpRecipe = PageExpRecipe.trim();
PageExpTotalRaw = PageExpTotalRaw.trim();
var Summary = "";
//change page if anything is different (this INCLUDES different formatting)
var NewContent = "";
if ((PageRecipe == Recipe) && (PageTotalRaw == TotalRaw) && (PageExpRecipe == ExpRecipe) && (PageExpTotalRaw == ExpTotalRaw)) {
console.log(ItemName + " page was not changed.")
} else {
if (PageRecipe != Recipe) {
if (PageRecipe.length > 0) {
var NewPageRecipeStart = OldContent.search(/(\s|\|)recipe/) + 7;
var NewPageRecipeCut = OldContent.slice(NewPageRecipeStart);
var NewPageRecipeEnd = NewPageRecipeCut.search(/\||}}/);
var ActualNewPageRecipeEnd = NewPageRecipeStart + NewPageRecipeEnd;
if (Recipe.length > 0) {
NewContent = OldContent.slice(0, NewPageRecipeStart) + " = " + Recipe + "\n" + OldContent.slice(ActualNewPageRecipeEnd);
console.log("Replaced " + ItemName + " recipe.");
Summary = Summary + "Updated recipe to " + version + ". ";
} else {
NewPageRecipeStart = NewPageRecipeStart - 7;
NewContent = OldContent.slice(0, NewPageRecipeStart) + OldContent.slice(ActualNewPageRecipeEnd);
console.log("Removed " + ItemName + " recipe.");
Summary = Summary + "Removed recipe. ";
}
} else if (Recipe.length > 0) {
var InfoboxStart = OldContent.search(/{{Infobox/i) + 9;
NewContent = OldContent.slice(0, InfoboxStart) + "\n|recipe = " + Recipe + OldContent.slice(InfoboxStart);
console.log("Added " + ItemName + " recipe to the start of the infobox.");
Summary = Summary + "Added recipe. ";
}
}
}
if (PageTotalRaw != TotalRaw) {
var NewPageTotalRawStart = NewContent.search(/(\s|\|)total-raw/) + 10;
if (NewContent.length == 0) {
UpdatePara(TotalRaw, PageTotalRaw, "total-raw", NewPageTotalRawStart, 10, ItemName);
NewContent = OldContent
}
}
if (PageExpRecipe != ExpRecipe) {
if (PageTotalRaw.length > 0) {
if (NewContent.length == 0) {
var NewPageTotalRawStart = NewContent.search(/(\s|\|)total-raw/) + 10;
NewContent = OldContent
var NewPageTotalRawCut = NewContent.slice(NewPageTotalRawStart);
var NewPageTotalRawEnd = NewPageTotalRawCut.search(/\||}}/);
var ActualNewPageTotalRawEnd = NewPageTotalRawStart + NewPageTotalRawEnd;
if (TotalRaw.length > 0) {
NewContent = NewContent.slice(0, NewPageTotalRawStart) + " = " + TotalRaw + "\n" + NewContent.slice(ActualNewPageTotalRawEnd);
console.log("Replaced " + ItemName + " total-raw.");
Summary = Summary + "Updated total-raw to " + version + ". ";
} else {
NewPageTotalRawStart = NewPageTotalRawStart - 10;
NewContent = NewContent.slice(0, NewPageTotalRawStart) + NewContent.slice(ActualNewPageTotalRawEnd);
console.log("Removed " + ItemName + " total-raw. ");
Summary = Summary + "Removed total-raw.";
}
} else if (TotalRaw.length > 0) {
var InfoboxStart = NewContent.search(/{{Infobox/i) + 9;
NewContent = NewContent.slice(0, InfoboxStart) + "\n|total-raw = " + TotalRaw + NewContent.slice(InfoboxStart);
console.log("Added " + ItemName + " total-raw to the start of the infobox.");
Summary = Summary + "Added total-raw. ";
}
}
}
if (PageExpRecipe != ExpRecipe) {
var NewPageExpRecipeStart = NewContent.search(/(\s|\|)expensive-recipe/) + 17;
if (NewContent.length == 0) {
UpdatePara(ExpRecipe, PageExpRecipe, "expensive-recipe", NewPageExpRecipeStart, 17, ItemName);
NewContent = OldContent
}
}
if (PageExpTotalRaw != ExpTotalRaw) {
if (PageExpRecipe.length > 0) {
if (NewContent.length == 0) {
var NewPageExpRecipeStart = NewContent.search(/(\s|\|)expensive-recipe/) + 17;
NewContent = OldContent
var NewPageExpRecipeCut = NewContent.slice(NewPageExpRecipeStart);
var NewPageExpRecipeEnd = NewPageExpRecipeCut.search(/\||}}/);
var ActualNewPageExpRecipeEnd = NewPageExpRecipeStart + NewPageExpRecipeEnd;
if (ExpRecipe.length > 0) {
NewContent = NewContent.slice(0, NewPageExpRecipeStart) + " = " + ExpRecipe + "\n" + NewContent.slice(ActualNewPageExpRecipeEnd);
console.log("Replaced " + ItemName + " expensive-recipe.");
Summary = Summary + "Updated expensive-recipe to " + version + ". ";
} else {
NewPageExpRecipeStart = NewPageExpRecipeStart - 17;
NewContent = NewContent.slice(0, NewPageExpRecipeStart) + NewContent.slice(ActualNewPageExpRecipeEnd);
console.log("Removed " + ItemName + " expensive-recipe.");
Summary = Summary + "Removed expensive-recipe. ";
}
} else if (ExpRecipe.length > 0) {
var InfoboxStart = NewContent.search(/{{Infobox/i) + 9;
NewContent = NewContent.slice(0, InfoboxStart) + "\n|expensive-recipe = " + ExpRecipe + NewContent.slice(InfoboxStart);
console.log("Added " + ItemName + " expensive-recipe to the start of the infobox.");
Summary = Summary + "Added expensive-recipe. ";
}
}
if (PageExpTotalRaw != ExpTotalRaw) {
if (NewContent.length == 0) {
NewContent = OldContent
}
if (PageExpTotalRaw.length > 0) {
var NewPageExpTotalRawStart = NewContent.search(/(\s|\|)expensive-total-raw/) + 20;
var NewPageExpTotalRawCut = NewContent.slice(NewPageExpTotalRawStart);
var NewPageExpTotalRawEnd = NewPageExpTotalRawCut.search(/\||}}/);
var ActualNewPageExpTotalRawEnd = NewPageExpTotalRawStart + NewPageExpTotalRawEnd;
if (ExpTotalRaw.length > 0) {
NewContent = NewContent.slice(0, NewPageExpTotalRawStart) + " = " + ExpTotalRaw + "\n" + NewContent.slice(ActualNewPageExpTotalRawEnd);
console.log("Replaced " + ItemName + " expensive-total-raw.");
Summary = Summary + "Updated expensive-total-raw to " + version + ". ";
} else {
NewPageExpTotalRawStart = NewPageExpTotalRawStart - 20;
NewContent = NewContent.slice(0, NewPageExpTotalRawStart) + NewContent.slice(ActualNewPageExpTotalRawEnd);
console.log("Removed " + ItemName + " expensive-total-raw.");
Summary = Summary + "Removed expensive-total-raw. ";
}
} else if (ExpTotalRaw.length > 0) {
var InfoboxStart = NewContent.search(/{{Infobox/i) + 9;
NewContent = NewContent.slice(0, InfoboxStart) + "\n|expensive-total-raw = " + ExpTotalRaw +  NewContent.slice(InfoboxStart);
console.log("Added " + ItemName + " expensive-total-raw to the start of the infobox.");
Summary = Summary + "Added expensive-total-raw. ";
}
}
}
var NewPageExpTotalRawStart = NewContent.search(/(\s|\|)expensive-total-raw/) + 20;
UpdatePara(ExpTotalRaw, PageExpTotalRaw, "expensive-total-raw", NewPageExpTotalRawStart, 20, ItemName);
}
}
//alright, NewContent should be defined, change page:
}
if (NewContent.length > 0) {
//alright, NewContent should be defined, change page:
$.ajax({
if (NewContent.length > 0) {
url: 'https://wiki.factorio.com/api.php',
EditPage(ItemName + "/infobox", ItemName);
data: {
}
format: 'json',
action: 'edit',
title: ItemName + '/infobox',
text: NewContent,
token: globalToken,
summary: Summary,
bot: true,
nocreate: true
},
async: false,
dataType: 'json',
type: 'POST',
success: function( data ) {
  console.log("Updated " + ItemName);
},
error: function( xhr ) {
console.log("Failed to update " + ItemName);
}
});
}
}
}
}


$("#ConsumerUpdate").click(function(){
$("#ConsumerUpdate").click(function(){
     getConsumers();
     getConsumersAndStackSize();
});
});


function getConsumers() {
function getConsumersAndStackSize() {
getUserGroup();
getUserGroup();
if (UserGroup.some(isBot) == true) {
if (UserGroup.some(isBot) == false) {
var ItemInput = prompt("Please enter the consumers");
return;
if (ItemInput != null) {
}
getToken();
var ItemInput = prompt("Please enter the consumers and the stack-sizes");
var Items = ItemInput.split(/\s\s/g);
if (ItemInput != null) {
console.log(Items.length + " Items detected");
getToken();
Items.forEach(UpdateInfoboxWithConsumers);
var Items = ItemInput.split(/\s\s/g);
}
console.log(Items.length + " Items detected");
Items.forEach(UpdateInfoboxWithConsumersAndStackSize);
}
}
};
};


function UpdateInfoboxWithConsumers(Item) {
function UpdateInfoboxWithConsumersAndStackSize)(Item) {
var ItemNameEnd = Item.search("\\|");
var ItemNameEnd = Item.search("\\|");
var ItemName = Item.slice(0, ItemNameEnd);
var ItemName = Item.slice(0, ItemNameEnd);
ItemName = ItemName.trim();
ItemName = ItemName.trim();
//Remove Itemnames if the item does not have a page on the wiki, so that the item is removed from the output
//Remove Items that don't have Infoboxes on the wiki
NoInfobox.forEach(function(InfoboxName) {
NoInfobox.forEach(function(InfoboxName) {
if (ItemName == InfoboxName) {
if (ItemName == InfoboxName) {
console.log("Removed " + ItemName + " from output.");
console.log("Removed " + ItemName + " from output.");
ItemName = "";
return;
}
}
})
})
if (ItemName.length > 0) {
var Consumers = getInputPara(Item, "\\|consumers = ", 13, "consumers", ItemName);
var ConsumersStart = Item.search("\\|consumers = ") + 13;
var StackSize = getInputPara(Item, "\\|stack-size = ", 14, "stack-size", ItemName);
var Consumers = Item.slice(ConsumersStart);
 
Consumers = Consumers.trim();
Consumers = Consumers.trim();
StackSize = StackSize.trim();
//get page content of the item -> OldContent
var OldContent = getPage(ItemName + '/infobox')
if (OldContent.length = 0) {
console.log("No " + ItemName + " page found.");
return;
}
}
//find recipes in page (OldContent)
var PageConsumersStart = OldContent.search(/(\s|\|)consumers/) + 10;
var PageConsumers = getOldPara(PageConsumersStart, 10, "consumers", ItemName);
var OldContent = "";
var PageStackSizeStart = OldContent.search(/(\s|\|)stack-size/) + 11;
var PageStackSize = getOldPara(PageStackSizeStart, 11, "stack-size", ItemName);
if (ItemName.length > 0) {
//get page content of the item -> OldContent
PageConsumers = PageConsumers.trim();
$.ajax({
PageStackSize = PageStackSize.trim();
url: 'https://wiki.factorio.com/api.php',
data: {
var Summary = "";
format: 'json',
action: 'query',
//change page if anything is different (this INCLUDES different formatting)
titles: ItemName + '/infobox',
var NewContent = "";
prop: 'revisions',
if ((PageConsumers == Consumers) && (PageStackSize == StackSize)) {
rvprop: 'content'
console.log(ItemName + " page was not changed.")
},
async: false,
dataType: 'json',
type: 'GET',
success: function( data ) {
var pages = data.query.pages;
var revisions = pages[Object.keys(pages)[0]].revisions[0];
OldContent = revisions[Object.keys(revisions)[2]];
var title = pages[Object.keys(pages)[0]].title;
},
error: function( xhr ) {
alert( 'Error: Request failed.' );
OldContent = "";
}
});
} else {
} else {
OldContent = "";
if (PageConsumers != Consumers) {
}
NewContent = OldContent;
var NewPageConsumersStart = NewContent.search(/(\s|\|)consumers/) + 10;
if (OldContent.length > 0) {
UpdatePara(Consumers, PageConsumers, "consumers", NewPageConsumersStart, 10, ItemName);
//find recipes in page (OldContent)
var PageConsumersStart = OldContent.search(/(\s|\|)consumers/) + 10;
if (PageConsumersStart < 10) {
console.log(ItemName + ": No consumers found on page.");
var PageConsumers = "";
} else {
var PageConsumersCut = OldContent.slice(PageConsumersStart);
PageConsumersStart = PageConsumersCut.search(/\w/);
PageConsumersCut = PageConsumersCut.slice(PageConsumersStart); //removes anything before the recipe that does not belong there, like = and \s
var PageConsumersEnd = PageConsumersCut.search(/\||}}/);
if (PageConsumersEnd < 1) {
var PageConsumers = PageConsumersCut;
} else {
var PageConsumers = PageConsumersCut.slice(0, PageConsumersEnd);
}
}
}
if (PageStackSize != StackSize) {
PageConsumers = PageConsumers.trim();
if (NewContent.length == 0) {
NewContent = OldContent;
var Summary = "";
//change page if anything is different (this INCLUDES different formatting)
var NewContent = "";
if (PageConsumers == Consumers) {
console.log(ItemName + " page was not changed.")
} else {
if (PageConsumers.length > 0) {
var NewPageConsumersStart = OldContent.search(/(\s|\|)consumers/) + 10;
var NewPageConsumersCut = OldContent.slice(NewPageConsumersStart);
var NewPageConsumersEnd = NewPageConsumersCut.search(/\||}}/);
var ActualNewPageConsumersEnd = NewPageConsumersStart + NewPageConsumersEnd;
NewContent = OldContent.slice(0, NewPageConsumersStart) + " = " + Consumers + "\n" + OldContent.slice(ActualNewPageConsumersEnd) //I'm just assuming that PageRecipeEnd must exist because the infobox HAS to end with }}
console.log("Replaced " + ItemName + " consumers.");
Summary = Summary + "Updated consumers to " + version + ". ";
} else if (Consumers.length > 0) {
var InfoboxStart = OldContent.search(/{{Infobox/i) + 9;
NewContent = OldContent.slice(0, InfoboxStart) + "|consumers = " + Consumers + "\n" + OldContent.slice(InfoboxStart)
console.log("Added " + ItemName + " consumers to the start of the infobox.");
Summary = Summary + "Added consumers. ";
}
}
var NewPageStackSizeStart = NewContent.search(/(\s|\|)stack-size/) + 11;
UpdatePara(StackSize, PageStackSize, "stack-size", NewPageStackSizeStart, 11, ItemName);
}
}
}
//alright, NewContent should be defined, change page:
if (NewContent.length > 0) {
$.ajax({
url: 'https://wiki.factorio.com/api.php',
data: {
format: 'json',
action: 'edit',
title: ItemName + '/infobox',
text: NewContent,
token: globalToken,
summary: Summary,
bot: true,
nocreate: true
},
async: false,
dataType: 'json',
type: 'POST',
success: function( data ) {
  console.log("Updated " + ItemName);
},
error: function( xhr ) {
console.log("Failed to update " + ItemName);
}
});
}
//alright, NewContent should be defined, change page:
if (NewContent.length > 0) {
EditPage(ItemName + "/infobox", ItemName);
}
}
}
}
Line 548: Line 357:
TechName = TechName.trim();
TechName = TechName.trim();
var CostStart = Tech.search("\\|cost = ") + 8;
if (CostStart < 8) {
console.log(TechName + ": No cost found.");
var Cost = "";
} else {
var CostCut = Tech.slice(CostStart);
var CostEnd = CostCut.search(/\||}}/);
if (CostEnd < 1) {
var Cost = CostCut;
} else {
var Cost = CostCut.slice(0, CostEnd);
}
}
var CostMultiStart = Tech.search("\\|cost-multiplier = ") + 19;
var Cost = getInputPara(Tech, "\\|cost = ", 8, "cost", TechName);
if (CostMultiStart < 19) {
var CostMulti = getInputPara(Tech, "\\|cost-multiplier = ", 19, "cost-multiplier", TechName);
console.log(TechName + ": No cost-multiplier found.");
var ExpCostMulti = getInputPara(Tech, "\\|expensive-cost-multiplier = ", 29, "expensive-cost-multiplier", TechName);
var CostMulti = "";
var ReqTech = getInputPara(Tech, "\\|required-technologies = ", 25, "required-technologies", TechName);
} else {
var Allows = getInputPara(Tech, "\\|allows = ", 10, "allows", TechName);
var CostMultiCut = Tech.slice(CostMultiStart);
var Effects = getInputPara(Tech, "\\|effects = ", 11, "effects", TechName);
var CostMultiEnd = CostMultiCut.search(/\||}}/);
 
if (CostMultiEnd < 1) {
var CostMulti = CostMultiCut;
} else {
var CostMulti = CostMultiCut.slice(0, CostMultiEnd);
}
}
var ExpCostMultiStart = Tech.search("\\|expensive-cost-multiplier = ") + 29;
if (ExpCostMultiStart < 29) {
console.log(TechName + ": No expensive-cost-multiplier found.");
var ExpCostMulti = "";
} else {
var ExpCostMultiCut = Tech.slice(ExpCostMultiStart);
var ExpCostMultiEnd = ExpCostMultiCut.search(/\||}}/);
if (ExpCostMultiEnd < 1) {
var ExpCostMulti = ExpCostMultiCut;
} else {
var ExpCostMulti = ExpCostMultiCut.slice(0, ExpCostMultiEnd);
}
}
var ReqTechStart = Tech.search("\\|required-technologies = ") + 25;
if (ReqTechStart < 25) {
console.log(TechName + ": No required-technologies found.");
var ReqTech = "";
} else {
var ReqTechCut = Tech.slice(ReqTechStart);
var ReqTechEnd = ReqTechCut.search(/\||}}/);
if (ReqTechEnd < 1) {
var ReqTech = ReqTechCut;
} else {
var ReqTech = ReqTechCut.slice(0, ReqTechEnd);
}
}
var AllowsStart = Tech.search("\\|allows = ") + 10;
if (AllowsStart < 10) {
console.log(TechName + ": No allows found.");
var Allows = "";
} else {
var AllowsCut = Tech.slice(AllowsStart);
var AllowsEnd = AllowsCut.search(/\||}}/);
if (AllowsEnd < 1) {
var Allows = AllowsCut;
} else {
var Allows = AllowsCut.slice(0, AllowsEnd);
}
}
var EffectsStart = Tech.search("\\|effects = ") + 11;
if (EffectsStart < 11) {
console.log(TechName + ": No effects found.");
var Effects = "";
} else {
var EffectsCut = Tech.slice(EffectsStart);
var EffectsEnd = EffectsCut.search(/\||}}/);
if (EffectsEnd < 1) {
var Effects = EffectsCut;
} else {
var Effects = EffectsCut.slice(0, EffectsEnd);
}
}
Cost = Cost.trim();
Cost = Cost.trim();
Line 639: Line 373:
Effects = Effects.trim();
Effects = Effects.trim();
var OldContent = "";
//get page content of the tech -> OldContent
//get page content of the tech -> OldContent
$.ajax({
var OldContent = getPage(TechName + " (research)/infobox")
url: 'https://wiki.factorio.com/api.php',
data: {
format: 'json',
action: 'query',
titles: TechName + ' (research)/infobox',
prop: 'revisions',
rvprop: 'content'
},
async: false,
dataType: 'json',
type: 'GET',
success: function( data ) {
var pages = data.query.pages;
var revisions = pages[Object.keys(pages)[0]].revisions[0];
OldContent = revisions[Object.keys(revisions)[2]];
var title = pages[Object.keys(pages)[0]].title;
},
error: function( xhr ) {
alert( 'Error: Request failed.' );
OldContent = "";
}
});
if (OldContent.length = 0) {
if (OldContent.length = 0) {
console.log("No " + TechName + " page found.");
return;
return;
}
}
//find costs etc in page (OldContent)
//find costs etc in page (OldContent)
var PageCostStart = OldContent.search(/(\s|\|)cost(\s|=)/) + 6;
var PageCostStart = OldContent.search(/(\s|\|)cost(\s|=)/) + 6;
if (PageCostStart < 6) {
var PageCost = getOldPara(PageCostStart, 6, "cost", TechName);
console.log(TechName + ": No cost found.");
var PageCost = "";
} else {
var PageCostCut = OldContent.slice(PageCostStart);
PageCostStart = PageCostCut.search(/\w/);
PageCostCut = PageCostCut.slice(PageCostStart);
var PageCostEnd = PageCostCut.search(/\||}}/);
if (PageCostEnd < 1) {
var PageCost = PageCostCut;
} else {
var PageCost = PageCostCut.slice(0, PageCostEnd);
}
}
var PageCostMultiStart = OldContent.search(/(\s|\|)cost-multiplier/) + 16;
var PageCostMultiStart = OldContent.search(/(\s|\|)cost-multiplier/) + 16;
if (PageCostMultiStart < 16) {
var PageCostMulti = getOldPara(PageCostMultiStart, 16, "cost-multiplier", TechName);
console.log(TechName + ": No cost-multiplier found.");
var PageCostMulti = "";
} else {
var PageCostMultiCut = OldContent.slice(PageCostMultiStart);
PageCostMultiStart = PageCostMultiCut.search(/\w/);
PageCostMultiCut = PageCostMultiCut.slice(PageCostMultiStart);
var PageCostMultiEnd = PageCostMultiCut.search(/\||}}/);
if (PageCostMultiEnd < 1) {
var PageCostMulti = PageCostMultiCut;
} else {
var PageCostMulti = PageCostMultiCut.slice(0, PageCostMultiEnd);
}
}
var PageExpCostMultiStart = OldContent.search(/(\s|\|)expensive-cost-multiplier/) + 26;
var PageExpCostMultiStart = OldContent.search(/(\s|\|)expensive-cost-multiplier/) + 26;
if (PageExpCostMultiStart < 26) {
var PageExpCostMulti = getOldPara(PageExpCostMultiStart, 26, "expensive-cost-multiplier", TechName);
console.log(TechName + ": No expensive-cost-multiplier found.");
var PageExpCostMulti = "";
} else {
var PageExpCostMultiCut = OldContent.slice(PageExpCostMultiStart);
PageExpCostMultiStart = PageExpCostMultiCut.search(/\w/);
PageExpCostMultiCut = PageExpCostMultiCut.slice(PageExpCostMultiStart);
var PageExpCostMultiEnd = PageExpCostMultiCut.search(/\||}}/);
if (PageExpCostMultiEnd < 1) {
var PageExpCostMulti = PageExpCostMultiCut;
} else {
var PageExpCostMulti = PageExpCostMultiCut.slice(0, PageExpCostMultiEnd);
}
}
var PageReqTechStart = OldContent.search(/(\s|\|)required-technologies/) + 22;
var PageReqTechStart = OldContent.search(/(\s|\|)required-technologies/) + 22;
if (PageReqTechStart < 22) {
var PageReqTech = getOldPara(PageReqTechStart, 22, "required-technologies", TechName);
console.log(TechName + ": No required-technologies found.");
var PageReqTech = "";
} else {
var PageReqTechCut = OldContent.slice(PageReqTechStart);
PageReqTechStart = PageReqTechCut.search(/\w/);
PageReqTechCut = PageReqTechCut.slice(PageReqTechStart);
var PageReqTechEnd = PageReqTechCut.search(/\||}}/);
if (PageReqTechEnd < 1) {
var PageReqTech = PageReqTechCut;
} else {
var PageReqTech = PageReqTechCut.slice(0, PageReqTechEnd);
}
}
var PageAllowsStart = OldContent.search(/(\s|\|)allows/) + 7;
var PageAllowsStart = OldContent.search(/(\s|\|)allows/) + 7;
if (PageAllowsStart < 7) {
var PageAllows = getOldPara(PageAllowsStart, 7, "allows", TechName);
console.log(TechName + ": No allows found.");
var PageAllows = "";
} else {
var PageAllowsCut = OldContent.slice(PageAllowsStart);
PageAllowsStart = PageAllowsCut.search(/\w/);
PageAllowsCut = PageAllowsCut.slice(PageAllowsStart);
var PageAllowsEnd = PageAllowsCut.search(/\||}}/);
if (PageAllowsEnd < 1) {
var PageAllows = PageAllowsCut;
} else {
var PageAllows = PageAllowsCut.slice(0, PageAllowsEnd);
}
}
var PageEffectsStart = OldContent.search(/(\s|\|)effects/) + 8;
var PageEffectsStart = OldContent.search(/(\s|\|)effects/) + 8;
if (PageEffectsStart < 8) {
var PageEffects = getOldPara(PageEffectsStart, 8, "effects", TechName);
console.log(TechName + ": No effects found.");
 
var PageEffects = "";
} else {
var PageEffectsCut = OldContent.slice(PageEffectsStart);
PageEffectsStart = PageEffectsCut.search(/\w/);
PageEffectsCut = PageEffectsCut.slice(PageEffectsStart);
var PageEffectsEnd = PageEffectsCut.search(/\||}}/);
if (PageEffectsEnd < 1) {
var PageEffects = PageEffectsCut;
} else {
var PageEffects = PageEffectsCut.slice(0, PageEffectsEnd);
}
}
PageCost = PageCost.trim();
PageCost = PageCost.trim();
Line 784: Line 418:
} else {
} else {
if (PageCost != Cost) {
if (PageCost != Cost) {
NewContent = OldContent
NewContent = OldContent;
var NewPageCostStart = NewContent.search(/(\s|\|)cost(\s|=)/) + 6;
var NewPageCostStart = NewContent.search(/(\s|\|)cost(\s|=)/) + 6;
UpdateTechPara(Cost, PageCost, "cost", NewPageCostStart, 6);
UpdatePara(Cost, PageCost, "cost", NewPageCostStart, 6, TechName);
}
}
if (PageCostMulti != CostMulti) {
if (PageCostMulti != CostMulti) {
if (NewContent.length == 0) {
if (NewContent.length == 0) {
NewContent = OldContent
NewContent = OldContent;
}
}
var NewPageCostMultiStart = NewContent.search(/(\s|\|)cost-multiplier/) + 16;
var NewPageCostMultiStart = NewContent.search(/(\s|\|)cost-multiplier/) + 16;
UpdateTechPara(CostMulti, PageCostMulti, "cost-multiplier", NewPageCostMultiStart, 16);
UpdatePara(CostMulti, PageCostMulti, "cost-multiplier", NewPageCostMultiStart, 16, TechName);
}
}
if (PageExpCostMulti != ExpCostMulti) {
if (PageExpCostMulti != ExpCostMulti) {
if (NewContent.length == 0) {
if (NewContent.length == 0) {
NewContent = OldContent
NewContent = OldContent;
}
}
var NewPageExpCostMultiStart = NewContent.search(/(\s|\|)expensive-cost-multiplier/) + 26;
var NewPageExpCostMultiStart = NewContent.search(/(\s|\|)expensive-cost-multiplier/) + 26;
UpdateTechPara(ExpCostMulti, PageExpCostMulti, "expensive-cost-multiplier", NewPageExpCostMultiStart, 26);
UpdatePara(ExpCostMulti, PageExpCostMulti, "expensive-cost-multiplier", NewPageExpCostMultiStart, 26, TechName);
}
}
if (PageReqTech != ReqTech) {
if (PageReqTech != ReqTech) {
if (NewContent.length == 0) {
if (NewContent.length == 0) {
NewContent = OldContent
NewContent = OldContent;
}
}
var NewPageReqTechStart = NewContent.search(/(\s|\|)required-technologies/) + 22;
var NewPageReqTechStart = NewContent.search(/(\s|\|)required-technologies/) + 22;
UpdateTechPara(ReqTech, PageReqTech, "required-technologies", NewPageReqTechStart, 22);
UpdatePara(ReqTech, PageReqTech, "required-technologies", NewPageReqTechStart, 22, TechName);
}
}
if (PageAllows != Allows) {
if (PageAllows != Allows) {
if (NewContent.length == 0) {
if (NewContent.length == 0) {
NewContent = OldContent
NewContent = OldContent;
}
}
var NewPageAllowsStart = NewContent.search(/(\s|\|)allows/) + 7;
var NewPageAllowsStart = NewContent.search(/(\s|\|)allows/) + 7;
UpdateTechPara(Allows, PageAllows, "allows", NewPageAllowsStart, 7);
UpdatePara(Allows, PageAllows, "allows", NewPageAllowsStart, 7, TechName);
}
}
if (PageEffects != Effects) {
if (PageEffects != Effects) {
if (NewContent.length == 0) {
if (NewContent.length == 0) {
NewContent = OldContent
NewContent = OldContent;
}
}
var NewPageEffectsStart = NewContent.search(/(\s|\|)effects/) + 8;
var NewPageEffectsStart = NewContent.search(/(\s|\|)effects/) + 8;
UpdateTechPara(Effects, PageEffects, "effects", NewPageEffectsStart, 8);
UpdatePara(Effects, PageEffects, "effects", NewPageEffectsStart, 8, TechName);
}
}
}
}
//alright, NewContent should be defined, change page:
//alright, NewContent should be defined, change page:
if (NewContent.length > 0) {
if (NewContent.length > 0) {
$.ajax({
EditPage(TechName + " (research)/infobox", TechName);
url: 'https://wiki.factorio.com/api.php',
}
data: {
format: 'json',
action: 'edit',
title: TechName + ' (research)/infobox',
text: NewContent,
token: globalToken,
summary: Summary,
bot: true,
nocreate: true
},
async: false,
dataType: 'json',
type: 'POST',
success: function( data ) {
  console.log("Updated " + TechName);
},
error: function( xhr ) {
console.log("Failed to update " + TechName);
}
});
}
 
}
}



Revision as of 14:21, 20 May 2017

/* Any JavaScript here will be loaded for all users on every page load. */
	
/* Infobox updating */

var NoInfobox = ["Basic oil processing", "Advanced oil processing", "Coal liquefaction", "Empty barrel", "Heavy oil cracking", "Light oil cracking", "Solid fuel from heavy oil", "Solid fuel from light oil", "Solid fuel from petroleum gas"]
var version = "0.15.12";


var Para = "";
function getInputPara(Item, Search, Length, Name, ItemName) {
	var ParaStart = Item.search(Search) + Length; //finds the beginning of the para, is after para-name
	if (ParaStart < Length) {
		console.log(ItemName + ": No " + Name + " found.");
		Para = "";
	} else {
		var ParaCut = Item.slice(ParaStart);  //lets the string begin after the parameter name
		var ParaEnd = ParaCut.search(/\||}}/); //finds the end of the parameter definition
		if (ParaEnd < 1) { //Para ends at para-end if it exists
			Para = ParaCut;
		} else {
			Para = ParaCut.slice(0, ParaEnd);
		}
	}
	return Para;
};


function getPage(Title) { //returns content
	$.ajax({
		url: 'https://wiki.factorio.com/api.php',
		data: {
			format: 'json',
			action: 'query',
			titles: Title,
			prop: 'revisions',
			rvprop: 'content'
		},
		async: false,
		dataType: 'json',
		type: 'GET',
		success: function( data ) {
			var pages = data.query.pages;
			var revisions = pages[Object.keys(pages)[0]].revisions[0];
			var content = revisions[Object.keys(revisions)[2]];
			var title = pages[Object.keys(pages)[0]].title;
		},
		error: function( xhr ) {
			alert( 'Error: Request failed.' );
			content = "";
		}
	});
	return content;
};

var PagePara = "";
function getOldPara(PageParaStart, Length, Name, ItemName) { //also uses OldContent
	if (PageParaStart < Length) { //if the start is less than the length of the para name (Name) then the search was unsuccessful
		console.log(ItemName + ": No " + Name + " found on page.");
		PagePara = "";
	} else {
		var PageParaCut = OldContent.slice(PageParaStart);
		PageParaStart = PageParaCut.search(/\w/);
		PageParaCut = PageParaCut.slice(PageParaStart); //removes anything before the parameter that does not belong there, like = and \s
		var PageParaEnd = PageParaCut.search(/\||}}/); //finds the end of the parameter definition
		if (PageConsumersEnd < 1) { //Para ends at para-end if it exists
			PagePara = PageParaCut;
		} else {
			PagePara = PageParaCut.slice(0, PagePara);
		}
	}
	return PagePara;
};


function UpdatePara(Para, PagePara, Name, NewPageParaStart, Length, ItemName) {  //also needs version, Summary, NewContent!!
	if (PagePara.length > 0) {
		var NewPageParaCut = NewContent.slice(NewPageParaStart); //lets the string being after the parameter name
		var NewPageParaEnd = NewPageParaCut.search(/\||}}/) + NewPageParaStart; //finds the end of the parameter definition, with added parastart so that it's relative to the start of the entire string, not the parameter string
		if (Para.length > 0) {
			NewContent = NewContent.slice(0, NewPageParaStart) + " = " + Para + "\n" + NewContent.slice(NewPageParaEnd);
			console.log("Replaced " + ItemName + " " + Name + ".");
			Summary = Summary + "Updated " + Name + " to " + version + ". ";
		} else {
			NewPageParaStart = NewPageParaStart - Length; //makes it so that the start of the para string if before the name, so that the name also gets deleted
			NewContent = NewContent.slice(0, NewPageParaStart) + NewContent.slice(NewPageParaEnd); //removes what is between parastart and paraend from newcontent
			console.log("Removed " + ItemName + " " + Name + ". ");
			Summary = Summary + "Removed " + Name + ". ";
		}
	} else if (Para.length > 0) {
		var InfoboxStart = NewContent.search(/{{Infobox/i) + 9; //finds the start of the infobox, excludes {{infobox from the resulting string
		NewContent = NewContent.slice(0, InfoboxStart) + "\n|" + Name + " = " + Para + NewContent.slice(InfoboxStart);
		console.log("Added " + ItemName + " " + Name + ". ");
		Summary = Summary + "Added " + Name + ". ";
	}
};


function EditPage(Title, ItemName) { //also uses Summary, globalToken, NewContent
	$.ajax({
		url: 'https://wiki.factorio.com/api.php',
		data: {
			format: 'json',
			action: 'edit',
			title: Title,
			text: NewContent,
			token: globalToken,
			summary: Summary,
			bot: true,
			nocreate: true
		},
		dataType: 'json',
		type: 'POST',
		success: function( data ) {
		   console.log("Updated " + ItemName);
		},
		error: function( xhr ) {
			console.log("Failed to update " + ItemName);
		}
	});
};


$("#RecipeUpdate").click(function(){
    getRecipes();
});

function getRecipes() {
	getUserGroup();
	if (UserGroup.some(isBot) == true) {
		var RecipeInput = prompt("Please enter the recipes");
		if (RecipeInput != null) {
			getToken();
			var OldContent = "";
			var Items = RecipeInput.split(/\s\s/g);
			console.log(Items.length + " Items detected");
			Items.forEach(RemoveDuplicateRecipesAndUpdateInfobox);
		}
	}
};


function RemoveDuplicateRecipesAndUpdateInfobox(Recipes) {
	var ItemNameEnd = Recipes.search("\\|");
	var ItemName = Recipes.slice(0, ItemNameEnd);
	ItemName = ItemName.trim();
	
	//Remove Itemnames if the item does not have a page on the wiki, so that the item is removed from the output
	NoInfobox.forEach(function(InfoboxName) {
	if (ItemName == InfoboxName) {
		console.log("Removed " + ItemName + " from output.");
		return;
	}
	})
	
	var Recipe = getInputPara(Recipes, "\\|recipe = ", 10, "recipe", ItemName);
	var TotalRaw = getInputPara(Recipes, "\\|total-raw = ", 13, "total-raw", ItemName);
	var ExpRecipe = getInputPara(Recipes, "\\|expensive-recipe = ", 20, "expensive-recipe", ItemName);
	var ExpTotalRaw = getInputPara(Recipes, "\\|expensive-total-raw = ", 23, "expensive-total-raw", ItemName);
	
	//remove whitespace
	Recipe = Recipe.trim();
	TotalRaw = TotalRaw.trim();
	ExpRecipe = ExpRecipe.trim();
	ExpTotalRaw = ExpTotalRaw.trim();	
	
	
	//remove duplicate recipes, but only if the recipe actually exists
	if ((ExpTotalRaw == ExpRecipe) && (ExpTotalRaw.length > 0)) {
		ExpTotalRaw = "";
		console.log(ItemName + ": Removed expensive-total-raw because it was a duplicate of expensive-recipe.");
	} else if ((ExpTotalRaw == TotalRaw) && (ExpTotalRaw.length > 0)) {
		ExpTotalRaw = "";
		console.log(ItemName + ": Removed expensive-total-raw because it was a duplicate of total-raw.");
	}
	if ((ExpRecipe == Recipe) && (ExpRecipe.length > 0)) {
		ExpRecipe = "";
		console.log(ItemName + ": Removed expensive-recipe because it was a duplicate of recipe.");
	}
	if ((TotalRaw == Recipe) && (TotalRaw.length > 0)) {
		TotalRaw = "";
		console.log(ItemName + ": Removed total-raw because it was a duplicate of recipe.");
	}
	
	
	//get page content of the item -> OldContent
	var OldContent = getPage(ItemName + "/infobox")
	if (OldContent.length = 0) {
		console.log("No " + ItemName + " page found.");
		return;
	}
	
	
	//find recipes in page (OldContent)
	var PageRecipeStart = OldContent.search(/(\s|\|)recipe/) + 7;
	var PageRecipe = getOldPara(PageRecipeStart, 7, "recipe", ItemName);

	var PageTotalRawStart = OldContent.search(/(\s|\|)total-raw/) + 10;
	var PageTotalRaw = getOldPara(PageTotalRawStart, 10, "total-raw", ItemName);
	
	var PageExpRecipeStart = OldContent.search(/(\s|\|)expensive-recipe/) + 17;
	var PageExpRecipe = getOldPara(PageExpRecipeStart, 17, "expensive-recipe", ItemName);

	var PageExpTotalRawStart = OldContent.search(/(\s|\|)expensive-total-raw/) + 20;
	var PageExpTotalRaw = getOldPara(PageExpTotalRawStart, 20, "expensive-total-raw", ItemName);

	
	//remove whitespace
	PageRecipe = PageRecipe.trim();
	PageTotalRaw = PageTotalRaw.trim();
	PageExpRecipe = PageExpRecipe.trim();
	PageExpTotalRaw = PageExpTotalRaw.trim();
	
	var Summary = "";
	
	//change page if anything is different (this INCLUDES different formatting)
	var NewContent = "";
	if ((PageRecipe == Recipe) && (PageTotalRaw == TotalRaw) && (PageExpRecipe == ExpRecipe) && (PageExpTotalRaw == ExpTotalRaw)) {
		console.log(ItemName + " page was not changed.")
	} else {
		if (PageRecipe != Recipe) {
			NewContent = OldContent;
			var NewPageRecipeStart = NewContent.search(/(\s|\|)recipe/) + 7;
			UpdatePara(Recipe, PageRecipe, "recipe", NewPageRecipeStart, 7, ItemName);
		}
		if (PageTotalRaw != TotalRaw) {
			if (NewContent.length == 0) {
				NewContent = OldContent
			}
			var NewPageTotalRawStart = NewContent.search(/(\s|\|)total-raw/) + 10;
			UpdatePara(TotalRaw, PageTotalRaw, "total-raw", NewPageTotalRawStart, 10, ItemName);
		}
		if (PageExpRecipe != ExpRecipe) {
			if (NewContent.length == 0) {
				NewContent = OldContent
			}
			var NewPageExpRecipeStart = NewContent.search(/(\s|\|)expensive-recipe/) + 17;
			UpdatePara(ExpRecipe, PageExpRecipe, "expensive-recipe", NewPageExpRecipeStart, 17, ItemName);
		}
		if (PageExpTotalRaw != ExpTotalRaw) {
			if (NewContent.length == 0) {
				NewContent = OldContent
			}
			var NewPageExpTotalRawStart = NewContent.search(/(\s|\|)expensive-total-raw/) + 20;
			UpdatePara(ExpTotalRaw, PageExpTotalRaw, "expensive-total-raw", NewPageExpTotalRawStart, 20, ItemName);
		}
	}
	//alright, NewContent should be defined, change page:
	if (NewContent.length > 0) {
		EditPage(ItemName + "/infobox", ItemName);
	}	
}

$("#ConsumerUpdate").click(function(){
    getConsumersAndStackSize();
});

function getConsumersAndStackSize() {
	getUserGroup();
		if (UserGroup.some(isBot) == false) {
		return;
	}
	var ItemInput = prompt("Please enter the consumers and the stack-sizes");
	if (ItemInput != null) {
		getToken();
		var Items = ItemInput.split(/\s\s/g);
		console.log(Items.length + " Items detected");
		Items.forEach(UpdateInfoboxWithConsumersAndStackSize);
	}
};

function UpdateInfoboxWithConsumersAndStackSize)(Item) {
	var ItemNameEnd = Item.search("\\|");
	var ItemName = Item.slice(0, ItemNameEnd);
	ItemName = ItemName.trim();
	
	//Remove Items that don't have Infoboxes on the wiki
	NoInfobox.forEach(function(InfoboxName) {
	if (ItemName == InfoboxName) {
		console.log("Removed " + ItemName + " from output.");
		return;
	}
	})
	
	var Consumers = getInputPara(Item, "\\|consumers = ", 13, "consumers", ItemName);
	var StackSize = getInputPara(Item, "\\|stack-size = ", 14, "stack-size", ItemName);

	Consumers = Consumers.trim();
	StackSize = StackSize.trim();
	
	
	//get page content of the item -> OldContent
	var OldContent = getPage(ItemName + '/infobox')
	if (OldContent.length = 0) {
		console.log("No " + ItemName + " page found.");
		return;
	}
	
	//find recipes in page (OldContent)
	var PageConsumersStart = OldContent.search(/(\s|\|)consumers/) + 10;
	var PageConsumers = getOldPara(PageConsumersStart, 10, "consumers", ItemName);
	
	var PageStackSizeStart = OldContent.search(/(\s|\|)stack-size/) + 11;
	var PageStackSize = getOldPara(PageStackSizeStart, 11, "stack-size", ItemName);
	
	
	PageConsumers = PageConsumers.trim();
	PageStackSize = PageStackSize.trim();
	
	var Summary = "";
	
	//change page if anything is different (this INCLUDES different formatting)
	var NewContent = "";
	if ((PageConsumers == Consumers) && (PageStackSize == StackSize)) {
		console.log(ItemName + " page was not changed.")
	} else {
		if (PageConsumers != Consumers) {
			NewContent = OldContent;
			var NewPageConsumersStart = NewContent.search(/(\s|\|)consumers/) + 10;
			UpdatePara(Consumers, PageConsumers, "consumers", NewPageConsumersStart, 10, ItemName);
		}
		if (PageStackSize != StackSize) {
			if (NewContent.length == 0) {
				NewContent = OldContent;
			}
			var NewPageStackSizeStart = NewContent.search(/(\s|\|)stack-size/) + 11;
			UpdatePara(StackSize, PageStackSize, "stack-size", NewPageStackSizeStart, 11, ItemName);
		}
	}
	
	//alright, NewContent should be defined, change page:
	if (NewContent.length > 0) {
		EditPage(ItemName + "/infobox", ItemName);
	}
}

$("#TechUpdate").click(function(){
    getTechnologies();
});

function getTechnologies() {
	getUserGroup();
		if (UserGroup.some(isBot) == false) {
		return;
	}
	var TechInput = prompt("Please enter the technologies");
	if (TechInput != null) {
		getToken();
		var Techs = TechInput.split(/\s\s/g);
		console.log(Techs.length + " Techs detected");
		Techs.forEach(UpdateTechnologyInfobox);
	}
}

function UpdateTechnologyInfobox(Tech) {
	var TechNameEnd = Tech.search("\\|");
	var TechName = Tech.slice(0, TechNameEnd);
	TechName = TechName.trim();
	
	
	var Cost = getInputPara(Tech, "\\|cost = ", 8, "cost", TechName);
	var CostMulti = getInputPara(Tech, "\\|cost-multiplier = ", 19, "cost-multiplier", TechName);
	var ExpCostMulti = getInputPara(Tech, "\\|expensive-cost-multiplier = ", 29, "expensive-cost-multiplier", TechName);
	var ReqTech = getInputPara(Tech, "\\|required-technologies = ", 25, "required-technologies", TechName);
	var Allows = getInputPara(Tech, "\\|allows = ", 10, "allows", TechName);
	var Effects = getInputPara(Tech, "\\|effects = ", 11, "effects", TechName);

	
	Cost = Cost.trim();
	CostMulti = CostMulti.trim();
	ExpCostMulti = ExpCostMulti.trim();
	ReqTech = ReqTech.trim();
	Allows = Allows.trim();
	Effects = Effects.trim();
	
	
	//get page content of the tech -> OldContent
	var OldContent = getPage(TechName + " (research)/infobox")
	if (OldContent.length = 0) {
		console.log("No " + TechName + " page found.");
		return;
	}
	
	
	//find costs etc in page (OldContent)
	var PageCostStart = OldContent.search(/(\s|\|)cost(\s|=)/) + 6;
	var PageCost = getOldPara(PageCostStart, 6, "cost", TechName);
	
	var PageCostMultiStart = OldContent.search(/(\s|\|)cost-multiplier/) + 16;
	var PageCostMulti = getOldPara(PageCostMultiStart, 16, "cost-multiplier", TechName);
	
	var PageExpCostMultiStart = OldContent.search(/(\s|\|)expensive-cost-multiplier/) + 26;
	var PageExpCostMulti = getOldPara(PageExpCostMultiStart, 26, "expensive-cost-multiplier", TechName);
	
	var PageReqTechStart = OldContent.search(/(\s|\|)required-technologies/) + 22;
	var PageReqTech = getOldPara(PageReqTechStart, 22, "required-technologies", TechName);
	
	var PageAllowsStart = OldContent.search(/(\s|\|)allows/) + 7;
	var PageAllows = getOldPara(PageAllowsStart, 7, "allows", TechName);
	
	var PageEffectsStart = OldContent.search(/(\s|\|)effects/) + 8;
	var PageEffects = getOldPara(PageEffectsStart, 8, "effects", TechName);

	
	PageCost = PageCost.trim();
	PageCostMulti = PageCostMulti.trim();
	PageExpCostMulti = PageExpCostMulti.trim();
	PageReqTech = PageReqTech.trim();
	PageAllows = PageAllows.trim();
	PageEffects = PageEffects.trim();
	
	
	var Summary = "";
	var NewContent = "";
	
	//change page if anything is different (this INCLUDES different formatting)
	if ((PageCost == Cost) && (PageCostMulti == CostMulti) && (PageExpCostMulti == ExpCostMulti) && (PageReqTech == ReqTech) && (PageAllows == Allows) && (PageEffects == Effects)) {
		console.log(TechName + " page was not changed.")
	} else {
		if (PageCost != Cost) {
			NewContent = OldContent;
			var NewPageCostStart = NewContent.search(/(\s|\|)cost(\s|=)/) + 6;
			UpdatePara(Cost, PageCost, "cost", NewPageCostStart, 6, TechName);
		}
		if (PageCostMulti != CostMulti) {
			if (NewContent.length == 0) {
				NewContent = OldContent;
			}
			var NewPageCostMultiStart = NewContent.search(/(\s|\|)cost-multiplier/) + 16;
			UpdatePara(CostMulti, PageCostMulti, "cost-multiplier", NewPageCostMultiStart, 16, TechName);
		}
		if (PageExpCostMulti != ExpCostMulti) {
			if (NewContent.length == 0) {
				NewContent = OldContent;
			}
			var NewPageExpCostMultiStart = NewContent.search(/(\s|\|)expensive-cost-multiplier/) + 26;
			UpdatePara(ExpCostMulti, PageExpCostMulti, "expensive-cost-multiplier", NewPageExpCostMultiStart, 26, TechName);
		}
		if (PageReqTech != ReqTech) {
			if (NewContent.length == 0) {
				NewContent = OldContent;
			}
			var NewPageReqTechStart = NewContent.search(/(\s|\|)required-technologies/) + 22;
			UpdatePara(ReqTech, PageReqTech, "required-technologies", NewPageReqTechStart, 22, TechName);
		}
		if (PageAllows != Allows) {
			if (NewContent.length == 0) {
				NewContent = OldContent;
			}
			var NewPageAllowsStart = NewContent.search(/(\s|\|)allows/) + 7;
			UpdatePara(Allows, PageAllows, "allows", NewPageAllowsStart, 7, TechName);
		}
		if (PageEffects != Effects) {
			if (NewContent.length == 0) {
				NewContent = OldContent;
			}
			var NewPageEffectsStart = NewContent.search(/(\s|\|)effects/) + 8;
			UpdatePara(Effects, PageEffects, "effects", NewPageEffectsStart, 8, TechName);
		}	
	}
	//alright, NewContent should be defined, change page:
	if (NewContent.length > 0) {
		EditPage(TechName + " (research)/infobox", TechName);
	}	
}



/* user is bot if UserGroup.some(isBot) == true */

var UserGroup = "";

function getUserGroup() {
	$.ajax({
		url: 'https://wiki.factorio.com/api.php',
		data: {
			format: 'json',
			action: 'query',
			meta: 'userinfo',
			uiprop: 'groups',
		},
		async: false,
		dataType: 'json',
		type: 'GET',
		success: function(data) {
			UserGroup = data.query.userinfo.groups
		},
	});
};

function isBot(group) {
	return group == "bot";
}

var globalToken;

function getToken() {
    $.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            format: 'json',
            action: 'query',
            meta: 'tokens',
            bot: true
        },
        async: false,
        dataType: 'json',
        type: 'POST',
        success: function( data ) {
           globalToken = data.query.tokens.csrftoken;
        },
        error: function( xhr ) {
            console.log("Failed to perform null edit");
        }
    });
}

/*** Language template ***/
if($(".languages-flags .flag").length == 0) {
 console.log("Not showing languages bar because there's no other language's version of this page.");
 $(".languages-container").hide();
}

//Spoiler template JavaScript
$(".spoiler-container .button").click(function() {
  $(this).siblings(".text").toggle("slow");
});

var wantedPagesListsLocation = "User:TheWombatGuru/WantedPages"
$("#create-wanted-pages-list").click(function(){
    getToken();
    createWantedPagesLists();
});

function createWantedPagesLists() {
    getUserGroup();
    if (UserGroup.some(isBot) == false) {
       return;
    }
    var wantedPages = getWantedPages();
    wantedPages = wantedPages.sort(compare);
    splitWantedPagesIntoDifferentLanguages(wantedPages);
};

function splitWantedPagesIntoDifferentLanguages(wantedPages) {
  var czechWantedPages = []; 
  var germanWantedPages = [];
  var spanishWantedPages = [];
  var frenchWantedPages = [];
  var italianWantedPages = [];
  var japaneseWantedPages = [];
  var dutchWantedPages = [];
  var polishWantedPages = [];
  var portugueseWantedPages = [];
  var russianWantedPages = [];
  var swedishWantedPages = [];
  var ukrainianWantedPages = [];
  var chineseWantedPages = [];
  var turkishWantedPages = [];
  var wantedFiles = [];
  var wantedTemplates = [];
  var otherWantedPages = [];

  for (var i = 0; i < wantedPages.length; i++) {
    switch (wantedPages[i].title.slice(-3)) {//"/cs", "/de", "/es", "/fr", "/it", "/ja", "/nl", "/pl", "/-br", "/ru", "/sv", "/uk", "/zh", "/tr"
      case "/cs": czechWantedPages.push(wantedPages[i]); break;
      case "/de": germanWantedPages.push(wantedPages[i]); break;
      case "/es": spanishWantedPages.push(wantedPages[i]); break;
      case "/fr": frenchWantedPages.push(wantedPages[i]); break;
      case "/it": italianWantedPages.push(wantedPages[i]); break;
      case "/ja": japaneseWantedPages.push(wantedPages[i]); break;
      case "/nl": dutchWantedPages.push(wantedPages[i]); break;
      case "/pl": polishWantedPages.push(wantedPages[i]); break;
      case "-br": portugueseWantedPages.push(wantedPages[i]); break;
      case "/ru": russianWantedPages.push(wantedPages[i]); break;
      case "/sv": swedishWantedPages.push(wantedPages[i]); break;
      case "/uk": ukrainianWantedPages.push(wantedPages[i]); break;
      case "/zh": chineseWantedPages.push(wantedPages[i]); break;
      case "/tr": turkishWantedPages.push(wantedPages[i]); break;
      default: if (wantedPages[i].title.slice(0, 5) == "File:") {wantedFiles.push(wantedPages[i])} else if (wantedPages[i].title.slice(0, 9) == "Template:") {wantedTemplates.push(wantedPages[i])} else {otherWantedPages.push(wantedPages[i])}; break;
    }
  }

  createWantedPagesPage("cs", czechWantedPages, "Czech");
  createWantedPagesPage("de", germanWantedPages, "German");
  createWantedPagesPage("es", spanishWantedPages, "Spanish");
  createWantedPagesPage("fr", frenchWantedPages, "French");
  createWantedPagesPage("it", italianWantedPages, "Italian");
  createWantedPagesPage("ja", japaneseWantedPages, "Japanese");
  createWantedPagesPage("nl", dutchWantedPages, "Dutch");
  createWantedPagesPage("pl", polishWantedPages, "Polish");
  createWantedPagesPage("pt-br", portugueseWantedPages, "Portuguese");
  createWantedPagesPage("ru", russianWantedPages, "Russian");
  createWantedPagesPage("sv", swedishWantedPages, "Swedish");
  createWantedPagesPage("uk", ukrainianWantedPages, "Ukrainian");
  createWantedPagesPage("zh", chineseWantedPages, "Chinese");
  createWantedPagesPage("tr", turkishWantedPages, "Turkish");

  createWantedPagesPage("file", wantedFiles, "Files");
  createWantedPagesPage("template", wantedTemplates, "Templates");
  createWantedPagesPage("other", otherWantedPages, "Other");
}

function createWantedPagesPage(location, wantedPages, language) {
  var formattedWantedPages = "Number of wanted pages in " + language + ": " + wantedPages.length + "\n{|class=wikitable\n!#\n!Page\n!Links to this page";

  for (var i = 0; i < wantedPages.length; i++) {
    formattedWantedPages = formattedWantedPages.concat("\n|-\n|" + (i + 1) + "\n|[https://wiki.factorio.com/index.php?title=" + encodeURI(wantedPages[i].title) + " " + wantedPages[i].title + "]\n|[https://wiki.factorio.com/index.php?title=Special:WhatLinksHere/" + encodeURI(wantedPages[i].title) + " " + wantedPages[i].value + "]");
  }

  formattedWantedPages = formattedWantedPages.concat("\n|}");

  createPage(wantedPagesListsLocation + "/" + location, formattedWantedPages, "(BOT) - Update the list of wanted pages for " + language + ".");
}

function performNullEdit(pageTitle, summary) {
    $.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            format: 'json',
            action: 'edit',
            title: pageTitle,
            section: 0,
            text: "",
            token: globalToken,
            summary: summary,
            bot: true
        },
        async: false,
        dataType: 'json',
        type: 'POST',
        success: function( data ) {
           console.log("Performed null edit");
        },
        error: function( xhr ) {
            console.log("Failed to perform null edit");
        }
    });
}

function purgeWhatLinksHere(pageTitle) {
    $.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            format: "json",
            action: 'query',
            list: "backlinks",
            bltitle: pageTitle,
            bllimit: 500
        },
        async: true,
        type: 'GET',
        success: function( data ) {
            console.log(data);
            for (var i = 0; i < data.query.backlinks.length; i++) {
                purgePage(data.query.backlinks[i].title);
            }
        },
        error: function( xhr ) {
            //alert( 'Error: Request failed.' );
            console.log("Failed purging");
        }
    });
}

function purgePage(pageTitle) {
    $.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            action: 'purge',
            forcelinkupdate: true,
            titles: pageTitle,
            prop: "info"
        },
        async: true,
        type: 'GET',
        success: function( data ) {
            console.log("purging " + pageTitle);
        },
        error: function( xhr ) {
            //alert( 'Error: Request failed.' );
            console.log("Failed purging");
        }
    });
}

function compare(a,b) {
  if (parseInt(a.value) > parseInt(b.value))
    return -1;
  if (parseInt(a.value) < parseInt(b.value))
    return 1;
  if (a.title < b.title)
    return -1;
  if (a.title > b.title)
    return 1;
  return 0;
}

function createPage(pageTitle, content, summary) {
    $.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            format: 'json',
            action: 'edit',
            title: pageTitle,
            text: content,
            token: globalToken,
            summary: summary,
            bot: true
        },
        async: false,
        dataType: 'json',
        type: 'POST',
        success: function( data ) {
           console.log("created page");
        },
        error: function( xhr ) {
            console.log("failed to create page");
        }
    });
}

function getWantedPages() {
   var wantedPages = [];

   $.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            format: 'json',
            action: 'query',
            list: 'querypage',
            qppage: 'Wantedpages',
            qplimit: '5000',
        },
        async: false,
        dataType: 'json',
        type: 'GET',
        success: function( data ) {
            var results = data.query.querypage.results;
            for (var i = 0; i < results.length; i++) {
               var pageObject = new WantedPage(results[i].title, results[i].value);
               var alreadyInArray = false;
               for (var j = 0; j < wantedPages.length; j++) {
                 if (wantedPages[j].title == pageObject.title) {
                    alreadyInArray = true;
                 }
               }
               if (!alreadyInArray) {
                 wantedPages.push(pageObject);
               }
               if (pageObject.title == "Rocket defense/it") {
               }
            }
        },
        error: function( xhr ) {
            //alert( 'Error: Request failed. Category' );
        }
  });

$.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            format: 'json',
            action: 'query',
            list: 'querypage',
            qppage: 'Wantedpages',
            qplimit: '5000',
            qpoffset: '3000',
        },
        async: false,
        dataType: 'json',
        type: 'GET',
        success: function( data ) {
            var results = data.query.querypage.results;
            for (var i = 0; i < results.length; i++) {
               var pageObject = new WantedPage(results[i].title, results[i].value);
               var alreadyInArray = false;
               for (var j = 0; j < wantedPages.length; j++) {
                 if (wantedPages[j].title == pageObject.title) {
                    alreadyInArray = true;
                 }
               }
               if (!alreadyInArray) {
                 wantedPages.push(pageObject);
               }
               if (pageObject.title == "Rocket defense/it") {
               }
            }
        },
        error: function( xhr ) {
            //alert( 'Error: Request failed. Category' );
        }
  });
  return wantedPages;
};

function WantedPage(pageTitle, pageValue) {
   this.title = pageTitle;
   this.value = pageValue;
}


/* OLD INFOBOX CONVERSION TOOLS */
/*function targetAllPagesInCategory(category) {
    var languageSuffixes = ["/fr", "/ru", "/de"]; //, "/cs", "/de", "/es", "/fr", "/it", "/nl", "/pl", "/pt-br", "/ru", "/sv", "/uk", "/zh", ""];
    for (var j = 0; j < languageSuffixes.length; j++) {
      $.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            format: 'json',
            action: 'query',
            list: 'categorymembers',
            cmtitle: (category + languageSuffixes[j]),
            cmlimit: 500
        },
        dataType: 'json',
        type: 'GET',
        success: function( data ) {
            var pages = data.query.categorymembers;
            for (var i = 0; i < pages.length; i++) {
                    //purgePage(pages[i].title);
                    extractPageInfo(pages[i].title, "9c28a1344a20bf189fda7d58339e518257f2dd9b+\\");
                
            }

            if ( data && data.query && data.query.result == 'Success' ) {
                window.location.reload(); // reload page if edit was successful
            } else if ( data && data.error ) {
                //alert( 'Error: API returned error code "' + data.error.code + '": ' + data.error.info + 'Category' );
            } else {
                //alert( 'Error: Unknown result from API. Category' );
            }
        },
        error: function( xhr ) {
            //alert( 'Error: Request failed. Category' );
        }
    });
  }
}

function extractPageInfo(pageTitle, token) {
    $.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            format: 'json',
            action: 'query',
            titles: pageTitle,
            prop: 'revisions',
            rvprop: 'content'
        },
        async: false,
        dataType: 'json',
        type: 'GET',
        success: function( data ) {
            var pages = data.query.pages;
            var revisions = pages[Object.keys(pages)[0]].revisions[0];
            var content = revisions[Object.keys(revisions)[2]]
            var title = pages[Object.keys(pages)[0]].title;
            createNewInfoboxPage(title, content, token);
            if ( data && data.query && data.query.result == 'Success' ) {
                window.location.reload(); // reload page if edit was successful
            } else if ( data && data.error ) {
                //alert( 'Error: API returned error code "' + data.error.code + '": ' + data.error.info );
            } else {
                //alert( 'Error: Unknown result from API.' );
            }
        },
        error: function( xhr ) {
            //alert( 'Error: Request failed.' );
        }
    });
}

function createNewInfoboxPage(page, contentOfMainPage, token) {
    var infoboxText = getInfoboxFromFullPageContent(contentOfMainPage);

    var infoboxPageTitle = page.replace(/\/(de|fr|nl|it|es|ru|pt\-br|cs|pl|sv|uk|zh)/g, function(piece) {return "";}).concat("/infobox");
    var oldPageRevisedText = getOldPageRevisedText(page, contentOfMainPage, infoboxPageTitle);	
    removeInfoboxFromMain(page, oldPageRevisedText, token);

    if (infoboxText != null) {
      if (/\/(de|fr|nl|it|es|ru|pt\-br|cs|pl|sv|uk|zh)/g.test(page)) {
        return;
      }
      var newPageTitle = page.concat("/infobox");
      var convertedInfoboxText = convertInfobox(infoboxText, token);
      createPage(newPageTitle, convertedInfoboxText, token, page, contentOfMainPage);
    }
}

function getOldPageRevisedText(pageTitle, content, infoboxPageTitle) {
    content = content.replace(/{{\bCombat\b(\s+(\||{).+)+\s}}/gi, function (piece) {
        return "{{:" + infoboxPageTitle + "}}";
    });
    return content;
}

function removeInfoboxFromMain(pageTitle, content, token) {
    $.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            format: 'json',
            action: 'edit',
            title: pageTitle,
            text: content,
            bot: true,
            token: token,
            summary: "(BOT) - Replaced old infobox with a link to the /infobox subpage"
        },
        async: false,
        dataType: 'json',
        type: 'POST',
        success: function( data ) {
            if ( data && data.edit && data.edit.result == 'Success' ) {
                window.location.reload(); // reload page if edit was successful
            } else if ( data && data.error ) {
                //alert( 'Error: API returned error code "' + data.error.code + '": ' + data.error.info );
            } else {
                //alert( 'Error: Unknown result from API.' );
            }
        },
        error: function( xhr ) {
            //alert( 'Error: Request failed.' );
        }
    })
};

function getInfoboxFromFullPageContent(contentOfPage) {
    var matches = contentOfPage.match(/{{\bCombat\b(\s+\|.+)+\s}}/gi);
if (matches != null && matches.length > 0) {
 infoboxText = matches[0];
} else {
 infoboxText = null;
}
    return infoboxText;
}

function convertInfobox(text) {
    text = text.replace(/{{(\w+)/g, function (piece, $1) {
        var returnText = "{{Infobox\n| category = ";

        $1 = $1.toLowerCase();

        switch ($1) {
            case "item":
                returnText = returnText.concat("Items");
                break;
            case "machinery":
                returnText = returnText.concat("Machinery");
                break;
            case "combat":
                returnText = returnText.concat("Combat");
                break;
            case "technology":
                returnText = returnText.concat("Technology");
        }

        switch ($1) {
            case "machinery":
                returnText = returnText.concat("\n| category-name = Machine");
                break;
            case "item":
                returnText = returnText.concat("\n| category-name = Item");
                break;
        }

        return returnText;
    });

    text = text.replace("stack_size", "stack-size");
    text = text.replace("poweroutput", "power-output");
    text = text.replace("input", "recipe");
    text = text.replace("raw", "total-raw");
    text = text.replace("technologies", "required-technologies");
    text = text.replace("costmultiplier", "cost-multiplier");
    text = text.replace("requirements", "required-technologies");
    text = text.replace("walkingspeed", "walking-speed");
    text = text.replace("storagesize", "storage-size");
    text = text.replace("gridsize", "grid-size");
    text = text.replace("shootingspeed", "shooting-speed");
    text = text.replace("damagebonus", "damage-bonus");
    text = text.replace("clustersize", "cluster-size");
    text = text.replace("aoesize", "area-of-effect-size");
    text = text.replace("magazinesize", "magazine-size");
    text = text.replace("recharge", "robot-recharge-rate");
    text = text.replace("rechargebuffer", "internal-buffer-recharge-rate");
    text = text.replace("wirereach", "wire-reach");
    text = text.replace("craftingspeed", "crafting-speed");
    text = text.replace("smeltingspeed", "smelting-speed");
    text = text.replace("miningpower", "mining-power");
    text = text.replace("miningspeed", "mining-speed");
    text = text.replace("miningarea", "mining-area");
    text = text.replace("supplyarea", "supply-area");
    text = text.replace("constructionarea", "construction-area");
    text = text.replace("lifetime", "lifespan");
    text = text.replace("inventorysizebonus", "inventory-size-bonus");
    text = text.replace("gridsize", "grid-size");
    text = text.replace("boosttechs", "boosting-technologies");
    text = text.replace("allowstech", "allows");
    text = text.replace("storage", "storage-size");
    text = text.replace(/\|\s*\brecipe\b\s*=\s*(.+)\n\|\s*\boutput\b\s*=\s*(.+)/g, function (piece, $1, $2) {
        return "| recipe = " + $1 + " = " + $2;
    });

    text = text.concat("<noinclude>[[Category:Infobox page]]</noinclude>");

    return text;
}

function createPage(pageTitle, content, token, page, contentOfMainPage) {
    $.ajax({
        url: 'https://wiki.factorio.com/api.php',
        data: {
            format: 'json',
            action: 'edit',
            title: pageTitle,
            text: content,
            bot: true,
            createonly: true,
            token: token,
            summary: "(BOT) - Created infobox sub page for " + page
        },
        async: false,
        dataType: 'json',
        type: 'POST',
        success: function( data ) {
           
            if ( data && data.edit && data.edit.result == 'Success' ) {
                window.location.reload(); // reload page if edit was successful
            } else if ( data && data.error ) {
                //alert( 'Error: API returned error code "' + data.error.code + '": ' + data.error.info );
            } else {
                //alert( 'Error: Unknown result from API.' );
            }
        },
        error: function( xhr ) {
            //alert( 'Error: Request failed.' );
        }
    });
}*/
/* END OF OLD INFOBOX CONVERSION TOOL */