mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-04-24 23:19:39 -05:00
leaveTeam
This commit is contained in:
parent
ea1022cac6
commit
5e8cb8600f
|
|
@ -14,6 +14,11 @@ const typeDef = gql`
|
|||
extend type Mutation {
|
||||
addTeam(name: String!): Boolean!
|
||||
joinTeam(inviteCode: String!): Boolean!
|
||||
resetInviteCode: String!
|
||||
leaveTeam: Boolean!
|
||||
# disbandTeam: Boolean!
|
||||
# transferCaptain: Boolean!
|
||||
# updateTeam(newValues: UpdateTeamInput!): Boolean!
|
||||
}
|
||||
|
||||
extend type User {
|
||||
|
|
@ -80,6 +85,48 @@ const getUsersBestPlacement = async (twitter, discordId) => {
|
|||
}
|
||||
}
|
||||
|
||||
const recalculateTeamsXp = async (team, discordIdToSkip) => {
|
||||
const teamsPlacements = []
|
||||
|
||||
for (const member of team.members) {
|
||||
if (member.discordId === discordIdToSkip) {
|
||||
continue
|
||||
}
|
||||
const user = await User.findOne({ discord_id: member.discordId })
|
||||
const bestPlacement = await getUsersBestPlacement(
|
||||
user.twitter_name,
|
||||
user.discord_id
|
||||
)
|
||||
if (bestPlacement) teamsPlacements.push(bestPlacement)
|
||||
}
|
||||
|
||||
const xpPlacements = teamsPlacements
|
||||
.sort((a, b) => b.xPower - a.xPower)
|
||||
.slice(0, 4)
|
||||
team.xpPlacements = xpPlacements
|
||||
|
||||
let teamXp = xpPlacements.reduce((acc, cur) => (acc += cur.xPower), 0)
|
||||
|
||||
teamXp += 2000 * (4 - xpPlacements.length)
|
||||
teamXp /= 4
|
||||
|
||||
team.teamXp = teamXp
|
||||
}
|
||||
|
||||
const recalculateTeamsCountries = async (team, newCountry, discordIdToSkip) => {
|
||||
const newCountries = new Set()
|
||||
if (newCountry) newCountries.add(newCountry)
|
||||
for (const member of team.members) {
|
||||
if (member.discordId === discordIdToSkip) {
|
||||
continue
|
||||
}
|
||||
const user = await User.findOne({ discord_id: member.discordId })
|
||||
if (user.country) newCountries.add(user.country)
|
||||
}
|
||||
|
||||
team.countries = Array.from(newCountries)
|
||||
}
|
||||
|
||||
const resolvers = {
|
||||
Query: {
|
||||
teams: () => Team.find({}),
|
||||
|
|
@ -200,6 +247,47 @@ const resolvers = {
|
|||
team.countries = countries
|
||||
}
|
||||
|
||||
await team.save()
|
||||
await User.findByIdAndUpdate(ctx.user._id, { $set: { team: team._id } })
|
||||
|
||||
return true
|
||||
},
|
||||
leaveTeam: async (_root, _args, { user }) => {
|
||||
if (!user) throw new UserInputError("Must be logged in to leave a team")
|
||||
if (!user.team) {
|
||||
throw new UserInputError("Can't leave a team if you aren't in one")
|
||||
}
|
||||
|
||||
const team = await Team.findById(user.team)
|
||||
if (!team) {
|
||||
throw new Error("Unexpected error: team not found with the id")
|
||||
}
|
||||
const memberOfTeam = team.members.find(
|
||||
(member) => member.discordId === user.discord_id
|
||||
)
|
||||
if (!memberOfTeam) {
|
||||
throw new Error("Unexpected error: user not found in the member list")
|
||||
}
|
||||
|
||||
if (memberOfTeam.captain) {
|
||||
throw new UserInputError("Can't leave a team you are captain for")
|
||||
}
|
||||
|
||||
team.members = team.members.filter(
|
||||
(member) => member.discordId !== user._id
|
||||
)
|
||||
|
||||
await User.findByIdAndUpdate(user._id, { $unset: { team: "" } })
|
||||
const pastMembers = team.pastMembersDiscordIds
|
||||
? team.pastMembersDiscordIds
|
||||
: []
|
||||
if (!pastMembers.includes(user.discord_id))
|
||||
pastMembers.push(user.discord_id)
|
||||
team.pastMembersDiscordIds = pastMembers
|
||||
|
||||
await recalculateTeamsCountries(team, null, user.discord_id)
|
||||
await recalculateTeamsXp(team, user.discord_id)
|
||||
|
||||
await team.save()
|
||||
|
||||
return true
|
||||
|
|
@ -210,4 +298,5 @@ const resolvers = {
|
|||
module.exports = {
|
||||
Team: typeDef,
|
||||
teamResolvers: resolvers,
|
||||
recalculateTeamsCountries,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ const Team = require("../mongoose-models/team")
|
|||
const countries = require("../utils/countries")
|
||||
const weapons = require("../utils/weapons")
|
||||
const mockUser = require("../utils/mocks")
|
||||
const { recalculateTeamsCountries } = require("./team")
|
||||
require("dotenv").config()
|
||||
|
||||
const typeDef = gql`
|
||||
|
|
@ -55,25 +56,6 @@ const typeDef = gql`
|
|||
}
|
||||
`
|
||||
|
||||
const recalculateTeamsCountries = async (team, newCountry, discordIdToSkip) => {
|
||||
const newCountries = new Set()
|
||||
newCountries.add(newCountry)
|
||||
for (const member of team.members) {
|
||||
if (member.discordId === discordIdToSkip) {
|
||||
continue
|
||||
}
|
||||
const user = await User.findOne({ discord_id: member.discordId })
|
||||
console.log("user.id", user.id)
|
||||
console.log("user.country", user.country)
|
||||
if (user.country) newCountries.add(user.country)
|
||||
}
|
||||
|
||||
console.log("newCountries", newCountries)
|
||||
team.countries = Array.from(newCountries)
|
||||
|
||||
await team.save()
|
||||
}
|
||||
|
||||
const resolvers = {
|
||||
User: {
|
||||
top500: async (root) => {
|
||||
|
|
@ -165,6 +147,7 @@ const resolvers = {
|
|||
args.country,
|
||||
ctx.user.discord_id
|
||||
)
|
||||
await team.save()
|
||||
} else {
|
||||
const countries = team.countries || []
|
||||
if (!countries.includes(args.country)) countries.push(args.country)
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
const mockUser = {
|
||||
_id: "5cee8f73d1120d4315c55011",
|
||||
id: "5cee8f73d1120d4315c55011",
|
||||
//id: "5cee8f73d1120d4315c55011",
|
||||
team: "5ee60f1fff81d717ecae4bb1",
|
||||
discord_id: "79237403620945920",
|
||||
//discord_id: "79237403620945920",
|
||||
discord_id: "220344765240180738",
|
||||
__v: 0,
|
||||
avatar: "a22c9557975494f859242aaf9b317058",
|
||||
discriminator: "0043",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user