Skip to content
Snippets Groups Projects
Commit b0f8932a authored by echicken's avatar echicken :chicken:
Browse files

New client-side avatar fetching/caching thing. Formatting changes.

parent 3a610e7a
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
...@@ -14,9 +14,8 @@ function Avatars() { ...@@ -14,9 +14,8 @@ function Avatars() {
} else { } else {
cache.local[usernumber] = data.data; cache.local[usernumber] = data.data;
} }
} else {
return cache.local[usernumber];
} }
return cache.local[usernumber];
} }
this.get_netuser = function (username, netaddr) { this.get_netuser = function (username, netaddr) {
...@@ -30,9 +29,8 @@ function Avatars() { ...@@ -30,9 +29,8 @@ function Avatars() {
} else { } else {
cache.network[netaddr][username] = data.data; cache.network[netaddr][username] = data.data;
} }
} else {
return cache.network[netaddr][username];
} }
return cache.network[netaddr][username];
} }
} }
...@@ -5,12 +5,32 @@ var settings = load('modopts.js', 'web') || { web_directory: '../webv4' }; ...@@ -5,12 +5,32 @@ var settings = load('modopts.js', 'web') || { web_directory: '../webv4' };
load(settings.web_directory + '/lib/init.js'); load(settings.web_directory + '/lib/init.js');
load(settings.web_lib + 'auth.js'); load(settings.web_lib + 'auth.js');
var handled = false;
var reply = {}; var reply = {};
if ((http_request.method === 'GET' || http_request.method === 'POST') && if ((http_request.method === 'GET' || http_request.method === 'POST') && http_request.query.call !== undefined) {
typeof http_request.query.call !== 'undefined' &&
user.number > 0 switch (http_request.query.call[0]) {
) { case 'get-avatar':
var avatar_lib = load({}, 'avatar_lib.js');
reply = http_request.query.user.map(function (e) {
const u = e.split('@');
var ret;
if (u.length === 1) {
ret = avatar_lib.read_localuser(u[0]) || {};
} else {
ret = avatar_lib.read_netuser(u[0], u[1]) || {};
}
ret.user = e;
return ret;
});
handled = true;
break;
default:
break;
}
if (!handled && user.number > 0) {
switch (http_request.query.call[0]) { switch (http_request.query.call[0]) {
...@@ -91,6 +111,8 @@ if ((http_request.method === 'GET' || http_request.method === 'POST') && ...@@ -91,6 +111,8 @@ if ((http_request.method === 'GET' || http_request.method === 'POST') &&
} }
}
reply = JSON.stringify(reply); reply = JSON.stringify(reply);
http_reply.header['Content-Type'] = 'application/json'; http_reply.header['Content-Type'] = 'application/json';
http_reply.header['Content-Length'] = reply.length; http_reply.header['Content-Length'] = reply.length;
......
...@@ -37,3 +37,49 @@ function Avatarizer() { ...@@ -37,3 +37,49 @@ function Avatarizer() {
} }
} }
const Avatars = new (function () {
const gc = new GraphicsConverter('./images/cp437-ibm-vga8.png', 8, 16, 64, 4);
function draw(data) {
const img = new Image();
img.addEventListener('load', () => document.querySelectorAll(`div[data-avatar="${data.user}"]:empty`).forEach(e => e.appendChild(img.cloneNode(true))));
img.src = data.dataURL || 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABgCAYAAACKa/UAAAABiUlEQVR4Xu3c0YqCUBiFUXtKX1Gfcga6TPBgn6LDrG5zSy3377EQX8uy/ExeXwu8AH5t9w4CbH4Aox9AgFUg5p0Dnw44z3P8iC2+rmvbwSB9eQMBxuMHEOCugBGOBQEIcF/AKhwbAvC/Ad592TLyPruRpy8iAEeHcPA+QICHBIzwIa7txgABHhOwCh/z2mwNEGAUiHENBBgFYlwDAUaBGNdAgFEgxjUQYBSIcQ0EGAViXAMBRoEY10CAUSDGNRBgFIhxDQQYBWJcAwFGgRjXQIBRIMYf38DP73f33Vpng31+v9PvjQEYRwQgwEMCRvgQ13ZjgAD3BR6/Ct99mRILNFXgPMIA44N3AAJMZwEjHJ+pABBgmkCrcOObAD4e8K9fplwNPFxEAO4/+QjgoKKjn3oAAdazXPs3RwM1UAOvFYh7t4gAjAIxroEAo0CMayDAKBDjGggwCsS4BgKMAjGugQCjQIxrIMAoEOMaCDAKxLgGAowCMa6BAKNAjGsgwCgQ4xoIMArE+KiBv6PnKB+V8OyaAAAAAElFTkSuQmCC';
}
function cacheAvatar(data) {
if (data.data) {
gc.from_bin(atob(data.data), 10, 6, dataURL => {
data.dataURL = dataURL;
localStorage.setItem(`avatar-${data.user}`, JSON.stringify(data));
draw(data);
}, true);
} else {
data.data = null;
localStorage.setItem(`avatar-${data.user}`, JSON.stringify(data));
draw(data);
}
}
function fromCache(user) {
return JSON.parse(localStorage.getItem(`avatar-${user}`));
// should return null if local copy is aged; as it is, avatars will remain in local storage until user clears it
}
async function fetchAvatar(user) {
const u = [].concat(user);
const data = await v4_get(`./api/system.ssjs?call=get-avatar&user=${u.join('&user=')}`);
[].concat(data).forEach(cacheAvatar);
}
this.draw = async function (user) {
const u = [].concat(user).filter(e => {
const a = fromCache(e);
if (a === null) return true; // Not cached
if (a) draw(a);
});
if (u.length) fetchAvatar(u);
}
})();
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment