mirror of
https://gitlab.com/xonotic/xonotic
synced 2025-01-20 21:20:55 +00:00
108 lines
3.2 KiB
Perl
108 lines
3.2 KiB
Perl
# Xonotic rcon2irc plugin by Merlijn Hofstra licensed under GPL - votestop.pl
|
|
# Place this file inside the same directory as rcon2irc.pl and add the full filename to the plugins.
|
|
|
|
# This plugin will stop an ongoing vote when the person who called it leaves. Edit the options below
|
|
# to disallow votes after certain events.
|
|
|
|
{ my %vs = (
|
|
mapstart => 90, # can't call mapchange votes for this amount of seconds after mapstart
|
|
connected => 120, # can't call votes when you just joined the server
|
|
minplayers => 2, # minimal amount of players for this script to work.
|
|
);
|
|
|
|
$store{plugin_votestop} = \%vs; }
|
|
|
|
# add a dependency on joinsparts.pl
|
|
if (defined %config && $config{plugins} !~ m/joinsparts\.pl/gi) {
|
|
die "votestop.pl depends on joinsparts.pl but it appears to not be loaded.";
|
|
}
|
|
|
|
sub out($$@);
|
|
|
|
sub time_to_seconds {
|
|
my @ar = split /:/, $_[0];
|
|
return ($ar[0] * 60 * 60) + ($ar[1] * 60) + $ar[2];
|
|
}
|
|
|
|
[ dp => q{:vote:vcall:(\d+):(.*)} => sub {
|
|
my ($id, $command) = @_;
|
|
$command = color_dp2irc $command;
|
|
my $vs = $store{plugin_votestop};
|
|
|
|
# use joinsparts for player check
|
|
return 0 unless ($id && get_player_count() >= $vs->{minplayers});
|
|
|
|
my $slot = $store{"playerslot_byid_$id"};
|
|
if ($vs->{mapstart} && (time() - $store{map_starttime}) < $vs->{mapstart}) {
|
|
if ($command =~ m/(endmatch|restart|gotomap|chmap)/gi) {
|
|
$vs->{vstopignore} = 1;
|
|
out dp => 0, "sv_cmd vote stop";
|
|
out irc => 0, "PRIVMSG $config{irc_channel} :* vote \00304$command\017 by " . $store{"playernick_byid_$id"} .
|
|
"\017 was rejected because the map hasn't been played long enough";
|
|
|
|
out dp => 0, "tell #$slot your vote was rejected because this map only just started.";
|
|
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
my $time = time_to_seconds $store{"playerslot_$slot"}->{'time'};
|
|
$time ||= 0;
|
|
if ($vs->{connected} && $time < $vs->{connected}) {
|
|
$vs->{vstopignore} = 1;
|
|
out dp => 0, "sv_cmd vote stop";
|
|
out irc => 0, "PRIVMSG $config{irc_channel} :* vote \00304$command\017 by " . $store{"playernick_byid_$id"} .
|
|
"\017 was rejected because he isn't connected long enough";
|
|
|
|
out dp => 0, "tell #$slot your vote was rejected because you just joined the server.";
|
|
|
|
return -1;
|
|
}
|
|
|
|
$vs->{currentvote} = $id;
|
|
$vs->{command} = $command;
|
|
return 0;
|
|
} ],
|
|
|
|
[ dp => q{:vote:v(yes|no|timeout|stop):.*} => sub {
|
|
my ($cmd) = @_;
|
|
my $vs = $store{plugin_votestop};
|
|
$vs->{currentvote} = undef;
|
|
$vs->{command} = undef;
|
|
|
|
if ($cmd eq 'stop' && $vs->{vstopignore}) {
|
|
$vs->{vstopignore} = undef;
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
} ],
|
|
|
|
[ dp => q{:part:(\d+)} => sub {
|
|
my ($id) = @_;
|
|
my $vs = $store{plugin_votestop};
|
|
|
|
if (defined $vs->{currentvote} && $id == $vs->{currentvote}) {
|
|
$vs->{vstopignore} = 1;
|
|
out dp => 0, "sv_cmd vote stop";
|
|
out dp => 0, "say Vote was stopped as player left the server";
|
|
out irc => 0, "PRIVMSG $config{irc_channel} :* vote \00304" . $vs->{command} . "\017 by " . $store{"playernick_byid_$id"} .
|
|
"\017 was stopped because he left the server";
|
|
}
|
|
|
|
return 0;
|
|
} ],
|
|
|
|
[ dp => q{:gamestart:(.*):[0-9.]*} => sub {
|
|
my $vs = $store{plugin_votestop};
|
|
|
|
if (defined $vs->{currentvote}) {
|
|
out dp => 0, "sv_cmd vote stop";
|
|
$vs->{currentvote} = undef;
|
|
$vs->{command} = undef;
|
|
$vs->{vstopignore} = undef;
|
|
}
|
|
|
|
return 0;
|
|
} ],
|