OverviewFilesCommitsIssuesDocsReleasesPeers

opencog-cogserver / opencog / cogserver / scm / cogserver.scm

87 lines · scm ref:
;
; Opencog cogserver module
; This is a convenience wrapper around the CogServerNode
;

(define-module (opencog cogserver))

(use-modules (opencog))
(use-modules (opencog cs-config))

(load-extension
	(string-append opencog-ext-path-servernode "libservernode")
	"opencog_servernode_init")

(include-from-path "opencog/cogserver/types/cogserver_types.scm")

(define* (start-cogserver #:key (port 17001)
                                (web  18080)
                                (mcp  18888)
                                (prompt    "opencog> ")
                                (scmprompt "guile> "))
"
  start-cogserver
  start-cogserver #:port 17001
  start-cogserver #:web 18080
  start-cogserver #:mcp 18888
  start-cogserver #:prompt \"opencog> \"
  start-cogserver #:prompt \"\\x1b[0;32mopencog\\x1b[1;32m> \\x1b[0m\"
  start-cogserver #:scmprompt \"guile> \"
  start-cogserver #:scmprompt \"\\x1b[0;34mguile\\x1b[1;34m> \\x1b[0m\"

  Start the cogserver, optionally specifying a telnet port, websocket
  port, telnet prompt and telnet scheme prompt (or any combination of
  these). If any are missing, default values will be used. The defaults
  are as shown.

  If any of the ports ares set to zero, then the corresponding server
  will not be started.  At least one must be non-zero.

  The prompts may be ANSI colorized prompts. The ANSI escape sequence
  uses the ESC char, which is written as \\x1b in guile.

  To stop the cogserver, just say stop-cogserver.

  Returns the CogServerNode that was created.
"
	(if (string? port) (set! port (string->number port)))

	(define name (format #f "cogserver://~a:~a:~a" port web mcp))
	(define csn (CogServerNode name))
	(cog-set-value! csn (Predicate "*-telnet-port-*") (FloatValue port))
	(cog-set-value! csn (Predicate "*-web-port-*") (FloatValue web))
	(cog-set-value! csn (Predicate "*-mcp-port-*") (FloatValue mcp))
	(cog-set-value! csn (Predicate "*-ansi-enabled-*") (BoolValue #t))
	(cog-set-value! csn (Predicate "*-ansi-prompt-*") (StringValue prompt))
	(cog-set-value! csn (Predicate "*-ansi-scm-prompt-*") (StringValue scmprompt))
	(cog-set-value! csn (Predicate "*-start-*") (VoidValue))
	csn
)

(define* (stop-cogserver #:optional csn)
"
  stop-cogserver
  stop-cogserver CSN

  Stop the cogserver. If a CogServerNode is provided, stop that specific
  server. If no argument is given, find all running CogServerNodes. If
  there is exactly one, stop it. If there are multiple, throw an error.

  See also: start-cogserver
"
	(if (not csn)
		(let ((servers (cog-get-atoms 'CogServerNode)))
			(cond
				((null? servers)
					(throw 'cogserver-error "No CogServerNode found"))
				((= 1 (length servers))
					(set! csn (car servers)))
				(else
					(throw 'cogserver-error
						"Multiple CogServerNodes found; specify which one to stop")))))
	(cog-set-value! csn (Predicate "*-stop-*") (VoidValue))
)

(export start-cogserver)
(export stop-cogserver)