Skip to content
Snippets Groups Projects
forum.ssjs 6.97 KiB
// Forum functions for ecWeb v3
// echicken -at- bbs.electronicchicken.com

load('msgutils.js'); // Supplies getMessageThreads(sub)

function getSig() {
	var sigFile = format("%04s", user.number.toString()) + ".sig";
	if(file_exists(system.data_dir + "user/" + sigFile)) {
		var f = new File(system.data_dir + "user/" + sigFile);
		f.open("r");
		var sig = f.read();
		f.close();
	}
	if(sig !== undefined)
		return sig;
	else
		return false;
}

function linkify(body) {
	// Magical URL-ify
	urlRE=/(?:https?|ftp|telnet|ssh|gopher|rlogin|news):\/\/[^\s'"'<>()]*|[-\w.+]+@(?:[-\w]+\.)+[\w]{2,6}/gi;
	body=body.replace(urlRE, 
		function (str) {
			var ret=''
			var p=0;
			var link=str.replace(/\.*$/, '');
			var linktext=link;
			if(link.indexOf('://')==-1)
				link='mailto:'+link;
			return('<a href="'+link+'">'+linktext+'</a>'+str.substr(linktext.length));
		}
	);
	return(body);
}

function printBoards() {
	out = "";
	for(var g = 0; g < msg_area.grp_list.length; g++) {
		out += "<div class='border box msg'>";
		out += format(
			"<a class='ulLink' onclick='toggleVisibility(\"group-%s\")'>%s</a><br />",
			msg_area.grp_list[g].name, msg_area.grp_list[g].name
			);
		out += msg_area.grp_list[g].sub_list.length + " sub-boards";
		out += "</div>";
		out += "<div id='group-" + msg_area.grp_list[g].name + "' style='display:none;'>";
		for(var s = 0; s < msg_area.grp_list[g].sub_list.length; s++) {
			out += "<div class='border msg indentBox1'>";
			out += format(
				"<a class='ulLink' onclick='loadThreads(\"http://%s:%s/%s/forum-async.ssjs\", \"%s\")'>%s</a><br />",
				webIni.HostName, webIni.HTTPPort, webIni.appendURL, msg_area.grp_list[g].sub_list[s].code, msg_area.grp_list[g].sub_list[s].name
			);
			var msgBase = new MsgBase(msg_area.grp_list[g].sub_list[s].code);
			msgBase.open();
			out += msgBase.total_msgs + " messages.<br />";
			var h = msgBase.get_msg_header(msgBase.last_msg);
			msgBase.close();
			if(h !== null)
				out += format("Latest: %s, by %s on %s", h.subject, h.from, system.timestr(h.when_written_time));
			if(user.alias != webIni.WebGuest && user.compare_ars(msgBase.cfg.post_ars)) {
				out += format(
					"<br /><a class='ulLink' onclick='addPost(\"http://%s:%s/%s/forum-async.ssjs\", \"%s\", \"%s\", \"%s\", \"%s\")'>Post a new message</a>",
					webIni.HostName, webIni.HTTPPort, webIni.appendURL, msg_area.grp_list[g].sub_list[s].code, user.alias, user.name
				);
				out += format("<div id='sub-%s-newMsgBox'></div>", msg_area.grp_list[g].sub_list[s].code);
			}
			out += "</div>";
			out += format(
				"<div id='sub-%s-info' class='border msg indentBox2' style='display:none;'></div>",
				msg_area.grp_list[g].sub_list[s].code
			);
			out += format("<div id='sub-%s' style='display:none;'></div>", msg_area.grp_list[g].sub_list[s].code);
		}
		out += "</div>";
	}
	print(out);
	return;
}

function printThreads(sub) {
	var msgBase = new MsgBase(sub);
	if(!msgBase.open())
		return false;
	msgBase.close();
	var threads = getMessageThreads(sub);
	var out = "";	
	for(var t in threads.order) {
		var header = threads.thread[threads.order[t]].messages[0];
		out += format("<a name='thread-%s'></a>", header.number);
		out += "<div class='border indentBox2 msg'>";
		out += format(
			"<a class='ulLink' onclick='loadThread(\"http://%s:%s/%s/forum-async.ssjs\", \"%s\", \"%s\")'>%s</a><br />",
			webIni.HostName, webIni.HTTPPort, webIni.appendURL, sub, threads.order[t], header.subject
			);
		out += format("Started by %s on %s<br />", header.from, system.timestr(header.when_written_time));
		if(threads.thread[threads.order[t]].messages.length > 1) {
			out += "Latest reply from ";
			out += threads.thread[threads.order[t]].messages[threads.thread[threads.order[t]].messages.length - 1].from;
			out += " on ";
			out += system.timestr(threads.thread[threads.order[t]].messages[threads.thread[threads.order[t]].messages.length - 1].when_written_time);
		}
		out += "</div>";
		out += format("<div id='sub-%s-thread-%s' style='display:none;'></div>", sub, threads.order[t]);
		out += format("<div id='sub-%s-thread-%s-info' class='border msg indentBox2' style='display:none;'></div>", sub, threads.order[t]);
	}
	print(out);
}

function printThread(sub, t) {
	var msgBase = new MsgBase(sub);
	if(!msgBase.open())
		return false;
	var threads = getMessageThreads(sub);
	var out = "";
	for(var m in threads.thread[t].messages) {
		var header = threads.thread[t].messages[m];
		var body = msgBase.get_msg_body(header.number, strip_ctrl_a=true);
		if(body === null)
			continue;
		out += format("<a name='%s-%s'></a>", sub, header.number);
		out += format("<div class='border indentBox3 msg' id='sub-%s-thread-%s-%s'>", sub, t, header.number);
		out += format(
			"From <b>%s</b> to <b>%s</b> on <b>%s</b><br /><br />",
			header.from, header.to, system.timestr(header.when_written_time)
		);
		out += linkify(strip_exascii(body).replace(/\r\n/g, "<br />").replace(/\n/g, "<br />"));
		out += "<br /><br />";
		out += format(
			"<a href='./index.xjs?page=002-forum.ssjs&board=%s&sub=%s&thread=%s#thread-%s'>Thread URL</a> - ",
			msgBase.cfg.grp_name, sub, t, t
		);
		out += format(
			"<a href='./index.xjs?page=002-forum.ssjs&board=%s&sub=%s&thread=%s&message=%s#%s-%s'>Message URL</a> - ",
			msgBase.cfg.grp_name, sub, t, header.number, sub, header.number
		);
		out += format("<a class=ulLink onclick='toggleVisibility(\"sub-%s-thread-%s\")'>Collapse Thread</a>", sub, t);
		if(user.alias != webIni.WebGuest && user.compare_ars(msgBase.cfg.post_ars))
			out += format(
				" - <a class='ulLink' onclick='addReply(\"http://%s:%s/%s/forum-async.ssjs\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\")'>Reply</a>",
				webIni.HostName, webIni.HTTPPort, webIni.appendURL, sub, t, header.number, header.from, user.alias, header.subject
		);
		out += "</div>";
	}
	print(out);
	msgBase.close();
}

function printMessage(sub, number) {
	var msgBase = new MsgBase(sub);
	if(!msgBase.open())
		return false;
	if(!user.compare_ars(msgBase.cfg.read_ars) || !user.compare_ars(msgBase.cfg.post_ars))
		return false;
	var ret = { "header" : msgBase.get_msg_header(number) };
	if(ret.header === null)
		return false;
	ret.body = strip_exascii(msgBase.get_msg_body(number));
	msgBase.close();
	ret.user = { 
		"alias" : user.alias,
		"name" : user.name
	};
	var sig = getSig();
	if(sig)
		ret.sig = sig;
	print(JSON.stringify(ret));
}

function postMessage(sub, irt, to, from, subject, body) {
	for(var a = 0; a < arguments.length; a++) {
		if(a == "irt")
			continue;
		if(arguments[a] === undefined || arguments[a] === null || arguments[a] == "")
			return false;
	}
	if(user.alias != from && user.name != from)
		return false
	var msgBase = new MsgBase(sub);
	if(!msgBase.open())
		return false;
	if(!user.compare_ars(msgBase.cfg.post_ars))
		return false;
	var header = {
		"to" : to,
		"from" : from,
		"from_ext" : user.number,
		"replyto" : from,
		"replyto_ext" : user.number,
		"subject" : subject
	}
	if(irt !== undefined && parseInt(irt) > 0)
		header.thread_back = irt;
	msgBase.save_msg(header, body);
	msgBase.close();
	print("Your message has been posted.");
	return true;
}