Finished up implementing channel-based user bans.

This commit is contained in:
rainbow napkin 2024-12-01 17:18:43 -05:00
parent ef79e9941c
commit 96953979a2
19 changed files with 518 additions and 202 deletions

View file

@ -21,8 +21,9 @@ class canopyAdminUtils{
//Statics
static banUserPopup = class{
constructor(target){
constructor(target, cb){
this.target = target;
this.cb = cb;
this.popup = new canopyUXUtils.popup("userBan", true, this.asyncConstruction.bind(this));
}
@ -61,12 +62,12 @@ class canopyAdminUtils{
this.popup.closePopup();
//Submit the user ban based on input
const bans = await adminUtil.banUser(this.target, this.permBan.checked, this.expiration.value);
const data = await adminUtil.banUser(this.target, this.permBan.checked, this.expiration.value);
//For some reason comparing this against undefined or null wasnt working in and of itself...
if(typeof userBanList != "undefined" && bans != null){
if(data != null){
//Why add an extra get request when we already have the data? :P
await userBanList.renderBanList(bans);
await this.cb(data);
}
}
}
@ -197,8 +198,7 @@ class adminUserList{
banPopup(event){
const user = event.target.id.replace("admin-user-list-ban-icon-","");
new canopyAdminUtils.banUserPopup(user);
new canopyAdminUtils.banUserPopup(user, userBanList.renderBanList.bind(userBanList));
}
updateSelect(update, select){
@ -283,14 +283,10 @@ class adminUserBanList{
renderBanList(banList){
this.clearBanList();
console.log(banList);
banList.forEach((ban) => {
//Calculate expiration date and expiration days
const expirationDate = new Date(ban.expirationDate);
const expirationDays = ((expirationDate - new Date()) / (1000 * 60 * 60 * 24)).toFixed(1);
var expirationDateString = `${expirationDate.toDateString()} (${expirationDays} day(s) left)`;
var banActionString = ban.permanent ? "Account Deletion" : "Un-Ban";
console.log(ban);
var expirationDateString = `${new Date(ban.expirationDate).toDateString()}<br>(${ban.daysUntilExpiration} day(s) left)`;
var banActionString = ban.permanent ? "Nuke<br>Accounts" : "Un-Ban";
if(ban.user == null){
//Fudge the user object if it's already been deleted
ban.user = {
@ -302,8 +298,8 @@ class adminUserBanList{
//Fake the display string
var signUpDateString = "-"
expirationDateString = "Accounts Nuked"
banActionString = "Accounts Nuked"
expirationDateString = "Accounts<br>Nuked"
banActionString = "Accounts<br>Nuked"
}else{
var signUpDateString = new Date(ban.user.date).toDateString()
@ -331,59 +327,28 @@ class adminUserBanList{
nukeAccount.title = `Nuke accounts`;
nukeAccount.addEventListener("click",console.log);
//Append cells to row
entryRow.appendChild(newCell(imgNode, true));
entryRow.appendChild(newCell(ban.user.id));
entryRow.appendChild(newCell(ban.user.user));
entryRow.appendChild(newCell(signUpDateString));
entryRow.appendChild(newCell(new Date(ban.banDate).toDateString()));
entryRow.appendChild(newCell(expirationDateString));
entryRow.appendChild(newCell(banActionString));
entryRow.appendChild(newCell(ban.user.deleted ? unbanIcon : [unbanIcon, nukeAccount]));
//append img cell to row
entryRow.appendChild(utils.ux.newTableCell(imgNode, true));
//Append standard cells to row
[
ban.user.id,
ban.user.user,
signUpDateString,
new Date(ban.banDate).toDateString(),
expirationDateString,
banActionString,
(ban.user.deleted ? unbanIcon : [unbanIcon, nukeAccount])
].forEach((content)=>{
//I don't like repeating myself, and this didn't really need it's own function
//though we could make one where each is an object that contains ever property needed and pass it to a mktable function
//I just don't see us using it enough to justify it :P
entryRow.appendChild(utils.ux.newTableCell(content));
});
//Append row to table
this.table.appendChild(entryRow);
});
//We should really move this over to uxutils along with newrow & newtable functions
function newCell(content, firstCol = false){
//Create a new 'td' element
const cell = document.createElement('td');
cell.classList.add("admin-list-entry","admin-list-entry-item");
//If it's not the first column, mention it!
if(!firstCol){
cell.classList.add("admin-list-entry-not-first-col");
}
//check for arrays
if(content.forEach == null){
//add single items
addContent(content);
}else{
//Crawl through content array
content.forEach((item)=>{
//add each item
addContent(item);
});
}
//return the resulting cell
return cell;
function addContent(ct){
//If we're adding as node
if(ct.cloneNode != null){
//append it like it's a node
cell.appendChild(ct);
}else{
//otherwise use it as innerHTML
cell.innerHTML = ct;
}
}
}
}
}