Skip to content

Commit

Permalink
add more search stuff (#1046)
Browse files Browse the repository at this point in the history
* add more search stuff

* clean up the options

* fix link hostname

* use some resolvers

* fix type
  • Loading branch information
devsnek authored and amishshah committed Dec 30, 2016
1 parent 258e4b9 commit da32c2e
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 242 deletions.
89 changes: 87 additions & 2 deletions src/client/rest/RESTMethods.js
@@ -1,3 +1,4 @@
const long = require('long');
const Constants = require('../../util/Constants');
const Collection = require('../../util/Collection');
const splitMessage = require('../../util/SplitMessage');
Expand All @@ -12,6 +13,35 @@ const Invite = require('../../structures/Invite');
const Webhook = require('../../structures/Webhook');
const UserProfile = require('../../structures/UserProfile');
const ClientOAuth2Application = require('../../structures/ClientOAuth2Application');
const Channel = require('../../structures/Channel');
const Guild = require('../../structures/Guild');

/**
* @typedef {Object} MessageSearchOptions
* @property {string} [content] Message content
* @property {string} [maxID] Maximum ID for the filter
* @property {string} [minID] Minimum ID for the filter
* @property {string} [has] One of `link`, `embed`, `file`, `video`, `image`, or `sound`,
* or add `-` to negate (e.g. `-file`)
* @property {ChannelResolvable} [channel] Channel to limit search to (only for guild search endpoint)
* @property {UserResolvable} [author] Author to limit search
* @property {string} [authorType] One of `user`, `bot`, `webhook`, or add `-` to negate (e.g. `-webhook`)
* @property {string} [sortBy='recent'] `recent` or `relevant`
* @property {string} [sortOrder='desc'] `asc` or `desc`
* @property {number} [contextSize=2] How many messages to get around the matched message (0 to 2)
* @property {number} [limit=25] Maximum number of results to get (1 to 25)
* @property {number} [offset=0] Offset the "pages" of results (since you can only see 25 at a time)
* @property {UserResolvable} [mentions] Mentioned user filter
* @property {boolean} [mentionsEveryone] If everyone is mentioned
* @property {string} [linkHostname] Filter links by hostname
* @property {string} [embedProvider] The name of an embed provider
* @property {string} [embedType] one of `image`, `video`, `url`, `rich`
* @property {string} [attachmentFilename] The name of an attachment
* @property {string} [attachmentExtention] The extension of an attachment
* @property {Date} [before] Date to find messages before
* @property {Date} [after] Date to find messages before
* @property {Date} [during] Date to find messages during (range of date to date + 24 hours)
*/

class RESTMethods {
constructor(restManager) {
Expand Down Expand Up @@ -117,13 +147,68 @@ class RESTMethods {
);
}

search(type, id, options) {
search(target, options) {
if (options.before) {
if (!(options.before instanceof Date)) options.before = new Date(options.before);
options.maxID = long.fromNumber(options.before.getTime() - 14200704e5).shiftLeft(22).toString();
}

if (options.after) {
if (!(options.after instanceof Date)) options.after = new Date(options.after);
options.minID = long.fromNumber(options.after.getTime() - 14200704e5).shiftLeft(22).toString();
}

if (options.during) {
if (!(options.during instanceof Date)) options.during = new Date(options.during);
const t = options.during.getTime() - 14200704e5;
options.minID = long.fromNumber(t).shiftLeft(22).toString();
options.maxID = long.fromNumber(t + 86400000).shift(222).toString();
}

if (options.channel) options.channel = this.client.resolver.resolveChannelID(options.channel);

if (options.author) options.author = this.client.resolver.resolveUserID(options.author);

if (options.mentions) options.mentions = this.client.resolver.resolveUserID(options.options.mentions);

options = {
content: options.content,
max_id: options.maxID,
min_id: options.minID,
has: options.has,
channel_id: options.channel,
author_id: options.author,
author_type: options.authorType,
context_size: options.contextSize,
sort_by: options.sortBy,
sort_order: options.sortOrder,
limit: options.limit,
offset: options.offset,
mentions: options.mentions,
mentions_everyone: options.mentionsEveryone,
link_hostname: options.linkHostname,
embed_provider: options.embedProvider,
embed_type: options.embedType,
attachment_filename: options.attachmentFilename,
attachment_extension: options.attachmentExtension,
};

const queryString = Object.keys(options)
.filter(k => options[k])
.map(k => [k, options[k]])
.map(x => x.join('='))
.join('&');
const url = `${Constants.Endpoints[`${type}Search`](id)}?${queryString}`;

let type;
if (target instanceof Channel) {
type = 'channel';
} else if (target instanceof Guild) {
type = 'guild';
} else {
throw new TypeError('Target must be a TextChannel, DMChannel, GroupDMChannel, or Guild.');
}

const url = `${Constants.Endpoints[`${type}Search`](target.id)}?${queryString}`;
return this.rest.makeRequest('get', url, true).then(body =>
body.messages.map(x => x.map(m => new Message(this.client.channels.get(m.channel_id), m, this.client)))
);
Expand Down
25 changes: 13 additions & 12 deletions src/structures/Guild.js
Expand Up @@ -3,7 +3,6 @@ const Role = require('./Role');
const Emoji = require('./Emoji');
const Presence = require('./Presence').Presence;
const GuildMember = require('./GuildMember');
const MessageSearch = require('./MessageSearch');
const Constants = require('../util/Constants');
const Collection = require('../util/Collection');
const cloneObject = require('../util/CloneObject');
Expand Down Expand Up @@ -707,20 +706,22 @@ class Guild {
/**
* Performs a search
* @param {MessageSearchOptions} [options={}] Options to pass to the search
* @returns {MessageSearch}
* @returns {Promise<Array<Message[]>>}
* An array containing arrays of messages. Each inner array is a search context cluster.
* The message which has triggered the result will have the `hit` property set to `true`.
* @example
* guild.search()
* .content('discord.js')
* .before('2016-11-17')
* .execute()
* .then(res => {
* const hit = res[0].find(m => m.hit).content;
* console.log(`I found: **${hit}**`);
* })
* .catch(console.error);
* guild.search({
* content: 'discord.js',
* before: '2016-11-17'
* })
* .then(res => {
* const hit = res[0].find(m => m.hit).content;
* console.log(`I found: **${hit}**`);
* })
* .catch(console.error);
*/
search(options) {
return new MessageSearch(this, options);
return this.client.rest.methods.search(this, options);
}

/**
Expand Down
215 changes: 0 additions & 215 deletions src/structures/MessageSearch.js

This file was deleted.

0 comments on commit da32c2e

Please sign in to comment.