Compare commits

...

5 Commits
main ... dev

Author SHA1 Message Date
bd1da7928f Added infinite scroll for news page 2025-05-29 21:04:30 -04:00
53feec52f9 Removed commented code 2025-05-29 12:23:10 -04:00
72ec2e0bc0 Replaced ambiguous Unicode characters 2025-05-29 12:14:12 -04:00
de5ef86edb Various Improvements 2025-05-29 12:05:13 -04:00
d7e5aa3256 Added discord name colors and avatars 2025-05-26 02:12:16 -04:00
15 changed files with 298 additions and 173 deletions

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 MiB

View File

@ -1,5 +1,8 @@
const url = new URL(window.location.toLocaleString());
const sectionList = document.getElementsByClassName("section");
const pageList = document.getElementsByClassName("page");
const loaded = [];
var currentPage;
const nnRuler = "cool_tellow";
const nnCoRuler = "ColoradoCrusade";
@ -11,7 +14,7 @@ const constitutionAmendments = [
[
"A term is 2 months long. Approval ratings run 1 month into a term. A player is good to rule for at most 2 terms in a row before they must take a mandatory offterm. Once an off term is taken, their slate is clean and the player may run again with the same limitation as listed before.",
"New Nameful is its own identity, and cannot be conglomerated into any other town or nation. Membership status with the United Cities is to be maintained.",
"History is to be recorded to the best of the Ruler and their cabinets abilities. History is to be recorded in the New Nameful Museum, found in the Town Hall.",
"History is to be recorded to the best of the Ruler and their cabinets' abilities. History is to be recorded in the New Nameful Museum, found in the Town Hall.",
"Departments carry over into the next term, regardless of who the Ruler is. The ruler may create and delete Departments as well as hire and fire heads of departments. No department is to be without a head.",
"Anyone may run for Ruler, and anyone may win. Unless serious, condemning evidence of fraud or other foul play is found, no one is to be denied their electoral victory and rulership status. Rulers may both vote in and endorse candidates in elections.",
"The Co-Ruler has the same power of the Ruler, except they must achieve the permission of the Ruler for any major action or legislation.",
@ -32,7 +35,7 @@ const memberList = ["<span class='&b'>Om<span class='&5'>te<span class='&7'>gu</
const colorCodes = ["&0", "&1", "&2", "&3", "&4", "&5", "&6", "&7", "&8", "&9", "&a", "&b", "&c", "&d", "&e", "&f"]
const colorCodeColors = ["#000000", "#0000AA", "#00AA00", "#00AAAA", "#AA0000", "#AA00AA", "#FFAA00", "#AAAAAA", "#555555", "#5555FF", "#55FF55", "#55FFFF", "#FF5555", "#FF55FF", "#FFFF55", "#FFFFFF"]
let splashes = ["Totally not rigged!!!", "New Lameful", "What's Uptown?", nnRuler + " approves!", "♫I've been workin' on the railroad♫", "Also visit CalvinTown", "Also visit IkeaLand", "Also visit Matsunoki", "Also visit MillField", "Also visit Jurcgrad", "Also visit Spawn 2025", "Brought to you by the NNNNNNNNNN", "<b><i>Dig the Cube</i></b>", "Featured Players: " + keyboardanTroll() + " and " + keyboardanTroll(), "Urban Sprawl!", "Invest in WormzyCoin!", "New and Improved!", "Omtegu!", "do /pay new_nameful 20 for good luck", "my asshole hurts", "The most extravagant group project", "That damn cube…", "what the nameful", "Vote Karma!", "Cobble ceiling has been removed.", "railroad fetish", "ColoradoCrusade!", "MississipiMuslim!!", "PennsylvaniaPacifist!", "Haiiiii Lkarchhhh :3", "23% approved!", "67% approved!", "71% approved!", "Now updated to 1.21.5", "hardly know her", "Praise be thine", "Beware the NBP", "/lmk NewNameful", "Coded by Lkarch", "Just one more rail line…", "I think I get why they call it Minecraft", "Why isnt there a New Nameful 2?", "The townsfolk get a little quirky at night.", "/pay keyboardan 100", "Cube 3 coming soon!", "\"Mildly funny splash text here\"", "Also try Old Nameful"];
let splashes = ["Totally not rigged!!!", "New Lameful", "What's Uptown?", nnRuler + " approves!", "♫I've been workin' on the railroad♫", "Also visit CalvinTown", "Also visit IkeaLand", "Also visit Matsunoki", "Also visit MillField", "Also visit Jurcgrad", "Also visit Spawn 2025", "Brought to you by the NNNNNNNNNN", "<b><i>Dig the Cube</i></b>", "Featured Players: " + keyboardanTroll() + " and " + keyboardanTroll(), "Urban Sprawl!", "Invest in WormzyCoin!", "New and Improved!", "Omtegu!", "do /pay new_nameful 20 for good luck", "my asshole hurts", "The most extravagant group project", "That damn cube…", "what the nameful", "Vote Karma!", "Cobble ceiling has been removed.", "railroad fetish", "ColoradoCrusade!", "MississipiMuslim!!", "PennsylvaniaPacifist!", "Haiiiii Lkarchhhh :3", "23% approved!", "67% approved!", "71% approved!", "Now updated to 1.21.5", "hardly know her", "Praise be thine", "Beware the NBP", "/lmk NewNameful", "Coded by Lkarch", "Just one more rail line…", "I think I get why they call it Minecraft", "Why isn't there a New Nameful 2?", "The townsfolk get a little quirky at night.", "/pay keyboardan 100", "Cube 3 coming soon!", "\"Mildly funny splash text here\"", "Also try Old Nameful"];
function getCookie(cookieName) {
let name = cookieName + "=";
@ -82,98 +85,6 @@ function processColorCodes() {
console.log("Processed color codes!")
}
function switchSection(sectionName, button) {
for (let i = 0; i < sectionList.length; i++) {
sectionList[i].style.display = "none";
}
let navButton = document.getElementsByClassName("navButton");
for (let i = 0; i < navButton.length; i++) {
navButton[i].style.backgroundColor = "black";
navButton[i].style.color = "white";
}
document.title = button.innerText;
document.cookie = "section=" + sectionName;
document.getElementById(sectionName).style.display = "block";
button.style.backgroundColor = "white";
button.style.color = "black";
}
function loadRulersAndElectionCountdown() {
console.log("Ruler found: \"" + nnRuler + "\"");
document.getElementById("ruler").innerText = nnRuler;
document.getElementById("rulerAttachment").src = "https://minotar.net/armor/body/" + nnRuler + "/100.png";
console.log("Co-ruler found: \"" + nnCoRuler + "\"");
document.getElementById("coRuler").innerText = nnCoRuler;
document.getElementById("coRulerAttachment").src = "https://minotar.net/armor/body/" + nnCoRuler + "/100.png";
console.log("Next election occurs in " + calculateCountdown(electionDate) + " days");
if (Math.ceil(calculateCountdown(electionDate)) <= 0) {
document.getElementById("electionCountdown").innerText = "The next election is RIGHT NOW!!!";
} else {
document.getElementById("electionCountdown").innerText = "The next election is in " + Math.ceil(calculateCountdown(electionDate)) + " days!";
}
}
function randomizeSplash() {
let randomSplash = splashes[Math.floor(Math.random() * splashes.length)];
console.log("Splash randomized to \"" + randomSplash +"\"");
document.getElementById("splash").innerHTML = randomSplash;
}
function loadConstitution() {
for (let constitutionSection = 0; constitutionSection < constitutionSections.length; constitutionSection++) {
let constitutionSectionName = constitutionSections[constitutionSection].toLowerCase();
let constitutionSectionContainer = document.createElement("div");
let constitutionSectionTitle = document.createElement("p");
let constitutionLine = document.createElement("hr");
constitutionSectionContainer.className = "card";
constitutionSectionContainer.id = constitutionSectionName + "ConstitutionSection";
constitutionSectionTitle.innerText = constitutionSections[constitutionSection];
document.getElementById("constitution").append(constitutionSectionContainer);
document.getElementById(constitutionSectionContainer.id).append(constitutionSectionTitle,constitutionLine);
if (typeof (constitutionPreambles[constitutionSection]) !== "undefined") {
let sectionPreamble = document.createElement("div");
sectionPreamble.id = constitutionSectionName + "Preamble";
sectionPreamble.innerText = constitutionPreambles[constitutionSection];
document.getElementById(constitutionSectionContainer.id).append(sectionPreamble);
}
for (let amendment = 0; amendment < constitutionAmendments[constitutionSection].length; amendment++) {
let amendmentContent = document.createElement("p");
amendmentContent.class = "amendment";
amendmentContent.id = constitutionSections[constitutionSection] + "Amendment" + amendment;
amendmentContent.innerText = amendment + 1 + ") " + constitutionAmendments[constitutionSection][amendment];
document.getElementById(constitutionSectionContainer.id).append(amendmentContent);
}
}
}
function loadMemberList() {
for (let member = 0; member < memberList.length; member++) {
let memberListItem = document.createElement("p");
memberListItem.innerHTML = memberList[member];
document.getElementById("memberCount").innerText = "Member Count: " + memberList.length;
document.getElementById("memberList").append(memberListItem);
}
}
function loadDiscordMessagesFromJson(jsonName, addMessageContent, addAttachments, attachmentLinkOrEmbed) {
fetch("/assets/json/" + jsonName + "/" + jsonName + ".json")
.then(response => response.json())
@ -181,17 +92,20 @@ function loadDiscordMessagesFromJson(jsonName, addMessageContent, addAttachments
json.messages.reverse();
for (let message = 0; message < json.messages.length; message++) {
let messageContainer = document.createElement("div");
let messageAuthorAvatar = document.createElement("img");
let messageTitle = document.createElement("p");
let messageDate = new Date(json.messages[message].timestamp);
let messageLine = document.createElement("hr");
messageContainer.className = "card";
messageContainer.id = jsonName + message;
messageContainer.style = "overflow: hidden;";
messageTitle.innerText = json.messages[message].author.nickname + " | " + messageDate.toLocaleDateString();
messageContainer.id = jsonName + "-" + message;
messageAuthorAvatar.className = "message-author-avatar";
messageAuthorAvatar.src = "/assets/json/" + jsonName + "/" + json.messages[message].author.avatarUrl;
messageTitle.style = "margin-top: 5px;"
messageTitle.innerHTML = "<span style='color: " + json.messages[message].author.color + ";'>" + json.messages[message].author.nickname + "</span>" + " | " + messageDate.toLocaleDateString();
document.getElementById(jsonName).append(messageContainer);
document.getElementById(messageContainer.id).append(messageTitle, messageLine);
document.getElementById(messageContainer.id).append(messageAuthorAvatar, messageTitle, messageLine);
if (addMessageContent == true) {
let messageContent = document.createElement("p");
@ -202,56 +116,164 @@ function loadDiscordMessagesFromJson(jsonName, addMessageContent, addAttachments
}
if (addAttachments == true) {
let messageAttachment;
for (let attachment = 0; attachment < json.messages[message].attachments.length; attachment++) {
if (attachmentLinkOrEmbed === "link") {
let messageAttachment = document.createElement("a");
messageAttachment = document.createElement("a");
messageAttachment.className = "messageAttachment";
messageAttachment.href = json.messages[message].attachments[attachment].url;
messageAttachment.innerText = json.messages[message].attachments[attachment].url;
messageAttachment.href = "/assets/json/" + jsonName + json.messages[message].attachments[attachment].url;
messageAttachment.innerText = json.messages[message].attachments[attachment].fileName;
document.getElementById(messageContainer.id).append(messageAttachment);
} else if (attachmentLinkOrEmbed === "embed") {
let messageAttachment = document.createElement("img");
messageAttachment = document.createElement("img");
messageAttachment.className = "messageAttachment";
messageAttachment.src = json.messages[message].attachments[attachment].url;
messageAttachment.src = "/assets/json/" + jsonName + "/" + json.messages[message].attachments[attachment].url;
document.getElementById(messageContainer.id).append(messageAttachment);
}
messageAttachment.className = "message-attachment";
document.getElementById(messageContainer.id).append(messageAttachment);
}
}
}
});
}
function onPageLoad() {
if (url.searchParams.has("section")) {
console.log("URL parameter found, forcing section to \"" + url.searchParams.get("section") + "\"");
document.getElementById(url.searchParams.get("section") + "Button").click();
} else if (getCookie("section") === "") {
console.log("A wild user appears! Defaulting to first section, \"" + sectionList[0].id + "\"");
document.getElementById(sectionList[0].id + "Button").click();
} else {
console.log("Section cookie found, restoring section to \"" + getCookie("section") + "\"");
document.getElementById(getCookie("section") + "Button").click();
function switchPage(pageName, button) {
currentPage = pageName;
for (let page = 0; page < pageList.length; page++) {
pageList[page].style.display = "none";
}
loadRulersAndElectionCountdown();
loadConstitution();
loadMemberList();
loadDiscordMessagesFromJson("announcements", true, true, "embed");
loadDiscordMessagesFromJson("newnamefulnewsnotice", false, true, "embed");
processColorCodes();
let navButtons = document.getElementsByClassName("nav-button");
for (let navButton = 0; navButton < navButtons.length; navButton++) {
navButtons[navButton].style.backgroundColor = "black";
navButtons[navButton].style.color = "white";
}
document.title = button.innerText;
document.cookie = "page=" + pageName;
document.getElementById(pageName).style.display = "block";
button.style.backgroundColor = "white";
button.style.color = "black";
for (let page = 0; page <= loaded.length; page++) {
if (! loaded.includes(pageName)) {
loaded.push(pageName);
window[pageName + "Load"]();
}
}
}
function infoLoad() {
randomizeSplash();
}
function electionLoad() {
console.log("Ruler found: \"" + nnRuler + "\"");
document.getElementById("ruler").innerText = nnRuler;
document.getElementById("ruler-attachment").src = "https://minotar.net/armor/body/" + nnRuler + "/100.png";
console.log("Co-ruler found: \"" + nnCoRuler + "\"");
document.getElementById("co-ruler").innerText = nnCoRuler;
document.getElementById("co-ruler-attachment").src = "https://minotar.net/armor/body/" + nnCoRuler + "/100.png";
console.log("Next election occurs in " + calculateCountdown(electionDate) + " days");
if (Math.ceil(calculateCountdown(electionDate)) <= 0) {
document.getElementById("election-countdown").innerText = "The next election is RIGHT NOW!!!";
} else {
document.getElementById("election-countdown").innerText = "The next election is in " + Math.ceil(calculateCountdown(electionDate)) + " days!";
}
}
function randomizeSplash() {
let randomSplash = splashes[Math.floor(Math.random() * splashes.length)];
console.log("Splash randomized to \"" + randomSplash +"\"");
document.getElementById("splash").innerHTML = randomSplash;
}
function constitutionLoad() {
for (let constitutionSection = 0; constitutionSection < constitutionSections.length; constitutionSection++) {
let constitutionSectionName = constitutionSections[constitutionSection].toLowerCase();
let constitutionSectionContainer = document.createElement("div");
let constitutionSectionTitle = document.createElement("p");
let constitutionLine = document.createElement("hr");
constitutionSectionContainer.className = "card";
constitutionSectionContainer.id = constitutionSectionName + "-constitution-section";
constitutionSectionTitle.innerText = constitutionSections[constitutionSection];
document.getElementById("constitution").append(constitutionSectionContainer);
document.getElementById(constitutionSectionContainer.id).append(constitutionSectionTitle,constitutionLine);
if (typeof (constitutionPreambles[constitutionSection]) !== "undefined") {
let sectionPreamble = document.createElement("div");
sectionPreamble.id = constitutionSectionName + "-preamble";
sectionPreamble.innerText = constitutionPreambles[constitutionSection];
document.getElementById(constitutionSectionContainer.id).append(sectionPreamble);
}
for (let amendment = 0; amendment < constitutionAmendments[constitutionSection].length; amendment++) {
let amendmentContent = document.createElement("p");
amendmentContent.class = "amendment";
amendmentContent.id = constitutionSections[constitutionSection].toLowerCase() + "-amendment-" + amendment;
amendmentContent.innerText = amendment + 1 + ") " + constitutionAmendments[constitutionSection][amendment];
document.getElementById(constitutionSectionContainer.id).append(amendmentContent);
}
}
}
function membersLoad() {
for (let member = 0; member < memberList.length; member++) {
let memberListItem = document.createElement("p");
memberListItem.innerHTML = memberList[member];
document.getElementById("member-count").innerText = "Member Count: " + memberList.length;
document.getElementById("member-list").append(memberListItem);
}
processColorCodes();
}
function announcementsLoad() {
// loadDiscordMessagesFromJson("announcements", true, true, "embed");
addDiscordCards(window[currentPage + "CurrentIndex"], "announcements", true, true, "embed");
}
function newnamefulnewsnoticeLoad() {
// loadDiscordMessagesFromJson("newnamefulnewsnotice", false, true, "embed");
addDiscordCards(window[currentPage + "CurrentIndex"], "newnamefulnewsnotice", false, true, "embed");
window.addEventListener("scroll", handleInfiniteScroll);
}
function onPageLoad() {
if (url.searchParams.has("page")) {
console.log("URL parameter found, forcing page to \"" + url.searchParams.get("page") + "\"");
document.getElementById(url.searchParams.get("page") + "-button").click();
} else if (getCookie("page") === "") {
console.log("A wild user appears! Defaulting to first page, \"" + pageList[0].id + "\"");
document.getElementById(pageList[0].id + "-button").click();
} else {
console.log("Page cookie found, restoring page to \"" + getCookie("page") + "\"");
document.getElementById(getCookie("page") + "-button").click();
}
}
function loadArchive() {
for (let archive = 0; archive < 3; archive++) {
let archiveAttachment = document.createElement("img");
archiveAttachment.className = "archiveAttachment";
archiveAttachment.className = "archive-attachment";
archiveAttachment.src = "/archive/archive-" + archive;
document.body.append(archiveAttachment);

View File

@ -0,0 +1,104 @@
const cardIncrease = 10;
var announcementsCardLimit;
var announcementsCurrentIndex = 0;
var newnamefulnewsnoticeCardLimit;
var newnamefulnewsnoticeCurrentIndex = 0;
var throttleTimer;
const throttle = (callback, time) => {
if (throttleTimer) return;
throttleTimer = true;
setTimeout(() => {
callback();
throttleTimer = false;
}, time);
};
function createCardFromDiscordMessage(index, json, jsonName, addMessageContent, addAttachments, attachmentLinkOrEmbed) {
let messageContainer = document.createElement("div");
let messageAuthorAvatar = document.createElement("img");
let messageTitle = document.createElement("p");
let messageDate = new Date(json.messages[index].timestamp);
let messageLine = document.createElement("hr");
messageContainer.className = "card";
messageContainer.id = jsonName + "-" + index;
messageAuthorAvatar.className = "message-author-avatar";
messageAuthorAvatar.src = "/assets/json/" + jsonName + "/" + json.messages[index].author.avatarUrl;
messageTitle.style = "margin-top: 5px;"
messageTitle.innerHTML = "<span style='color: " + json.messages[index].author.color + ";'>" + json.messages[index].author.nickname + "</span>" + " | " + messageDate.toLocaleDateString();
document.getElementById(jsonName).append(messageContainer);
document.getElementById(messageContainer.id).append(messageAuthorAvatar, messageTitle, messageLine);
if (addMessageContent == true) {
let messageContent = document.createElement("p");
messageContent.innerText = json.messages[index].content;
document.getElementById(messageContainer.id).append(messageContent);
}
if (addAttachments == true) {
let messageAttachment;
for (let attachment = 0; attachment < json.messages[index].attachments.length; attachment++) {
if (attachmentLinkOrEmbed === "link") {
messageAttachment = document.createElement("a");
messageAttachment.href = "/assets/json/" + jsonName + json.messages[index].attachments[attachment].url;
messageAttachment.innerText = json.messages[index].attachments[attachment].fileName;
} else if (attachmentLinkOrEmbed === "embed") {
messageAttachment = document.createElement("img");
messageAttachment.src = "/assets/json/" + jsonName + "/" + json.messages[index].attachments[attachment].url;
document.getElementById(messageContainer.id).append(messageAttachment);
}
messageAttachment.className = "message-attachment";
document.getElementById(messageContainer.id).append(messageAttachment);
}
}
}
async function addDiscordCards(cardIndex, jsonName, addMessageContent, addAttachments, attachmentLinkOrEmbed) {
const response = await fetch("/assets/json/" + jsonName + "/" + jsonName + ".json");
const jsonData = await response.json();
jsonData.messages.reverse();
window[currentPage + "CardLimit"] = jsonData.messages.length;
window[currentPage + "CurrentIndex"] = cardIndex
window[currentPage + "EndIndex"] = window[currentPage + "CurrentIndex"] == window[currentPage + "CardLimit"] ? window[currentPage + "CardLimit"] : window[currentPage + "CurrentIndex"] + cardIncrease;
for (let i = window[currentPage + "CurrentIndex"]; i < window[currentPage + "EndIndex"]; i++) {
createCardFromDiscordMessage(i, jsonData, jsonName, addMessageContent, addAttachments, attachmentLinkOrEmbed);
console.log("Added card " + i)
}
console.log(window[currentPage + "CurrentIndex"] + " " + window[currentPage + "CardLimit"]);
};
function handleInfiniteScroll() {
throttle(() => {
const endOfPage = Math.ceil(window.innerHeight + window.pageYOffset + 10) >= document.body.offsetHeight;
console.log(endOfPage)
if (endOfPage && currentPage === "newnamefulnewsnotice") {
console.log("Adding cards")
addDiscordCards(window[currentPage + "CurrentIndex"] + cardIncrease, "newnamefulnewsnotice", false, true, "embed")
}
if (window[currentPage + "CurrentIndex"] + cardIncrease === window[currentPage + "CardLimit"]) {
console.log("Removing Handler")
removeInfiniteScroll(handleInfiniteScroll);
}
}, 1500);
}
function removeInfiniteScroll(name) {
window.removeEventListener("scroll", name);
console.log("removed " + name)
}

View File

@ -55,6 +55,7 @@ body {
margin-bottom: 20px;
box-shadow: 2px 2px 8px rgba(0,0,0,0.1);
width: 90%;
overflow: hidden;
}
.card p {
@ -66,14 +67,6 @@ body {
margin: auto;
}
.cardContainer {
margin: auto;
padding: 15px;
margin-bottom: 20px;
width: 90%;
height: 220;
}
#splash {
color: #FFFF00;
font-size: 1.5em;
@ -93,7 +86,7 @@ body {
animation: pop 0.58s infinite;
}
.section {
.page {
display: none;
padding: 95px 20px 20px;
}
@ -104,7 +97,7 @@ body {
background-color: black;
}
.navButton {
.nav-button {
float: left;
padding: 10px 20px;
border: none;
@ -115,7 +108,7 @@ body {
color: white;
}
.navButton:hover {
.nav-button:hover {
background-color: white !important;
color: black !important;
}
@ -128,20 +121,25 @@ body {
#footer a {
color: white;
font-size: 15px;
}
.infoAttachment {
.info-attachment {
padding: 10px;
width: 75%;
}
.messageAttachment {
.message-attachment {
padding: 10px;
width: 75%;
}
.message-author-avatar {
width: 64px;
border-radius: 100%;
}
.archiveAttachment {
.archive-attachment {
padding: 10px;
width: 75%;
}

View File

@ -12,89 +12,90 @@
</head>
<body onload="onPageLoad()">
<div id="navbar">
<button class="navButton" id="infoButton" onclick="switchSection('info', this)">Info</button>
<button class="navButton" id="electionButton" onclick="switchSection('election', this)">Election</button>
<button class="navButton" id="constitutionButton" onclick="switchSection('constitution', this)">Constitution</button>
<button class="navButton" id="membersButton" onclick="switchSection('members', this)">Members</button>
<button class="navButton" id="announcementsButton" onclick="switchSection('announcements', this)">Announcements</button>
<button class="navButton" id="newnamefulnewsnoticeButton" onclick="switchSection('newnamefulnewsnotice', this)">News</button>
<!-- <button class="navButton" id="historyButton" onclick="switchSection('history', this)">History</button> -->
<button class="navButton" id="discordButton" onclick="window.location.href = 'https://discord.newnameful.com'">Discord</button>
<button class="nav-button" id="info-button" onclick="switchPage('info', this)">Info</button>
<button class="nav-button" id="election-button" onclick="switchPage('election', this)">Election</button>
<button class="nav-button" id="constitution-button" onclick="switchPage('constitution', this)">Constitution</button>
<button class="nav-button" id="members-button" onclick="switchPage('members', this)">Members</button>
<button class="nav-button" id="announcements-button" onclick="switchPage('announcements', this)">Announcements</button>
<button class="nav-button" id="newnamefulnewsnotice-button" onclick="switchPage('newnamefulnewsnotice', this)">News</button>
<!-- <button class="nav-button" id="history-button" onclick="switchPage('history', this)">History</button> -->
<button class="nav-button" id="discord-button" onclick="window.location.href = 'https://discord.newnameful.com'">Discord</button>
</div>
<div class="section" id="info">
<img src="/assets/images/info/NamefulLogo.png" alt="">
<div class="page" id="info">
<img src="/assets/images/info/new-nameful-logo.png" alt="">
<div class="tilt">
<div id="splash" class="pop"></div>
</div>
<div class="card" id="infoIntroduction">
<div class="card" id="info-introduction">
<p>Introduction</p>
<hr>
<p>A large, populous town with great infrastructure, a good community, grand opportunities, and influence! New Nameful holds branches along other notable towns, being part of the United Cities and URO as well as the town spearheading the Nether Transit Coalition.</p>
</div>
<div class="card" id="infoDistricts">
<div class="card" id="info-districts">
<p>Districts</p>
<hr>
<p>The town is split into a district system, meaning different areas of the town may be managed by different players (and may have different rules, though this is rarely the case. Some noticeable districts include North Nameful, East Nameful, Nameful Bay, and Uptown Nameful.</p>
</div>
<div class="card" id="infoLeadership">
<div class="card" id="info-leadership">
<p>Leadership</p>
<hr>
<p>The town is run under a democratic structure of government, with bi-monthly elections to decide who leads the town. A rulership term is 2 months long, and a ruler is good to serve for at max 2 terms in a row before needing to take a mandatory off term. Political parties help group similarly minded individuals.</p>
</div>
<div class="card" id="infoJoinToday">
<div class="card" id="info-join-today">
<p>Join Today!</p>
<hr>
<p>New Nameful is FREE TO BUILD, meaning you do not need permission (save for specific districts). Just be respectful of other peoples builds and property. Take part of the community today!</p>
</div>
<div class="card" id="infoAttachments">
<div class="card" id="info-attachments">
<p>Images</p>
<hr>
<img class="infoAttachment" src="assets/images/info/ss-25_05_2025-01-53-13.png" alt="">
<img class="infoAttachment" src="assets/images/info/ss-25_05_2025-01-53-25.png" alt="">
<img class="infoAttachment" src="assets/images/info/ss-25_05_2025-01-53-48.png" alt="">
<img class="infoAttachment" src="assets/images/info/ss-25_05_2025-01-53-58.png" alt="">
<img class="infoAttachment" src="assets/images/info/ss-25_05_2025-01-54-19.png" alt="">
<img class="info-attachment" src="/assets/images/info/screenshot-1.jpg" alt="">
<img class="info-attachment" src="/assets/images/info/screenshot-2.jpg" alt="">
<img class="info-attachment" src="/assets/images/info/screenshot-3.jpg" alt="">
<img class="info-attachment" src="/assets/images/info/screenshot-4.jpg" alt="">
<img class="info-attachment" src="/assets/images/info/screenshot-5.jpg" alt="">
</div>
</div>
<div class="section" id="election">
<div class="page" id="election">
<p><b>Currently Elected Leaders</b></p>
<div class="card" style="height: 340px;width: 370px;">
<p>Ruler</p>
<hr>
<p id="ruler">Steve</p>
<img id="rulerAttachment" src="https://minotar.net/body/MHF_Steve/100.png" alt="Player Render">
<img id="ruler-attachment" src="https://minotar.net/body/MHF_Steve/100.png" alt="Player Render">
</div>
<div class="card" style="height: 340px;width: 370px;">
<p>Co-Ruler</p>
<hr>
<p id="coRuler">Steve</p>
<img id="coRulerAttachment" src="https://minotar.net/body/MHF_Steve/100.png" alt="Player Render">
<p id="co-ruler">Steve</p>
<img id="co-ruler-attachment" src="https://minotar.net/body/MHF_Steve/100.png" alt="Player Render">
</div>
<br>
<p id="electionCountdown">Election Countdown</p>
<p id="election-countdown">Election Countdown</p>
</div>
<div class="section" id="constitution">
<div class="page" id="constitution">
<p><b>Constitution</b></p>
</div>
<div class="section" id="members">
<div class="page" id="members">
<p><b>Member List</b></p>
<div class="card" id="memberList" style="width: 370px;">
<p id="memberCount">Member Count: 0</p>
<div class="card" id="member-list" style="width: 370px;">
<p id="member-count">Member Count: 0</p>
<hr>
</div>
</div>
<div class="section" id="announcements">
<p><b>Announcements</b></p>
<div class="page" id="announcements">
<p><b>Recent Announcements</b></p>
</div>
<div class="section" id="newnamefulnewsnotice">
<div class="page" id="newnamefulnewsnotice">
<p><b>New Nameful News Nexus News Network News Notice Noticeboard News</b></p>
</div>
<!-- <div class="section" id="history"> -->
<!-- <div class="page" id="history"> -->
<!-- <p>History</p> -->
<!-- </div> -->
<div id="footer">
<a href="https://git.lkarch.org/lkarch/newnameful.com">Source</a><br>
</div>
<script src="assets/javascript/index.js"></script>
<script src="/assets/javascript/load-discord-messages.js"></script>
<script src="/assets/javascript/index.js"></script>
</body>
</html>