feat(structures): add Team structure (#11396)

* feat(structures): add and update barrel exports in prep for new struct

* feat(structures): add TeamMember substructure

* feat(structures): add Team structure

* chore(structures): add ownerUserId attribute back

* chore(structures): add teamId attribute

* docs(structures): correctly use see/link blocks and cleanup

---------

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
This commit is contained in:
Asad
2026-01-27 22:59:42 +00:00
committed by GitHub
parent fc5ba6be70
commit c126367140
4 changed files with 121 additions and 0 deletions

View File

@@ -8,6 +8,7 @@ export * from './invites/index.js';
export * from './messages/index.js';
export * from './polls/index.js';
export * from './stickers/index.js';
export * from './teams/index.js';
export * from './users/index.js';
export * from './Structure.js';
export * from './subscriptions/index.js';

View File

@@ -0,0 +1,69 @@
import { DiscordSnowflake } from '@sapphire/snowflake';
import type { APITeam } from 'discord-api-types/v10';
import { Structure } from '../Structure.js';
import { kData } from '../utils/symbols.js';
import { isIdSet } from '../utils/type-guards.js';
import type { Partialize } from '../utils/types.js';
/**
* Represents any team on Discord.
*
* @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate`
* @remarks has substructure `TeamMember` which needs to be instantiated and stored by an extending class using it
*/
export class Team<Omitted extends keyof APITeam | '' = ''> extends Structure<APITeam, Omitted> {
/**
* The template used for removing data from the raw data stored for each team.
*/
public static override readonly DataTemplate: Partial<APITeam> = {};
/**
* @param data - The raw data received from the API for the team.
*/
public constructor(data: Partialize<APITeam, Omitted>) {
super(data);
}
/**
* Hash of the image of the team's icon
*/
public get icon() {
return this[kData].icon;
}
/**
* The unique id of the team
*/
public get id() {
return this[kData].id;
}
/**
* Name of the team
*/
public get name() {
return this[kData].name;
}
/**
* User ID of the current team owner
*/
public get ownerUserId() {
return this[kData].owner_user_id;
}
/**
* The timestamp the team was created at
*/
public get createdTimestamp() {
return isIdSet(this.id) ? DiscordSnowflake.timestampFrom(this.id) : null;
}
/**
* The time the team was created at
*/
public get createdAt() {
const createdTimestamp = this.createdTimestamp;
return createdTimestamp ? new Date(createdTimestamp) : null;
}
}

View File

@@ -0,0 +1,49 @@
import type { APITeamMember } from 'discord-api-types/v10';
import { Structure } from '../Structure.js';
import { kData } from '../utils/symbols.js';
import type { Partialize } from '../utils/types.js';
/**
* Represents any team member on Discord.
*
* @typeParam Omitted - Specify the properties that will not be stored in the raw data field as a union, implement via `DataTemplate`
* @remarks has substructure `User` which needs to be instantiated and stored by an extending class using it
*/
export class TeamMember<Omitted extends keyof APITeamMember | '' = ''> extends Structure<APITeamMember, Omitted> {
/**
* The template used for removing data from the raw data stored for each team member
*/
public static override readonly DataTemplate: Partial<APITeamMember> = {};
/**
* @param data - The raw data received from the API for the team member
*/
public constructor(data: Partialize<APITeamMember, Omitted>) {
super(data);
}
/**
* User's membership state on the team
*
* @see {@link https://discord.com/developers/docs/topics/teams#data-models-membership-state-enum}
*/
public get membershipState() {
return this[kData].membership_state;
}
/**
* Id of the parent team of which they are a member
*/
public get teamId() {
return this[kData].team_id;
}
/**
* Role of the team member
*
* @see {@link https://discord.com/developers/docs/topics/teams#team-member-roles-team-member-role-types}
*/
public get role() {
return this[kData].role;
}
}

View File

@@ -0,0 +1,2 @@
export * from './Team.js';
export * from './TeamMember.js';