<?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 ?>