77 خطوط
2.0 KiB
PHP
77 خطوط
2.0 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace VoiceState;
|
||
|
|
||
|
use \Monolog\Logger;
|
||
|
use Discord\Parts\WebSockets\VoiceStateUpdate;
|
||
|
|
||
|
class Bot
|
||
|
{
|
||
|
public const NAME = "VoiceState";
|
||
|
public const MAX_LOG_FILE_COUNT = 7;
|
||
|
private const STATE_FILE_TEMPLATE = "%s.json";
|
||
|
|
||
|
private const STATE_DEFAULT = [
|
||
|
'state' => null,
|
||
|
];
|
||
|
private const STATE_ACTIVE = 'active';
|
||
|
private const STATE_MUTE = 'muted';
|
||
|
private const STATE_SELF_MUTE = 'selfMuted';
|
||
|
|
||
|
private string $stateFileDir;
|
||
|
private Logger $logger;
|
||
|
|
||
|
public function __construct(string $stateFileDir, Logger $logger)
|
||
|
{
|
||
|
if (!is_dir($stateFileDir)) {
|
||
|
throw new \RuntimeException("stateFileDir is no directory");
|
||
|
}
|
||
|
|
||
|
$this->stateFileDir = rtrim($stateFileDir, '/');
|
||
|
$this->logger = $logger;
|
||
|
}
|
||
|
|
||
|
public function updateVoiceState(VoiceStateUpdate $voiceState): void
|
||
|
{
|
||
|
try {
|
||
|
$stateFile = $this->stateFileDir . '/' . sprintf(self::STATE_FILE_TEMPLATE, $voiceState->user_id);
|
||
|
|
||
|
if (!file_exists($stateFile)) {
|
||
|
$this->createStatusFile($stateFile);
|
||
|
}
|
||
|
|
||
|
$state = $this->getState($voiceState);
|
||
|
file_put_contents($stateFile, json_encode($state));
|
||
|
} catch (\Throwable $t) {
|
||
|
$this->logger->error($t);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private function getState(VoiceStateUpdate $voiceState)
|
||
|
{
|
||
|
$state = self::STATE_DEFAULT;
|
||
|
$state['state'] = self::STATE_ACTIVE;
|
||
|
if ($voiceState->mute) {
|
||
|
$state['state'] = self::STATE_MUTE;
|
||
|
}
|
||
|
if ($voiceState->self_mute) {
|
||
|
$state['state'] = self::STATE_SELF_MUTE;
|
||
|
}
|
||
|
|
||
|
return $state;
|
||
|
}
|
||
|
|
||
|
private function createStatusFile(string $stateFile): void
|
||
|
{
|
||
|
if (file_exists($stateFile)) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
file_put_contents($stateFile, json_encode(self::STATE_DEFAULT));
|
||
|
|
||
|
if (!file_exists($stateFile)) {
|
||
|
throw new \RuntimeException("could not create statefile: " . $stateFile);
|
||
|
}
|
||
|
}
|
||
|
}
|