mirror of
https://github.com/webmin/webmin.git
synced 2025-07-21 23:40:34 +00:00
More player-level actions
This commit is contained in:
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
43
minecraft/save_users.cgi
Normal 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("");
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user