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
feature: teams support #3350
Changes from all commits
0e4e901
0478d27
23373c8
4310e7c
42ccff6
9aeb74f
d021c81
0c6b0a8
73b5b7c
5888800
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 || 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 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.TeamIcon(this.id, this.icon, { format, size }); | ||
} | ||
|
||
/** | ||
* 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; | ||
} | ||
|
||
toJSON() { | ||
return super.toJSON({ createdTimestamp: true }); | ||
} | ||
} | ||
|
||
module.exports = Team; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
'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 this member is part of | ||
* @type {Team} | ||
*/ | ||
this.team = team; | ||
|
||
this._patch(data); | ||
} | ||
|
||
_patch(data) { | ||
/** | ||
* 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); | ||
|
||
/** | ||
* The ID of the Team Member | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I meant it. This is redundant... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. TeamMembers are keyed by id in Team#members, the only id we have to relate to is the user id, which is no different than how GuildMembers' ids work. I thought your original complaint is we weren't using the User instead of the raw user data, so that's why I made the change I did, which really doesn't matter which way. |
||
* @type {Snowflake} | ||
*/ | ||
this.id = this.user.id; | ||
} | ||
|
||
/** | ||
* When concatenated with a string, this automatically returns the team members's tag instead of the | ||
* TeamMember object. | ||
* @returns {string} | ||
* @example | ||
* // Logs: Team Member's tag: @Hydrabolt | ||
* console.log(`Team Member's tag: ${teamMember}`); | ||
*/ | ||
toString() { | ||
return this.user.toString(); | ||
} | ||
} | ||
|
||
module.exports = TeamMember; |
There was a problem hiding this comment.
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