From 54f0c6a6577c5e3f86eeca55970374aca1f32728 Mon Sep 17 00:00:00 2001
From: mcmlxxix <>
Date: Tue, 26 Jul 2011 19:18:12 +0000
Subject: [PATCH] simple fullscreen interbbs/internode chat client previous
 commit is actually just the API (oops)

---
 exec/fschat.js | 183 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 183 insertions(+)
 create mode 100644 exec/fschat.js

diff --git a/exec/fschat.js b/exec/fschat.js
new file mode 100644
index 0000000000..9affb9a89f
--- /dev/null
+++ b/exec/fschat.js
@@ -0,0 +1,183 @@
+/**
+ *	Internode/InterBBS Full Screen Chat 
+ *		for Synchronet 3.15a+
+ *		by Matt Johnson - 2011
+ *	
+ *	for local setup, see
+ *		exec/load/json-service.js
+ 
+ *	to use a different chat server, see "jsonchat" in 
+ *		ctrl/modopts.ini
+ */
+
+(function() {
+
+	const VERSION = "$Revision$".split(' ')[1];
+	load("sbbsdefs.js");
+	bbs.command_str='';
+	load("str_cmds.js");
+
+	var chat_options = load("modopts.js","jsonchat");
+	/* I dont like how this is done... seems like it should be more "automatic" */
+	load("json-client.js");
+	var chat_client = new JSONClient(chat_options.host,chat_options.port);
+	load("json-chat.js");
+	var chat = new JSONChat(chat_client);
+
+	var channels = [];
+	var channels_map = [];
+	var channel_index = 0;
+	//var today = new Date();
+	//var laststamp;
+
+	var chat_settings = {
+		ALERT_COLOR:RED,
+		NOTICE_COLOR:BROWN,
+		CHANNEL_COLOR:DARKGRAY,
+		TEXT_COLOR:LIGHTGRAY,
+		NICK_COLOR:CYAN,
+		INPUT_COLOR:GREEN,
+		COMMAND_COLOR:YELLOW,
+		TIMESTAMP_COLOR:WHITE
+	}
+
+	function initChat() {
+		console.attributes = BG_BLACK + LIGHTGRAY;
+		console.clear();
+		console.putmsg(format("\1y\1hSynchronet Chat (v%s)\r\n",VERSION));
+		console.putmsg("\1n\1yType '\1h/help\1n\1y' for a list of commands\r\n");
+		chat.join("#main");
+	}
+
+	function chatMain() {
+		while(1) {
+			/* force client to check for updates */
+			chat.cycle();
+			
+			/* check for channel messages and update local channel cache */
+			for(var c in chat.channels) {
+				var chan = chat.channels[c];
+				
+				/* verify this channels presence in the local cache */
+				verifyLocalCache(chan);
+			
+				/* display any new messages */
+				while(chan.messages.length > 0) 
+					printMessage(chan,chan.messages.shift());
+			}
+			
+			/* synchronize local cache with chat client */
+			updateLocalCache();
+			
+			/* receive and process user input */
+			getInput();
+		}
+	}
+	
+	function verifyLocalCache(chan) {
+		if(channels_map[chan.name] == undefined) {
+		
+			console.attributes = chat_settings.NOTICE_COLOR;
+			console.writeln("joining channel: " + chan.name);
+			
+			channels_map[chan.name] = channels.length;
+			channel_index = channels.length;
+			channels.push(chan.name);
+		}
+	}
+	
+	function updateLocalCache() {
+		/* verify local channel cache */
+		for(var c in channels_map) {
+			if(!chat.channels[c.toUpperCase()]) {
+			
+				console.attributes = chat_settings.NOTICE_COLOR;
+				console.writeln("parting channel: " + c);
+				
+				channels.splice(channels_map[c],1);
+				delete channels_map[c];
+				if(!channels[channel_index])
+					channel_index = channels.length-1;
+			}	
+		}
+	}
+	
+	function printMessage(chan,msg) {
+		// this is broken.... not sure why
+		// var stamp = strftime("%x",msg.time);
+		// if(stamp != laststamp) {
+			// laststamp = stamp;
+			// console.attributes = chat_settings.TIMESTAMP_COLOR;
+			// console.write(stamp + " ");
+		// }
+		
+		console.attributes = chat_settings.CHANNEL_COLOR;
+		console.write("[" + chan.name + "] ");
+		
+		console.attributes = chat_settings.NICK_COLOR;
+		console.write(msg.nick.name);
+		
+		console.attributes = chat_settings.TEXT_COLOR;
+		console.writeln(": " + msg.str);
+	}
+
+	function getInput() {
+		/* get user input */
+		var k = console.inkey(K_NONE,25);
+		if(k) {
+			switch(k) {
+			/* quit chat */
+			case '\x1b':
+			case ctrl('Q'):
+				exit();
+				break;
+			/* do nothing for CRLF on a blank line */
+			case '\r':
+			case '\n':
+				break;
+			/* switch to the next channel in our channel list */
+			case '\t':
+				if(channels.length > 1) {
+					channel_index++;
+					if(channel_index >= channels.length)
+						channel_index = 0;
+					console.attributes = chat_settings.NOTICE_COLOR;
+					console.writeln("now chatting in: " + channels[channel_index]);
+				}
+				break;
+			/* process a user command */
+			case '/':
+				console.attributes = chat_settings.COMMAND_COLOR;
+				console.write(k);
+				chat.handle_command(channels[channel_index],console.getstr(500));
+				break;
+			/* process a sysop command */
+			case ';':
+				if(user.compare_ars("SYSOP") || bbs.sys_status&SS_TMPSYSOP) {
+					console.attributes = chat_settings.COMMAND_COLOR;
+					console.write(k);
+					str_cmds(console.getstr(500));
+				}
+				break;
+			/* process all other input */
+			default:
+				/* send a message to the current channel */
+				if(channels.length > 0) {
+					console.attributes = chat_settings.INPUT_COLOR;
+					console.ungetstr(k);
+					chat.submit(channels[channel_index],console.getstr(500));
+				}
+				/* if we have not joined any channels, we cant send any messages */
+				else {
+					console.attributes = chat_settings.ALERT_COLOR;
+					console.writeln("you must join a channel first");
+				}
+				break;
+			}
+		}
+	}
+	
+	initChat();
+	chatMain();
+	
+})();
-- 
GitLab