diff --git a/packages/rocketchat-oembed/client/baseWidget.coffee b/packages/rocketchat-oembed/client/baseWidget.coffee index 535df9dcc23..41a6f91006c 100644 --- a/packages/rocketchat-oembed/client/baseWidget.coffee +++ b/packages/rocketchat-oembed/client/baseWidget.coffee @@ -1,6 +1,9 @@ Template.oembedBaseWidget.helpers template: -> - # console.log this + # console.log this + if this._overrideTemplate + return this._overrideTemplate + if this.headers?.contentType?.match(/image\/.*/)? return 'oembedImageWidget' @@ -10,4 +13,4 @@ Template.oembedBaseWidget.helpers if this.parsedUrl?.host is 'www.youtube.com' and this.meta?.twitterPlayer? return 'oembedYoutubeWidget' - return 'oembedUrlWidget' \ No newline at end of file + return 'oembedUrlWidget' diff --git a/packages/rocketchat-spotify/client/oembedSpotifyWidget.html b/packages/rocketchat-spotify/client/oembedSpotifyWidget.html new file mode 100644 index 00000000000..aefa8172fd8 --- /dev/null +++ b/packages/rocketchat-spotify/client/oembedSpotifyWidget.html @@ -0,0 +1,13 @@ + diff --git a/packages/rocketchat-spotify/client/widget.coffee b/packages/rocketchat-spotify/client/widget.coffee new file mode 100644 index 00000000000..abca5becdce --- /dev/null +++ b/packages/rocketchat-spotify/client/widget.coffee @@ -0,0 +1,11 @@ +Template.registerHelper 'replace', (source, find, replace, option) -> + if option.hash.regex is true + find = new RegExp(find) + return source.replace(find, replace) + +Template.registerHelper 'match', (source, regex) -> + return new RegExp(regex).test(source) + +Template.oembedBaseWidget.onCreated () -> + if this.data?.parsedUrl?.host is 'open.spotify.com' and this.data?.meta?.ogAudio? + this.data._overrideTemplate = 'oembedSpotifyWidget' diff --git a/packages/rocketchat-spotify/package.js b/packages/rocketchat-spotify/package.js new file mode 100644 index 00000000000..3bf70a29597 --- /dev/null +++ b/packages/rocketchat-spotify/package.js @@ -0,0 +1,27 @@ +Package.describe({ + name: 'rocketchat:spotify', + version: '0.0.1', + summary: 'Message pre-processor that will translate spotify on messages', + git: '' +}); + +Package.onUse(function(api) { + api.versionsFrom('1.0'); + + api.use([ + 'coffeescript', + 'templating', + 'underscore', + 'rocketchat:oembed@0.0.1', + 'rocketchat:lib@0.0.1' + ]); + + api.addFiles('client/widget.coffee', 'client'); + api.addFiles('client/oembedSpotifyWidget.html', 'client'); + + api.addFiles('spotify.coffee', ['server','client']); +}); + +Package.onTest(function(api) { + +}); diff --git a/packages/rocketchat-spotify/spotify.coffee b/packages/rocketchat-spotify/spotify.coffee new file mode 100644 index 00000000000..921ded82b3b --- /dev/null +++ b/packages/rocketchat-spotify/spotify.coffee @@ -0,0 +1,48 @@ +### +# Spotify a named function that will process Spotify links or syntaxes (ex: spotify:track:1q6IK1l4qpYykOaWaLJkWG) +# @param {Object} message - The message object +### + +class Spotify + process = (message, source, callback) -> + if _.trim source + # Separate text in code blocks and non code blocks + msgParts = source.split(/(```\w*[\n\ ]?[\s\S]*?```+?)/) + + for part, index in msgParts + # Verify if this part is code + codeMatch = part.match(/```(\w*)[\n\ ]?([\s\S]*?)```+?/) + if not codeMatch? + callback message, msgParts, part, index + + @transform: (message) -> + urls = [] + if Array.isArray message.urls + urls = urls.concat message.urls + + changed = false + + process message, message.msg, (message, msgParts, part) -> + re = /(?:^|\s)spotify:([^:]+):(\S+)(?:\s|$)/g + while match = re.exec(part) + url = "https://open.spotify.com/" + _.escape match[1] + "/" + _.escape match[2] + urls.push {'url': url} + changed = true + + # Re-mount message + if changed + message.urls = urls + + return message + + @render: (message) -> + process message, message.html, (message, msgParts, part, index) -> + msgParts[index] = part.replace /(^|\s)spotify:([^:]+):(\S+)(\s|$)/g, (match, before, type, id, after) -> + url = 'https://open.spotify.com/' + _.escape type + '/' + _.escape id + return before + 'spotify:' + type + ':' + id + '' + after + message.html = msgParts.join('') + + return message + +RocketChat.callbacks.add 'beforeSaveMessage', Spotify.transform, RocketChat.callbacks.priority.LOW +RocketChat.callbacks.add 'renderMessage', Spotify.render