More player-level actions

This commit is contained in:
Jamie Cameron
2012-12-12 16:44:27 -08:00
parent af9f02a274
commit 4515318dbb
6 changed files with 208 additions and 20 deletions

View File

@ -20,7 +20,7 @@ my @white = &list_whitelist_users();
print &ui_form_start("save_users.cgi", "post");
print &ui_hidden('mode', 'white');
print $text{'users_whitedesc'},"<p>\n";
print &ui_textarea('white', join("\n", @white), 10, 80);
print &ui_textarea('white', join("\n", @white), 10, 80),"<br>\n";
my $enabled = &find_value("white-list", $conf);
print &ui_checkbox("enabled", 1, $text{'users_enabled'},
$enabled =~ /true|yes/i);

View File

@ -22,7 +22,7 @@ users_tabop=Operators
users_apply=Save and Apply
users_whitedesc=When enabled, only users listed here will be allowed to connect to this Minecraft server.
users_opdesc=Only users listed here are allowed to run administration commands on this Minecraft server.
users_enable=Whitelist enforcement enabled?
users_enabled=Whitelist enforcement enabled?
conns_title=Connected Players
conns_desc=The following players are currently connected to your server. Click on a player name to perform actions on it.
@ -85,6 +85,21 @@ conn_banb=Ban Player
conn_oplist=Operator state
conn_opb=Grant Operator
conn_deopb=Revoke Operator
conn_ex=X position must be an integer
conn_ey=Y position must be an integer
conn_ez=Z position must be an integer
conn_spawndone=Moved spawn point to $1, $2, $3
conn_tpdone=Teleported player to $1, $2, $3
conn_tppdone=Teleported player to location of $1
conn_bandone=Banned player $1
conn_pardondone=Pardoned player $1
conn_reason=for reason
conn_opdone=Granted operator status
conn_deopdone=Revoked operator status
conn_ebutton=No button clicked!
conn_kick=Disconnect player
conn_kickb=Kick Now
conn_kickdone=Disconnected player
worlds_title=Manage Worlds

View File

@ -48,6 +48,11 @@ foreach my $p (@procs) {
return undef;
}
sub get_minecraft_config_file
{
return $config{'minecraft_dir'}."/server.properties";
}
# get_minecraft_config()
# Parses the config into an array ref of hash refs
sub get_minecraft_config
@ -55,8 +60,7 @@ sub get_minecraft_config
my @rv;
my $fh = "CONFIG";
my $lnum = 0;
&open_readfile($fh, $config{'minecraft_dir'}."/server.properties") ||
return [ ];
&open_readfile($fh, &get_minecraft_config_file()) || return [ ];
while(<$fh>) {
s/\r|\n//g;
s/#.*$//;
@ -71,6 +75,57 @@ close($fh);
return \@rv;
}
# find(name, &config)
# Returns all objects with some name in the config
sub find
{
my ($name, $conf) = @_;
my @rv = grep { lc($_->{'name'}) eq lc($name) } @$conf;
return wantarray ? @rv : $rv[0];
}
# find_value(name, &config)
# Returns the values of all objects with some name in the config
sub find_value
{
my ($name, $conf) = @_;
my @rv = map { $_->{'value'} } &find($name, $conf);
return wantarray ? @rv : $rv[0];
}
# save_directive(name, value, &config)
# Update one directive in the config
sub save_directive
{
my ($name, $value, $conf) = @_;
my $old = &find($name, $conf);
my $lref = &read_file_lines(&get_minecraft_config_file());
if ($old && defined($value)) {
# Update existing line
$lref->[$old->{'line'}] = $name."=".$value;
$old->{'value'} = $value;
}
elsif ($old && !defined($value)) {
# Delete existing line
splice(@$lref, $old->{'line'}, 1);
my $idx = &indexof($old, @$conf);
splice(@$conf, $idx, 1) if ($idx >= 0);
foreach my $c (@$conf) {
if ($c->{'line'} > $old->{'line'}) {
$c->{'line'}--;
}
}
}
elsif (!$old && defined($value)) {
# Add new line
my $n = { 'name' => $name,
'value' => $value,
'line' => scalar(@$lref) };
push(@$lref, $name."=".$value);
push(@$conf, $n);
}
}
# get_start_command()
# Returns a command to start the server
sub get_start_command
@ -299,11 +354,16 @@ foreach my $l (@out) {
return @rv;
}
sub get_whitelist_file
{
return $config{'minecraft_dir'}.'/white-list.txt';
}
# list_whitelist_users()
# Returns a list of usernames on the whitelist
sub list_whitelist_users
{
my $lref = &read_file_lines($config{'minecraft_dir'}.'/white-list.txt', 1);
my $lref = &read_file_lines(&get_whitelist_file(), 1);
return @$lref;
}
@ -312,16 +372,21 @@ return @$lref;
sub save_whitelist_users
{
my ($users) = @_;
my $lref = &read_file_lines($config{'minecraft_dir'}.'/white-list.txt');
my $lref = &read_file_lines(&get_whitelist_file());
@$lref = @$users;
&flush_file_lines($config{'minecraft_dir'}.'/white-list.txt');
&flush_file_lines(&get_whitelist_file());
}
sub get_op_file
{
return $config{'minecraft_dir'}.'/ops.txt';
}
# list_op_users()
# Returns a list of usernames on the operator list
sub list_op_users
{
my $lref = &read_file_lines($config{'minecraft_dir'}.'/ops.txt', 1);
my $lref = &read_file_lines(&get_op_file(), 1);
return @$lref;
}
@ -330,11 +395,9 @@ return @$lref;
sub save_op_users
{
my ($users) = @_;
my $lref = &read_file_lines($config{'minecraft_dir'}.'/ops.txt');
my $lref = &read_file_lines(&get_op_file());
@$lref = @$users;
&flush_file_lines($config{'minecraft_dir'}.'/ops.txt');
&flush_file_lines(&get_op_file());
}
1;

View File

@ -20,6 +20,11 @@ elsif ($in{'kill'}) {
&send_server_command("/kill $in{'name'}");
$msg = $text{'conn_killdone'};
}
elsif ($in{'kick'}) {
# Disconnect this player
&send_server_command("/kick $in{'name'}");
$msg = $text{'conn_kickdone'};
}
elsif ($in{'give'}) {
# Give an item
$in{'id'} =~ /^\d+$/ || &error($text{'conn_eid'});
@ -33,6 +38,62 @@ elsif ($in{'give'}) {
$msg = &text('conn_givedone', $i ? $i->{'name'} : $in{'id'},
$in{'count'});
}
elsif ($in{'spawn'}) {
# Change spawn point
$in{'spawnx'} =~ /^\-?([0-9]+)$/ || &error($text{'conn_ex'});
$in{'spawny'} =~ /^\-?([0-9]+)$/ || &error($text{'conn_ey'});
$in{'spawnz'} =~ /^\-?([0-9]+)$/ || &error($text{'conn_ez'});
my $out = &execute_minecraft_command(
"/spawnpoint $in{'name'} $in{'spawnx'} $in{'spawny'} $in{'spawnz'}");
$out =~ /Set\s+\Q$in{'name'}\E/ ||
&error(&html_escape($out));
$msg = &text('conn_spawndone', $in{'spawnx'}, $in{'spawny'}, $in{'spawnz'});
}
elsif ($in{'tp'}) {
$in{'tpx'} =~ /^\~?\-?([0-9]+)$/ || &error($text{'conn_ex'});
$in{'tpy'} =~ /^\~?\-?([0-9]+)$/ || &error($text{'conn_ey'});
$in{'tpz'} =~ /^\~?\-?([0-9]+)$/ || &error($text{'conn_ez'});
my $out = &execute_minecraft_command(
"/tp $in{'name'} $in{'tpx'} $in{'tpy'} $in{'tpz'}");
$out =~ /Teleported\s+\Q$in{'name'}\E/ ||
&error(&html_escape($out));
$msg = &text('conn_tpdone', $in{'tpx'}, $in{'tpy'}, $in{'tpz'});
}
elsif ($in{'tpp'}) {
my $out = &execute_minecraft_command(
"/tp $in{'name'} $in{'player'}");
$out =~ /Teleported\s+\Q$in{'name'}\E/ ||
&error(&html_escape($out));
$msg = &text('conn_tppdone', $in{'player'});
}
elsif ($in{'ban'}) {
my $out = &execute_minecraft_command(
"/ban $in{'name'} $in{'reason'}");
$out =~ /Banned\s+player\s+\Q$in{'name'}\E/ ||
&error(&html_escape($out));
$msg = &text('conn_bandone');
}
elsif ($in{'pardon'}) {
my $out = &execute_minecraft_command(
"/pardon $in{'name'}");
$out =~ /Unbanned\s+player\s+\Q$in{'name'}\E/ ||
&error(&html_escape($out));
$msg = &text('conn_pardondone');
}
elsif ($in{'op'}) {
my $out = &execute_minecraft_command(
"/op $in{'name'}");
$out =~ /Opped\s+\Q$in{'name'}\E/ ||
&error(&html_escape($out));
$msg = &text('conn_opdone');
}
elsif ($in{'deop'}) {
my $out = &execute_minecraft_command(
"/deop $in{'name'}");
$out =~ /De-opped\s+\Q$in{'name'}\E/ ||
&error(&html_escape($out));
$msg = &text('conn_deopdone');
}
else {
# No button clicked!
&error($text{'conn_ebutton'});

43
minecraft/save_users.cgi Normal file
View File

@ -0,0 +1,43 @@
#!/usr/local/bin/perl
# Update whitelisted or operator users
use strict;
use warnings;
require './minecraft-lib.pl';
our (%in, %text, %config);
&ReadParse();
my $conf = &get_minecraft_config();
&error_setup($text{'users_err'});
if ($in{'mode'} eq 'white') {
# Update whitelist, and maybe apply it
&lock_file(&get_minecraft_config_file());
&lock_file(&get_whitelist_file());
my @users = split(/\r?\n/, $in{'white'});
&save_whitelist_users(\@users);
&save_directive("white-list", $in{'enabled'} ? 'true' : 'false', $conf);
&flush_file_lines();
&unlock_file(&get_whitelist_file());
&unlock_file(&get_minecraft_config_file());
if ($in{'apply'}) {
&send_server_command("/whitelist reload");
&send_server_command("/whitelist ".
($in{'enabled'} ? "on" : "off"));
}
&webmin_log('white');
}
elsif ($in{'mode'} eq 'op') {
# Update operator list
&lock_file(&get_op_file());
my @users = split(/\r?\n/, $in{'op'});
&save_op_users(\@users);
&unlock_file(&get_op_file());
&webmin_log('op');
}
else {
&error($text{'users_emode'});
}
&redirect("");

View File

@ -57,6 +57,10 @@ if ($c || 1) {
print &ui_table_row($text{'conn_kill'},
&ui_submit($text{'conn_killb'}, 'kill'));
# Disconnect player
print &ui_table_row($text{'conn_kick'},
&ui_submit($text{'conn_kickb'}, 'kick'));
# Grant item
print &ui_table_row($text{'conn_give'},
&ui_textbox("id", undef, 5).
@ -70,22 +74,22 @@ if ($c || 1) {
# Change spawn point
print &ui_table_row($text{'conn_spawn'},
"X:".&ui_textbox("spawnx", $x, 20)." ".
"Y:".&ui_textbox("spawny", $y, 20)." ".
"Z:".&ui_textbox("spawnz", $z, 20)." ".
"X:".&ui_textbox("spawnx", int($x), 20)." ".
"Y:".&ui_textbox("spawny", int($y), 20)." ".
"Z:".&ui_textbox("spawnz", int($z), 20)." ".
&ui_submit($text{'conn_spawnb'}, 'spawn'));
# Teleport to location
print &ui_table_row($text{'conn_tp'},
"X:".&ui_textbox("tpx", $x, 20)." ".
"Y:".&ui_textbox("tpy", $y, 20)." ".
"Z:".&ui_textbox("tpz", $z, 20)." ".
"X:".&ui_textbox("tpx", int($x), 20)." ".
"Y:".&ui_textbox("tpy", int($y), 20)." ".
"Z:".&ui_textbox("tpz", int($z), 20)." ".
&ui_submit($text{'conn_tpb'}, 'tp'));
# Teleport to player
if (@conns) {
print &ui_table_row($text{'conn_tpp'},
&ui_select("player", \@conns, undef)." ".
&ui_select("player", undef, \@conns)." ".
&ui_submit($text{'conn_tpb'}, 'tpp'));
}
@ -100,7 +104,9 @@ if ($c || 1) {
else {
print &ui_table_row($text{'conn_banlist'},
$text{'conn_pardoned'}." ".
&ui_submit($text{'conn_banb'}, 'ban'));
&ui_submit($text{'conn_banb'}, 'ban')." ".
$text{'conn_reason'}." ".
&ui_textbox("reason", undef, 30));
}
# Op or de-op player