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

feat(Teams): backport support for teams #3357

Merged
merged 5 commits into from Jul 11, 2019
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/structures/OAuth2Application.js
@@ -1,4 +1,5 @@
const Snowflake = require('../util/Snowflake');
const Team = require('./Team');
const util = require('util');

/**
Expand Down Expand Up @@ -103,6 +104,14 @@ class OAuth2Application {
*/
this.owner = this.client.dataManager.newUser(data.owner);
}

if (data.team) {
/**
* The owning team of this OAuth application
* @type {?Team}
*/
this.team = new Team(this.client, data.team);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The team property should always exist as null or Team, not excluding the property if no data.team, so the object keeps consistent shape.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, and also, it should be deprecated since it will be gone in v12.

Copy link
Member Author

@SpaceEEC SpaceEEC Jun 27, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How would such a deprecation look like? Emitting a process warning on access seems unjustified as there is no way to fix this before v12. Maybe a warn or info in the documentation?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At minimum just a docstring @deprecated. But probably that with an explanation (in a warn or info tag) in the description.

}
}

/**
Expand Down
109 changes: 109 additions & 0 deletions src/structures/Team.js
@@ -0,0 +1,109 @@
const Snowflake = require('../util/Snowflake');
const Collection = require('../util/Collection');
const TeamMember = require('./TeamMember');
const Constants = require('../util/Constants');

/**
* Represents a Client OAuth2 Application Team.
*/
class Team {
constructor(client, data) {
/**
* The client that instantiated the team
* @name Team#client
* @type {Client}
* @readonly
*/
Object.defineProperty(this, 'client', { value: client });

this._patch(data);
}

_patch(data) {
/**
* The ID of the Team
* @type {Snowflake}
*/
this.id = data.id;

/**
* The name of the Team
* @type {string}
*/
this.name = data.name;

/**
* The Team's icon hash
* @type {?string}
*/
this.icon = data.icon || null;

/**
* The Team's owner id
* @type {?string}
*/
this.ownerID = data.owner_user_id || null;

/**
* The Team's members
* @type {Collection<Snowflake, TeamMember>}
*/
this.members = new Collection();

for (const memberData of data.members) {
const member = new TeamMember(this.client, this, memberData);
this.members.set(member.id, member);
}
}

/**
* The owner of the team
* @type {?TeamMember}
* @readonly
*/
get owner() {
return this.members.get(this.ownerID) || null;
}

/**
* The timestamp the team was created at
* @type {number}
* @readonly
*/
get createdTimestamp() {
return Snowflake.deconstruct(this.id).timestamp;
}

/**
* The time the team was created at
* @type {Date}
* @readonly
*/
get createdAt() {
return new Date(this.createdTimestamp);
}

/**
* A link to the teams's icon.
* @type {?string}
* @readonly
*/
get iconURL() {
if (!this.icon) return null;
return Constants.Endpoints.CDN(this.client.options.http.cdn).TeamIcon(this.id, this.icon);
}

/**
* When concatenated with a string, this automatically returns the Team's name instead of the
* Team object.
* @returns {string}
* @example
* // Logs: Team name: My Team
* console.log(`Team name: ${team}`);
*/
toString() {
return this.name;
}
}

module.exports = Team;
67 changes: 67 additions & 0 deletions src/structures/TeamMember.js
@@ -0,0 +1,67 @@
const { MembershipStates } = require('../util/Constants');

/**
* Represents a Client OAuth2 Application Team Member.
*/
class TeamMember {
constructor(client, team, data) {
/**
* The client that instantiated the Team Member
* @name TeamMember#client
* @type {Client}
* @readonly
*/
Object.defineProperty(this, 'client', { value: client });

/**
* The Team this member is part of
* @type {Team}
*/
this.team = team;

this._patch(data);
}

_patch(data) {
/**
* The permissions this Team Member has with regard to the team
* @type {string[]}
*/
this.permissions = data.permissions;

/**
* The membership state this Team Member has with regard to the team
* @type {MembershipStates}
*/
this.membershipState = MembershipStates[data.membership_state];

/**
* The user for this Team Member
* @type {User}
*/
this.user = this.client.dataManager.newUser(data.user);
}

/**
* The ID of the Team Member
* @type {Snowflake}
* @readonly
*/
get id() {
return this.user.id;
}

/**
* When concatenated with a string, this automatically returns the team members's mention instead of the
* TeamMember object.
* @returns {string}
* @example
* // Logs: Team Member's mention: <@123456789>
* console.log(`Team Member's mention: ${teamMember}`);
*/
toString() {
return this.user.toString();
}
}

module.exports = TeamMember;
14 changes: 14 additions & 0 deletions src/util/Constants.js
Expand Up @@ -216,6 +216,7 @@ const Endpoints = exports.Endpoints = {
AppAsset: (clientID, hash) => `${root}/app-assets/${clientID}/${hash}.png`,
GDMIcon: (channelID, hash) => `${root}/channel-icons/${channelID}/${hash}.jpg?size=2048`,
Splash: (guildID, hash) => `${root}/splashes/${guildID}/${hash}.jpg`,
TeamIcon: (teamID, hash) => `${root}/team-icons/${teamID}/${hash}.jpg`,
};
},
OAUTH2: {
Expand Down Expand Up @@ -853,3 +854,16 @@ exports.DefaultMessageNotifications = [
'ALL',
'MENTIONS',
];

/**
* The value set for a team members's membership state:
* * INVITED
* * ACCEPTED
* @typedef {string} MembershipStates
*/
exports.MembershipStates = [
// They start at 1
null,
'INVITED',
'ACCEPTED',
];
32 changes: 32 additions & 0 deletions typings/index.d.ts
Expand Up @@ -935,6 +935,7 @@ declare module 'discord.js' {
public rpcApplicationState: boolean;
public rpcOrigins: string[];
public secret: string;
public team?: Team;
public reset(): OAuth2Application;
public toString(): string;
}
Expand Down Expand Up @@ -1232,6 +1233,34 @@ declare module 'discord.js' {
public setBitrate(bitrate: number | 'auto'): void;
}

export class Team {
constructor(client: Client, data: object);
public readonly client: Client;
public readonly createdAt: Date;
public readonly createdTimestamp: number;
public icon: string | null;
public readonly iconURL: string;
public id: Snowflake;
public members: Collection<Snowflake, TeamMember>;
public name: string;
public readonly owner: TeamMember;
public ownerID: Snowflake | null;

public toString(): string;
}

export class TeamMember {
constructor(client: Client, team: Team, data: object);
public readonly client: Client;
public id: Snowflake;
public membershipState: MembershipStates;
public permissions: string[];
public team: Team;
public user: User;

public toString(): string;
}

export class TextChannel extends TextBasedChannel(GuildChannel) {
constructor(guild: Guild, data: object);
public lastMessageID: string;
Expand Down Expand Up @@ -1873,6 +1902,9 @@ declare module 'discord.js' {

type InviteResolvable = string;

type MembershipStates = 'INVITED'
| 'ACCEPTED';

type MessageCollectorOptions = CollectorOptions & {
max?: number;
maxMatches?: number;
Expand Down