mirror of
https://git.friendi.ca/friendica/friendica-addons.git
synced 2024-12-11 10:03:18 +00:00
419 lines
9.9 KiB
JavaScript
419 lines
9.9 KiB
JavaScript
|
/*
|
||
|
|
||
|
Jappix - An open social platform
|
||
|
These are the archives functions for Jappix
|
||
|
|
||
|
-------------------------------------------------
|
||
|
|
||
|
License: AGPL
|
||
|
Author: Vanaryon
|
||
|
Last revision: 03/03/11
|
||
|
|
||
|
*/
|
||
|
|
||
|
// Opens the archive tools
|
||
|
function openArchives() {
|
||
|
// Popup HTML content
|
||
|
var html =
|
||
|
'<div class="top">' + _e("Message archives") + '</div>' +
|
||
|
|
||
|
'<div class="content">' +
|
||
|
'<div class="filter">' +
|
||
|
'<select class="friend" multiple=""></select>' +
|
||
|
|
||
|
'<div class="date"></div>' +
|
||
|
'</div>' +
|
||
|
|
||
|
'<div class="current">' +
|
||
|
'<span class="name"></span>' +
|
||
|
'<span class="time">' + _e("Please select a friend to view the chat history.") + '</span>' +
|
||
|
'</div>' +
|
||
|
|
||
|
'<div class="logs" id="chat-content-archives"></div>' +
|
||
|
'</div>' +
|
||
|
|
||
|
'<div class="bottom">' +
|
||
|
'<div class="wait wait-medium"></div>' +
|
||
|
|
||
|
'<a href="#" class="finish">' + _e("Close") + '</a>' +
|
||
|
'</div>';
|
||
|
|
||
|
// Create the popup
|
||
|
createPopup('archives', html);
|
||
|
|
||
|
// Associate the events
|
||
|
launchArchives();
|
||
|
|
||
|
// Get all the buddies in our roster
|
||
|
var buddies = getAllBuddies();
|
||
|
var options = '';
|
||
|
|
||
|
for(i in buddies) {
|
||
|
var current = buddies[i];
|
||
|
|
||
|
// Add the current buddy
|
||
|
options += '<option value="' + encodeQuotes(current) + '">' + getBuddyName(current).htmlEnc() + '</option>';
|
||
|
}
|
||
|
|
||
|
// Can append the buddy HTML code?
|
||
|
if(options)
|
||
|
$('#archives .filter .friend').append(options);
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// Closes the archive tools
|
||
|
function closeArchives() {
|
||
|
// Destroy the popup
|
||
|
destroyPopup('archives');
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// Gets the archives list for a buddy
|
||
|
function getListArchives(xid) {
|
||
|
// Reset the archives viewer
|
||
|
$('#archives .logs').empty();
|
||
|
|
||
|
// Show the waiting icon
|
||
|
$('#archives .wait').show();
|
||
|
|
||
|
// Apply the ID
|
||
|
var id = genID();
|
||
|
$('#archives').attr('data-session', id);
|
||
|
|
||
|
// New IQ
|
||
|
var iq = new JSJaCIQ();
|
||
|
iq.setType('get');
|
||
|
iq.setID(id);
|
||
|
|
||
|
var list = iq.appendNode('list', {'xmlns': NS_URN_ARCHIVE, 'with': xid});
|
||
|
var set = list.appendChild(iq.buildNode('set', {'xmlns': NS_RSM}));
|
||
|
set.appendChild(iq.buildNode('max', {'xmlns': NS_RSM}, '0'));
|
||
|
|
||
|
con.send(iq, handleListArchives);
|
||
|
|
||
|
logThis('Getting archives list for: ' + xid + '...');
|
||
|
}
|
||
|
|
||
|
// Handles the archives list for a buddy
|
||
|
function handleListArchives(iq) {
|
||
|
// Hide the waiting icon
|
||
|
$('#archives .wait').hide();
|
||
|
|
||
|
// Any error?
|
||
|
if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']'))
|
||
|
return;
|
||
|
|
||
|
// Get the last archive date
|
||
|
var last = $(iq.getNode()).find('list set changed').text();
|
||
|
|
||
|
// Any last archive?
|
||
|
if(last) {
|
||
|
// Read the date
|
||
|
var date = Date.jab2date(last);
|
||
|
|
||
|
// Change the datepicker value
|
||
|
$('#archives .filter .date').DatePickerSetDate(date, true);
|
||
|
|
||
|
// Retrieve the archives
|
||
|
checkChangeArchives();
|
||
|
}
|
||
|
|
||
|
logThis('Got archives list.', 2);
|
||
|
}
|
||
|
|
||
|
// Gets the archives for a day
|
||
|
function getDayArchives(xid, date) {
|
||
|
// Reset the archives viewer
|
||
|
$('#archives .logs').empty();
|
||
|
|
||
|
// Show the waiting icon
|
||
|
$('#archives .wait').show();
|
||
|
|
||
|
// Apply the ID
|
||
|
var id = genID();
|
||
|
$('#archives').attr('data-session', id);
|
||
|
|
||
|
// New IQ
|
||
|
var iq = new JSJaCIQ();
|
||
|
iq.setType('get');
|
||
|
iq.setID(id);
|
||
|
|
||
|
iq.appendNode('list', {'xmlns': NS_URN_ARCHIVE, 'with': xid, 'start': date + 'T00:00:00Z', 'end': date + 'T23:59:59Z'});
|
||
|
|
||
|
con.send(iq, handleDayArchives);
|
||
|
|
||
|
logThis('Getting day archives (' + date + ') for: ' + xid + '...');
|
||
|
}
|
||
|
|
||
|
// Handles the archives for a day
|
||
|
function handleDayArchives(iq) {
|
||
|
// Hide the waiting icon
|
||
|
$('#archives .wait').hide();
|
||
|
|
||
|
// Any error?
|
||
|
if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']'))
|
||
|
return;
|
||
|
|
||
|
// Get each archive thread
|
||
|
$(iq.getNode()).find('chat').each(function() {
|
||
|
// Current values
|
||
|
var xid = $(this).attr('with');
|
||
|
var start = $(this).attr('start');
|
||
|
|
||
|
if(xid && start)
|
||
|
$('#archives .logs').append('<input class="archives-pending" type="hidden" data-with="' + encodeQuotes(xid) + '" data-start="' + encodeQuotes(start) + '" />');
|
||
|
});
|
||
|
|
||
|
// Display the day
|
||
|
var date = parseDay($('#archives .filter .date').DatePickerGetDate(true) + 'T00:00:00Z' + getDateTZO());
|
||
|
|
||
|
// Try to get the first thread
|
||
|
var pending = '#archives input.archives-pending:first';
|
||
|
|
||
|
if(!exists(pending))
|
||
|
date = printf(_e("Nothing found for: %s"), date);
|
||
|
|
||
|
else {
|
||
|
retrieveArchives($(pending).attr('data-with'), $(pending).attr('data-start'));
|
||
|
$(pending).remove();
|
||
|
}
|
||
|
|
||
|
$('#archives .current .time').text(date);
|
||
|
|
||
|
logThis('Got day archives.', 2);
|
||
|
}
|
||
|
|
||
|
// Retrieves a specified archive collection
|
||
|
function retrieveArchives(xid, start) {
|
||
|
// Show the waiting icon
|
||
|
$('#archives .wait').show();
|
||
|
|
||
|
// Apply the ID
|
||
|
var id = genID();
|
||
|
$('#archives').attr('data-session', id);
|
||
|
|
||
|
// New IQ
|
||
|
var iq = new JSJaCIQ();
|
||
|
iq.setType('get');
|
||
|
iq.setID(id);
|
||
|
|
||
|
var list = iq.appendNode('retrieve', {'xmlns': NS_URN_ARCHIVE, 'with': xid, 'start': start});
|
||
|
|
||
|
con.send(iq, handleRetrieveArchives);
|
||
|
|
||
|
logThis('Retrieving archives (start: ' + start + ') for: ' + xid + '...');
|
||
|
}
|
||
|
|
||
|
// Handles a specified archive collection
|
||
|
function handleRetrieveArchives(iq) {
|
||
|
// Hide the waiting icon
|
||
|
$('#archives .wait').hide();
|
||
|
|
||
|
// Any error?
|
||
|
if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']'))
|
||
|
return;
|
||
|
|
||
|
// Get the node
|
||
|
var chat = $(iq.getNode()).find('chat:first');
|
||
|
|
||
|
// Get the buddy XID
|
||
|
var xid = bareXID(chat.attr('with'));
|
||
|
|
||
|
// Get the start date & stamp
|
||
|
var start_date = Date.jab2date(chat.attr('start'));
|
||
|
var start_stamp = extractStamp(start_date);
|
||
|
|
||
|
// Parse the result chat
|
||
|
chat.find('to, from').each(function() {
|
||
|
var node = (this).nodeName;
|
||
|
var stamp = start_stamp + parseInt($(this).attr('secs'));
|
||
|
var date = extractTime(new Date(stamp * 1000));
|
||
|
var body = $(this).find('body').text();
|
||
|
|
||
|
// Is it my message?
|
||
|
if((node == 'to') && body)
|
||
|
displayMessage('chat', getXID(), 'archives', getBuddyName(getXID()).htmlEnc(), body, date, start_stamp, 'user-message', true, '', 'me');
|
||
|
|
||
|
// Is it a buddy message?
|
||
|
else if((node == 'from') && body)
|
||
|
displayMessage('chat', xid, 'archives', getBuddyName(xid).htmlEnc(), body, date, start_stamp, 'user-message', true, '', 'him');
|
||
|
});
|
||
|
|
||
|
// Not the latest thread?
|
||
|
var pending = '#archives input.archives-pending:first';
|
||
|
|
||
|
if(exists(pending)) {
|
||
|
retrieveArchives($(pending).attr('data-with'), $(pending).attr('data-start'));
|
||
|
$(pending).remove();
|
||
|
}
|
||
|
|
||
|
// Everything has been retrieved, get the avatars
|
||
|
else {
|
||
|
getAvatar(getXID(), 'cache', 'true', 'forget');
|
||
|
getAvatar(xid, 'cache', 'true', 'forget');
|
||
|
}
|
||
|
|
||
|
logThis('Got archives.', 2);
|
||
|
}
|
||
|
|
||
|
// Gets the archiving configuration
|
||
|
function getConfigArchives() {
|
||
|
// Lock the archiving options
|
||
|
$('#archiving').attr('checked', false).attr('disabled', true);
|
||
|
|
||
|
// Get the archiving configuration
|
||
|
var iq = new JSJaCIQ();
|
||
|
iq.setType('get');
|
||
|
|
||
|
iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE});
|
||
|
|
||
|
con.send(iq, handleGetConfigArchives);
|
||
|
}
|
||
|
|
||
|
// Handles the archiving configuration
|
||
|
function handleGetConfigArchives(iq) {
|
||
|
// Reset the options stuffs
|
||
|
waitOptions('archives');
|
||
|
|
||
|
// Unlock the archiving options
|
||
|
$('#archiving').removeAttr('disabled');
|
||
|
|
||
|
// End if not a result
|
||
|
if(!iq || (iq.getType() != 'result'))
|
||
|
return;
|
||
|
|
||
|
// Extract the preferences from the IQ
|
||
|
var enabled = $(iq.getNode()).find('pref auto').attr('save');
|
||
|
|
||
|
// Define the input enabling/disabling vars
|
||
|
var checked = true;
|
||
|
|
||
|
if(enabled != 'true')
|
||
|
checked = false;
|
||
|
|
||
|
// Apply the values
|
||
|
$('#archiving').attr('checked', checked);
|
||
|
}
|
||
|
|
||
|
// Configures the archiving on the server
|
||
|
function configArchives(enabled) {
|
||
|
// Configure the auto element
|
||
|
var iq = new JSJaCIQ();
|
||
|
iq.setType('set');
|
||
|
|
||
|
iq.appendNode('auto', {'xmlns': NS_URN_ARCHIVE, 'save': enabled});
|
||
|
|
||
|
con.send(iq, handleConfigArchives);
|
||
|
|
||
|
// Configure the default element
|
||
|
var iq = new JSJaCIQ();
|
||
|
iq.setType('set');
|
||
|
|
||
|
var pref = iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE});
|
||
|
pref.appendChild(iq.appendNode('default', {'xmlns': NS_URN_ARCHIVE, 'otr': 'concede', 'save': 'body'}));
|
||
|
|
||
|
con.send(iq);
|
||
|
|
||
|
// Configure the method element
|
||
|
var iq = new JSJaCIQ();
|
||
|
iq.setType('set');
|
||
|
|
||
|
var mType = new Array('auto', 'local', 'manual');
|
||
|
var mUse = new Array('prefer', 'concede', 'concede');
|
||
|
|
||
|
var pref = iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE});
|
||
|
|
||
|
for(i in mType)
|
||
|
pref.appendChild(iq.appendNode('method', {'xmlns': NS_URN_ARCHIVE, 'type': mType[i], 'use': mUse[i]}));
|
||
|
|
||
|
con.send(iq);
|
||
|
|
||
|
// Logger
|
||
|
logThis('Configuring archives...', 3);
|
||
|
}
|
||
|
|
||
|
// Handles the archives configuration
|
||
|
function handleConfigArchives(iq) {
|
||
|
if(!iq || (iq.getType() != 'result'))
|
||
|
logThis('Archives not configured.', 2);
|
||
|
else
|
||
|
logThis('Archives configured.', 3);
|
||
|
}
|
||
|
|
||
|
// Checks if the datepicker has changed
|
||
|
function checkChangeArchives() {
|
||
|
var xid = $('#archives .filter .friend').val();
|
||
|
var date = $('#archives .filter .date').DatePickerGetDate(true);
|
||
|
|
||
|
// No XID?
|
||
|
if(!xid || !xid.length)
|
||
|
return;
|
||
|
|
||
|
// Too many value?
|
||
|
if(xid.length > 1) {
|
||
|
$('#archives .filter .friend').val(xid[0]);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Get the first XID
|
||
|
xid = xid[0];
|
||
|
|
||
|
// Get the archives
|
||
|
getDayArchives(xid, date);
|
||
|
}
|
||
|
|
||
|
// Update the archives with the selected XID
|
||
|
function updateArchives() {
|
||
|
// Read the values
|
||
|
var xid = $('#archives .filter .friend').val();
|
||
|
var date = $('#archives .filter .date').DatePickerGetDate(true);
|
||
|
|
||
|
// No XID?
|
||
|
if(!xid || !xid.length)
|
||
|
return;
|
||
|
|
||
|
// Too many value?
|
||
|
if(xid.length > 1) {
|
||
|
$('#archives .filter .friend').val(xid[0]);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Get the first XID
|
||
|
xid = xid[0];
|
||
|
|
||
|
// Apply the current marker
|
||
|
$('#archives .current .name').text(getBuddyName(xid));
|
||
|
$('#archives .current .time').text(parseDay(date + 'T00:00:00Z' + getDateTZO()));
|
||
|
|
||
|
// Get the archives
|
||
|
getListArchives(xid, date);
|
||
|
}
|
||
|
|
||
|
// Plugin launcher
|
||
|
function launchArchives() {
|
||
|
// Current date
|
||
|
var current_date = explodeThis('T', getXMPPTime(), 0);
|
||
|
|
||
|
// Datepicker
|
||
|
$('#archives .filter .date').DatePicker({
|
||
|
flat: true,
|
||
|
date: current_date,
|
||
|
current: current_date,
|
||
|
calendars: 1,
|
||
|
starts: 1,
|
||
|
onChange: checkChangeArchives
|
||
|
});
|
||
|
|
||
|
// Click events
|
||
|
$('#archives .bottom .finish').click(function() {
|
||
|
return closeArchives();
|
||
|
});
|
||
|
|
||
|
// Change event
|
||
|
$('#archives .filter .friend').change(updateArchives);
|
||
|
}
|