diff --git a/src/controllers/api/addIgnoredUserController.ts b/src/controllers/api/addIgnoredUserController.ts new file mode 100644 index 00000000..99b38972 --- /dev/null +++ b/src/controllers/api/addIgnoredUserController.ts @@ -0,0 +1,30 @@ +import { toOid } from "@/src/helpers/inventoryHelpers"; +import { getJSONfromString } from "@/src/helpers/stringHelpers"; +import { Account, Ignore } from "@/src/models/loginModel"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { IFriendInfo } from "@/src/types/guildTypes"; +import { RequestHandler } from "express"; + +export const addIgnoredUserController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const data = getJSONfromString(String(req.body)); + const ignoreeAccount = await Account.findOne( + { DisplayName: data.playerName.substring(0, data.playerName.length - 1) }, + "_id" + ); + if (ignoreeAccount) { + await Ignore.create({ ignorer: accountId, ignoree: ignoreeAccount._id }); + res.json({ + Ignored: { + _id: toOid(ignoreeAccount._id), + DisplayName: data.playerName + } satisfies IFriendInfo + }); + } else { + res.status(400).end(); + } +}; + +interface IAddIgnoredUserRequest { + playerName: string; +} diff --git a/src/controllers/api/getIgnoredUsersController.ts b/src/controllers/api/getIgnoredUsersController.ts index 97127fba..abadb91c 100644 --- a/src/controllers/api/getIgnoredUsersController.ts +++ b/src/controllers/api/getIgnoredUsersController.ts @@ -1,16 +1,20 @@ +import { toOid } from "@/src/helpers/inventoryHelpers"; +import { Account, Ignore } from "@/src/models/loginModel"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { IFriendInfo } from "@/src/types/guildTypes"; +import { parallelForeach } from "@/src/utils/async-utils"; import { RequestHandler } from "express"; -const getIgnoredUsersController: RequestHandler = (_req, res) => { - res.writeHead(200, { - "Content-Type": "text/html", - "Content-Length": "3" +export const getIgnoredUsersController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const ignores = await Ignore.find({ ignorer: accountId }); + const ignoredUsers: IFriendInfo[] = []; + await parallelForeach(ignores, async ignore => { + const ignoreeAccount = (await Account.findById(ignore.ignoree, "DisplayName"))!; + ignoredUsers.push({ + _id: toOid(ignore.ignoree), + DisplayName: ignoreeAccount.DisplayName + "" + }); }); - res.end( - Buffer.from([ - 0x7b, 0x22, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x3a, 0x38, 0x33, 0x30, 0x34, 0x30, 0x37, 0x37, 0x32, 0x32, - 0x34, 0x30, 0x32, 0x32, 0x32, 0x36, 0x31, 0x35, 0x30, 0x31, 0x7d - ]) - ); + res.json({ IgnoredUsers: ignoredUsers }); }; - -export { getIgnoredUsersController }; diff --git a/src/controllers/api/removeIgnoredUserController.ts b/src/controllers/api/removeIgnoredUserController.ts new file mode 100644 index 00000000..73613ce6 --- /dev/null +++ b/src/controllers/api/removeIgnoredUserController.ts @@ -0,0 +1,21 @@ +import { getJSONfromString } from "@/src/helpers/stringHelpers"; +import { Account, Ignore } from "@/src/models/loginModel"; +import { getAccountForRequest } from "@/src/services/loginService"; +import { RequestHandler } from "express"; + +export const removeIgnoredUserController: RequestHandler = async (req, res) => { + const accountId = await getAccountForRequest(req); + const data = getJSONfromString(String(req.body)); + const ignoreeAccount = await Account.findOne( + { DisplayName: data.playerName.substring(0, data.playerName.length - 1) }, + "_id" + ); + if (ignoreeAccount) { + await Ignore.deleteOne({ ignorer: accountId, ignoree: ignoreeAccount._id }); + } + res.end(); +}; + +interface IRemoveIgnoredUserRequest { + playerName: string; +} diff --git a/src/controllers/custom/deleteAccountController.ts b/src/controllers/custom/deleteAccountController.ts index fad4485b..32fe4f19 100644 --- a/src/controllers/custom/deleteAccountController.ts +++ b/src/controllers/custom/deleteAccountController.ts @@ -1,6 +1,6 @@ import { RequestHandler } from "express"; import { getAccountIdForRequest } from "@/src/services/loginService"; -import { Account } from "@/src/models/loginModel"; +import { Account, Ignore } from "@/src/models/loginModel"; import { Inbox } from "@/src/models/inboxModel"; import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; import { Loadout } from "@/src/models/inventoryModels/loadoutModel"; @@ -23,6 +23,8 @@ export const deleteAccountController: RequestHandler = async (req, res) => { await Promise.all([ Account.deleteOne({ _id: accountId }), GuildMember.deleteMany({ accountId: accountId }), + Ignore.deleteMany({ ignorer: accountId }), + Ignore.deleteMany({ ignoree: accountId }), Inbox.deleteMany({ ownerId: accountId }), Inventory.deleteOne({ accountOwnerId: accountId }), Leaderboard.deleteMany({ ownerId: accountId }), diff --git a/src/models/loginModel.ts b/src/models/loginModel.ts index 7b12c07a..3e564aa6 100644 --- a/src/models/loginModel.ts +++ b/src/models/loginModel.ts @@ -1,4 +1,4 @@ -import { IDatabaseAccountJson } from "@/src/types/loginTypes"; +import { IDatabaseAccountJson, IIgnore } from "@/src/types/loginTypes"; import { model, Schema, SchemaOptions } from "mongoose"; const opts = { @@ -37,3 +37,13 @@ databaseAccountSchema.set("toJSON", { }); export const Account = model("Account", databaseAccountSchema); + +const ignoreSchema = new Schema({ + ignorer: Schema.Types.ObjectId, + ignoree: Schema.Types.ObjectId +}); + +ignoreSchema.index({ ignorer: 1 }); +ignoreSchema.index({ ignorer: 1, ignoree: 1 }, { unique: true }); + +export const Ignore = model("Ignore", ignoreSchema); diff --git a/src/routes/api.ts b/src/routes/api.ts index d16ea321..71b90dc4 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -4,6 +4,7 @@ import { abortDojoComponentController } from "@/src/controllers/api/abortDojoCom import { abortDojoComponentDestructionController } from "@/src/controllers/api/abortDojoComponentDestructionController"; import { activateRandomModController } from "@/src/controllers/api/activateRandomModController"; import { addFriendImageController } from "@/src/controllers/api/addFriendImageController"; +import { addIgnoredUserController } from "@/src/controllers/api/addIgnoredUserController"; import { addToAllianceController } from "@/src/controllers/api/addToAllianceController"; import { addToGuildController } from "@/src/controllers/api/addToGuildController"; import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController"; @@ -97,6 +98,7 @@ import { redeemPromoCodeController } from "@/src/controllers/api/redeemPromoCode import { releasePetController } from "@/src/controllers/api/releasePetController"; import { removeFromAllianceController } from "@/src/controllers/api/removeFromAllianceController"; import { removeFromGuildController } from "@/src/controllers/api/removeFromGuildController"; +import { removeIgnoredUserController } from "@/src/controllers/api/removeIgnoredUserController"; import { rerollRandomModController } from "@/src/controllers/api/rerollRandomModController"; import { retrievePetFromStasisController } from "@/src/controllers/api/retrievePetFromStasisController"; import { saveDialogueController } from "@/src/controllers/api/saveDialogueController"; @@ -202,6 +204,7 @@ apiRouter.get("/updateSession.php", updateSessionGetController); apiRouter.post("/abortDojoComponent.php", abortDojoComponentController); apiRouter.post("/activateRandomMod.php", activateRandomModController); apiRouter.post("/addFriendImage.php", addFriendImageController); +apiRouter.post("/addIgnoredUser.php", addIgnoredUserController); apiRouter.post("/addToAlliance.php", addToAllianceController); apiRouter.post("/addToGuild.php", addToGuildController); apiRouter.post("/arcaneCommon.php", arcaneCommonController); @@ -266,6 +269,7 @@ apiRouter.post("/purchase.php", purchaseController); apiRouter.post("/redeemPromoCode.php", redeemPromoCodeController); apiRouter.post("/releasePet.php", releasePetController); apiRouter.post("/removeFromGuild.php", removeFromGuildController); +apiRouter.post("/removeIgnoredUser.php", removeIgnoredUserController); apiRouter.post("/rerollRandomMod.php", rerollRandomModController); apiRouter.post("/retrievePetFromStasis.php", retrievePetFromStasisController); apiRouter.post("/saveDialogue.php", saveDialogueController); diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index 0d02b0db..59e7a3a0 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -103,12 +103,12 @@ export interface IGuildMemberDatabase { ShipDecorationsContributed?: ITypeCount[]; } -interface IFriendInfo { +export interface IFriendInfo { _id: IOid; DisplayName?: string; PlatformNames?: string[]; PlatformAccountId?: string; - Status: number; + Status?: number; ActiveAvatarImageType?: string; LastLogin?: IMongoDate; PlayerLevel?: number; diff --git a/src/types/loginTypes.ts b/src/types/loginTypes.ts index 8c443797..17128e2a 100644 --- a/src/types/loginTypes.ts +++ b/src/types/loginTypes.ts @@ -1,3 +1,5 @@ +import { Types } from "mongoose"; + export interface IAccountAndLoginResponseCommons { DisplayName: string; CountryCode: string; @@ -56,3 +58,8 @@ export interface IGroup { experiment: string; experimentGroup: string; } + +export interface IIgnore { + ignorer: Types.ObjectId; + ignoree: Types.ObjectId; +} diff --git a/src/utils/async-utils.ts b/src/utils/async-utils.ts index b2d40c0d..f8825612 100644 --- a/src/utils/async-utils.ts +++ b/src/utils/async-utils.ts @@ -1,3 +1,4 @@ +// Misnomer: We have concurrency, not parallelism - oh well! export const parallelForeach = async (data: T[], op: (datum: T) => Promise): Promise => { const promises: Promise[] = []; for (const datum of data) {