mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-09-17 18:26:57 +00:00
3.5.152. Add support for Channel Feed. A smidgen of memes for Memeathon.
This commit is contained in:
parent
a58810e177
commit
9ead660f89
9 changed files with 306 additions and 212 deletions
|
@ -224,6 +224,23 @@ FFZ.prototype._modify_cindex = function(view) {
|
|||
opts.options.gravity = utils.tooltip_placement(constants.TOOLTIP_DISTANCE, opts.options.gravity || 'n');
|
||||
|
||||
|
||||
/*if ( id === 'memeathon' ) {
|
||||
var sb = document.createElement('a');
|
||||
sb.className = 'action button js-sub-button primary subscribe-button meme-sub-button';
|
||||
sb.id = 'meme-scribe';
|
||||
sb.innerHTML = '<span class="subscribe-text">Subscribe</span><span class="subscribe-price">$599.99</span>';
|
||||
|
||||
var actions = el.querySelector('.channel-actions');
|
||||
if ( actions ) {
|
||||
var c = actions.querySelector('.notification-controls') || actions.querySelector('.follow-button');
|
||||
if ( c )
|
||||
actions.insertBefore(sb, c.nextSibling);
|
||||
else
|
||||
actions.appendChild(sb);
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
this.ffzFixTitle();
|
||||
this.ffzUpdateUptime();
|
||||
this.ffzUpdateChatters();
|
||||
|
|
|
@ -514,6 +514,11 @@ FFZ.prototype._modify_cview = function(view) {
|
|||
ffzInit: function() {
|
||||
f._chatv = this;
|
||||
|
||||
var room_id = this.get('controller.currentRoom.id'),
|
||||
el = this.get('element');
|
||||
|
||||
el && el.setAttribute('data-room', room_id || "");
|
||||
|
||||
this.$('.textarea-contain').append(f.build_ui_link(this));
|
||||
this.$('.chat-messages').find('.html-tooltip').tipsy({live: true, html: true, gravity: utils.tooltip_placement(2*constants.TOOLTIP_DISTANCE, 'n')});
|
||||
this.$('.chat-messages').find('.ffz-tooltip').tipsy({live: true, html: true, title: f.render_tooltip(), gravity: utils.tooltip_placement(2*constants.TOOLTIP_DISTANCE, 'n')});
|
||||
|
@ -589,6 +594,7 @@ FFZ.prototype._modify_cview = function(view) {
|
|||
|
||||
var room = this.get('controller.currentRoom'),
|
||||
room_id = room && room.get('id'),
|
||||
el = this.get('element'),
|
||||
was_unread = room_id && this.ffz_unread[room_id],
|
||||
update_height = false;
|
||||
|
||||
|
@ -597,6 +603,7 @@ FFZ.prototype._modify_cview = function(view) {
|
|||
room.ffz_last_view = Date.now();
|
||||
}
|
||||
|
||||
el && el.setAttribute('data-room', room_id || "");
|
||||
|
||||
if ( room && room._ffz_tab ) {
|
||||
var was_hidden = room._ffz_tab.classList.contains('hidden'),
|
||||
|
|
|
@ -413,6 +413,8 @@ FFZ.prototype._load_set_json = function(set_id, callback, data) {
|
|||
if ( this._inputv )
|
||||
Ember.propertyDidChange(this._inputv, 'ffz_emoticons');
|
||||
|
||||
this.rerender_feed_cards();
|
||||
|
||||
if ( callback )
|
||||
callback(true, data);
|
||||
}
|
|
@ -49,6 +49,7 @@ FFZ.prototype.setup_bttv = function(delay) {
|
|||
}
|
||||
|
||||
document.body.classList.add('ffz-bttv');
|
||||
document.body.classList.toggle('ffz-bttv-dark', BetterTTV.settings.get('darkenedMode'));
|
||||
|
||||
// Disable Chat Tabs
|
||||
if ( this._chatv ) {
|
||||
|
|
|
@ -35,7 +35,7 @@ FFZ.msg_commands = {};
|
|||
|
||||
// Version
|
||||
var VER = FFZ.version_info = {
|
||||
major: 3, minor: 5, revision: 151,
|
||||
major: 3, minor: 5, revision: 152,
|
||||
toString: function() {
|
||||
return [VER.major, VER.minor, VER.revision].join(".") + (VER.extra || "");
|
||||
}
|
||||
|
@ -153,6 +153,7 @@ require('./ember/chat-input');
|
|||
//require('./ember/teams');
|
||||
require('./ember/directory');
|
||||
require('./ember/following');
|
||||
require('./ember/feed-card');
|
||||
|
||||
require('./debug');
|
||||
|
||||
|
@ -180,6 +181,7 @@ require('./ui/about_page');
|
|||
|
||||
require('./commands');
|
||||
require('./ext/api');
|
||||
//require('./memes');
|
||||
|
||||
|
||||
// ---------------
|
||||
|
@ -415,6 +417,7 @@ FFZ.prototype.init_ember = function(delay) {
|
|||
this.setup_chat_input();
|
||||
this.setup_directory();
|
||||
this.setup_profile_following();
|
||||
this.setup_feed_cards();
|
||||
|
||||
//this.setup_teams();
|
||||
|
||||
|
@ -433,6 +436,8 @@ FFZ.prototype.init_ember = function(delay) {
|
|||
this.find_bttv(10);
|
||||
this.find_emote_menu(10);
|
||||
|
||||
//this.setup_memes();
|
||||
|
||||
//this.check_news();
|
||||
this.check_ff();
|
||||
this.refresh_chat();
|
||||
|
|
263
src/tokenize.js
263
src/tokenize.js
|
@ -622,115 +622,162 @@ FFZ.prototype.tokenize_line = function(user, room, message, no_emotes, no_emoji)
|
|||
}
|
||||
|
||||
|
||||
FFZ.prototype.tokenize_feed_body = function(message, emotes, user_id) {
|
||||
"use strict";
|
||||
|
||||
if ( typeof message === "string" )
|
||||
message = [{type: "text", text: message}];
|
||||
|
||||
if ( helpers && helpers.linkifyMessage )
|
||||
message = helpers.linkifyMessage(message);
|
||||
|
||||
if ( helpers && helpers.emoticonizeMessage )
|
||||
message = helpers.emoticonizeMessage(message, emotes);
|
||||
|
||||
// Tokenize Lines
|
||||
var tokens = [], token;
|
||||
|
||||
for(var i = 0; i < message.length; i++) {
|
||||
token = message[i];
|
||||
if ( ! token )
|
||||
continue;
|
||||
|
||||
if ( typeof token !== "string" )
|
||||
if ( token.type === "text" )
|
||||
token = token.text;
|
||||
else {
|
||||
tokens.push(token);
|
||||
continue;
|
||||
}
|
||||
|
||||
var segments = token.split(/\n/g);
|
||||
while(segments.length) {
|
||||
tokens.push({type: "text", text: segments.shift()});
|
||||
if ( segments.length )
|
||||
tokens.push({type: "raw", html: "</p><p>"});
|
||||
}
|
||||
}
|
||||
|
||||
tokens = this.tokenize_emotes(user_id, user_id, tokens)
|
||||
|
||||
if ( this.settings.parse_emoji )
|
||||
tokens = this.tokenize_emoji(tokens);
|
||||
|
||||
return tokens;
|
||||
}
|
||||
|
||||
|
||||
FFZ.prototype.render_token = function(render_links, warn_links, token) {
|
||||
if ( ! token )
|
||||
return "";
|
||||
|
||||
if ( token.hidden )
|
||||
return "";
|
||||
|
||||
else if ( token.type === "raw" )
|
||||
return token.html;
|
||||
|
||||
else if ( token.type === "emoticon" ) {
|
||||
var src = token.imgSrc, srcset, cls, extra;
|
||||
if ( token.ffzEmote ) {
|
||||
var emote_set = this.emote_sets && this.emote_sets[token.ffzEmoteSet],
|
||||
emote = emote_set && emote_set.emoticons && emote_set.emoticons[token.ffzEmote];
|
||||
|
||||
srcset = emote ? emote.srcSet : token.srcSet;
|
||||
//extra = (emote ? ` data-ffz-emote="${emote.id}"` : '') + (emote_set ? ` data-ffz-set="${emote_set.id}"` : '');
|
||||
extra = (emote ? ' data-ffz-emote="' + emote.id + '"' : '') + (emote_set ? ' data-ffz-set="' + emote_set.id + '"' : '')
|
||||
|
||||
} else if ( token.ffzEmoji ) {
|
||||
var setting = this.settings.parse_emoji;
|
||||
if ( setting === 0 || (setting === 1 && ! token.tw) || (setting === 2 && ! token.noto) || (setting === 3 && ! token.one) )
|
||||
return token.altText;
|
||||
|
||||
src = setting === 3 ? token.one_src : (setting === 2 ? token.noto_src : token.tw_src);
|
||||
//extra = ` data-ffz-emoji="${token.ffzEmoji}" height="18px"`;
|
||||
extra = ' data-ffz-emoji="' + token.ffzEmoji + '" height="18px"';
|
||||
cls = ' emoji';
|
||||
|
||||
} else {
|
||||
var id = FFZ.src_to_id(src),
|
||||
replacement = this.settings.replace_bad_emotes && constants.EMOTE_REPLACEMENTS[id];
|
||||
|
||||
//extra = ` data-emote="${id}" onerror="FrankerFaceZ._emote_mirror_swap(this)"`;
|
||||
extra = ' data-emote="' + id + '" onerror="FrankerFaceZ._emote_mirror_swap(this)"';
|
||||
|
||||
if ( replacement ) {
|
||||
src = constants.EMOTE_REPLACEMENT_BASE + replacement;
|
||||
srcset = '';
|
||||
} else
|
||||
srcset = utils.build_srcset(id);
|
||||
}
|
||||
|
||||
//return `<img class="emoticon ffz-tooltip${cls||''}"${extra||''} src="${utils.quote_attr(src)}"${srcset ? ' srcset="' + utils.quote_attr(srcset) + '"' : ''} alt="${utils.quote_attr(token.altText)}">`;
|
||||
return '<img class="emoticon ffz-tooltip' + (cls||'') + '"' + (extra||'') + ' src="' + utils.quote_attr(src) + '"' + (srcset ? ' srcset="' + utils.quote_attr(srcset) + '"' : '') + ' alt="' + utils.quote_attr(token.altText) + '">';
|
||||
}
|
||||
|
||||
else if ( token.type === "link" ) {
|
||||
var text = token.title || (token.isLong && '<long link>') || (token.isDeleted && '<deleted link>') || (warn_links && '<whispered link>') || token.text;
|
||||
|
||||
if ( ! render_links && render_links !== undefined )
|
||||
return utils.sanitize(text);
|
||||
|
||||
var href = token.link || token.text,
|
||||
cls = '';
|
||||
|
||||
if ( token.isMailTo ) {
|
||||
// E-Mail Link
|
||||
cls = 'email-link';
|
||||
href = 'mailto:' + href;
|
||||
|
||||
} else {
|
||||
// Web Link
|
||||
cls = 'chat-link';
|
||||
|
||||
if ( this.settings.link_info ) {
|
||||
if (!( this._link_data && this._link_data[href] )) {
|
||||
this._link_data = this._link_data || {};
|
||||
this._link_data[href] = true;
|
||||
this.ws_send("get_link", href, load_link_data.bind(this, href));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Deleted Links
|
||||
var actual_href = href;
|
||||
if ( token.isDeleted ) {
|
||||
cls = 'deleted-link ' + cls;
|
||||
href = '#';
|
||||
|
||||
} else if ( warn_links ) {
|
||||
cls = 'warn-link deleted-link ' + cls;
|
||||
href = '#';
|
||||
}
|
||||
|
||||
//return `<a class="ffz-tooltip ${cls}" data-text="${utils.quote_attr(token.text)}" data-url="${utils.quote_attr(actual_href)}" href="${utils.quote_attr(href||'#')}" target="_blank">${utils.sanitize(text)}</a>`;
|
||||
return '<a class="ffz-tooltip' + (cls ? ' ' + cls : '') + '" data-text="' + utils.quote_attr(token.text) + '" data-url="' + utils.quote_attr(actual_href) + '" href="' + utils.quote_attr(href||'#') + '" target="_blank">' + utils.sanitize(text) + '</a>';
|
||||
}
|
||||
|
||||
else if ( token.type === "deleted" )
|
||||
return '<span class="deleted-word tooltip" title="' + utils.quote_attr(token.text) + '" data-text="' + utils.sanitize(token.text) + '">×××</span>';
|
||||
//return `<span class="deleted-word tooltip" title="${utils.quote_attr(token.text)}" data-text="${utils.sanitize(token.text)}">×××</span>`;
|
||||
|
||||
else if ( token.type === "mention" )
|
||||
return '<span class="' + (token.isOwnMessage ? 'mentioning' : 'mentioned') + '">' + utils.sanitize(token.user) + '</span>';
|
||||
//return `<span class="${token.isOwnMessage ? 'mentioning' : 'mentioned'}">${utils.sanitize(token.user)}</span>`;
|
||||
|
||||
else if ( token.deletedLink || token.text )
|
||||
return utils.sanitize(token.text);
|
||||
|
||||
else if ( typeof token !== "string" )
|
||||
return '<b class="html-tooltip" title="<div style="text-align:left">' + utils.quote_attr(JSON.stringify(token,null,2)) + '</div>">[invalid token]</b>';
|
||||
//return `<b class="html-tooltip" title="<div style="text-align:left">${utils.quote_attr(JSON.stringify(token,null,2))}</div>">[invalid token]</b>`;
|
||||
|
||||
return utils.sanitize(token);
|
||||
}
|
||||
|
||||
|
||||
FFZ.prototype.render_tokens = function(tokens, render_links, warn_links) {
|
||||
var f = this;
|
||||
return _.map(tokens, function(token) {
|
||||
if ( ! token )
|
||||
return "";
|
||||
|
||||
if ( token.hidden )
|
||||
return "";
|
||||
|
||||
else if ( token.type === "raw" )
|
||||
return token.html;
|
||||
|
||||
else if ( token.type === "emoticon" ) {
|
||||
var src = token.imgSrc, srcset, cls, extra;
|
||||
if ( token.ffzEmote ) {
|
||||
var emote_set = f.emote_sets && f.emote_sets[token.ffzEmoteSet],
|
||||
emote = emote_set && emote_set.emoticons && emote_set.emoticons[token.ffzEmote];
|
||||
|
||||
srcset = emote ? emote.srcSet : token.srcSet;
|
||||
//extra = (emote ? ` data-ffz-emote="${emote.id}"` : '') + (emote_set ? ` data-ffz-set="${emote_set.id}"` : '');
|
||||
extra = (emote ? ' data-ffz-emote="' + emote.id + '"' : '') + (emote_set ? ' data-ffz-set="' + emote_set.id + '"' : '')
|
||||
|
||||
} else if ( token.ffzEmoji ) {
|
||||
var setting = f.settings.parse_emoji;
|
||||
if ( setting === 0 || (setting === 1 && ! token.tw) || (setting === 2 && ! token.noto) || (setting === 3 && ! token.one) )
|
||||
return token.altText;
|
||||
|
||||
src = setting === 3 ? token.one_src : (setting === 2 ? token.noto_src : token.tw_src);
|
||||
//extra = ` data-ffz-emoji="${token.ffzEmoji}" height="18px"`;
|
||||
extra = ' data-ffz-emoji="' + token.ffzEmoji + '" height="18px"';
|
||||
cls = ' emoji';
|
||||
|
||||
} else {
|
||||
var id = FFZ.src_to_id(src),
|
||||
replacement = f.settings.replace_bad_emotes && constants.EMOTE_REPLACEMENTS[id];
|
||||
|
||||
//extra = ` data-emote="${id}" onerror="FrankerFaceZ._emote_mirror_swap(this)"`;
|
||||
extra = ' data-emote="' + id + '" onerror="FrankerFaceZ._emote_mirror_swap(this)"';
|
||||
|
||||
if ( replacement ) {
|
||||
src = constants.EMOTE_REPLACEMENT_BASE + replacement;
|
||||
srcset = '';
|
||||
} else
|
||||
srcset = utils.build_srcset(id);
|
||||
}
|
||||
|
||||
//return `<img class="emoticon ffz-tooltip${cls||''}"${extra||''} src="${utils.quote_attr(src)}"${srcset ? ' srcset="' + utils.quote_attr(srcset) + '"' : ''} alt="${utils.quote_attr(token.altText)}">`;
|
||||
return '<img class="emoticon ffz-tooltip' + (cls||'') + '"' + (extra||'') + ' src="' + utils.quote_attr(src) + '"' + (srcset ? ' srcset="' + utils.quote_attr(srcset) + '"' : '') + ' alt="' + utils.quote_attr(token.altText) + '">';
|
||||
}
|
||||
|
||||
else if ( token.type === "link" ) {
|
||||
var text = token.title || (token.isLong && '<long link>') || (token.isDeleted && '<deleted link>') || (warn_links && '<whispered link>') || token.text;
|
||||
|
||||
if ( ! render_links && render_links !== undefined )
|
||||
return utils.sanitize(text);
|
||||
|
||||
var href = token.link || token.text,
|
||||
cls = '';
|
||||
|
||||
if ( token.isMailTo ) {
|
||||
// E-Mail Link
|
||||
cls = 'email-link';
|
||||
href = 'mailto:' + href;
|
||||
|
||||
} else {
|
||||
// Web Link
|
||||
cls = 'chat-link';
|
||||
|
||||
if ( f.settings.link_info ) {
|
||||
if (!( f._link_data && f._link_data[href] )) {
|
||||
f._link_data = f._link_data || {};
|
||||
f._link_data[href] = true;
|
||||
f.ws_send("get_link", href, load_link_data.bind(f, href));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Deleted Links
|
||||
var actual_href = href;
|
||||
if ( token.isDeleted ) {
|
||||
cls = 'deleted-link ' + cls;
|
||||
href = '#';
|
||||
|
||||
} else if ( warn_links ) {
|
||||
cls = 'warn-link deleted-link ' + cls;
|
||||
href = '#';
|
||||
}
|
||||
|
||||
//return `<a class="ffz-tooltip ${cls}" data-text="${utils.quote_attr(token.text)}" data-url="${utils.quote_attr(actual_href)}" href="${utils.quote_attr(href||'#')}" target="_blank">${utils.sanitize(text)}</a>`;
|
||||
return '<a class="ffz-tooltip' + (cls ? ' ' + cls : '') + '" data-text="' + utils.quote_attr(token.text) + '" data-url="' + utils.quote_attr(actual_href) + '" href="' + utils.quote_attr(href||'#') + '" target="_blank">' + utils.sanitize(text) + '</a>';
|
||||
}
|
||||
|
||||
else if ( token.type === "deleted" )
|
||||
return '<span class="deleted-word tooltip" title="' + utils.quote_attr(token.text) + '" data-text="' + utils.sanitize(token.text) + '">×××</span>';
|
||||
//return `<span class="deleted-word tooltip" title="${utils.quote_attr(token.text)}" data-text="${utils.sanitize(token.text)}">×××</span>`;
|
||||
|
||||
else if ( token.type === "mention" )
|
||||
return '<span class="' + (token.isOwnMessage ? 'mentioning' : 'mentioned') + '">' + utils.sanitize(token.user) + '</span>';
|
||||
//return `<span class="${token.isOwnMessage ? 'mentioning' : 'mentioned'}">${utils.sanitize(token.user)}</span>`;
|
||||
|
||||
else if ( token.deletedLink || token.text )
|
||||
return utils.sanitize(token.text);
|
||||
|
||||
else if ( typeof token !== "string" )
|
||||
return '<b class="html-tooltip" title="<div style="text-align:left">' + utils.quote_attr(JSON.stringify(token,null,2)) + '</div>">[invalid token]</b>';
|
||||
//return `<b class="html-tooltip" title="<div style="text-align:left">${utils.quote_attr(JSON.stringify(token,null,2))}</div>">[invalid token]</b>`;
|
||||
|
||||
return utils.sanitize(token);
|
||||
}).join("");
|
||||
return _.map(tokens, this.render_token.bind(this, render_links, warn_links)).join("");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -93,9 +93,9 @@ FFZ.menu_pages.myemotes = {
|
|||
name: "My Emoticons",
|
||||
icon: constants.EMOTE,
|
||||
|
||||
visible: function(view) {
|
||||
has_sets: function(view) {
|
||||
var user = this.get_user(),
|
||||
tmi = view.get('controller.currentRoom.tmiSession'),
|
||||
tmi = view && view.get('controller.currentRoom.tmiSession'),
|
||||
ffz_sets = user && this.users[user.login] && this.users[user.login].sets || [],
|
||||
twitch_sets = (tmi && tmi.getEmotes() || {'emoticon_sets': {}})['emoticon_sets'],
|
||||
|
||||
|
@ -104,7 +104,11 @@ FFZ.menu_pages.myemotes = {
|
|||
if ( sk && ! this.settings.global_emotes_in_menu && sk.indexOf('0') !== -1 )
|
||||
sk.removeObject('0');
|
||||
|
||||
return ffz_sets.length || (sk && sk.length) || this.settings.emoji_in_menu;
|
||||
return ffz_sets.length || (sk && sk.length);
|
||||
},
|
||||
|
||||
visible: function(view) {
|
||||
return this.settings.emoji_in_menu || FFZ.menu_pages.myemotes.has_sets.apply(this, view);
|
||||
},
|
||||
|
||||
default_page: function() {
|
||||
|
@ -134,6 +138,10 @@ FFZ.menu_pages.myemotes = {
|
|||
name: "All Emoticons",
|
||||
sort_order: 2,
|
||||
|
||||
visible: function(view) {
|
||||
return FFZ.menu_pages.myemotes.has_sets.apply(this, view);
|
||||
},
|
||||
|
||||
render: function(view, container) {
|
||||
FFZ.menu_pages.myemotes.render_lists.call(this, view, container, false);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue