Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
perf: linear speed position getters (#9528)
* perf(Channel): linear speed position getter (#9497)

Co-authored-by: kyra <kyradiscord@gmail.com>

* perf(Role): linear speed position getter

---------

Co-authored-by: kyra <kyradiscord@gmail.com>
Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
  • Loading branch information
3 people committed Sep 6, 2023
1 parent cb11c56 commit 90ca028
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 4 deletions.
18 changes: 16 additions & 2 deletions src/structures/GuildChannel.js
Expand Up @@ -5,6 +5,7 @@ const { Error } = require('../errors');
const PermissionOverwriteManager = require('../managers/PermissionOverwriteManager');
const { VoiceBasedChannelTypes } = require('../util/Constants');
const Permissions = require('../util/Permissions');
const Util = require('../util/Util');

/**
* Represents a guild channel from any of the following:
Expand Down Expand Up @@ -145,8 +146,21 @@ class GuildChannel extends Channel {
* @readonly
*/
get position() {
const sorted = this.guild._sortedChannels(this);
return [...sorted.values()].indexOf(sorted.get(this.id));
const selfIsCategory = this.type === 'GUILD_CATEGORY';
const types = Util.getSortableGroupTypes(this.type);

let count = 0;
for (const channel of this.guild.channels.cache.values()) {
if (!types.includes(channel.type)) continue;
if (!selfIsCategory && channel.parentId !== this.parentId) continue;
if (this.rawPosition === channel.rawPosition) {
if (BigInt(channel.id) < BigInt(this.id)) count++;
} else if (this.rawPosition > channel.rawPosition) {
count++;
}
}

return count;
}

/**
Expand Down
9 changes: 7 additions & 2 deletions src/structures/Role.js
Expand Up @@ -228,8 +228,13 @@ class Role extends Base {
* @readonly
*/
get position() {
const sorted = this.guild._sortedRoles();
return [...sorted.values()].indexOf(sorted.get(this.id));
let count = 0;
for (const role of this.guild.roles.cache.values()) {
if (this.rawPosition > role.rawPosition) count++;
else if (this.rawPosition === role.rawPosition && BigInt(this.id) > BigInt(role.id)) count++;
}

return count;
}

/**
Expand Down
29 changes: 29 additions & 0 deletions src/util/Util.js
Expand Up @@ -14,6 +14,10 @@ let deprecationEmittedForSplitMessage = false;
let deprecationEmittedForRemoveMentions = false;
let deprecationEmittedForResolveAutoArchiveMaxLimit = false;

const TextSortableGroupTypes = ['GUILD_TEXT', 'GUILD_ANNOUCMENT', 'GUILD_FORUM'];
const VoiceSortableGroupTypes = ['GUILD_VOICE', 'GUILD_STAGE_VOICE'];
const CategorySortableGroupTypes = ['GUILD_CATEGORY'];

/**
* Contains various general-purpose utility methods.
*/
Expand Down Expand Up @@ -742,6 +746,31 @@ class Util extends null {
};
}

/**
* Gets an array of the channel types that can be moved in the channel group. For example, a GuildText channel would
* return an array containing the types that can be ordered within the text channels (always at the top), and a voice
* channel would return an array containing the types that can be ordered within the voice channels (always at the
* bottom).
* @param {ChannelType} type The type of the channel
* @returns {ChannelType[]}
* @ignore
*/
static getSortableGroupTypes(type) {
switch (type) {
case 'GUILD_TEXT':
case 'GUILD_ANNOUNCEMENT':
case 'GUILD_FORUM':
return TextSortableGroupTypes;
case 'GUILD_VOICE':
case 'GUILD_STAGE_VOICE':
return VoiceSortableGroupTypes;
case 'GUILD_CATEGORY':
return CategorySortableGroupTypes;
default:
return [type];
}
}

/**
* Calculates the default avatar index for a given user id.
* @param {Snowflake} userId - The user id to calculate the default avatar index for
Expand Down

0 comments on commit 90ca028

Please sign in to comment.