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

109 lines
3.6 KiB
PHP

<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* Chatlog plugin.
* Keeps log of player chat, and displays the chat log.
* Created by Xymph
*
* Dependencies: none
*/
Aseco::registerEvent('onChat', 'log_chat');
Aseco::addChatCommand('chatlog', 'Displays log of recent chat messages');
global $chatbuf; // chat history buffer
global $chatlen; // length of chat history
global $linelen; // max length of chat line
$chatbuf = array();
$chatlen = 30;
$linelen = 40;
// called @ onChat
function log_chat($aseco, $chat) {
global $chatbuf, $chatlen;
// check for non-empty player chat line, not a chat command
if ($chat[0] != $aseco->server->id && $chat[2] != '' && $chat[2]{0} != '/') {
// drop oldest chat line if buffer full
if (count($chatbuf) >= $chatlen) {
array_shift($chatbuf);
}
// append timestamp, player nickname (but strip wide font) & chat line to history
if ($player = $aseco->server->players->getPlayer($chat[1]))
$chatbuf[] = array(date('H:i:s'), str_ireplace('$w', '', $player->nickname), $chat[2]);
}
} // log_chat
function chat_chatlog($aseco, $command) {
global $chatbuf, $linelen;
$player = $command['author'];
$login = $player->login;
if (!empty($chatbuf)) {
if ($aseco->server->getGame() == 'TMN') {
$head = 'Recent chat history:' . LF;
$msg = '';
$lines = 0;
$player->msgs = array();
$player->msgs[0] = 1;
foreach ($chatbuf as $item) {
// break up long lines into chunks with continuation strings
$multi = explode(LF, wordwrap(stripColors($item[2]), $linelen, LF . '...'));
foreach ($multi as $line) {
$line = substr($line, 0, $linelen+3); // chop off excessively long words
$msg .= '$z' . ($aseco->settings['chatpmlog_times'] ? '$n<{#server}' . $item[0] . '$z$n>$m ' : '') .
'[{#black}' . $item[1] . '$z] ' . $line . LF;
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);
} else { // > 2
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $player->msgs[1], 'Close', 'Next', 0);
}
} elseif ($aseco->server->getGame() == 'TMF') {
$head = 'Recent chat history:';
$msg = array();
$lines = 0;
$player->msgs = array();
$player->msgs[0] = array(1, $head, array(1.2), array('Icons64x64_1', 'Outbox'));
foreach ($chatbuf as $item) {
// break up long lines into chunks with continuation strings
$multi = explode(LF, wordwrap(stripColors($item[2]), $linelen+30, LF . '...'));
foreach ($multi as $line) {
$line = substr($line, 0, $linelen+33); // chop off excessively long words
$msg[] = array('$z' . ($aseco->settings['chatpmlog_times'] ? '<{#server}' . $item[0] . '$z> ' : '') .
'[{#black}' . $item[1] . '$z] ' . $line);
if (++$lines > 14) {
$player->msgs[] = $msg;
$lines = 0;
$msg = array();
}
}
}
// add if last batch exists
if (!empty($msg))
$player->msgs[] = $msg;
// display ManiaLink message
display_manialink_multi($player);
}
} else {
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No chat history found!'), $login);
}
} // chat_chatlog
?>