--- deliantra/Deliantra-Client/DC/Main.pm 2012/11/04 02:13:53 1.22
+++ deliantra/Deliantra-Client/DC/Main.pm 2012/11/17 10:40:09 1.24
@@ -27,6 +27,7 @@
use List::Util qw(max min);
use Deliantra;
+use Deliantra::Util;
use Deliantra::Protocol::Constants;
use AnyEvent::Util ();
@@ -130,6 +131,7 @@
our $BUTTONBAR; # the menu buttons
our $METASERVER;
our $LOGIN_BUTTON;
+our $LOGIN_ERROR;
our $QUIT_DIALOG;
our $HOST_ENTRY;
our $FULLSCREEN_ENABLE;
@@ -255,6 +257,40 @@
$MODBOX->set_markup ("$markup");
}
+sub errorbox {
+ my ($msg) = @_;
+
+ status $msg;
+
+ my $dialog = new DC::UI::Toplevel
+ x => "center",
+ y => "center",
+ z => 200,
+ title => "Error",
+ child => my $vbox = new DC::UI::VBox,
+ has_close_button => 1,
+ on_delete => sub {
+ $_[0]->destroy;
+ },
+ ;
+
+ add $vbox new DC::UI::Label
+ align => 0.5,
+ ellipsise => 0,
+ text => $msg;
+
+ add $vbox new DC::UI::Button
+ expand => 1,
+ text => "OK",
+ on_activate => sub {
+ $dialog->destroy;
+ 0
+ }
+ ;
+
+ $dialog->show;
+}
+
#############################################################################
#TODO: maybe move into own audio module...
@@ -930,17 +966,18 @@
}
sub dc_connect {
- my ($host, $port) = @_;
+ my ($host, $port, $create) = @_;
my $mapw = List::Util::min 48, List::Util::max 11, int 1.5 + $WIDTH * $CFG->{mapsize} * 0.01 / 32;
my $maph = List::Util::min 48, List::Util::max 11, int 1.5 + $HEIGHT * $CFG->{mapsize} * 0.01 / 32;
- $CONN =
+ $CONN =
new DC::Protocol
host => $host,
port => $port,
+ create_login => $create,
user => $PROFILE->{user},
- pass => $PROFILE->{password},
+ pass => (pack "H*", $PROFILE->{password}),
mapw => $mapw,
maph => $maph,
@@ -970,14 +1007,24 @@
status "successfully connected to the server";
} else {
undef $CONN;
- status "unable to connect: $!";
+ $LOGIN_ERROR->{fg} = [1, 0, 0];
+ $LOGIN_ERROR->set_text ("Unable to connect to server: $!");
stop_game();
}
},
+
+ on_addme => sub {
+ my ($ok, $msg) = @_;
+
+ $LOGIN_ERROR->{fg} = $ok ? [0, 1, 0] : [1, 0, 0];
+ $LOGIN_ERROR->set_text ($msg);
+ },
;
}
-sub start_game {
+sub start_game($) {
+ my ($create) = @_;
+
status "logging in...";
my $server = $PROFILE->{host} || $DEFAULT_SERVER;
@@ -1002,10 +1049,10 @@
}
}
- dc_connect $host, $port;
+ dc_connect $host, $port, $create;
};
} else {
- dc_connect $host, $port;
+ dc_connect $host, $port, $create;
}
}
@@ -1848,41 +1895,81 @@
child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]),
);
- $table->add_at (0, 4, new DC::UI::Label align => 1, text => "Username");
- $table->add_at (1, 4, new DC::UI::Entry
+ my $nullpw = "\x00" x 16;
+
+ $table->add_at (0, 0, new DC::UI::Label align => 1, text => "Username");
+ $table->add_at (1, 0, new DC::UI::Entry
text => $PROFILE->{user},
tooltip => "The name of your character on the server. The name is case-sensitive!",
on_changed => sub { my ($self, $value) = @_; $PROFILE->{user} = $value; 1 }
);
- $table->add_at (0, 5, new DC::UI::Label align => 1, text => "Password");
- $table->add_at (1, 5, new DC::UI::Entry
- text => $PROFILE->{password},
+ $table->add_at (0, 1, new DC::UI::Label align => 1, text => "Password");
+ $table->add_at (1, 1, my $pw1 = new DC::UI::Entry
+ text => $PROFILE->{password} ? $nullpw : "",
hidden => 1,
tooltip => "The password for your character.",
- on_changed => sub { my ($self, $value) = @_; $PROFILE->{password} = $value; 1 }
+ on_focus_in => sub {
+ my ($self) = @_;
+ $self->set_text ("")
+ if $self->{text} eq $nullpw;
+ 0
+ },
+ on_changed => sub {
+ my ($self, $value) = @_;
+ $PROFILE->{password} = pack "H*", Deliantra::Util::hash_pw $value
+ if length $value && $value ne $nullpw;
+ 1
+ },
);
- $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button
+ $table->add_at (1, 2, $LOGIN_BUTTON = new DC::UI::Button
expand => 1,
- text => "Login / Register",
- tooltip => "This button will either login to the account configured above or register a new account.",
+ text => "Login to Existing Account",
+ tooltip => "This button will login to the account given by the Username and Password fields above.",
on_activate => sub {
$CONN ? stop_game
- : start_game;
+ : start_game 0;
1
},
);
+ $table->add_at (0, 3, new DC::UI::Label align => 1, text => "Password");
+ $table->add_at (1, 3, my $pw2 = new DC::UI::Entry
+ hidden => 1,
+ tooltip => "The new password for your character",
+ );
+
+ $table->add_at (1, 4, new DC::UI::Button
+ expand => 1,
+ text => "Create New Account",
+ tooltip => "This button will try to create a new account - you need to fill out the Username and the two Password fields above, using the same password for both Password fields.",
+ on_activate => sub {
+ if ($pw1->{text} ne $pw2->{text}) {
+ $LOGIN_ERROR->{fg} = [1, 0, 0];
+ $LOGIN_ERROR->set_text ("The passwords do not match - try to enter them again.");
+ } else {
+ $CONN or start_game 1;
+ }
+ 1
+ },
+ );
+
+ $vbox->add (new DC::UI::FancyFrame
+ label => "Server Message",
+ tooltip => "The last message, or error, form the server.",
+ child => ($LOGIN_ERROR = new DC::UI::Label valign => 0, ellipsise => 0),
+ );
+
$vbox->add (new DC::UI::FancyFrame
label => "How to Play",
- min_h => 240,
+ min_h => 240,#d# should not be necessary - widget bug
child => (new DC::UI::Label valign => 0, ellipsise => 0,
markup =>
"First select a suitable video resolution in the Graphics tab, above.\n\n"
- . "Then register a new account (or use an existing one if you have one). "
- . "To register an account, choose a username that hasn't been taken yet (just guess) and "
- . "try to log-in. Follow the instructions in the Log tab in the message window.",
+ . "Then create a new account (or use an existing one if you have one).\n\n"
+ . "To create an account, choose a username that hasn't been taken yet (just guess) and "
+ . "fill out the top two Password fields using the same password, then press Create New Account.",
),
);
@@ -2995,9 +3082,9 @@
$PROFILE = $CFG->{profile}{$profile};
$PROFILE->{host} ||= "gameserver.deliantra.net";
- $PROFILE->{host} = $args[0] if @args > 0;
- $PROFILE->{user} = $args[1] if @args > 1;
- $PROFILE->{password} = $args[2] if @args > 2;
+ $PROFILE->{host} = $args[0] if @args > 0;
+ $PROFILE->{user} = $args[1] if @args > 1;
+ $PROFILE->{password} = unpack "H*", Deliantra::Util::hash_pw $args[2] if @args > 2;
# convert old bindings (only default profile matters)
if (my $bindings = delete $PROFILE->{bindings}) {