User resolving optimizations + debug logging
This commit is contained in:
parent
fffb791a2e
commit
ac7f6e728b
5 changed files with 38 additions and 8 deletions
|
@ -310,15 +310,15 @@ export class SlowmodePlugin extends ZeppelinPlugin<ISlowmodePluginConfig> {
|
||||||
const thisMsgLock = await this.locks.acquire(`message-${msg.id}`);
|
const thisMsgLock = await this.locks.acquire(`message-${msg.id}`);
|
||||||
if (thisMsgLock.interrupted) return;
|
if (thisMsgLock.interrupted) return;
|
||||||
|
|
||||||
|
// Check if this channel even *has* a bot-maintained slowmode
|
||||||
|
const channelSlowmode = await this.slowmodes.getChannelSlowmode(channel.id);
|
||||||
|
if (!channelSlowmode) return thisMsgLock.unlock();
|
||||||
|
|
||||||
// Make sure this user is affected by the slowmode
|
// Make sure this user is affected by the slowmode
|
||||||
const member = await this.getMember(msg.user_id);
|
const member = await this.getMember(msg.user_id);
|
||||||
const isAffected = this.hasPermission("is_affected", { channelId: channel.id, userId: msg.user_id, member });
|
const isAffected = this.hasPermission("is_affected", { channelId: channel.id, userId: msg.user_id, member });
|
||||||
if (!isAffected) return thisMsgLock.unlock();
|
if (!isAffected) return thisMsgLock.unlock();
|
||||||
|
|
||||||
// Check if this channel even *has* a bot-maintained slowmode
|
|
||||||
const channelSlowmode = await this.slowmodes.getChannelSlowmode(channel.id);
|
|
||||||
if (!channelSlowmode) return thisMsgLock.unlock();
|
|
||||||
|
|
||||||
// Delete any extra messages sent after a slowmode was already applied
|
// Delete any extra messages sent after a slowmode was already applied
|
||||||
const userHasSlowmode = await this.slowmodes.userHasSlowmode(channel.id, msg.user_id);
|
const userHasSlowmode = await this.slowmodes.userHasSlowmode(channel.id, msg.user_id);
|
||||||
if (userHasSlowmode) {
|
if (userHasSlowmode) {
|
||||||
|
|
|
@ -203,6 +203,8 @@ export class TagsPlugin extends ZeppelinPlugin<ITagsPluginConfig> {
|
||||||
}
|
}
|
||||||
|
|
||||||
async onMessageCreate(msg: SavedMessage) {
|
async onMessageCreate(msg: SavedMessage) {
|
||||||
|
if (msg.is_bot) return;
|
||||||
|
|
||||||
const member = await this.getMember(msg.user_id);
|
const member = await this.getMember(msg.user_id);
|
||||||
if (!this.hasPermission("can_use", { member, channelId: msg.channel_id })) return;
|
if (!this.hasPermission("can_use", { member, channelId: msg.channel_id })) return;
|
||||||
|
|
||||||
|
|
|
@ -470,7 +470,11 @@ export class UtilityPlugin extends ZeppelinPlugin<IUtilityPluginConfig> {
|
||||||
@d.permission("can_info")
|
@d.permission("can_info")
|
||||||
async infoCmd(msg: Message, args: { user?: User | UnknownUser }) {
|
async infoCmd(msg: Message, args: { user?: User | UnknownUser }) {
|
||||||
const user = args.user || msg.author;
|
const user = args.user || msg.author;
|
||||||
const member = user && (await this.getMember(user.id));
|
|
||||||
|
let member;
|
||||||
|
if (!(user instanceof UnknownUser)) {
|
||||||
|
member = await this.getMember(user.id);
|
||||||
|
}
|
||||||
|
|
||||||
const embed: EmbedOptions = {
|
const embed: EmbedOptions = {
|
||||||
fields: [],
|
fields: [],
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
import { IBasePluginConfig, IPluginOptions, Plugin } from "knub";
|
import { IBasePluginConfig, IPluginOptions, logger, Plugin } from "knub";
|
||||||
import { PluginRuntimeError } from "../PluginRuntimeError";
|
import { PluginRuntimeError } from "../PluginRuntimeError";
|
||||||
import Ajv, { ErrorObject } from "ajv";
|
import Ajv, { ErrorObject } from "ajv";
|
||||||
import { isSnowflake, isUnicodeEmoji, resolveMember, resolveUser, UnknownUser } from "../utils";
|
import { isSnowflake, isUnicodeEmoji, resolveMember, resolveUser, UnknownUser } from "../utils";
|
||||||
import { Member, User } from "eris";
|
import { Member, User } from "eris";
|
||||||
|
|
||||||
|
import { performance } from "perf_hooks";
|
||||||
|
|
||||||
|
const SLOW_RESOLVE_THRESHOLD = 1500;
|
||||||
|
|
||||||
export class ZeppelinPlugin<TConfig extends {} = IBasePluginConfig> extends Plugin<TConfig> {
|
export class ZeppelinPlugin<TConfig extends {} = IBasePluginConfig> extends Plugin<TConfig> {
|
||||||
protected configSchema: any;
|
protected configSchema: any;
|
||||||
protected permissionsSchema: any;
|
protected permissionsSchema: any;
|
||||||
|
@ -81,10 +85,24 @@ export class ZeppelinPlugin<TConfig extends {} = IBasePluginConfig> extends Plug
|
||||||
* Resolves a user from the passed string. The passed string can be a user id, a user mention, a full username (with discrim), etc.
|
* Resolves a user from the passed string. The passed string can be a user id, a user mention, a full username (with discrim), etc.
|
||||||
*/
|
*/
|
||||||
async resolveUser(userResolvable: string): Promise<User | UnknownUser> {
|
async resolveUser(userResolvable: string): Promise<User | UnknownUser> {
|
||||||
return resolveUser(this.bot, userResolvable);
|
const start = performance.now();
|
||||||
|
const user = await resolveUser(this.bot, userResolvable);
|
||||||
|
const time = performance.now() - start;
|
||||||
|
if (time >= SLOW_RESOLVE_THRESHOLD) {
|
||||||
|
const rounded = Math.round(time);
|
||||||
|
logger.warn(`Slow user resolve (${rounded}ms): ${userResolvable}`);
|
||||||
|
}
|
||||||
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
async getMember(memberResolvable: string): Promise<Member> {
|
async getMember(memberResolvable: string): Promise<Member> {
|
||||||
return resolveMember(this.bot, this.guild, memberResolvable);
|
const start = performance.now();
|
||||||
|
const member = await resolveMember(this.bot, this.guild, memberResolvable);
|
||||||
|
const time = performance.now() - start;
|
||||||
|
if (time >= SLOW_RESOLVE_THRESHOLD) {
|
||||||
|
const rounded = Math.round(time);
|
||||||
|
logger.warn(`Slow member resolve (${rounded}ms): ${memberResolvable} in ${this.guild.name} (${this.guild.id})`);
|
||||||
|
}
|
||||||
|
return member;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -566,6 +566,9 @@ export async function resolveUser(bot: Client, value: string): Promise<User | Un
|
||||||
if (cachedUser) return cachedUser;
|
if (cachedUser) return cachedUser;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
logger.info(`Resolving unknown user: ${value} / ${userId}`);
|
||||||
|
console.trace();
|
||||||
|
|
||||||
const freshUser = await bot.getRESTUser(userId);
|
const freshUser = await bot.getRESTUser(userId);
|
||||||
bot.users.add(freshUser, bot);
|
bot.users.add(freshUser, bot);
|
||||||
return freshUser;
|
return freshUser;
|
||||||
|
@ -585,6 +588,9 @@ export async function resolveMember(bot: Client, guild: Guild, value: string): P
|
||||||
// If not, fetch it from the API
|
// If not, fetch it from the API
|
||||||
if (!member) {
|
if (!member) {
|
||||||
try {
|
try {
|
||||||
|
logger.info(`Resolving unknown member: ${value}`);
|
||||||
|
console.trace();
|
||||||
|
|
||||||
member = await bot.getRESTGuildMember(guild.id, user.id);
|
member = await bot.getRESTGuildMember(guild.id, user.id);
|
||||||
member.id = user.id;
|
member.id = user.id;
|
||||||
member.guild = guild;
|
member.guild = guild;
|
||||||
|
|
Loading…
Add table
Reference in a new issue