Add CSV-export of local records

This commit is contained in:
Alexander Nell 2020-05-18 08:46:19 +02:00
parent 0148923268
commit 50408c75f6
2 changed files with 95 additions and 0 deletions

View File

@ -63,6 +63,32 @@ abstract class DataUtil {
}
}
/**
* Checks, if a string ends with the given substring.
* @param string $haystack
* @param string $needle
* @return bool
*/
public static function endsWith($haystack, $needle) {
$length = strlen($needle);
if ($length == 0) {
return true;
}
return (substr($haystack, -$length) === $needle);
}
/**
* Checks, if a string starts with the given substring.
* @param string $haystack
* @param string $needle
* @return bool
*/
public static function startsWith($haystack, $needle) {
$length = strlen($needle);
return (substr($haystack, 0, $length) === $needle);
}
/**
* Implodes sub-arrays with position properties.
*

View File

@ -27,6 +27,7 @@ use ManiaControl\Players\PlayerManager;
use ManiaControl\Plugins\Plugin;
use ManiaControl\Settings\Setting;
use ManiaControl\Settings\SettingManager;
use ManiaControl\Utils\DataUtil;
use ManiaControl\Utils\Formatter;
use MCTeam\Common\RecordWidget;
@ -64,6 +65,7 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
const SETTING_RECORDS_BEFORE_AFTER = 'Number of Records displayed before and after a player';
const CB_LOCALRECORDS_CHANGED = 'LocalRecords.Changed';
const ACTION_SHOW_RECORDSLIST = 'LocalRecords.ShowRecordsList';
const CSV_SPLITTER = ';';
/*
@ -171,6 +173,7 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::TM_ONFINISHLINE, $this, 'handleFinishCallback');
$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::TM_ONLAPFINISH, $this, 'handleFinishLapCallback');
$this->maniaControl->getCommandManager()->registerCommandListener(array('exportrecs', 'exportrecords', 'recexport'), $this, 'exportRecordsList', true, 'Exports the records of a map to a CSV-file.');
$this->maniaControl->getCommandManager()->registerCommandListener(array('recs', 'records'), $this, 'showRecordsList', false, 'Shows a list of Local Records on the current map.');
$this->maniaControl->getCommandManager()->registerCommandListener('delrec', $this, 'deletePersonalRecord', false, 'Removes your record from the database.');
$this->maniaControl->getCommandManager()->registerCommandListener('delrec', $this, 'deleteAnyRecord', true, 'Removes any record from the database.');
@ -691,6 +694,72 @@ class LocalRecordsPlugin implements CallbackListener, CallQueueListener, Command
$this->showRecordsList(array(), $player);
}
/**
* Exports the Records of a map to a CSV-file
*
* @api
* @param array $chat
* @param Player $player
*/
public function exportRecordsList(array $chat, Player $player) {
if (!$this->maniaControl->getAuthenticationManager()->checkPluginPermission($this, $player, self::PERMISSION_DELETE_ANY_RECORD)) {
$this->maniaControl->getAuthenticationManager()->sendNotAllowed($player);
return;
}
$commandParts = explode(' ', $chat[1][2]);
if (count($commandParts) < 2 || strlen($commandParts[1]) == 0) {
$this->maniaControl->getChat()->sendUsageInfo('Missing CSV-Filename ID! (Example: //exportrecs locals.csv)', $player);
return;
}
$filename = $commandParts[1];
if (!DataUtil::endsWith($filename, '.csv')) {
$filename .= '.csv';
}
$map = null;
if (count($commandParts) >= 3) {
$mapId = (int) $commandParts[2];
if ($mapId <= 0) {
$this->maniaControl->getChat()->sendUsageInfo('Map-Id below 1!', $player);
return;
}
$mapIndex = $mapId-1;
$map = $this->maniaControl->getMapManager()->getMapByIndex($mapIndex);
if (!$map) {
$this->maniaControl->getChat()->sendUsageInfo('Map-Id too high!', $player);
return;
}
} else {
$map = $this->maniaControl->getMapManager()->getCurrentMap();
}
$records = $this->getLocalRecords($map);
$lines = array();
$header = array('rank', 'login', 'time', 'checkpoints');
array_push($lines, implode(self::CSV_SPLITTER, $header));
foreach ($records as $record) {
$line = array(
$record->rank,
$record->login,
$record->time,
$record->checkpoints,
);
array_push($lines, implode(self::CSV_SPLITTER, $line));
}
try {
file_put_contents($filename, implode(PHP_EOL, $lines));
} catch (\Exception $e) {
$this->maniaControl->getChat()->sendException($e, $player);
}
$this->maniaControl->getChat()->sendSuccess('Successfully exported Local Records of map ' . $map->getEscapedName() . ' to $<$fff' . $filename . '$>!');
}
/**
* Shows a ManiaLink list with the local records.
*