docker-tmserver/xaseco/plugins/plugin.msglog.php

107 lines
3.1 KiB
PHP

<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* Msglog plugin.
* Keeps log of system messages, and displays the messages log.
* Created by Xymph
*
* Dependencies: none
*/
Aseco::addChatCommand('msglog', 'Displays log of recent system messages');
// handles action id "7223" for /msglog button
Aseco::registerEvent('onPlayerManialinkPageAnswer', 'event_msglog');
Aseco::registerEvent('onPlayerConnect', 'msglog_button');
global $msgbuf; // message history buffer
global $msglen; // length of message history
global $linlen; // max length of message line
global $winlen; // number of message lines
$msgbuf = array();
$msglen = 21;
$linlen = 800;
$winlen = 5;
function send_window_message($aseco, $message, $scoreboard) {
global $msgbuf, $msglen, $linlen, $winlen;
// append message line(s) to history
$message = explode(LF, $message);
foreach ($message as $item) {
// break up long (report) lines into chunks
$multi = explode(LF, wordwrap('$z$s' . $item, $linlen, LF . '$z$s$n'));
foreach ($multi as $line) {
// drop oldest message line if buffer full
if (count($msgbuf) >= $msglen) {
array_shift($msgbuf);
}
$msgbuf[] = $aseco->formatColors($line);
}
}
// check for display at end of track
if ($scoreboard) {
$aseco->client->query('GetChatTime');
$timeout = $aseco->client->getResponse();
$timeout = $timeout['CurrentValue'] + 5000; // podium animation
} else {
$timeout = $aseco->settings['window_timeout'] * 1000;
}
$lines = array_slice($msgbuf, -$winlen);
display_msgwindow($aseco, $lines, $timeout);
} // send_window_message
function chat_msglog($aseco, $command) {
global $msgbuf;
$player = $command['author'];
$login = $player->login;
if ($aseco->server->getGame() == 'TMF') {
if (!empty($msgbuf)) {
$header = 'Recent system message history:';
$msgs = array();
foreach ($msgbuf as $line)
$msgs[] = array($line);
// display ManiaLink message
display_manialink($login, $header, array('Icons64x64_1', 'NewMessage'), $msgs, array(1.53), 'OK');
} else {
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No system message history found!'), $login);
}
} else {
$message = $aseco->getChatMessage('FOREVER_ONLY');
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
}
} // chat_msglog
// called @ onPlayerConnect
function msglog_button($aseco, $player) {
display_msglogbutton($aseco, $player->login);
} // msglog_button
// called @ onPlayerManialinkPageAnswer // Handles ManiaLink style responses
// [0]=PlayerUid, [1]=Login, [2]=Answer
function event_msglog($aseco, $answer) {
// leave actions other than 7223 to other handlers
if ($answer[2] == 7223) {
// get player
$player = $aseco->server->players->getPlayer($answer[1]);
// log clicked command
$aseco->console('player {1} clicked command "/msglog "', $player->login);
// /msglog
$command = array();
$command['author'] = $player;
chat_msglog($aseco, $command);
}
} // event_msglog
?>