1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-10-19 09:22:00 +00:00

An update!

This commit is contained in:
SirStendec 2015-06-10 18:46:04 -04:00
parent 6264da62fc
commit b184fc74b2
15 changed files with 905 additions and 125 deletions

View file

@ -67,9 +67,9 @@ FFZ.prototype.setup_channel = function() {
if ( f._cindex )
f._cindex.ffzFixTitle();
}.observes("content.status", "content.id")
}.observes("content.status", "content.id"),
/*ffzHostTarget: function() {
ffzHostTarget: function() {
var target = this.get('content.hostModeTarget'),
name = target && target.get('name'),
display_name = target && target.get('display_name');
@ -79,7 +79,7 @@ FFZ.prototype.setup_channel = function() {
if ( f.settings.group_tabs && f._chatv )
f._chatv.ffzRebuildTabs();
}.observes("content.hostModeTarget")*/
}.observes("content.hostModeTarget")
});
}

View file

@ -17,6 +17,47 @@ var FFZ = window.FrankerFaceZ,
// Settings
// --------------------
FFZ.settings_info.prevent_clear = {
type: "boolean",
value: false,
no_bttv: true,
category: "Chat",
name: "Show Deleted Messages",
help: "Fade deleted messages instead of replacing them, and prevent chat from being cleared.",
on_update: function(val) {
if ( this.has_bttv || ! this.rooms )
return;
for(var room_id in this.rooms) {
var ffz_room = this.rooms[room_id],
room = ffz_room && ffz_room.room;
if ( ! room )
continue;
room.get("messages").forEach(function(s, n) {
if ( val && ! s.ffz_deleted && s.deleted )
room.set("messages." + n + ".deleted", false);
else if ( s.ffz_deleted && ! val && ! s.deleted )
room.set("messages." + n + ".deleted", true);
});
}
}
};
FFZ.settings_info.chat_history = {
type: "boolean",
value: true,
visible: false,
category: "Chat",
name: "Chat History <span>Alpha</span>",
help: "Load previous chat messages when loading a chat room so you can see what people have been talking about. <b>This currently only works in a handful of channels due to server capacity.</b>",
};
FFZ.settings_info.group_tabs = {
type: "boolean",
value: false,

View file

@ -321,13 +321,29 @@ FFZ.prototype.setup_line = function() {
this._twitch_emotes = {};
this._link_data = {};
this.log("Hooking the Ember Whisper controller.");
var Whisper = App.__container__.resolve('component:whisper-line');
if ( Whisper )
this._modify_line(Whisper);
this.log("Hooking the Ember Line controller.");
var Line = App.__container__.resolve('component:message-line'),
f = this;
var Line = App.__container__.resolve('component:message-line');
Line.reopen({
if ( Line )
this._modify_line(Line);
// Store the capitalization of our own name.
var user = this.get_user();
if ( user && user.name )
FFZ.capitalization[user.login] = [user.name, Date.now()];
}
FFZ.prototype._modify_line = function(component) {
var f = this;
component.reopen({
tokenizedMessage: function() {
// Add our own step to the tokenization procedure.
var tokens = this.get("msgObject.cachedTokens");
@ -375,6 +391,10 @@ FFZ.prototype.setup_line = function() {
}.property("msgObject.message", "isChannelLinksDisabled", "currentUserNick", "msgObject.from", "msgObject.tags.emotes"),
ffzUpdated: Ember.observer("msgObject.ffz_deleted", "msgObject.ffz_old_messages", function() {
this.rerender();
}),
didInsertElement: function() {
this._super();
try {
@ -397,12 +417,29 @@ FFZ.prototype.setup_line = function() {
}
el.classList.toggle('ffz-alternate', row_type);
el.classList.toggle('ffz-deleted', f.settings.prevent_clear && this.get('msgObject.ffz_deleted'));
// Basic Data
el.setAttribute('data-room', room);
el.setAttribute('data-sender', user);
el.setAttribute('data-deleted', this.get('deleted')||false);
el.setAttribute('data-deleted', this.get('msgObject.deleted')||false);
// Old Messages (for Chat Clear)
var old_messages = this.get("msgObject.ffz_old_messages");
if ( old_messages && old_messages.length ) {
var btn = document.createElement('div');
btn.className = 'button primary float-right';
btn.innerHTML = 'Show ' + utils.number_commas(old_messages.length) + ' Old';
btn.addEventListener("click", f._show_deleted.bind(f, room));
el.classList.add('clearfix');
el.classList.add('ffz-has-deleted');
this.$('.message').append(btn);
}
// Badge
@ -550,12 +587,6 @@ FFZ.prototype.setup_line = function() {
}
}
});
// Store the capitalization of our own name.
var user = this.get_user();
if ( user && user.name )
FFZ.capitalization[user.login] = [user.name, Date.now()];
}
@ -701,7 +732,7 @@ FFZ.prototype._remove_banned = function(tokens) {
// ---------------------
FFZ.prototype._emoticonize = function(component, tokens) {
var room_id = component.get("msgObject.room") || App.__container__.lookup('controller:chat').get('currentRoom.id'),
var room_id = component.get("msgObject.room"),
user_id = component.get("msgObject.from");
return this.tokenize_emotes(user_id, room_id, tokens);

View file

@ -194,11 +194,17 @@ FFZ.prototype.add_room = function(id, room) {
this.log("Adding Room: " + id);
// Create a basic data table for this room.
this.rooms[id] = {id: id, room: room, menu_sets: [], sets: [], css: null};
var data = this.rooms[id] = {id: id, room: room, menu_sets: [], sets: [], css: null, needs_history: false};
// Let the server know where we are.
this.ws_send("sub", id);
// See if we need history?
if ( ! this.has_bttv && this.settings.chat_history && room && (room.get('messages.length') || 0) < 10 ) {
if ( ! this.ws_send("chat_history", [id,25], this._load_history.bind(this, id)) )
data.needs_history = true;
}
// For now, we use the legacy function to grab the .css file.
this.load_room(id);
}
@ -232,6 +238,142 @@ FFZ.prototype.remove_room = function(id) {
}
// --------------------
// Chat History
// --------------------
FFZ.prototype._load_history = function(room_id, success, data) {
var room = this.rooms[room_id];
if ( ! room || ! room.room )
return;
if ( success )
this.log("Received " + data.length + " old messages for: " + room_id);
else
return this.log("Error retrieving chat history for: " + room_id);
if ( ! data.length )
return;
return this._insert_history(room_id, data);
}
FFZ.prototype._show_deleted = function(room_id) {
var room = this.rooms[room_id];
if ( ! room || ! room.room )
return;
var old_messages = room.room.get('messages.0.ffz_old_messages');
if ( ! old_messages || ! old_messages.length )
return;
room.room.set('messages.0.ffz_old_messages', undefined);
this._insert_history(room_id, old_messages);
}
FFZ.prototype._insert_history = function(room_id, data) {
var room = this.rooms[room_id];
if ( ! room || ! room.room )
return;
var r = room.room,
messages = r.get('messages'),
tmiSession = r.tmiSession || (TMI._sessions && TMI._sessions[0]),
tmiRoom = r.tmiRoom,
inserted = 0,
last_msg = data[data.length - 1],
now = new Date(),
last_date = typeof last_msg.date === "string" ? utils.parse_date(last_msg.date) : last_msg.date,
age = (now - last_date) / 1000,
is_old = age > 300,
i = data.length,
alternation = r.get('messages.0.ffz_alternate') || false;
if ( is_old )
alternation = ! alternation;
var i = data.length;
while(i--) {
var msg = data[i];
if ( typeof msg.date === "string" )
msg.date = utils.parse_date(msg.date);
msg.ffz_alternate = alternation = ! alternation;
if ( ! msg.room )
msg.room = room_id;
if ( ! msg.color )
msg.color = msg.tags && msg.tags.color ? msg.tags.color : tmiSession && msg.from ? tmiSession.getColor(msg.from.toLowerCase()) : "#755000";
if ( ! msg.labels || ! msg.labels.length ) {
var labels = msg.labels = [];
if ( msg.tags ) {
if ( msg.tags.turbo )
labels.push("turbo");
if ( msg.tags.subscriber )
labels.push("subscriber");
if ( msg.from === room_id )
labels.push("owner")
else {
var ut = msg.tags['user-type'];
if ( ut === 'mod' || ut === 'staff' || ut === 'admin' || ut === 'global_mod' )
labels.push(ut);
}
}
}
if ( ! msg.style ) {
if ( msg.from === "jtv" )
msg.style = "admin";
else if ( msg.from === "twitchnotify" )
msg.style = "notification";
}
if ( ! msg.cachedTokens || ! msg.cachedTokens.length )
this.tokenize_chat_line(msg, true);
if ( r.shouldShowMessage(msg) ) {
if ( messages.length < r.get("messageBufferSize") ) {
// One last thing! Make sure we don't have too many messages.
if ( msg.ffz_old_messages ) {
var max_msgs = r.get("messageBufferSize") - (messages.length + 1);
if ( msg.ffz_old_messages.length > max_msgs )
msg.ffz_old_messages = msg.ffz_old_messages.slice(msg.ffz_old_messages.length - max_msgs);
}
messages.unshiftObject(msg);
inserted += 1;
} else
break;
}
}
if ( is_old ) {
var msg = {
ffz_alternate: ! alternation,
color: "#755000",
date: new Date(),
from: "frankerfacez_admin",
style: "admin",
message: "(Last message is " + utils.human_time(age) + " old.)",
room: room_id
};
this.tokenize_chat_line(msg);
if ( r.shouldShowMessage(msg) ) {
messages.insertAt(inserted, msg);
while( messages.length > r.get('messageBufferSize') )
messages.removeAt(0);
}
}
}
// --------------------
// Receiving Set Info
// --------------------
@ -270,6 +412,8 @@ FFZ.prototype._load_room_json = function(room_id, callback, data) {
if ( this.rooms[room_id] )
data.room = this.rooms[room_id].room;
data.needs_history = this.rooms[room_id] && this.rooms[room_id].needs_history || false;
this.rooms[room_id] = data;
if ( data.css || data.moderator_badge )
@ -312,10 +456,53 @@ FFZ.prototype._modify_room = function(room) {
}
},
clearMessages: function(user) {
var t = this;
if ( user ) {
this.get("messages").forEach(function(s, n) {
if ( s.from === user ) {
t.set("messages." + n + ".ffz_deleted", true);
if ( ! f.settings.prevent_clear )
t.set("messages." + n + ".deleted", true);
}
});
} else {
if ( f.settings.prevent_clear )
this.addTmiMessage("A moderator's attempt to clear chat was ignored.");
else {
var msgs = t.get("messages");
t.set("messages", []);
t.addMessage({
style: 'admin',
message: i18n("Chat was cleared by a moderator"),
ffz_old_messages: msgs
});
}
}
},
pushMessage: function(msg) {
if ( this.shouldShowMessage(msg) ) {
var t, s, n, a = this.get("messageBufferSize");
for (this.get("messages").pushObject(msg), t = this.get("messages.length"), s = t - a, n = 0; s > n; n++)
this.get("messages").removeAt(0);
"admin" === msg.style || ("whisper" === msg.style && ! this.ffz_whisper_room ) || this.incrementProperty("unreadCount", 1);
}
},
addMessage: function(msg) {
try {
if ( msg ) {
msg.room = this.get('id');
var is_whisper = msg.style === 'whisper';
if ( f.settings.group_tabs && f.settings.whisper_room ) {
if ( ( is_whisper && ! this.ffz_whisper_room ) || ( ! is_whisper && this.ffz_whisper_room ) )
return;
}
if ( ! is_whisper )
msg.room = this.get('id');
f.tokenize_chat_line(msg);
}
} catch(err) {
@ -334,6 +521,9 @@ FFZ.prototype._modify_room = function(room) {
},
send: function(text) {
if ( f.settings.group_tabs && f.settings.whisper_room && this.ffz_whisper_room )
return;
try {
var cmd = text.split(' ', 1)[0].toLowerCase();
if ( cmd === "/ffz" ) {