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

feature: teams support #3350

Merged
merged 10 commits into from Jun 25, 2019
Merged
Show file tree
Hide file tree
Changes from 3 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
2 changes: 2 additions & 0 deletions src/index.js
Expand Up @@ -85,6 +85,8 @@ module.exports = {
ReactionEmoji: require('./structures/ReactionEmoji'),
RichPresenceAssets: require('./structures/Presence').RichPresenceAssets,
Role: require('./structures/Role'),
Team: require('./structures/Team'),
TeamMember: require('./structures/TeamMember'),
TextChannel: require('./structures/TextChannel'),
User: require('./structures/User'),
VoiceChannel: require('./structures/VoiceChannel'),
Expand Down
5 changes: 3 additions & 2 deletions src/structures/ClientApplication.js
Expand Up @@ -3,6 +3,7 @@
const Snowflake = require('../util/Snowflake');
const { ClientApplicationAssetTypes, Endpoints } = require('../util/Constants');
const Base = require('./Base');
const Team = require('./Team');

const AssetTypes = Object.keys(ClientApplicationAssetTypes);

Expand Down Expand Up @@ -67,9 +68,9 @@ class ClientApplication extends Base {

/**
* The owner of this OAuth application
* @type {?User}
* @type {User|Team}
Copy link
Member

Choose a reason for hiding this comment

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

The Owner and Team should be separated in my opinion. While the owner of an app that is in a team is fake, it's still an user. A warning should be added instead

*/
this.owner = data.owner ? this.client.users.add(data.owner) : null;
this.owner = data.team ? new Team(this.client, data.team) : this.client.users.add(data.owner);
}

/**
Expand Down
109 changes: 109 additions & 0 deletions src/structures/Team.js
@@ -0,0 +1,109 @@
'use strict';

const Snowflake = require('../util/Snowflake');
const Collection = require('../util/Collection');
const Base = require('./Base');
const TeamMember = require('./TeamMember');

/**
* Represents a Client OAuth2 Application Team.
* @extends {Base}
*/
class Team extends Base {
constructor(client, data) {
super(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;

/**
* 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 this team
* @type {?TeamMember}
* @readonly
*/
get owner() {
return this.members.get(this.ownerID) || null;
}

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

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

/**
* A link to the application's icon.
* @param {ImageURLOptions} [options={}] Options for the Image URL
* @returns {?string} URL to the icon
*/
iconURL({ format, size } = {}) {
if (!this.icon) return null;
return this.client.rest.cdn.AppIcon(this.id, this.icon, { format, size });
bdistin marked this conversation as resolved.
Show resolved Hide resolved
}

/**
* 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: ${application}`);
bdistin marked this conversation as resolved.
Show resolved Hide resolved
*/
toString() {
return this.name;
}

toJSON() {
return super.toJSON({ createdTimestamp: true });
}
}

module.exports = Team;
66 changes: 66 additions & 0 deletions src/structures/TeamMember.js
@@ -0,0 +1,66 @@
'use strict';

const Base = require('./Base');
const { MembershipStates } = require('../util/Constants');

/**
* Represents a Client OAuth2 Application Team Member.
* @extends {Base}
*/
class TeamMember extends Base {
constructor(client, team, data) {
super(client);

/**
* The Team
bdistin marked this conversation as resolved.
Show resolved Hide resolved
* @type {Team}
*/
this.team = team;

this._patch(data);
}

_patch(data) {
/**
* The ID of the Team Member
* @type {Snowflake}
*/
this.id = data.user.id;
bdistin marked this conversation as resolved.
Show resolved Hide resolved

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

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

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

/**
* When concatenated with a string, this automatically returns the team members's name instead of the
* TeamMember object.
* @returns {string}
* @example
* // Logs: Team Member's username: Hydrabolt
* console.log(`Team Member's name: ${teamMember}`);
*/
toString() {
return this.user.username;
bdistin marked this conversation as resolved.
Show resolved Hide resolved
}

toJSON() {
bdistin marked this conversation as resolved.
Show resolved Hide resolved
return super.toJSON();
bdistin marked this conversation as resolved.
Show resolved Hide resolved
}
}

module.exports = TeamMember;
11 changes: 11 additions & 0 deletions src/util/Constants.js
Expand Up @@ -569,6 +569,17 @@ exports.DefaultMessageNotifications = [
'MENTIONS',
];

/**
* The value set for a team members's membership state:
* * INVITED
* * ACCEPTED
* @typedef {string} MembershipStates
*/
exports.MembershipStates = [
bdistin marked this conversation as resolved.
Show resolved Hide resolved
'INVITED',
'ACCEPTED',
];

function keyMirror(arr) {
let tmp = Object.create(null);
for (const value of arr) tmp[value] = value;
Expand Down