User resolving optimizations + debug logging

This commit is contained in:
Dragory 2019-05-02 18:14:36 +03:00
parent fffb791a2e
commit ac7f6e728b
5 changed files with 38 additions and 8 deletions

View file

@ -310,15 +310,15 @@ export class SlowmodePlugin extends ZeppelinPlugin<ISlowmodePluginConfig> {
const thisMsgLock = await this.locks.acquire(`message-${msg.id}`);
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
const member = await this.getMember(msg.user_id);
const isAffected = this.hasPermission("is_affected", { channelId: channel.id, userId: msg.user_id, member });
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
const userHasSlowmode = await this.slowmodes.userHasSlowmode(channel.id, msg.user_id);
if (userHasSlowmode) {

View file

@ -203,6 +203,8 @@ export class TagsPlugin extends ZeppelinPlugin<ITagsPluginConfig> {
}
async onMessageCreate(msg: SavedMessage) {
if (msg.is_bot) return;
const member = await this.getMember(msg.user_id);
if (!this.hasPermission("can_use", { member, channelId: msg.channel_id })) return;

View file

@ -470,7 +470,11 @@ export class UtilityPlugin extends ZeppelinPlugin<IUtilityPluginConfig> {
@d.permission("can_info")
async infoCmd(msg: Message, args: { user?: User | UnknownUser }) {
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 = {
fields: [],

View file

@ -1,9 +1,13 @@
import { IBasePluginConfig, IPluginOptions, Plugin } from "knub";
import { IBasePluginConfig, IPluginOptions, logger, Plugin } from "knub";
import { PluginRuntimeError } from "../PluginRuntimeError";
import Ajv, { ErrorObject } from "ajv";
import { isSnowflake, isUnicodeEmoji, resolveMember, resolveUser, UnknownUser } from "../utils";
import { Member, User } from "eris";
import { performance } from "perf_hooks";
const SLOW_RESOLVE_THRESHOLD = 1500;
export class ZeppelinPlugin<TConfig extends {} = IBasePluginConfig> extends Plugin<TConfig> {
protected configSchema: 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.
*/
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> {
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;
}
}

View file

@ -566,6 +566,9 @@ export async function resolveUser(bot: Client, value: string): Promise<User | Un
if (cachedUser) return cachedUser;
try {
logger.info(`Resolving unknown user: ${value} / ${userId}`);
console.trace();
const freshUser = await bot.getRESTUser(userId);
bot.users.add(freshUser, bot);
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 (!member) {
try {
logger.info(`Resolving unknown member: ${value}`);
console.trace();
member = await bot.getRESTGuildMember(guild.id, user.id);
member.id = user.id;
member.guild = guild;