\ No newline at end of file
diff --git a/old_changes.html b/old_changes.html
index 6875158d..504c8d5e 100644
--- a/old_changes.html
+++ b/old_changes.html
@@ -1,3 +1,15 @@
+
3.5.412
+
+
Changed: Do not push the entire event schedule to the client every time there's an update.
+
+
+
3.5.411
+
+
Added: Experimental event schedule feature.
+
+
Yes, I'm spending New Years Eve writing code. Leave me alone.
+
+
3.5.410
API Fixed: api.retokenize_messages didn't actually work.
diff --git a/src/ember/chat-input.js b/src/ember/chat-input.js
index 19d302fe..76a29f9f 100644
--- a/src/ember/chat-input.js
+++ b/src/ember/chat-input.js
@@ -1325,7 +1325,6 @@ FFZ.prototype.modify_chat_input = function(component) {
// If suggestions aren't visible... show them. And set that we
// triggered the suggestions with tab.
if ( ! this.get('ffz_suggestions_visible') ) {
- f.log("Showing Suggestions from Tab");
this.ffzFetchNameSuggestions();
this.set('ffz_suggestions_visible', true);
this.ffzSetPartialWord();
diff --git a/src/ember/line.js b/src/ember/line.js
index 9b2dfca4..1b0d0b56 100644
--- a/src/ember/line.js
+++ b/src/ember/line.js
@@ -995,6 +995,10 @@ FFZ.prototype._modify_chat_line = function(component, is_vod) {
return false;
}.property(),
+ ffzIsSpecialMessage: function() {
+ return this.get('hasSystemMsg') || this.get('msgObject.from') === 'twitchnotify';
+ }.property('hasSystemMsg', 'msgObject.from'),
+
ffzWasDeleted: function() {
return f.settings.prevent_clear && this.get("msgObject.ffz_deleted")
}.property("msgObject.ffz_deleted"),
@@ -1016,7 +1020,7 @@ FFZ.prototype._modify_chat_subline = function(component, is_whisper) {
component.reopen({
classNameBindings: is_whisper ?
[':whisper-line', ':chat-line', 'isReceivedWhisper:whisper-incoming:whisper-outgoing'] :
- ["msgObject.style", "msgObject.isModerationMessage:moderation-message", "msgObject.ffz_has_mention:ffz-mentioned", "ffzWasDeleted:ffz-deleted", "ffzHasOldMessages:clearfix", "ffzHasOldMessages:ffz-has-deleted"],
+ ["msgObject.isModerationMessage:moderation-message", "msgObject.ffz_has_mention:ffz-mentioned", "ffzIsSpecialMessage:special-message", "ffzWasDeleted:ffz-deleted", "ffzHasOldMessages:clearfix", "ffzHasOldMessages:ffz-has-deleted"],
attributeBindings: is_whisper ?
['msgObject.nonce:data-nonce', 'msgObject.tags.id:data-id', 'msgObject.from:data-sender'] :
["msgObject.tags.id:data-id", "msgObject.room:data-room", "msgObject.from:data-sender", "msgObject.deleted:data-deleted"],
diff --git a/src/ember/room.js b/src/ember/room.js
index cc850436..4b049f75 100644
--- a/src/ember/room.js
+++ b/src/ember/room.js
@@ -1252,11 +1252,12 @@ FFZ.prototype._modify_room = function(room) {
ffzCheckDestroy: function() {
var Chat = utils.ember_lookup('controller:chat'),
+ current_vod = f._vodc && f._vodc.get('channel.name'),
user = f.get_user(),
room_id = this.get('id');
// Don't destroy the room if it's still relevant.
- if ( (Chat && Chat.get('currentChannelRoom') === this) || (user && user.login === room_id) || (f._chatv && f._chatv._ffz_host === room_id) || (f.settings.pinned_rooms && f.settings.pinned_rooms.indexOf(room_id) !== -1) )
+ if ( (current_vod === room_id) || (Chat && Chat.get('currentChannelRoom') === this) || (user && user.login === room_id) || (f._chatv && f._chatv._ffz_host === room_id) || (f.settings.pinned_rooms && f.settings.pinned_rooms.indexOf(room_id) !== -1) )
return;
this.destroy();
diff --git a/src/ember/vod-chat.js b/src/ember/vod-chat.js
index 8ed924ec..2e39666f 100644
--- a/src/ember/vod-chat.js
+++ b/src/ember/vod-chat.js
@@ -74,10 +74,14 @@ FFZ.prototype.modify_vod_chat_display = function(component) {
this.ffzUpdateBadges();
- // Load the room, if nencessary.
- var room_id = this.get('channel.name');
- if ( room_id && ! f.rooms[room_id] )
- f.load_room(room_id);
+ // Load the room, if necessary.
+ var room_id = this.get('video.channel.id');
+ if ( room_id && ! f.rooms[room_id] ) {
+ // Load the room model.
+ f.log("Loading Room for VOD: " + room_id);
+ var Room = utils.ember_resolve('model:room');
+ Room && Room.findOne(room_id);
+ }
if ( ! f.has_bttv ) {
this.ffzFixStickyBottom();
@@ -92,13 +96,21 @@ FFZ.prototype.modify_vod_chat_display = function(component) {
if ( f._vodc === this )
f._vodc = undefined;
+ var room_id = this.get('video.channel.id'),
+ room = f.rooms && f.rooms[room_id];
+
+ // We don't need the chat room anymore, in theory. This will
+ // check if the room is still important after a short delay.
+ if ( room && room.room )
+ room.room.ffzScheduleDestroy();
+
this.ffzDisableFreeze();
this.ffzRemoveKeyHook();
},
ffzUpdateBadges: function() {
var t = this,
- channel_name = this.get('channel.name'),
+ channel_name = this.get('video.channel.id'),
owner_name = this.get('video.owner.name'),
owner_id = this.get('video.owner._id');
@@ -122,7 +134,7 @@ FFZ.prototype.modify_vod_chat_display = function(component) {
if ( ! badges )
return this._super();
- var room_id = this.get('channel.name'),
+ var room_id = this.get('video.channel.id'),
output = [];
for(var badge_id in badges) {
@@ -140,6 +152,10 @@ FFZ.prototype.modify_vod_chat_display = function(component) {
val = this.get('stuckToBottom');
VODService && VODService.set("messageBufferSize", f.settings.scrollback_length + (val ? 0 : 150));
+ },
+
+ _scheduleScrollToBottom: function() {
+ this._scrollToBottom();
}
}, FFZ.HoverPause));
diff --git a/src/main.js b/src/main.js
index de597694..f2e93fa6 100644
--- a/src/main.js
+++ b/src/main.js
@@ -61,7 +61,7 @@ FFZ.channel_metadata = {};
// Version
var VER = FFZ.version_info = {
- major: 3, minor: 5, revision: 421,
+ major: 3, minor: 5, revision: 422,
toString: function() {
return [VER.major, VER.minor, VER.revision].join(".") + (VER.extra || "");
}
diff --git a/src/tokenize.js b/src/tokenize.js
index 667a9efd..197c66c7 100644
--- a/src/tokenize.js
+++ b/src/tokenize.js
@@ -1034,7 +1034,7 @@ FFZ.prototype.render_token = function(render_links, warn_links, render_bits, tok
if ( clip_info ) {
var clips = utils.ember_lookup('service:clips');
- clips && clips.getClipInfo(clip_info[1], clip_info[2]).then(function(data) {
+ clips && clips.getClipInfo(clip_info[1] + '/' + clip_info[2]).then(function(data) {
success(true, {
image: data.previewImage,
image_iframe: false,