From 2520fac7d6fc69c3ddf8b1bbd2a22138a364b3c3 Mon Sep 17 00:00:00 2001 From: Dragory Date: Thu, 2 Aug 2018 04:00:42 +0300 Subject: [PATCH] Allow browsing !search result pages --- src/plugins/Utility.ts | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/plugins/Utility.ts b/src/plugins/Utility.ts index 6c436a3c..03d2c20f 100644 --- a/src/plugins/Utility.ts +++ b/src/plugins/Utility.ts @@ -79,7 +79,9 @@ export class UtilityPlugin extends Plugin { @d.command("search", "") @d.permission("search") async searchCmd(msg: Message, args: { query: string }) { - const query = args.query.toLowerCase(); + let [, query, inputPageNum] = args.query.match(/^(.*?)(?:\s([0-9]+))?$/); + query = query.toLowerCase(); + const matchingMembers = this.guild.members.filter(member => { const fullUsername = `${member.user.username}#${member.user.discriminator}`; if (member.nick && member.nick.toLowerCase().indexOf(query) !== -1) return true; @@ -91,20 +93,35 @@ export class UtilityPlugin extends Plugin { let header; const resultText = matchingMembers.length === 1 ? "result" : "results"; - if (matchingMembers.length > MAX_SEARCH_RESULTS) { - header = `Found ${matchingMembers.length} ${resultText} (showing ${MAX_SEARCH_RESULTS})`; + const paginated = matchingMembers.length > MAX_SEARCH_RESULTS; + + const pageInputMatch = args.query.match(/\s([0-9]+)$/); + const inputPage = pageInputMatch ? parseInt(pageInputMatch[1], 10) : 1; + const lastPage = Math.ceil(matchingMembers.length / MAX_SEARCH_RESULTS); + const page = Math.min(lastPage, Math.max(1, inputPage)); + + const from = (page - 1) * MAX_SEARCH_RESULTS; + const to = Math.min(from + MAX_SEARCH_RESULTS, matchingMembers.length); + + if (paginated) { + header = `Found ${matchingMembers.length} ${resultText} (showing ${from + 1}-${to})`; } else { header = `Found ${matchingMembers.length} ${resultText}`; } - const lines = matchingMembers.slice(0, MAX_SEARCH_RESULTS).map(member => { + let lines = matchingMembers.map(member => { return `${member.user.username}#${member.user.discriminator} (${member.id})`; }); lines.sort((a, b) => { return a.toLowerCase() < b.toLowerCase() ? -1 : 1; }); + lines = lines.slice(from, to); - msg.channel.createMessage(`${header}\n\`\`\`${lines.join("\n")}\`\`\``); + const footer = paginated + ? "Add a page number to the end of the command to browse results" + : ""; + + msg.channel.createMessage(`${header}\n\`\`\`${lines.join("\n")}\`\`\`${footer}`); } else { msg.channel.createMessage(errorMessage("No results found")); }