248 lines
8.3 KiB
PHP
248 lines
8.3 KiB
PHP
|
<?php
|
||
|
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
|
||
|
|
||
|
/**
|
||
|
* Muting plugin.
|
||
|
* Handles individual and global player muting, and provides
|
||
|
* /mute, /unmute, /mutelist & /refresh commands.
|
||
|
* Created by Xymph
|
||
|
*
|
||
|
* Dependencies: none
|
||
|
*/
|
||
|
|
||
|
Aseco::registerEvent('onStartup', 'init_globalpat');
|
||
|
Aseco::registerEvent('onChat', 'handle_muting');
|
||
|
Aseco::addChatCommand('mute', 'Mute another player\'s chat messages');
|
||
|
Aseco::addChatCommand('unmute', 'UnMute another player\'s chat messages');
|
||
|
Aseco::addChatCommand('mutelist', 'Display list of muted players');
|
||
|
Aseco::addChatCommand('refresh', 'Refresh chat window');
|
||
|
|
||
|
global $globalpat; // pre-defined pattern for global messages
|
||
|
global $muting_available; // signal to chat.admin.php & plugin.rasp_chat.php
|
||
|
|
||
|
// called @ onStartup
|
||
|
function init_globalpat() {
|
||
|
global $aseco, $globalpat, $muting_available;
|
||
|
|
||
|
// define pattern for known global messages to reduce overhead
|
||
|
$globalpat = '/' . $aseco->formatColors(formatText($aseco->getChatMessage('ROUND'), '\d+'))
|
||
|
. '|' . $aseco->formatColors('$z$s{#server}>> ')
|
||
|
. '|' . $aseco->formatColors('{#server}>> ') . '/A'; // anchor at start
|
||
|
$globalpat = str_replace('$', '\$', $globalpat); // escape dollars
|
||
|
|
||
|
$muting_available = true;
|
||
|
} // init_globalpat
|
||
|
|
||
|
// called @ onChat
|
||
|
function handle_muting($aseco, $chat) {
|
||
|
global $globalpat;
|
||
|
|
||
|
// check for player chat line
|
||
|
if ($chat[0] != $aseco->server->id) {
|
||
|
// check if not a registered (== hidden) chat command
|
||
|
if (!$chat[3] && ($chatter = $aseco->server->players->getPlayer($chat[1]))) {
|
||
|
|
||
|
// check each player's mute list and global mute list
|
||
|
foreach ($aseco->server->players->player_list as $player) {
|
||
|
if (in_array($chat[1], $player->mutelist) ||
|
||
|
in_array($chat[1], $aseco->server->mutelist)) {
|
||
|
// spew buffer back to player and thus mute the chatter
|
||
|
if (!empty($player->mutebuf)) {
|
||
|
$buf = '';
|
||
|
foreach ($player->mutebuf as $line) {
|
||
|
// double '$z' to avoid match with $globalpat that would cause
|
||
|
// spewed buffer to be buffered again
|
||
|
$buf .= LF . '$z$z$s' . $line;
|
||
|
}
|
||
|
$aseco->client->query('ChatSendServerMessageToLogin', $buf, $player->login);
|
||
|
}
|
||
|
} else {
|
||
|
// append chatter line to buffer
|
||
|
if (count($player->mutebuf) >= 28) { // chat window length
|
||
|
array_shift($player->mutebuf);
|
||
|
}
|
||
|
$player->mutebuf[] = '$z$s[' . $chatter->nickname . '$z$s] ' . $chat[2];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} else { // any server chat
|
||
|
// check for global server message
|
||
|
if (preg_match($globalpat, $chat[2])) {
|
||
|
// append global server message to all players' buffers
|
||
|
foreach ($aseco->server->players->player_list as $player) {
|
||
|
if (count($player->mutebuf) >= 28) { // chat window length
|
||
|
array_shift($player->mutebuf);
|
||
|
}
|
||
|
$player->mutebuf[] = $chat[2];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} // handle_muting
|
||
|
|
||
|
function chat_mute($aseco, $command) {
|
||
|
|
||
|
$player = $command['author'];
|
||
|
$target = $player;
|
||
|
|
||
|
// get player login or ID
|
||
|
if (!$target = $aseco->getPlayerParam($player, $command['params']))
|
||
|
return;
|
||
|
|
||
|
// check for any admin tier
|
||
|
if ($aseco->isAnyAdmin($target)) {
|
||
|
// obtain correct title
|
||
|
$title = $aseco->isMasterAdmin($target) ? $aseco->titles['MASTERADMIN'][0] :
|
||
|
($aseco->isAdmin($target) ? $aseco->titles['ADMIN'][0] :
|
||
|
($aseco->isOperator($target) ? $aseco->titles['OPERATOR'][0] :
|
||
|
'Player'));
|
||
|
$message = formatText('{#server}> {#error}Cannot mute {#logina}$i {1} {#highlite}{2}$z$s{#error} !',
|
||
|
$title, stripColors($target->nickname));
|
||
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $player->login);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// check if not yet in mute list
|
||
|
if (!in_array($target->login, $player->mutelist)) {
|
||
|
// mute this player
|
||
|
$player->mutelist[] = $target->login;
|
||
|
|
||
|
$message = formatText($aseco->getChatMessage('MUTE'),
|
||
|
$target->nickname);
|
||
|
} else {
|
||
|
$message = '{#server}> {#error}Player {#highlite}$i ' . stripColors($target->nickname) . '$z$s{#error} is already in your mute list!';
|
||
|
}
|
||
|
// show chat message
|
||
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $player->login);
|
||
|
} // chat_mute
|
||
|
|
||
|
function chat_unmute($aseco, $command) {
|
||
|
|
||
|
$player = $command['author'];
|
||
|
$target = $player;
|
||
|
|
||
|
// get player login or ID
|
||
|
if (!$target = $aseco->getPlayerParam($player, $command['params'], true))
|
||
|
return;
|
||
|
|
||
|
// check if indeed in mute list
|
||
|
if (($i = array_search($target->login, $player->mutelist)) !== false) {
|
||
|
// unmute this player
|
||
|
$player->mutelist[$i] = '';
|
||
|
|
||
|
$message = formatText($aseco->getChatMessage('UNMUTE'),
|
||
|
$target->nickname);
|
||
|
} else {
|
||
|
$message = '{#server}> {#error}Player {#highlite}$i ' . stripColors($target->nickname) . '$z$s{#error} is not in your mute list!';
|
||
|
}
|
||
|
// show chat message
|
||
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $player->login);
|
||
|
} // chat_unmute
|
||
|
|
||
|
function chat_mutelist($aseco, $command) {
|
||
|
|
||
|
$player = $command['author'];
|
||
|
$login = $player->login;
|
||
|
|
||
|
// check for muted players
|
||
|
if (empty($player->mutelist)) {
|
||
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No muted players found!'), $login);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ($aseco->server->getGame() == 'TMN') {
|
||
|
$player->playerlist = array();
|
||
|
$player->msgs = array();
|
||
|
$player->msgs[0] = 1;
|
||
|
|
||
|
$head = 'Currently Muted Players:' . LF . 'Id {#nick}Nick $g/{#login} Login' . LF;
|
||
|
$msg = '';
|
||
|
$pid = 1;
|
||
|
$lines = 0;
|
||
|
foreach ($player->mutelist as $pl) {
|
||
|
if ($pl != '') {
|
||
|
$plarr = array();
|
||
|
$plarr['login'] = $pl;
|
||
|
$player->playerlist[] = $plarr;
|
||
|
|
||
|
$msg .= '$g' . str_pad($pid, 2, '0', STR_PAD_LEFT) . '. {#black}'
|
||
|
. str_ireplace('$w', '', $aseco->getPlayerNick($pl))
|
||
|
. '$z / {#login}' . $pl . LF;
|
||
|
$pid++;
|
||
|
if (++$lines > 9) {
|
||
|
$player->msgs[] = $aseco->formatColors($head . $msg);
|
||
|
$lines = 0;
|
||
|
$msg = '';
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// add if last batch exists
|
||
|
if ($msg != '')
|
||
|
$player->msgs[] = $aseco->formatColors($head . $msg);
|
||
|
|
||
|
// display popup message
|
||
|
if (count($player->msgs) == 2) {
|
||
|
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $player->msgs[1], 'OK', '', 0);
|
||
|
} elseif (count($player->msgs) > 2) {
|
||
|
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $player->msgs[1], 'Close', 'Next', 0);
|
||
|
} else { // == 1
|
||
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No muted players found!'), $login);
|
||
|
}
|
||
|
|
||
|
} elseif ($aseco->server->getGame() == 'TMF') {
|
||
|
$player->playerlist = array();
|
||
|
|
||
|
$head = 'Currently Muted Players:';
|
||
|
$msg = array();
|
||
|
$msg[] = array('Id', '{#nick}Nick $g/{#login} Login');
|
||
|
$pid = 1;
|
||
|
$lines = 0;
|
||
|
$player->msgs = array();
|
||
|
$player->msgs[0] = array(1, $head, array(0.9, 0.1, 0.8), array('Icons128x128_1', 'Padlock', 0.01));
|
||
|
foreach ($player->mutelist as $pl) {
|
||
|
if ($pl != '') {
|
||
|
$plarr = array();
|
||
|
$plarr['login'] = $pl;
|
||
|
$player->playerlist[] = $plarr;
|
||
|
|
||
|
$msg[] = array(str_pad($pid, 2, '0', STR_PAD_LEFT) . '.',
|
||
|
'{#black}' . str_ireplace('$w', '', $aseco->getPlayerNick($pl))
|
||
|
. '$z / {#login}' . $pl);
|
||
|
$pid++;
|
||
|
if (++$lines > 14) {
|
||
|
$player->msgs[] = $msg;
|
||
|
$lines = 0;
|
||
|
$msg = array();
|
||
|
$msg[] = array('Id', '{#nick}Nick $g/{#login} Login');
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// add if last batch exists
|
||
|
if (count($msg) > 1)
|
||
|
$player->msgs[] = $msg;
|
||
|
|
||
|
// display ManiaLink message
|
||
|
if (count($player->msgs) > 1) {
|
||
|
display_manialink_multi($player);
|
||
|
} else { // == 1
|
||
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No muted players found!'), $login);
|
||
|
}
|
||
|
}
|
||
|
} // chat_mutelist
|
||
|
|
||
|
function chat_refresh($aseco, $command) {
|
||
|
|
||
|
$player = $command['author'];
|
||
|
|
||
|
// spew buffer back to player
|
||
|
if (!empty($player->mutebuf)) {
|
||
|
$buf = '';
|
||
|
foreach ($player->mutebuf as $line) {
|
||
|
// double '$z' to avoid match with $globalpat that would cause
|
||
|
// spewed buffer to be buffered again
|
||
|
$buf .= LF . '$z$z$s' . $line;
|
||
|
}
|
||
|
$aseco->client->query('ChatSendServerMessageToLogin', $buf, $player->login);
|
||
|
}
|
||
|
} // chat_refresh
|
||
|
?>
|