852 lines
31 KiB
PHP
852 lines
31 KiB
PHP
<?php
|
|
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
|
|
|
|
/**
|
|
* Music Server plugin (TMF).
|
|
* Handles all server-controlled music.
|
|
* Created by Xymph
|
|
*
|
|
* Dependencies: none
|
|
*/
|
|
|
|
Aseco::registerEvent('onSync', 'music_loadsettings');
|
|
Aseco::registerEvent('onShutdown', 'music_shutdown');
|
|
Aseco::registerEvent('onEndRace', 'music_nextsong');
|
|
|
|
// handles action id's "-2101"-"-4000" for selecting from max. 1900 songs
|
|
Aseco::registerEvent('onPlayerManialinkPageAnswer', 'event_music');
|
|
|
|
Aseco::addChatCommand('music', 'Handles server music (see: /music help)');
|
|
|
|
require_once('includes/ogg_comments.inc.php'); // provides .OGG comments
|
|
|
|
class Music {
|
|
var $server;
|
|
var $songs;
|
|
var $tags;
|
|
var $current;
|
|
var $override;
|
|
var $autonext;
|
|
var $autoshuffle;
|
|
var $allowjb;
|
|
var $stripdirs;
|
|
var $stripexts;
|
|
var $cachetags;
|
|
var $cacheread;
|
|
var $cachefile;
|
|
var $mannext;
|
|
var $jukebox;
|
|
var $messages;
|
|
|
|
function Music($settings) {
|
|
|
|
if (isset($settings['OVERRIDE_TRACK'][0]))
|
|
$this->override = (strtolower($settings['OVERRIDE_TRACK'][0]) == 'true');
|
|
else
|
|
$this->override = false;
|
|
if (isset($settings['AUTO_NEXTSONG'][0]))
|
|
$this->autonext = (strtolower($settings['AUTO_NEXTSONG'][0]) == 'true');
|
|
else
|
|
$this->autonext = false;
|
|
if (isset($settings['AUTO_SHUFFLE'][0]))
|
|
$this->autoshuffle = (strtolower($settings['AUTO_SHUFFLE'][0]) == 'true');
|
|
else
|
|
$this->autoshuffle = false;
|
|
if (isset($settings['ALLOW_JUKEBOX'][0]))
|
|
$this->allowjb = (strtolower($settings['ALLOW_JUKEBOX'][0]) == 'true');
|
|
else
|
|
$this->allowjb = false;
|
|
if (isset($settings['STRIP_SUBDIRS'][0]))
|
|
$this->stripdirs = (strtolower($settings['STRIP_SUBDIRS'][0]) == 'true');
|
|
else
|
|
$this->stripdirs = false;
|
|
if (isset($settings['STRIP_EXTS'][0]))
|
|
$this->stripexts = (strtolower($settings['STRIP_EXTS'][0]) == 'true');
|
|
else
|
|
$this->stripexts = false;
|
|
if (isset($settings['CACHE_TAGS'][0]))
|
|
$this->cachetags = (strtolower($settings['CACHE_TAGS'][0]) == 'true');
|
|
else
|
|
$this->cachetags = false;
|
|
if (isset($settings['CACHE_READONLY'][0]))
|
|
$this->cacheread = (strtolower($settings['CACHE_READONLY'][0]) == 'true');
|
|
else
|
|
$this->cacheread = false;
|
|
|
|
$this->cachefile = $settings['CACHE_FILE'][0];
|
|
$this->server = $settings['MUSIC_SERVER'][0];
|
|
// check for remote or local path
|
|
if (substr($this->server, 0, 7) == 'http://') {
|
|
// append / if missing
|
|
if (substr($this->server, -1) != '/')
|
|
$this->server .= '/';
|
|
} else {
|
|
// append DIRSEP if missing
|
|
if (substr($this->server, -1) != DIRECTORY_SEPARATOR)
|
|
$this->server .= DIRECTORY_SEPARATOR;
|
|
}
|
|
|
|
$this->songs = array();
|
|
foreach ($settings['SONG_FILES'][0]['SONG'] as $song)
|
|
$this->songs[] = $song;
|
|
// remove duplicates
|
|
$this->songs = array_values(array_unique($this->songs));
|
|
// randomize list
|
|
if ($this->autoshuffle)
|
|
shuffle($this->songs);
|
|
|
|
$this->messages = $settings['MESSAGES'][0];
|
|
$this->mannext = false;
|
|
$this->current = 0;
|
|
$this->jukebox = array();
|
|
$this->tags = array();
|
|
}
|
|
|
|
function currentSong($sid = false) {
|
|
|
|
if ($sid === false)
|
|
return $this->songs[$this->current];
|
|
else
|
|
return $this->songs[--$sid];
|
|
}
|
|
|
|
function nextSong() {
|
|
|
|
$this->current++;
|
|
if ($this->current == count($this->songs))
|
|
$this->current = 0;
|
|
|
|
return $this->songs[$this->current];
|
|
}
|
|
|
|
function selectSong($sid) {
|
|
|
|
$sid--;
|
|
$this->current++;
|
|
if ($this->current == count($this->songs))
|
|
$this->current = 0;
|
|
|
|
if ($sid != $this->current)
|
|
moveArrayElement($this->songs, $sid, $this->current);
|
|
|
|
return $this->songs[$this->current];
|
|
}
|
|
} // class Music
|
|
|
|
global $music_server;
|
|
|
|
|
|
// called @ onSync
|
|
function music_loadsettings($aseco) {
|
|
global $music_server;
|
|
|
|
// read & parse config file
|
|
$aseco->console('Load music server config [musicserver.xml]');
|
|
if (!$settings = $aseco->xml_parser->parseXml('musicserver.xml')) {
|
|
trigger_error('Could not read/parse Music server config file musicserver.xml !', E_USER_ERROR);
|
|
}
|
|
$music_server = new Music($settings['SETTINGS']);
|
|
|
|
if ($music_server->cachetags)
|
|
refresh_tags($aseco, $music_server);
|
|
} // music_loadsettings
|
|
|
|
// called @ onShutdown
|
|
function music_shutdown($aseco) {
|
|
global $music_server;
|
|
|
|
// disable music
|
|
$aseco->client->query('SetForcedMusic', $music_server->override, '');
|
|
} // music_loadsettings
|
|
|
|
function refresh_tags($aseco, $music) {
|
|
|
|
// read tags cache, if present
|
|
if ($cache = $aseco->xml_parser->parseXml($music->cachefile)) {
|
|
if (isset($cache['TAGS']['SONG']))
|
|
foreach ($cache['TAGS']['SONG'] as $song)
|
|
$music->tags[$song['FILE'][0]] = array('Title' => $song['TITLE'][0],
|
|
'Artist' => $song['ARTIST'][0]);
|
|
}
|
|
|
|
// define full path to server
|
|
$server = $music->server;
|
|
if (substr($server, 0, 7) != 'http://')
|
|
$server = $aseco->server->gamedir . $server;
|
|
|
|
// check all .OGG songs for cached or new tags
|
|
foreach ($music->songs as $song) {
|
|
if (strtoupper(substr($song, -4)) == '.OGG') {
|
|
if (!isset($music->tags[$song])) {
|
|
$tags = new Ogg_Comments($server . $song, true);
|
|
if (!empty($tags->comments) && isset($tags->comments['TITLE']) && isset($tags->comments['ARTIST']))
|
|
$music->tags[$song] = array('Title' => $tags->comments['TITLE'],
|
|
'Artist' => $tags->comments['ARTIST']);
|
|
}
|
|
}
|
|
}
|
|
|
|
// check for read-only cache
|
|
if ($music->cacheread) return;
|
|
|
|
// compile updated tags cache
|
|
$list = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" . CRLF
|
|
. "<tags>" . CRLF;
|
|
foreach ($music->tags as $song => $tags)
|
|
$list .= "\t<song>" . CRLF
|
|
. "\t\t<file>" . $song . "</file>" . CRLF
|
|
. "\t\t<title>" . utf8_encode($tags['Title']) . "</title>" . CRLF
|
|
. "\t\t<artist>" . utf8_encode($tags['Artist']) . "</artist>" . CRLF
|
|
. "\t</song>" . CRLF;
|
|
$list .= "</tags>" . CRLF;
|
|
|
|
// write out cache file
|
|
if (!@file_put_contents($music->cachefile, $list)) {
|
|
trigger_error('Could not write music tags cache ' . $music->cachefile . ' !', E_USER_WARNING);
|
|
}
|
|
} // refresh_tags
|
|
|
|
|
|
// called @ onEndRace
|
|
function music_nextsong($aseco, $data) {
|
|
global $music_server;
|
|
|
|
// if restart, bail out immediately
|
|
if ($aseco->restarting != 0) return;
|
|
|
|
// check for manual next song by admin
|
|
if ($music_server->mannext) {
|
|
$music_server->mannext = false;
|
|
return;
|
|
}
|
|
|
|
// check for jukeboxed song
|
|
if (!empty($music_server->jukebox)) {
|
|
$next = array_shift($music_server->jukebox);
|
|
|
|
// check remote or local song access
|
|
$song = $music_server->server . $music_server->selectSong($next);
|
|
if (!http_get_file($song, true) &&
|
|
!file_exists($aseco->server->gamedir . $song)) {
|
|
trigger_error('Could not access song ' . $song . ' !', E_USER_WARNING);
|
|
} else {
|
|
// log console message
|
|
$aseco->console('[Music] Setting next song to: ' . $song);
|
|
|
|
// load next song
|
|
$aseco->client->query('SetForcedMusic', $music_server->override, $song);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// check for automatic next song
|
|
if ($music_server->autonext) {
|
|
// check remote or local song access
|
|
$song = $music_server->server . $music_server->nextSong();
|
|
if (!http_get_file($song, true) &&
|
|
!file_exists($aseco->server->gamedir . $song)) {
|
|
trigger_error('Could not access song ' . $song . ' !', E_USER_WARNING);
|
|
} else {
|
|
// log console message
|
|
$aseco->console('[Music] Setting next song to: ' . $song);
|
|
|
|
// load next song
|
|
$aseco->client->query('SetForcedMusic', $music_server->override, $song);
|
|
}
|
|
} else {
|
|
// disable next song
|
|
$aseco->client->query('SetForcedMusic', $music_server->override, '');
|
|
}
|
|
} // music_nextsong
|
|
|
|
|
|
function chat_music($aseco, $command) {
|
|
global $music_server;
|
|
|
|
if ($aseco->server->getGame() != 'TMF') {
|
|
$message = $aseco->getChatMessage('FOREVER_ONLY');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
return;
|
|
}
|
|
|
|
$player = $command['author'];
|
|
$login = $player->login;
|
|
$arglist = $command['params'];
|
|
$command['params'] = explode(' ', preg_replace('/ +/', ' ', $command['params']));
|
|
if (!isset($command['params'][1])) $command['params'][1] = '';
|
|
|
|
// get masteradmin/admin/operator titles
|
|
if ($aseco->isMasterAdmin($player)) {
|
|
$logtitle = 'MasterAdmin';
|
|
$chattitle = $aseco->titles['MASTERADMIN'][0];
|
|
} else {
|
|
if ($aseco->isAdmin($player)) {
|
|
$logtitle = 'Admin';
|
|
$chattitle = $aseco->titles['ADMIN'][0];
|
|
} else {
|
|
if ($aseco->isOperator($player)) {
|
|
$logtitle = 'Operator';
|
|
$chattitle = $aseco->titles['OPERATOR'][0];
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($command['params'][0] == 'help') {
|
|
|
|
$header = '{#black}/music$g handles server music:';
|
|
$help = array();
|
|
$help[] = array('...', '{#black}help',
|
|
'Displays this help information');
|
|
$help[] = array('...', '{#black}settings',
|
|
'Displays current music settings');
|
|
$help[] = array('...', '{#black}list',
|
|
'Displays all available songs');
|
|
$help[] = array('...', '{#black}list <xxx>',
|
|
'Searches song names/tags for <xxx>');
|
|
$help[] = array('...', '{#black}current',
|
|
'Shows the current song');
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
$help[] = array('...', '{#black}reload',
|
|
'Reloads musicserver.xml config file');
|
|
$help[] = array('...', '{#black}next',
|
|
'Skips to next song (upon next track)');
|
|
$help[] = array('...', '{#black}sort',
|
|
'Sorts the song list');
|
|
$help[] = array('...', '{#black}shuffle',
|
|
'Randomizes the song list');
|
|
$help[] = array('...', '{#black}override',
|
|
'Changes track override setting');
|
|
$help[] = array('...', '{#black}autonext',
|
|
'Changes automatic next song setting');
|
|
$help[] = array('...', '{#black}autoshuffle',
|
|
'Changes automatic shuffle setting');
|
|
$help[] = array('...', '{#black}allowjb',
|
|
'Changes allow jukebox setting');
|
|
$help[] = array('...', '{#black}stripdirs',
|
|
'Changes strip subdirs setting');
|
|
$help[] = array('...', '{#black}stripexts',
|
|
'Changes strip extensions setting');
|
|
$help[] = array('...', '{#black}off',
|
|
'Disables music, auto next & jukebox');
|
|
}
|
|
$help[] = array('...', '{#black}jukebox/jb',
|
|
'Displays upcoming songs in jukebox');
|
|
$help[] = array('...', '{#black}drop',
|
|
'Drops your currently added song');
|
|
$help[] = array('...', '{#black}##',
|
|
'Adds a song to jukebox where ## is');
|
|
$help[] = array('', '',
|
|
'the song Id from {#black}/music list');
|
|
// display ManiaLink message
|
|
display_manialink($login, $header, array('Icons64x64_1', 'TrackInfo', -0.01), $help, array(0.9, 0.05, 0.2, 0.65), 'OK');
|
|
}
|
|
elseif ($command['params'][0] == 'settings') {
|
|
|
|
$header = 'Music server settings:';
|
|
$info = array();
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
$info[] = array('Server', $music_server->server);
|
|
}
|
|
// get current song and strip server path
|
|
$aseco->client->query('GetForcedMusic');
|
|
$current = $aseco->client->getResponse();
|
|
if ($current['Url'] != '' || $current['File'] != '') {
|
|
//$current = preg_replace('|^' . $music_server->server . '|', '',
|
|
$current = str_replace($music_server->server, '',
|
|
($current['Url'] != '' ? $current['Url'] : $current['File']));
|
|
if ($music_server->cachetags && isset($music_server->tags[$current]))
|
|
$tags = $music_server->tags[$current];
|
|
if ($music_server->stripdirs)
|
|
$current = preg_replace('|.*[/\\\\]|', '', $current);
|
|
if ($music_server->stripexts)
|
|
$current = preg_replace('|\.[^.]+$|', '', $current);
|
|
} else {
|
|
$current = 'In-game music';
|
|
}
|
|
|
|
$info[] = array('Current', $current);
|
|
if ($music_server->cachetags && isset($tags))
|
|
$info[] = array('', $tags['Title'] . '{#black} by $g' . $tags['Artist']);
|
|
$info[] = array('Override', bool2text($music_server->override));
|
|
$info[] = array('AutoNext', bool2text($music_server->autonext));
|
|
$info[] = array('AutoShuffle', bool2text($music_server->autoshuffle));
|
|
$info[] = array('AllowJB', bool2text($music_server->allowjb));
|
|
$info[] = array('StripDirs', bool2text($music_server->stripdirs));
|
|
$info[] = array('StripExts', bool2text($music_server->stripexts));
|
|
$info[] = array('CacheTags', bool2text($music_server->cachetags));
|
|
$info[] = array('CacheRead', bool2text($music_server->cacheread));
|
|
$info[] = array('CacheFile', $music_server->cachefile);
|
|
// display ManiaLink message
|
|
display_manialink($login, $header, array('Icons64x64_1', 'Sound'), $info, array(1.0, 0.23, 0.77), 'OK');
|
|
}
|
|
elseif ($command['params'][0] == 'list') {
|
|
|
|
// check for search parameter
|
|
if (isset($command['params'][1]))
|
|
$search = $command['params'][1];
|
|
else
|
|
$search = '';
|
|
|
|
$head = 'Songs On This Server:';
|
|
$page = array();
|
|
$page[] = array('Id', 'Filename');
|
|
$sid = 1;
|
|
$lines = 0;
|
|
$player->msgs = array();
|
|
$player->msgs[0] = array(1, $head, array(1.0, 0.1, 0.9), array('Icons64x64_1', 'Music'));
|
|
foreach ($music_server->songs as $song) {
|
|
if ($music_server->cachetags && isset($music_server->tags[$song]))
|
|
$tags = $music_server->tags[$song];
|
|
|
|
// check for match in filename or, if available, title & artist tags
|
|
if ($search == '') {
|
|
$pos = 0;
|
|
} else {
|
|
$pos = stripos($song, $search);
|
|
if ($pos === false && isset($tags)) {
|
|
$pos = stripos($tags['Title'], $search);
|
|
if ($pos === false)
|
|
$pos = stripos($tags['Artist'], $search);
|
|
}
|
|
}
|
|
|
|
if ($pos !== false) {
|
|
if ($music_server->stripdirs)
|
|
$song = preg_replace('|.*[/\\\\]|', '', $song);
|
|
if ($music_server->stripexts)
|
|
$song = preg_replace('|\.[^.]+$|', '', $song);
|
|
$page[] = array(str_pad($sid, 2, '0', STR_PAD_LEFT) . '.',
|
|
// add clickable button
|
|
(($aseco->settings['clickable_lists'] && $sid <= 1900) ?
|
|
array('{#black}' . $song, -2100-$sid) : // action id
|
|
'{#black}' . $song));
|
|
if ($music_server->cachetags) {
|
|
if (isset($tags))
|
|
$page[] = array('', $tags['Title'] . '{#black} by $g' . $tags['Artist']);
|
|
else
|
|
$page[] = array();
|
|
}
|
|
|
|
if (++$lines > ($music_server->cachetags ? 7 : 14)) {
|
|
$player->msgs[] = $page;
|
|
$lines = 0;
|
|
$page = array();
|
|
$page[] = array('Id', 'Filename');
|
|
}
|
|
}
|
|
$sid++;
|
|
unset($tags);
|
|
}
|
|
// add if last batch exists
|
|
if (count($page) > 1)
|
|
$player->msgs[] = $page;
|
|
|
|
if (count($player->msgs) > 1) {
|
|
// display ManiaLink message
|
|
display_manialink_multi($player);
|
|
} else {
|
|
$message = '{#server}> {#error}No songs found, try again!';
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'current') {
|
|
|
|
// get current song and strip server path
|
|
$aseco->client->query('GetForcedMusic');
|
|
$current = $aseco->client->getResponse();
|
|
if ($current['Url'] != '' || $current['File'] != '') {
|
|
//$current = preg_replace('|^' . $music_server->server . '|', '',
|
|
$current = str_replace($music_server->server, '',
|
|
($current['Url'] != '' ? $current['Url'] : $current['File']));
|
|
if ($music_server->cachetags && isset($music_server->tags[$current]))
|
|
$tags = $music_server->tags[$current];
|
|
if ($music_server->stripdirs)
|
|
$current = preg_replace('|.*[/\\\\]|', '', $current);
|
|
if ($music_server->stripexts)
|
|
$current = preg_replace('|\.[^.]+$|', '', $current);
|
|
if ($music_server->cachetags && isset($tags))
|
|
$current .= '{#music} : {#highlite}' . $tags['Title'] . '{#music} by {#highlite}' . $tags['Artist'];
|
|
} else {
|
|
$current = 'In-game music';
|
|
}
|
|
|
|
// show chat message
|
|
$message = formatText($music_server->messages['CURRENT'][0],
|
|
$current);
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
elseif ($command['params'][0] == 'reload') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
// read & parse config file
|
|
if (!$settings = $aseco->xml_parser->parseXml('musicserver.xml')) {
|
|
trigger_error('Could not read/parse Music server config file musicserver.xml !', E_USER_WARNING);
|
|
$message = '{#server}> {#error}Could not read/parse Music server config file!';
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
return;
|
|
}
|
|
$music_server = new Music($settings['SETTINGS']);
|
|
if ($music_server->cachetags)
|
|
refresh_tags($aseco, $music_server);
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] reloaded config {3} !', $logtitle, $login, 'musicserver.xml');
|
|
|
|
// show chat message
|
|
$message = formatText($music_server->messages['RELOADED'][0],
|
|
$chattitle, $player->nickname);
|
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
|
|
|
// throw 'musicbox reloaded' event
|
|
$aseco->releaseEvent('onMusicboxReloaded', null);
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'next') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
// check remote or local song access
|
|
$song = $music_server->server . $music_server->nextSong();
|
|
if (!http_get_file($song, true) &&
|
|
!file_exists($aseco->server->gamedir . $song)) {
|
|
trigger_error('Could not access song ' . $song . ' !', E_USER_WARNING);
|
|
} else {
|
|
// load next song
|
|
$aseco->client->query('SetForcedMusic', $music_server->override, $song);
|
|
$music_server->mannext = true;
|
|
$song = $music_server->currentSong();
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] loaded next song {3} !', $logtitle, $login, $song);
|
|
|
|
// show chat message
|
|
if ($music_server->stripdirs)
|
|
$song = preg_replace('|.*[/\\\\]|', '', $song);
|
|
if ($music_server->stripexts)
|
|
$song = preg_replace('|\.[^.]+$|', '', $song);
|
|
$message = formatText($music_server->messages['NEXT'][0],
|
|
$chattitle, $player->nickname, $song);
|
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
|
}
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'sort') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
// sort songs list and clear jukebox
|
|
sort($music_server->songs);
|
|
$music_server->jukebox = array();
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] sorted song list!', $logtitle, $login);
|
|
|
|
// show chat message
|
|
$message = formatText($music_server->messages['SORTED'][0],
|
|
$chattitle, $player->nickname);
|
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'shuffle') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
// randomize songs list and clear jukebox
|
|
shuffle($music_server->songs);
|
|
$music_server->jukebox = array();
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] shuffled song list!', $logtitle, $login);
|
|
|
|
// show chat message
|
|
$message = formatText($music_server->messages['SHUFFLED'][0],
|
|
$chattitle, $player->nickname);
|
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'override' && $command['params'][1] != '') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
$param = strtoupper($command['params'][1]);
|
|
if ($param == 'ON' || $param == 'OFF') {
|
|
$music_server->override = ($param == 'ON');
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] set music override {3} !', $logtitle, $login, ($music_server->override ? 'ON' : 'OFF'));
|
|
|
|
// show chat message
|
|
$message = '{#server}> {#music}Music override set to ' . ($music_server->override ? 'Enabled' : 'Disabled');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'autonext' && $command['params'][1] != '') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
$param = strtoupper($command['params'][1]);
|
|
if ($param == 'ON' || $param == 'OFF') {
|
|
$music_server->autonext = ($param == 'ON');
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] set music autonext {3} !', $logtitle, $login, ($music_server->autonext ? 'ON' : 'OFF'));
|
|
|
|
// show chat message
|
|
$message = '{#server}> {#music}Music autonext set to ' . ($music_server->autonext ? 'Enabled' : 'Disabled');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'autoshuffle' && $command['params'][1] != '') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
$param = strtoupper($command['params'][1]);
|
|
if ($param == 'ON' || $param == 'OFF') {
|
|
$music_server->autoshuffle = ($param == 'ON');
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] set music autoshuffle {3} !', $logtitle, $login, ($music_server->autoshuffle ? 'ON' : 'OFF'));
|
|
|
|
// show chat message
|
|
$message = '{#server}> {#music}Music autoshuffle set to ' . ($music_server->autoshuffle ? 'Enabled' : 'Disabled');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'allowjb' && $command['params'][1] != '') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
$param = strtoupper($command['params'][1]);
|
|
if ($param == 'ON' || $param == 'OFF') {
|
|
$music_server->allowjb = ($param == 'ON');
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] set allow music jukebox {3} !', $logtitle, $login, ($music_server->allowjb ? 'ON' : 'OFF'));
|
|
|
|
// show chat message
|
|
$message = '{#server}> {#music}Allow music jukebox set to ' . ($music_server->allowjb ? 'Enabled' : 'Disabled');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'stripdirs' && $command['params'][1] != '') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
$param = strtoupper($command['params'][1]);
|
|
if ($param == 'ON' || $param == 'OFF') {
|
|
$music_server->stripdirs = ($param == 'ON');
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] set strip subdirs {3} !', $logtitle, $login, ($music_server->stripdirs ? 'ON' : 'OFF'));
|
|
|
|
// show chat message
|
|
$message = '{#server}> {#music}Strip subdirs set to ' . ($music_server->stripdirs ? 'Enabled' : 'Disabled');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'stripexts' && $command['params'][1] != '') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
$param = strtoupper($command['params'][1]);
|
|
if ($param == 'ON' || $param == 'OFF') {
|
|
$music_server->stripexts = ($param == 'ON');
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] set strip extensions {3} !', $logtitle, $login, ($music_server->stripexts ? 'ON' : 'OFF'));
|
|
|
|
// show chat message
|
|
$message = '{#server}> {#music}Strip extensions set to ' . ($music_server->stripexts ? 'Enabled' : 'Disabled');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'off') {
|
|
|
|
// check for admin ability
|
|
if ($aseco->allowAbility($player, 'chat_musicadmin')) {
|
|
// disable music
|
|
$aseco->client->query('SetForcedMusic', $music_server->override, '');
|
|
// disable autonext and jukebox
|
|
$music_server->autonext = false;
|
|
$music_server->allowjb = false;
|
|
$music_server->jukebox = array();
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] disabled music & song jukebox!', $logtitle, $login);
|
|
|
|
// show chat message
|
|
$message = formatText($music_server->messages['SHUTDOWN'][0],
|
|
$chattitle, $player->nickname);
|
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
|
} else {
|
|
$message = $aseco->getChatMessage('NO_ADMIN');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'jukebox' ||
|
|
$command['params'][0] == 'jb') {
|
|
|
|
if (!empty($music_server->jukebox)) {
|
|
$head = 'Upcoming songs in the jukebox:';
|
|
$page = array();
|
|
$page[] = array('Id', 'Filename');
|
|
$sid = 1;
|
|
$lines = 0;
|
|
$player->msgs = array();
|
|
$player->msgs[0] = array(1, $head, array(0.9, 0.1, 0.8), array('Icons64x64_1', 'Music'));
|
|
foreach ($music_server->jukebox as $sid) {
|
|
$song = $music_server->currentSong($sid);
|
|
if ($music_server->stripdirs)
|
|
$song = preg_replace('|.*[/\\\\]|', '', $song);
|
|
if ($music_server->stripexts)
|
|
$song = preg_replace('|\.[^.]+$|', '', $song);
|
|
$page[] = array(str_pad($sid, 2, '0', STR_PAD_LEFT) . '.',
|
|
'{#black}' . $song);
|
|
$sid++;
|
|
if (++$lines > 14) {
|
|
$player->msgs[] = $page;
|
|
$lines = 0;
|
|
$page = array();
|
|
$page[] = array('Id', 'Filename');
|
|
}
|
|
}
|
|
// add if last batch exists
|
|
if (count($page) > 1)
|
|
$player->msgs[] = $page;
|
|
|
|
// display ManiaLink message
|
|
display_manialink_multi($player);
|
|
} else {
|
|
$message = $music_server->messages['JUKEBOX_EMPTY'][0];
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif ($command['params'][0] == 'drop') {
|
|
|
|
// check for a song by this player
|
|
if (array_key_exists($login, $music_server->jukebox)) {
|
|
// delete song from jukebox
|
|
$sid = $music_server->jukebox[$login];
|
|
unset($music_server->jukebox[$login]);
|
|
$song = $music_server->currentSong($sid);
|
|
|
|
// show chat message
|
|
if ($music_server->stripdirs)
|
|
$song = preg_replace('|.*[/\\\\]|', '', $song);
|
|
if ($music_server->stripexts)
|
|
$song = preg_replace('|\.[^.]+$|', '', $song);
|
|
$message = formatText($music_server->messages['JUKEBOX_DROP'][0],
|
|
stripColors($player->nickname), $song);
|
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
|
} else {
|
|
$message = $music_server->messages['JUKEBOX_NODROP'][0];
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
elseif (is_numeric($command['params'][0])) {
|
|
|
|
// check whether jukeboxing is allowed
|
|
if ($music_server->allowjb) {
|
|
// check song ID
|
|
$sid = intval($command['params'][0]);
|
|
if ($sid > 0 && $sid <= count($music_server->songs)) {
|
|
// check for song by this player in jukebox
|
|
if (!array_key_exists($login, $music_server->jukebox)) {
|
|
// check if song is already queued in jukebox
|
|
if (!in_array($sid, $music_server->jukebox)) {
|
|
// jukebox song
|
|
$music_server->jukebox[$login] = $sid;
|
|
$song = $music_server->currentSong($sid);
|
|
|
|
// show chat message
|
|
if ($music_server->stripdirs)
|
|
$song = preg_replace('|.*[/\\\\]|', '', $song);
|
|
if ($music_server->stripexts)
|
|
$song = preg_replace('|\.[^.]+$|', '', $song);
|
|
$message = formatText($music_server->messages['JUKEBOX'][0],
|
|
stripColors($player->nickname), $song);
|
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
|
} else {
|
|
$message = $music_server->messages['JUKEBOX_DUPL'][0];
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} else {
|
|
$message = $music_server->messages['JUKEBOX_ALREADY'][0];
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} else {
|
|
$message = $music_server->messages['JUKEBOX_NOTFOUND'][0];
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} else {
|
|
$message = $music_server->messages['NO_JUKEBOX'][0];
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
}
|
|
else {
|
|
$message = '{#server}> {#error}Unknown music command or missing parameter: {#highlite}$i ' . $arglist;
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} // chat_music
|
|
|
|
|
|
// called @ onPlayerManialinkPageAnswer
|
|
// Handles ManiaLink music responses
|
|
// [0]=PlayerUid, [1]=Login, [2]=Answer
|
|
function event_music($aseco, $answer) {
|
|
|
|
// leave actions outside -4000 - -2101 to other handlers
|
|
if ($answer[2] >= -4000 && $answer[2] <= -2101) {
|
|
// get player
|
|
$player = $aseco->server->players->getPlayer($answer[1]);
|
|
|
|
// log clicked command
|
|
$aseco->console('player {1} clicked command "/music {2}"',
|
|
$player->login, abs($answer[2])-2100);
|
|
|
|
// jukebox selected song
|
|
$command = array();
|
|
$command['author'] = $player;
|
|
$command['params'] = abs($answer[2])-2100;
|
|
chat_music($aseco, $command);
|
|
}
|
|
} // event_music
|
|
?>
|