Generic connection object
This object determines behavior for connections.
Server methods:
connect() Indicates onnection
disconnect() Indicates disconnection
parse(s) Indicates text line from user
Private methods:
echo_welcome() Echo welcome screen to user
Commands:
connect_cmd() Connect to an existing user
create_cmd() Create a new user
quit_cmd() Quit and log out
parent commands
object connection
var connection user 0
var connection addr 0
var connection port 0
method init
arg ancestors;
(> pass(ancestors) <);
if (definer() in ancestors) {
user = 0;
addr = 0;
port = 0;
}
.
method uninit
arg ancestors;
if (!caller().is_agent('hierarchy))
throw(~perm, "Caller is not an agent of hierarchy protocol.");
catch any {
if (definer() in ancestors) {
if (user)
user.connection_gone();
user = 0;
}
}
pass(ancestors);
.
eval
.initialize();
.set_name("Generic connection object");
.add_command("conn?ect *", 'template, 'connect_cmd);
.add_command("create *", 'template, 'create_cmd);
.add_command("@quit", 'template, 'quit_cmd);
.
method tell
arg s;
if (sender() != user)
throw(~perm, "Sender not the player.");
echo(s);
.
method connect
arg addr_arg, port_arg;
if (sender() != 0)
throw(~perm, "Sender not the server.");
addr = addr_arg;
port = port_arg;
.echo_welcome();
$sys.connection_starting();
.
method disconnect
if (sender() != 0)
throw(~perm, "Sender not the server.");
if (user)
user.connection_gone(addr, port);
.destroy();
.
method parse
arg str;
var cmd;
if (sender() != 0)
throw(~perm, "Sender not the server.");
// If we're logged in, forward the line to the player.
if (user) {
if (user.parse(str) == 'disconnect)
disconnect();
return;
}
// Display tracebacks, even though user may be clueless.
catch any {
cmd = .match_command(str);
if (cmd)
.(cmd[1])(@cmd[2]);
else
.echo_welcome();
} with handler {
for str in (traceback())
echo(str);
}
.
method echo_welcome
if (sender() != this() || caller() != definer())
throw(~perm, "Invalid access to private method.");
if (!(| echo_file("welcome") |))
echo("<The file 'welcome' is missing.>");
.
method connect_cmd
arg dummy, words;
var words, u, password, salt;
if (sender() != this())
throw(~perm, "Sender is not this.");
// Get user name and password.
words = explode(words);
if (listlen(words) != 2) {
echo("Usage: connect <name> <password>");
return;
}
// Look for a user with the given name.
catch ~usernf {
u = $sys.find_user(words[1]);
} with handler {
echo("The user \"" + words[1] + "\" does not exist.");
return;
}
// Check if the password is correct.
if (!u.check_password(words[2])) {
echo("That is the wrong password for " + words[1] + ".");
return;
}
// Forward remaining lines to the user.
user = u;
user.connection_logged_in(addr, port);
.
method create_cmd
arg dummy, words;
var words;
if (sender() != this())
throw(~perm, "Sender is not this.");
// Get user name and password.
words = explode(words);
if (listlen(words) != 2) {
echo("Usage: create <name> <password>");
return;
}
// Look for an existing user with the given name.
catch ~usernf {
$sys.find_user(words[1]);
echo("The user \"" + words[1] + "\" already exists.");
return;
}
// Create a new user and log it in.
user = $sys.create_user(words[1], words[2]);
user.connection_logged_in(addr, port);
.
method quit_cmd
arg dummy;
if (sender() != this())
throw(~perm, "Sender is not this.");
disconnect();
.