Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rework the Account model #1999

Draft
wants to merge 26 commits into
base: next
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
c5cae44
fix webp
stevenruidigao Jan 6, 2025
b8a31cb
preliminary work
stevenruidigao Jan 7, 2025
351f755
some work done, mostly to move staff
stevenruidigao Jan 8, 2025
75b8be2
fix incognito, profiles
stevenruidigao Jan 8, 2025
2ddd162
fix game end I think (needs testing)
stevenruidigao Jan 8, 2025
30f3904
fix end-game
stevenruidigao Jan 8, 2025
3e5e8ba
update season number on restart, rename constants
stevenruidigao Jan 8, 2025
b965b81
flatten accounts model, change to get to fix end-game?
stevenruidigao Jan 9, 2025
e96e36e
fix seasonal elo calc
stevenruidigao Jan 9, 2025
7d2b918
more fixes
stevenruidigao Jan 9, 2025
1158843
oops
stevenruidigao Jan 9, 2025
eec20ba
fix cardbacks I think
stevenruidigao Jan 9, 2025
391dc20
add migration script; fix oauth
stevenruidigao Jan 10, 2025
d17c74b
fix cardbacks, I think? + add working migration script
stevenruidigao Jan 10, 2025
0179da9
add better guard in the migration
stevenruidigao Jan 10, 2025
029d629
fix creategame error
stevenruidigao Jan 10, 2025
5228558
fix profile
stevenruidigao Jan 10, 2025
7b9a9a5
fix profile
stevenruidigao Jan 10, 2025
91a2ecb
update migration script to print progress every 100
stevenruidigao Jan 13, 2025
aa0bb40
update badges.js, make husky stop
stevenruidigao Jan 14, 2025
32e803f
fix
stevenruidigao Jan 15, 2025
54c3810
move .color to .theme
stevenruidigao Jan 16, 2025
993b4d9
oops
stevenruidigao Jan 16, 2025
11747e0
fix
stevenruidigao Jan 16, 2025
d8c7c02
pull in changes from ts branch (UNTESTED)
stevenruidigao Jan 17, 2025
3a581c6
forgot to add import
stevenruidigao Jan 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 50 additions & 126 deletions models/account.js
Original file line number Diff line number Diff line change
@@ -1,29 +1,41 @@
const mongoose = require('mongoose');
const passportLocalMongoose = require('passport-local-mongoose');

const { Schema } = mongoose;

const Stats = new Schema({
xp: { type: Number, default: 0 },
elo: { type: Number, default: 1600 },
wins: { type: Number, default: 0 },
losses: { type: Number, default: 0 },
rainbowWins: { type: Number, default: 0 },
rainbowLosses: { type: Number, default: 0 }
});

const Account = new Schema({
username: {
type: String,
required: true,
unique: true
},
version: Number,
username: { type: String, required: true, unique: true },
password: String,
isLocal: Boolean,
staffRole: String,
isContributor: Boolean,
hasNotDismissedSignupModal: Boolean,
dismissedSignupModal: Boolean,
gameSettings: {
playerPronouns: String,
staffDisableVisibleElo: Boolean,
staffDisableVisibleXP: Boolean,
staffDisableStaffColor: Boolean,
staffIncognito: Boolean,
staff: {
disableVisibleElo: Boolean,
disableVisibleXP: Boolean,
disableStaffColor: Boolean,
incognito: Boolean
},
isRainbow: Boolean,
newReport: Boolean,
hasUnseenBadge: Boolean,
customCardback: String,
customCardbackSaveTime: String,
customCardbackUid: String,
customCardback: {
fileExtension: String, // always 'png'
saveTime: String,
uid: String
},
enableTimestamps: Boolean,
enableRightSidebarInGame: Boolean,
disablePlayerColorsInChat: Boolean,
Expand Down Expand Up @@ -53,13 +65,13 @@ const Account = new Schema({
keyboardShortcuts: String,
notifyForNewLobby: Boolean,
gameFilters: {
pub: Boolean,
priv: Boolean,
unstarted: Boolean,
inprogress: Boolean,
inProgress: Boolean,
completed: Boolean,
customgame: Boolean,
casualgame: Boolean,
pub: Boolean,
priv: Boolean,
custom: Boolean,
casual: Boolean,
timedMode: Boolean,
standard: Boolean,
rainbow: Boolean
Expand Down Expand Up @@ -89,129 +101,41 @@ const Account = new Schema({
touLastAgreed: String,
bio: String,
games: Array,
wins: Number,
losses: Number,
rainbowWins: Number,
rainbowLosses: Number,
winsSeason1: Number,
lossesSeason1: Number,
rainbowWinsSeason1: Number,
rainbowLossesSeason1: Number,
winsSeason2: Number,
lossesSeason2: Number,
rainbowWinsSeason2: Number,
rainbowLossesSeason2: Number,
winsSeason3: Number,
lossesSeason3: Number,
rainbowWinsSeason3: Number,
rainbowLossesSeason3: Number,
winsSeason4: Number,
lossesSeason4: Number,
rainbowWinsSeason4: Number,
rainbowLossesSeason4: Number,
winsSeason5: Number,
lossesSeason5: Number,
rainbowWinsSeason5: Number,
rainbowLossesSeason5: Number,
winsSeason6: Number,
lossesSeason6: Number,
rainbowWinsSeason6: Number,
rainbowLossesSeason6: Number,
winsSeason7: Number,
lossesSeason7: Number,
rainbowWinsSeason7: Number,
rainbowLossesSeason7: Number,
winsSeason8: Number,
lossesSeason8: Number,
rainbowWinsSeason8: Number,
rainbowLossesSeason8: Number,
winsSeason9: Number,
lossesSeason9: Number,
rainbowWinsSeason9: Number,
rainbowLossesSeason9: Number,
winsSeason10: Number,
lossesSeason10: Number,
rainbowWinsSeason10: Number,
rainbowLossesSeason10: Number,
winsSeason11: Number,
lossesSeason11: Number,
rainbowWinsSeason11: Number,
rainbowLossesSeason11: Number,
winsSeason12: Number,
lossesSeason12: Number,
rainbowWinsSeason12: Number,
rainbowLossesSeason12: Number,
winsSeason13: Number,
lossesSeason13: Number,
rainbowWinsSeason13: Number,
rainbowLossesSeason13: Number,
winsSeason14: Number,
lossesSeason14: Number,
rainbowWinsSeason14: Number,
rainbowLossesSeason14: Number,
winsSeason15: Number,
lossesSeason15: Number,
rainbowWinsSeason15: Number,
rainbowLossesSeason15: Number,
winsSeason16: Number,
lossesSeason16: Number,
rainbowWinsSeason16: Number,
rainbowLossesSeason16: Number,
winsSeason17: Number,
lossesSeason17: Number,
rainbowWinsSeason17: Number,
rainbowLossesSeason17: Number,
winsSeason18: Number,
lossesSeason18: Number,
rainbowWinsSeason18: Number,
rainbowLossesSeason18: Number,
winsSeason19: Number,
lossesSeason19: Number,
rainbowWinsSeason19: Number,
rainbowLossesSeason19: Number,
winsSeason20: Number,
lossesSeason20: Number,
rainbowWinsSeason20: Number,
rainbowLossesSeason20: Number,
winsSeason21: Number,
lossesSeason21: Number,
rainbowWinsSeason21: Number,
rainbowLossesSeason21: Number,
winsSeason22: Number,
lossesSeason22: Number,
rainbowWinsSeason22: Number,
rainbowLossesSeason22: Number,
overall: Stats,
seasons: { type: Map, of: Stats, default: {} },
previousDayElo: Number,
previousDayXP: Number,
created: Date,
isOnFire: Boolean,
lastCompletedGame: Date,
lastVersionSeen: String,
isFixed: Boolean,
eloSeason: Number,
eloOverall: Number,
hashUid: String,
discordUsername: String,
discordDiscriminator: String,
discordMFA: Boolean,
discordUID: String,
githubUsername: String,
githubMFA: Boolean,
warnings: Array, // {text: String, moderator: String, time: Date, acknowledged: Boolean},
discord: {
username: String,
discriminator: String,
mfa: Boolean,
uid: String
},
github: {
username: String,
mfa: Boolean
},
warnings: Array, // { text: String, moderator: String, time: Date, acknowledged: Boolean },
feedbackSubmissions: Array, // { time: Date, text: String }
primaryColor: String,
secondaryColor: String,
tertiaryColor: String,
backgroundColor: String,
textColor: String,
theme: {
primaryColor: String,
secondaryColor: String,
tertiaryColor: String,
backgroundColor: String,
textColor: String
},
eloPercentile: {
seasonal: Number,
overall: Number
},
isRainbowSeason: Boolean,
isRainbowOverall: Boolean,
xpOverall: { type: Number, default: 0 },
xpSeason: { type: Number, default: 0 },
dateRainbowOverall: Date,
badges: [{ id: String, text: String, title: String, dateAwarded: Date }],
maxElo: { type: Number, default: 1600 },
Expand Down
69 changes: 40 additions & 29 deletions routes/accounts.js
Original file line number Diff line number Diff line change
Expand Up @@ -257,30 +257,38 @@ const continueSignup = config => {
} else {
if (isOAuth) {
const accountObj = {
version: 2,
username: username,
gameSettings: {
soundStatus: 'pack2'
},
verified: true,
wins: 0,
losses: 0,
overall: {
wins: 0,
losses: 0
},
created: new Date(),
signupIP: signupIP,
hasNotDismissedSignupModal: true,
dismissedSignupModal: false,
verification: {
email: type === 'discord' ? profile.email : profile._json.email
},
lastConnectedIP: signupIP
};

if (type === 'discord') {
accountObj.discordDiscriminator = profile.discriminator;
accountObj.discordMFA = profile.mfa_enabled;
accountObj.discordUsername = profile.username;
accountObj.discordUID = profile.id;
accountObj.discord = {
username: profile.username,
discriminator: profile.discriminator,
mfa: profile.mfa_enabled,
uid: profile.id
};
} else {
accountObj.githubUsername = profile.username;
accountObj.githubMFA = profile._json.two_factor_authentication;
accountObj.github = {
username: profile.username,
mfa: profile._json.two_factor_authentication
};

accountObj.bio = profile._json.bio;
}

Expand All @@ -293,7 +301,7 @@ const continueSignup = config => {
? `${config.type} ${config.profile.username}${config.type === 'discord' ? '#' + config.profile.discriminator : ''}`
: Boolean(email),
unobfuscatedIP: signupIP,
oauthID: `${config.isOAuth && config.type === 'discord' ? accountObj.discordUID : ''}`
oauthID: `${config.isOAuth && config.type === 'discord' ? accountObj.discord?.id : ''}`
});

Account.register(
Expand Down Expand Up @@ -390,9 +398,9 @@ module.exports.accounts = torIpsParam => {
username: req.user.username,
verified: req.user.verified,
email: req.user.verification ? req.user.verification.email : '',
discordUsername: req.user.discordUsername,
discordDiscriminator: req.user.discordDiscriminator,
githubUsername: req.user.githubUsername
discordUsername: req.user.discord?.username,
discordDiscriminator: req.user.discord?.discriminator,
githubUsername: req.user.github?.username
});
});

Expand Down Expand Up @@ -465,9 +473,10 @@ module.exports.accounts = torIpsParam => {
}
const signupIP = req.expandedIP;
const save = {
version: 2,
username,
isLocal: true,
hasNotDismissedSignupModal: true,
dismissedSignupModal: false,
gameSettings: {
soundStatus: 'pack2',
isPrivate
Expand All @@ -477,8 +486,10 @@ module.exports.accounts = torIpsParam => {
},
verified: false,
games: [],
wins: 0,
losses: 0,
overall: {
wins: 0,
losses: 0
},
created: new Date(),
signupIP,
lastConnectedIP: signupIP
Expand Down Expand Up @@ -802,21 +813,25 @@ module.exports.accounts = torIpsParam => {

if (req.user) {
if (type === 'discord') {
req.user.discordUsername = profile.username;
req.user.discordDiscriminator = profile.discriminator;
req.user.discordMFA = profile.mfa_enabled;
req.user.discordUID = profile.id;
req.user.discord = {
username: profile.username,
discriminator: profile.discriminator,
mfa: profile.mfa_enabled,
uid: profile.id
};
} else {
req.user.githubUsername = profile.username;
req.user.githubMFA = profile.two_factor_authentication;
req.user.github = {
username: profile.username,
mfa: profile.two_factor_authentication
};
}
req.user.verified = true;
req.user.save(() => {
res.redirect('/game');
});
} else {
// see if their oauth information matches an account, if so sign them in
const queryObj = type === 'discord' ? { discordUID: profile.id } : { githubUsername: profile.username };
const queryObj = type === 'discord' ? { 'discord.uid': profile.id } : { 'github.username': profile.username };

Account.findOne(queryObj)
.then(account => {
Expand Down Expand Up @@ -962,18 +977,14 @@ module.exports.accounts = torIpsParam => {
});

app.get('/revoke-discord', ensureAuthenticated, (req, res) => {
req.user.discordUsername = null;
req.user.discordDiscriminator = null;
req.user.discordUID = null;
req.user.discordMFA = null;
req.user.discord = {};
req.user.save(() => {
res.redirect('/account');
});
});

app.get('/revoke-github', ensureAuthenticated, (req, res) => {
req.user.githubUsername = null;
req.user.githubMFA = null;
req.user.github = {};
req.user.save(() => {
res.redirect('/account');
});
Expand Down
Loading
Loading