diff --git a/core/code/chat.js b/core/code/chat.js index 8a7d39cc7..1c8108d81 100644 --- a/core/code/chat.js +++ b/core/code/chat.js @@ -76,18 +76,21 @@ window.chat.genPostData = function(channel, storageHash, getOlderMsgs) { // after the request is finished – i.e. there would be one almost // useless request. chat._faction.data = {}; + chat._faction.guids = []; chat._faction.oldestTimestamp = -1; chat._faction.newestTimestamp = -1; delete chat._faction.oldestGUID; delete chat._faction.newestGUID; chat._public.data = {}; + chat._public.guids = []; chat._public.oldestTimestamp = -1; chat._public.newestTimestamp = -1; delete chat._public.oldestGUID; delete chat._public.newestGUID; chat._alerts.data = {}; + chat._alerts.guids = []; chat._alerts.oldestTimestamp = -1; chat._alerts.newestTimestamp = -1; delete chat._alerts.oldestGUID; @@ -164,7 +167,7 @@ window.chat.requestFaction = function(getOlderMsgs, isRetry) { } -window.chat._faction = {data:{}, oldestTimestamp:-1, newestTimestamp:-1}; +window.chat._faction = {data:{}, guids: [], oldestTimestamp:-1, newestTimestamp:-1}; window.chat.handleFaction = function(data, olderMsgs, ascendingTimestampOrder) { chat._requestFactionRunning = false; $("#chatcontrols a:contains('faction')").removeClass('loading'); @@ -186,7 +189,7 @@ window.chat.handleFaction = function(data, olderMsgs, ascendingTimestampOrder) { } window.chat.renderFaction = function(oldMsgsWereAdded) { - chat.renderData(chat._faction.data, 'chatfaction', oldMsgsWereAdded); + chat.renderData(chat._faction.data, 'chatfaction', oldMsgsWereAdded, chat._faction.guids); } @@ -212,7 +215,7 @@ window.chat.requestPublic = function(getOlderMsgs, isRetry) { ); } -window.chat._public = {data:{}, oldestTimestamp:-1, newestTimestamp:-1}; +window.chat._public = {data:{}, guids: [], oldestTimestamp:-1, newestTimestamp:-1}; window.chat.handlePublic = function(data, olderMsgs, ascendingTimestampOrder) { chat._requestPublicRunning = false; $("#chatcontrols a:contains('all')").removeClass('loading'); @@ -235,7 +238,7 @@ window.chat.handlePublic = function(data, olderMsgs, ascendingTimestampOrder) { } window.chat.renderPublic = function(oldMsgsWereAdded) { - chat.renderData(chat._public.data, 'chatall', oldMsgsWereAdded); + chat.renderData(chat._public.data, 'chatall', oldMsgsWereAdded, chat._public.guids); } @@ -262,7 +265,7 @@ window.chat.requestAlerts = function(getOlderMsgs, isRetry) { } -window.chat._alerts = {data:{}, oldestTimestamp:-1, newestTimestamp:-1}; +window.chat._alerts = {data:{}, guids: [], oldestTimestamp:-1, newestTimestamp:-1}; window.chat.handleAlerts = function(data, olderMsgs, ascendingTimestampOrder) { chat._requestAlertsRunning = false; $("#chatcontrols a:contains('alerts')").removeClass('loading'); @@ -285,7 +288,7 @@ window.chat.handleAlerts = function(data, olderMsgs, ascendingTimestampOrder) { } window.chat.renderAlerts = function(oldMsgsWereAdded) { - chat.renderData(chat._alerts.data, 'chatalerts', oldMsgsWereAdded); + chat.renderData(chat._alerts.data, 'chatalerts', oldMsgsWereAdded, chat._alerts.guids); } @@ -401,6 +404,10 @@ window.chat.writeDataToHash = function(newData, storageHash, isPublicChannel, is // format: timestamp, autogenerated, HTML message, nick, additional data (parsed, plugin specific data...) storageHash.data[parsedData.guid] = [parsedData.time, parsedData.auto, chat.renderMsgRow(parsedData), parsedData.player.name, parsedData]; + if (isAscendingOrder) + storageHash.guids.push(parsedData.guid); + else + storageHash.guids.unshift(parsedData.guid); }); } @@ -562,19 +569,24 @@ window.chat.renderDivider = function(text) { // renders data from the data-hash to the element defined by the given // ID. Set 3rd argument to true if it is likely that old data has been // added. Latter is only required for scrolling. -window.chat.renderData = function(data, element, likelyWereOldMsgs) { +window.chat.renderData = function(data, element, likelyWereOldMsgs, sortedGuids) { var elm = $('#'+element); if(elm.is(':hidden')) return; // discard guids and sort old to new //TODO? stable sort, to preserve server message ordering? or sort by GUID if timestamps equal? - var vals = $.map(data, function(v, k) { return [v]; }); - vals = vals.sort(function(a, b) { return a[0]-b[0]; }); + var vals = sortedGuids; + if (vals === undefined) { + vals = $.map(data, function(v, k) { return [[v[0], k]]; }); + vals = vals.sort(function(a, b) { return a[0]-b[0]; }); + vals = vals.map(function(v) { return v[1]}); + } // render to string with date separators inserted var msgs = ''; var prevTime = null; - $.each(vals, function(ind, msg) { + vals.forEach(function(guid) { + var msg = data[guid]; var nextTime = new Date(msg[0]).toLocaleDateString(); if(prevTime && prevTime !== nextTime) msgs += chat.renderDivider(nextTime);