From 1f5002ae41d309144d8048aa60fe0c71373c6c9f Mon Sep 17 00:00:00 2001 From: abalabahaha Date: Sat, 30 Apr 2016 13:01:06 -0700 Subject: [PATCH] Nickname mention detecting, channel and role mentions in cleanContent --- lib/Client/Resolver/Resolver.js | 83 ++++++++++++++++++++++++++------- lib/Structures/Message.js | 2 +- src/Client/Resolver/Resolver.js | 39 ++++++++++++---- src/Structures/Message.js | 2 +- 4 files changed, 99 insertions(+), 27 deletions(-) diff --git a/lib/Client/Resolver/Resolver.js b/lib/Client/Resolver/Resolver.js index 9e2a45456..c21590d02 100644 --- a/lib/Client/Resolver/Resolver.js +++ b/lib/Client/Resolver/Resolver.js @@ -190,11 +190,10 @@ var Resolver = (function () { return Promise.resolve(resource); }; - Resolver.prototype.resolveMentions = function resolveMentions(resource) { - // resource is a string + Resolver.prototype.resolveMentions = function resolveMentions(resource, channel) { var _mentions = []; var changed = resource; - for (var _iterator2 = resource.match(/<@[0-9]+>/g) || [], _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + for (var _iterator2 = resource.match(/<@\!?[0-9]+>/g) || [], _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { @@ -207,12 +206,62 @@ var Resolver = (function () { } var mention = _ref2; + // username mention + if (mention[2] === '!') { + var user = this.internal.users.get("id", mention.substring(3, mention.length - 1)); + if (user) { + _mentions.push(user); + var details = channel.server.detailsOf(user); + if (details) { + changed = changed.replace(new RegExp(mention, "g"), "@" + (details.nick || user.username + "#" + user.discriminator)); + } + } + } else { + var user = this.internal.users.get("id", mention.substring(2, mention.length - 1)); + if (user) { + _mentions.push(user); + changed = changed.replace(new RegExp(mention, "g"), "@" + (user.username + "#" + user.discriminator)); + } + } + } + if (channel && channel.server && channel.server.roles) { + for (var _iterator3 = resource.match(/<@&[0-9]+>/g) || [], _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; - var userID = mention.substring(2, mention.length - 1); - var user = this.internal.client.users.get("id", userID); - if (user) { - _mentions.push(user); - changed = changed.replace(new RegExp(mention, "g"), "@" + user.username); + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref3 = _i3.value; + } + + var mention = _ref3; + // role mention + var role = channel.server.roles.get("id", mention.substring(3, mention.length - 1)); + if (role) { + changed = changed.replace(new RegExp(mention, "g"), "@" + role.name); + } + } + } + for (var _iterator4 = resource.match(/<#[0-9]+>/g) || [], _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref4; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref4 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref4 = _i4.value; + } + + var mention = _ref4; + // channel mention + var channel = this.internal.channels.get("id", mention.substring(2, mention.length - 1)); + if (channel) { + changed = changed.replace(new RegExp(mention, "g"), "#" + channel.name); } } return [_mentions, changed]; @@ -299,19 +348,19 @@ var Resolver = (function () { } if (resource instanceof _StructuresUser2["default"]) { // see if a PM exists - for (var _iterator3 = this.internal.private_channels, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { - var _ref3; + for (var _iterator5 = this.internal.private_channels, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; - if (_isArray3) { - if (_i3 >= _iterator3.length) break; - _ref3 = _iterator3[_i3++]; + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; } else { - _i3 = _iterator3.next(); - if (_i3.done) break; - _ref3 = _i3.value; + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; } - var pmchat = _ref3; + var pmchat = _ref5; if (pmchat.recipient.equals(resource)) { return Promise.resolve(pmchat); diff --git a/lib/Structures/Message.js b/lib/Structures/Message.js index c706badf9..31e0055b8 100644 --- a/lib/Structures/Message.js +++ b/lib/Structures/Message.js @@ -61,7 +61,7 @@ var Message = (function (_Equality) { this.content = data.content; - var mentionData = client.internal.resolver.resolveMentions(data.content); + var mentionData = client.internal.resolver.resolveMentions(data.content, channel); this.cleanContent = mentionData[1]; this.mentions = []; diff --git a/src/Client/Resolver/Resolver.js b/src/Client/Resolver/Resolver.js index c45ea3486..9bb9da4fa 100644 --- a/src/Client/Resolver/Resolver.js +++ b/src/Client/Resolver/Resolver.js @@ -132,16 +132,39 @@ export default class Resolver { return Promise.resolve(resource); } - resolveMentions(resource) { - // resource is a string + resolveMentions(resource, channel) { var _mentions = []; var changed = resource; - for (var mention of (resource.match(/<@[0-9]+>/g) || [])) { - var userID = mention.substring(2, mention.length - 1); - var user = this.internal.client.users.get("id", userID); - if (user) { - _mentions.push(user); - changed = changed.replace(new RegExp(mention, "g"), `@${user.username}`); + for (var mention of (resource.match(/<@\!?[0-9]+>/g) || [])) { // username mention + if (mention[2] === '!') { + var user = this.internal.users.get("id", mention.substring(3, mention.length - 1)); + if (user) { + _mentions.push(user); + var details = channel.server.detailsOf(user); + if (details) { + changed = changed.replace(new RegExp(mention, "g"), `@${details.nick || (user.username + "#" + user.discriminator)}`); + } + } + } else { + var user = this.internal.users.get("id", mention.substring(2, mention.length - 1)); + if (user) { + _mentions.push(user); + changed = changed.replace(new RegExp(mention, "g"), `@${user.username + "#" + user.discriminator}`); + } + } + } + if(channel && channel.server && channel.server.roles) { + for (var mention of (resource.match(/<@&[0-9]+>/g) || [])) { // role mention + var role = channel.server.roles.get("id", mention.substring(3, mention.length - 1)); + if (role) { + changed = changed.replace(new RegExp(mention, "g"), `@${role.name}`); + } + } + } + for (var mention of (resource.match(/<#[0-9]+>/g) || [])) { // channel mention + var channel = this.internal.channels.get("id", mention.substring(2, mention.length - 1)); + if (channel) { + changed = changed.replace(new RegExp(mention, "g"), `#${channel.name}`); } } return [_mentions, changed]; diff --git a/src/Structures/Message.js b/src/Structures/Message.js index f266567ab..28ebb54f5 100644 --- a/src/Structures/Message.js +++ b/src/Structures/Message.js @@ -36,7 +36,7 @@ export default class Message extends Equality{ this.content = data.content; - var mentionData = client.internal.resolver.resolveMentions(data.content); + var mentionData = client.internal.resolver.resolveMentions(data.content, channel); this.cleanContent = mentionData[1]; this.mentions = [];