Skip to content
Snippets Groups Projects
avatar_lib.js 4.46 KiB
// $Id$

// Library for dealing with user Avatars (ex-ASCII/ANSI block art)

const defs = {
	width: 10,
	height: 6,
};

const size = defs.width * defs.height * 2;	// 2 bytes per cell for char and attributes

function local_library()
{
	return format("%savatars/", system.text_dir);
}

function localuser_fname(usernum)
{
	return format("%suser/%04u.ini", system.data_dir, usernum);
}

function netuser_fname(netaddr)
{
	return format("%sqnet/%s.avatars.ini", system.data_dir, file_getname(netaddr));
}

function is_valid(buf)
{
	load("cga_defs.js");
	if(!buf || !buf.length || buf.length != this.size)
		return false;
	var invalid = buf.split('').filter(function (e,i) { 
		if((i&1) == 0) { // char
			switch(e) {
				case '\r':
				case '\n':
				case '\x07':	// Beep/BEL ('\a')
				case '\b':
				case '\t':
				case '\f':
				case '\x1b':	// ESC ('\e')
				case '\xff':	// Telnet IAC
					return true;
			}
			return false;
		}
		// attr
		return (ascii(e)&BLINK);
		});
	return invalid.length == 0;
}

function write_localuser(usernum, obj)
{
	var file = new File(this.localuser_fname(usernum));
	if(!file.open(file.exists ? 'r+':'w+')) {
		return false;
	}
	var result = file.iniSetObject("avatar", obj);
	file.close();
	return result;
}

function enable_localuser(usernum, enabled)
{
	var file = new File(this.localuser_fname(usernum));
	if(!file.open(file.exists ? 'r+':'w+')) {
		return false;
	}
	var result;
	if(!file.iniGetObject("avatar"))
		result = false;
	else
		result = file.iniSetValue("avatar", "disabled", !enabled);
	file.close();
	return result;
}

function remove_localuser(usernum)
{
	var file = new File(this.localuser_fname(usernum));
	if(!file.open(file.exists ? 'r+':'w+')) {
		return false;
	}
	var result = file.iniRemoveSection("avatar");
	file.close();
	return result;
}

function write_netuser(username, netaddr, obj)
{
	var file = new File(this.netuser_fname(netaddr));
	if(!file.open(file.exists ? 'r+':'w+')) {
		return false;
	}
	var result = file.iniSetObject(username, obj);
	file.close();
	return result;
}

function read_localuser(usernum)
{
	var file = new File(this.localuser_fname(usernum));
	if(!file.open("r")) {
		return false;
	}
	var obj = file.iniGetObject("avatar");
	file.close();
	return obj;
}

function read_netuser(username, netaddr)
{
	var file = new File(this.netuser_fname(netaddr));
	if(!file.open("r")) {
		return false;
	}
	var obj = file.iniGetObject(username);
	file.close();
	return obj;
}

function read(usernum, username, netaddr)
{
	if(parseInt(usernum) >= 1)
		return read_localuser(usernum);
	else
		return read_netuser(username, netaddr);
}

function update_localuser(usernum, data)
{
	var obj = read_localuser(usernum);
	if(!obj)
		obj = { created: new Date() };
	obj.data = data;
	obj.updated = new Date();
	return write_localuser(usernum, obj);
}
function import_file(usernum, filename, offset)
{
	load('graphic.js');
	var graphic = new Graphic(this.defs.width, this.defs.height);
	if(!graphic.load(filename, offset))
		return false;
	if(!is_valid(graphic.BIN))
		return false;
	return update_localuser(usernum, base64_encode(graphic.BIN));
}

function enabled(obj)
{
	return typeof obj == 'object' 
		&& typeof obj.data == 'string'
		&& obj.data.length
		&& !obj.disabled;
}

// Uses Graphic.draw() at an absolute screen coordinate
function draw(usernum, username, netaddr, above, right)
{
	var avatar = this.read(usernum, username, netaddr);
	if(!enabled(avatar))
		return false;
	load('graphic.js');
	var graphic = new Graphic(this.defs.width, this.defs.height);
	try {
		graphic.BIN = base64_decode([avatar.data]);
		var lncntr = console.line_counter;
		var pos = console.getxy();
		var x = pos.x;
		var y = pos.y;
		if(above)
			y -= this.defs.height;
		if(right)
			x = console.screen_columns - (this.defs.width + 1);
		graphic.attr_mask = ~graphic.defs.BLINK;	// Disable blink attribute (consider iCE colors?)
		graphic.draw(x, y, this.defs.width, this.defs.height);
		console.gotoxy(pos);
		console.line_counter = lncntr;
	} catch(e) {
		return false;
	};
	return true;
}

// Uses console.write() where-ever the cursor happens to be
function show(usernum, username, netaddr)
{
	var avatar = this.read(usernum, username, netaddr);
	if(!enabled(avatar))
		return false;
	load('graphic.js');
	var graphic = new Graphic(this.defs.width, this.defs.height);
	graphic.attr_mask = ~graphic.defs.BLINK;	// Disable blink attribute (consider iCE colors?)
	try {
		graphic.BIN = base64_decode([avatar.data]);
		console.print(graphic.ANSI);
	} catch(e) {
		return false;
	};
	return true;
}


this;