From 66ce37665f4966a088cfbf02c58e67ab2cd2d715 Mon Sep 17 00:00:00 2001
From: mcmlxxix <>
Date: Wed, 1 Jun 2011 18:20:45 +0000
Subject: [PATCH] Update to use new service. NOTE: It is no longer necessary to
 run commservice.js in services.ini to use the interbbs features of this game.
 See /exec/json-service.js if you wish to host your own server

---
 xtrn/starstocks/game.js      | 191 +++++++++++++----------------------
 xtrn/starstocks/interbbs.doc |  83 +++++++--------
 xtrn/starstocks/server.ini   |   2 -
 xtrn/starstocks/stars.js     |  63 +++++-------
 xtrn/starstocks/sysop.doc    |  13 ++-
 5 files changed, 140 insertions(+), 212 deletions(-)

diff --git a/xtrn/starstocks/game.js b/xtrn/starstocks/game.js
index 51a94978ec..2af9306d34 100644
--- a/xtrn/starstocks/game.js
+++ b/xtrn/starstocks/game.js
@@ -1,42 +1,34 @@
-/*						**********************************
-						   ******  STAR STOCKS (2007)   ******
-					   	    ***  for use with Synchronet v3.14  ***
-						   ***  by Matt Johnson  **************                   
-						**********************************
-
-						SET TAB STOPS TO 4 FOR EDITING
-*/
+/*********************************
+*		STAR STOCKS (2007) 		*
+*		for Synchronet v3.15 		*
+*		by Matt Johnson			*
+*********************************/
 
 load("sbbsdefs.js");
-load("commclient.js");
 load("funclib.js");
 load("graphic.js");
 
-var root_dir=js.exec_dir;
 var oldpass=console.ctrlkey_passthru;
-var stream=argv[0];
-
 console.ctrlkey_passthru="+ACGKLOPQRTUVWXYZ_";
 bbs.sys_status|=SS_MOFF;
+client.subscribe("starstocks.scores");
 
-const 	root=				root_dir;
 const 	cfgname=			"stars.cfg";  
-const	high_score_file=	"scores.dat";
 const 	space=				"\xFA";
 var 	max_companies=		6;
 var 	max_turns=			80;
 const	starting_cash=		10000;
-const  interest_rate=		.05;
-const  ccolor=				"\1w\1h"
-var   partial_company=	"\1n+";
+const  	interest_rate=		.05;
+const  	ccolor=				"\1w\1h"
+var   	partial_company=	"\1n+";
 var 	difficulty=			1;
 var 	min_difficult=		20;
 var 	max_difficult=		35;
-var 	scores=			[];	
-var 	border_row=		4;
-var  	border_column=	1;
-var		menu_row=		1;
-var		menu_column=	63;
+var 	scores=				[];	
+var 	border_row=			4;
+var  	border_column=		1;
+var		menu_row=			1;
+var		menu_column=		63;
 var 	columns=
 		rows=
 		min_stars=
@@ -45,12 +37,16 @@ var 	columns=
 		starcolor=
 		star=
 		scolor="";
+		
 loadSettings();
-loadHighScores();
+loadScores();
+
 var 	min_normal=		min_stars;
 var 	max_normal=		max_stars;
 var 	game;
+
 gameMenu();
+client.unsubscribe("starstocks.scores");
 quit();
 
 //########################## MAIN FUNCTIONS ###################################
@@ -109,81 +105,22 @@ function 	gameMenu()
 		case "Q": 
 			return;
 		}
+		cycle();
 	}
 }
-function 	loadHighScores()
+function 	loadScores()
 { 
-	for(diff=0;diff<3;diff++) scores[diff]=[];
-	var sfile=new File(root + high_score_file);
-	if(!file_exists(sfile.name)) return false;
-	sfile.open('r', true);
-	var count=0;
-	var timeout=200;
-	while(!sfile.is_open && count<timeout)
-	{
-		mswait(5);
-		count++;
-		sfile.open('r', true);
-	}
-	if(sfile.is_open)
-	{
-		for(sc=0;!(sfile.eof);sc++) 
-		{
-			player=sfile.readln();
-			if(player==undefined || player=="") break;
-			score=parseFloat(sfile.readln());
-			diff=parseInt(sfile.readln());
-			date=sfile.readln();
-			scores[diff].push(new Score(player,score,diff,date));
-		}
-		sfile.close();
-		return true;
-	}
-	else
-	{
-		log("\1r\1hUnable to load scores");
-		return false;
-	}
+	scores = client.read("starstocks.scores",1);
 }
-function	storeHighScores(tempscore)
+function	storeScore(score)
 {
-	loadHighScores();
-	scores[tempscore.difficulty].push(tempscore);
-	var sfile=new File(root + high_score_file);
-	
-	var count=0;
-	var timeout=200;
-	while(locked() && count<timeout)
-	{
-		mswait(5);
-		count++;
-	}
-	if(!locked())
-	{
-		lock();
-		sfile.open('w+', false);
-		for(d in scores)
-		{
-			scores[d]=sortScores(scores[d]);
-			for(score in scores[d])
-			{
-				sfile.writeln(scores[d][score].player);
-				sfile.writeln(scores[d][score].score);
-				sfile.writeln(scores[d][score].difficulty);
-				sfile.writeln(scores[d][score].date);
-				if(score==9) break;
-			}
-		}
-		sfile.close();
-		if(stream) sendFiles(high_score_file);
-		unlock();
-		return true;
-	}
-	else 
-	{
-		message("\1r\1hUnable to save scores");
-		return false;
-	}
+	client.lock("starstocks.scores",2);
+	scores=client.read("starstocks.scores");
+	if(!scores[score.difficulty])
+		scores[score.difficulty] = [];
+	scores[score.difficulty].push(score);
+	client.write("starstocks.scores." + score.difficulty,scores[score.difficulty]);
+	client.unlock("starstocks.scores");
 }
 function 	loadSettings()
 { 
@@ -263,14 +200,14 @@ function 	playGame()
 		{
 			pMenu.display();
 			displayHeader(turn);
-			if(!game.options.length && game.inProgress) game.generateCompanies();
+			if(!game.options.length && game.inProgress) 
+				game.generateCompanies();
 			if(game.options.length)
 			{
 				message("\1r\1hChoose a location to start your company.");
 			}
 			var cmd=console.getkey(K_NOCRLF|K_NOSPIN|K_UPPER|K_NOECHO|K_COLD);	
-			if(pMenu.disabled[cmd]);
-			else
+			if(!(pMenu.disabled[cmd]))
 			{
 				switch(cmd)
 				{
@@ -324,8 +261,7 @@ function 	playGame()
 					{
 						console.home();
 						console.cleartoeol();
-						if(console.noyes("End this game?"));
-						else 
+						if(!(console.noyes("End this game?")))
 						{
 							game.clearOptions();
 							clearRows(23);
@@ -337,8 +273,10 @@ function 	playGame()
 						continue_game=false;
 						delete game;
 					}
-					if(continue_game) continue;
-					else break;
+					if(continue_game) 
+						continue;
+					else 
+						break;
 				default:
 					continue;
 				}
@@ -363,30 +301,47 @@ function 	playGame()
 			displayStocks();
 			getMoney();
 			showMeTheMoney();
-			if(turn>max_turns) game.inProgress=false;
+			if(turn>max_turns) 
+				game.inProgress=false;
 		}
+		cycle();
 	}
 	if(countCompanies(game.companies))
 	{
-		var tempscore=new Score(user.alias,game.networth,difficulty,system.datestr());
-		storeHighScores(tempscore);
-		notify();
+		var score=new Score(user.alias,game.networth,difficulty,system.datestr());
+		storeScore(score);
 		game.completed=true;
 		displaySummary();
 	}
 }
-
-//########################## DISPLAY FUNCTIONS #################################
-function 	notify()
+function 	cycle() 
 {
-	if(scores[difficulty].length<2) return false;
-	if(game.networth==scores[difficulty][0].score)
-	{
-		var localuser=system.matchuser(scores[difficulty][1].player,true);
-		if(!localuser>0 || localuser==user.number) return false;
-		system.put_telegram(scores[difficulty][1].player, "\1r\1h" + scores[difficulty][0].player + " \1c\1hbeat your High Score in Star Stocks!\r\n\r\n");
+	client.cycle();
+}
+function 	processUpdates(update) 
+{
+	switch(update.operation) {
+	case "ERROR":
+		throw(update.error_desc);
+		break;
+	case "UPDATE":
+		var p=update.location.split(".");
+		/* if we received something for a different game? */
+		if(p.shift().toUpperCase() != "STARSTOCKS") 
+			return;
+		var obj=scores;
+		p.shift();
+		while(p.length > 1) {
+			var child=p.shift();
+			obj=obj[child];
+		}
+		obj[p.shift()] = update.data;
+		break;
 	}
 }
+client.callback=processUpdates;
+
+//########################## DISPLAY FUNCTIONS #################################
 function	shortNumber(number)
 {
 	var newnum="";
@@ -435,7 +390,7 @@ function 	sortScores(sort)
 }
 function	viewHighScores()
 {
-	loadHighScores();
+	loadScores();
 	var difficulties=["Easy", "Normal", "Difficult"];
 	for(df in scores)
 	{
@@ -627,6 +582,7 @@ function	sortCompanies()
 	sorted.sort();
 	return sorted;
 }
+
 //########################## MISC FUNCTIONS ###################################
 function	locked()
 {
@@ -787,8 +743,7 @@ function	buyStockXpert(cmd)
 }
 function	canBuyStocks()
 {
-	for(cb in game.companies)
-	{
+	for(cb in game.companies) {
 		if(game.cash>=game.companies[cb].stock_value) return true;
 	}
 	return false;
@@ -882,11 +837,10 @@ function 	processNearby(location,prox)
 }
 function 	quit() 
 {
-	if(stream) stream.close();
 	console.ctrlkey_passthru=oldpass;
 	bbs.sys_status&=~SS_MOFF;
 	console.clear();
-	var splash_filename=root_dir + "exit.bin";
+	var splash_filename=root + "exit.bin";
 	if(!file_exists(splash_filename)) exit();
 	
 	var splash_size=file_size(splash_filename);
@@ -900,7 +854,6 @@ function 	quit()
 	console.center("\1n\1c[\1hPress any key to continue\1n\1c]");
 	while(console.inkey(K_NOECHO|K_NOSPIN)==="");
 	console.clear();
-	return;
 }
 //########################## CLASSES #########################################
 
diff --git a/xtrn/starstocks/interbbs.doc b/xtrn/starstocks/interbbs.doc
index ad89604d76..e12bf1824e 100644
--- a/xtrn/starstocks/interbbs.doc
+++ b/xtrn/starstocks/interbbs.doc
@@ -8,12 +8,21 @@ with the latest files from the Synchronet CVS repository at:
 	
 	RECOMMENDED UPDATES:
 	
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/irc_protocol.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/socket_bg.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/layout.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/inputline.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/funclib.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/calendar.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/event-timer.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/timer.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/clock.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/msgwndw.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/scrollbar.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/cvs.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/json-sock.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/json-client.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/chateng.js
 		
 	NOTE:	Replace any outdated local copies with the latest release from the links.
 
@@ -25,62 +34,39 @@ this program in inter-BBS mode, and can be downloaded from the Synchronet CVS re
 
 	http://cvs.synchro.net/cgi-bin/viewcvs.cgi/
 
-		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/commservice.js
-		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/commclient.js
-		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/chateng.js
-		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/ctrl/filesync.ini
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/json-service.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/json-db.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/json-sock.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/ctrl/json-service.ini
 	
 	NOTE: 	Placing these files in their corresponding local equivalent locations
 			will make configuration much easier.
 
-[COMMSERVICE.JS]
-
-	This is a static service that must be included in /ctrl/services.ini in order to 
-	accept connections and relay information to and from the main hub. It is critical
-	for this to be set up properly, for the programs that depend on it will not function
-	properly without it.
-
-	This file must be placed in your relative 'EXEC/' or 'MODS/' path (typically '/SBBS/EXEC/').
-	Once the file is in place, you must add the following to your 'CTRL/SERVICES.INI' file:
-
-		[Commserv]
-		Port=10088
-		Options=STATIC
-		Command=commservice.js bbs.thebrokenbubble.com 10088
-
-	NOTE:	there are two arguments on the command line that tell the service the address and 
-			port of the main hub, which by default is the Broken Bubble BBS, on port 10088. If
-			you wish to act as your own hub (e.g. start your own league), simple remove both
-			arguments from the command line, and direct league nodes to add your URL and port
-			to their SERVICES.INI file. If your system operates on multiple machines and you wish 
-			to share data between local nodes ONLY, setting up this service as a hub makes
-			this possible as well.
-
-	NOTE:	You should also double check to make sure that your services are running
-
-[COMMCLIENT.JS]
-
-	This is the dedicated client that connects to the inter-BBS service. This file handles
-	the transmission of data to and from the service, as well as managing file synchronization
-	for the client (this program). This file is critical for the successful operation of this program 
-	in inter-BBS mode.
-	
-	The file must be placed in your relative 'EXEC/LOAD/' path.
-	There is no further setup required for this to work (unless you changed the default 'Port' setting for the service 
-	in SERVICES.INI). 
-
 [CHATENG.JS]
 
-	This handles all inbound/outbound chat messages, and packages them for delivery via the client and service.
+	This handles all inbound/outbound chat messages, and packages them for delivery via the irc protocol.
 	this also contains the necessary objects to implement a chat room (windowed or fullscreen). 
 	
-	NOTE:	while this particular program may not have chat features, the service itself still may
-			require this file to be present.
+[JSON-DB.JS]
+	
+	This file acts as a JSON object database, which is used by JSON-SERVICE, but can be used 
+	on the client side as well. 
+	
+[JSON-CLIENT.JS]
+
+	This file is the gateway to the program's interbbs server. It contains the methods needed to lock, unlock,
+	read, write and delete objects from the server database.
+	
+[JSON-SERVICE.JS]
+
+	This file acts as an interbbs server. It contains the methods needed to lock, unlock,
+	read, write and delete objects from the server database, and also accepts JSON-CLIENT connections
+	and acts as the main source for all dynamic program data. The file contains instructions for
+	setting up a server.
 	
-[FILESYNC.INI]
+[JSON-SERVICE.INI]
 
-	This file tells FILESYNC.JS and COMMCLIENT.JS where to store/retrieve inbound/outbound transfers
-	coming from the client and the service. 
+	This file tells JSON-SERVICE.JS where a program's files are located.
 	
 	This file is critical for the service to operate properly. If you have installed the programs that 
 	use this service to their default locations, no additional configuration should be required.
@@ -88,9 +74,8 @@ this program in inter-BBS mode, and can be downloaded from the Synchronet CVS re
 [SERVER.INI]
 
 	This file should be located in the program's working directory, as it contains information for 
-	the host, port, and any "auth" the program's server might require. Deleting this file will cause
-	your program to function either as local-only, or as a server itself, depending on your setup
-	within the gaming service.
+	the host and port the program will be connecting to. Deleting this file will cause
+	your program not to function.
 	
 Please report any bugs, issues or questions to: mcmlxxix at bbs dot thebrokenbubble dot com
 
diff --git a/xtrn/starstocks/server.ini b/xtrn/starstocks/server.ini
index df585dabff..7da52a15dd 100644
--- a/xtrn/starstocks/server.ini
+++ b/xtrn/starstocks/server.ini
@@ -1,5 +1,3 @@
-;if you want to offer this game as local-only,
-;or if you want your system to be a league hub, delete this file
 host=bbs.thebrokenbubble.com
 port=10088
 autoupdate=true
\ No newline at end of file
diff --git a/xtrn/starstocks/stars.js b/xtrn/starstocks/stars.js
index cd05e20a34..51344d7b01 100644
--- a/xtrn/starstocks/stars.js
+++ b/xtrn/starstocks/stars.js
@@ -1,46 +1,29 @@
-/*
-	BUBBLE BOGGLE 
-	for Synchronet v3.15+ (javascript)
-	by Matt Johnson (2009)
-	
-	Game uses standard "Big Boggle" rules, scoring, and dice
-	Dictionary files created from ENABLe gaming dictionary
-	
-	for customization or installation help contact:
-	Matt Johnson ( MCMLXXIX@BBS.THEBROKENBUBBLE.COM )
-*/
-load("commclient.js");
+/*********************************
+*		STAR STOCKS (2007) 		*
+*		for Synchronet v3.15 		*
+*		by Matt Johnson			*
+*********************************/
 
+load("json-client.js");
 var root = js.exec_dir;
-var stream = false;
 
-var server_file=new File(root + "server.ini");
-if(file_exists(server_file.name)) {
-	stream=new ServiceConnection("starstocks");
+if(!file_exists(root + "server.ini")) {
+	throw("server initialization file missing");
+}
+
+var server_file = new File(root + "server.ini");
+server_file.open('r',true);
+//var autoUpdate=server_file.iniGetValue(null,"autoUpdate");
+var serverAddr=server_file.iniGetValue(null,"serverAddr");
+var serverPort=server_file.iniGetValue(null,"serverPort");
+server_file.close();
 
-	server_file.open('r',true);
-	var update=server_file.iniGetValue("autoupdate");
-	server_file.close();
-	
-	if(update != true) {
-		if((user.compare_ars("SYSOP") || (bbs.sys_status&SS_TMPSYSOP)) 
-			&& console.yesno("Check for game updates?")) 
-			update=true;
-	}
-	
-	if(update) {
-		console.putmsg("\r\n\1nChecking for updates...");
-		stream.recvfile("*.bin");
-		stream.recvfile("*.js");
-		stream.recvfile("starstocks.ans");
-		stream.recvfile("interbbs.doc");
-		stream.recvfile("stars.doc");
-		stream.recvfile("sysop.doc",true);
-	}
-	
-	console.putmsg("\r\n\1nSynchronizing data files...");
-	stream.recvfile("stars.cfg");
-	stream.recvfile("scores.dat",true);
+var client=new JSONClient(serverAddr,serverPort);
+
+/*
+if(autoUpdate) {
+	console.putmsg("\r\n\1nChecking for updates...");
 }
+*/
 
-load(root + "game.js",stream);
\ No newline at end of file
+load(root + "game.js");
\ No newline at end of file
diff --git a/xtrn/starstocks/sysop.doc b/xtrn/starstocks/sysop.doc
index dc81285f20..f0a7b8419a 100644
--- a/xtrn/starstocks/sysop.doc
+++ b/xtrn/starstocks/sysop.doc
@@ -43,19 +43,28 @@ NOTE:	This program REQUIRES the associated service to be configured in order
 	
 *****UPDATING YOUR LOCAL LIBRARIES******
 
-Before you attempt to install the inter-BBS service, it is recommended that you
-update your relative 'EXEC/' and 'EXEC/LOAD/' paths 
+It is recommended that you update your relative 'EXEC/' and 'EXEC/LOAD/' paths 
 with the latest files from the Synchronet CVS repository at:
 	
 	http://cvs.synchro.net/cgi-bin/viewcvs.cgi/
 	
 	RECOMMENDED UPDATES:
 	
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/irc_protocol.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/socket_bg.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/layout.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/inputline.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/funclib.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/calendar.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/event-timer.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/timer.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/clock.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/msgwndw.js
 		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/scrollbar.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/cvs.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/json-sock.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/json-client.js
+		http://cvs.synchro.net/cgi-bin/viewcvs.cgi/*checkout*/exec/load/chateng.js
 		
 	NOTE:	Replace any outdated local copies with the latest releases from these links.
 
-- 
GitLab