1
0
Fork 0
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:
SirStendec 2016-03-31 19:47:17 -04:00
parent a58810e177
commit 9ead660f89
9 changed files with 306 additions and 212 deletions

View file

@ -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();

View file

@ -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'),

View file

@ -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);
}

View file

@ -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 ) {

View file

@ -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();

View file

@ -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) + '">&times;&times;&times;</span>';
//return `<span class="deleted-word tooltip" title="${utils.quote_attr(token.text)}" data-text="${utils.sanitize(token.text)}">&times;&times;&times;</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=&quot;text-align:left&quot;>' + utils.quote_attr(JSON.stringify(token,null,2)) + '</div>">[invalid token]</b>';
//return `<b class="html-tooltip" title="<div style=&quot;text-align:left&quot;>${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) + '">&times;&times;&times;</span>';
//return `<span class="deleted-word tooltip" title="${utils.quote_attr(token.text)}" data-text="${utils.sanitize(token.text)}">&times;&times;&times;</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=&quot;text-align:left&quot;>' + utils.quote_attr(JSON.stringify(token,null,2)) + '</div>">[invalid token]</b>';
//return `<b class="html-tooltip" title="<div style=&quot;text-align:left&quot;>${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("");
}

View file

@ -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);
}