From 7df26ccdd804f0fad9f445486b76d1bc29e2319e Mon Sep 17 00:00:00 2001 From: Beu Date: Fri, 28 May 2021 00:00:01 +0200 Subject: [PATCH] Initial commit of gsheet plugin --- MatchManagerSuite/MatchManagerGSheet.php | 628 +++++++++++++++++++++++ 1 file changed, 628 insertions(+) create mode 100644 MatchManagerSuite/MatchManagerGSheet.php diff --git a/MatchManagerSuite/MatchManagerGSheet.php b/MatchManagerSuite/MatchManagerGSheet.php new file mode 100644 index 0000000..f09c146 --- /dev/null +++ b/MatchManagerSuite/MatchManagerGSheet.php @@ -0,0 +1,628 @@ +maniaControl = $maniaControl; + $this->initTables(); + $this->MatchManagerCore = $this->maniaControl->getPluginManager()->getPlugin(self::MATCHMANAGERCORE_PLUGIN); + + // Callbacks + $this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'updateSettings'); + + $this->maniaControl->getCallbackManager()->registerCallbackListener(MatchManagerCore::CB_MATCHMANAGER_STARTMATCH, $this, 'CheckAndPrepareSheet'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(MatchManagerCore::CB_MATCHMANAGER_ENDROUND, $this, 'onCallbackEndRound'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(MatchManagerCore::CB_MATCHMANAGER_ENDMATCH, $this, 'onCallbackEndMatch'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(MatchManagerCore::CB_MATCHMANAGER_STOPMATCH, $this, 'onCallbackStopMatch'); + + // Settings + $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCHMANAGERGSHEET_CLIENT_ID, "", "Used to Authenticate Maniacontrol. See the documentation of the plugin."); + $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCHMANAGERGSHEET_CLIENT_SECRET, "", "Used to Authenticate Maniacontrol. See the documentation of the plugin."); + $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCHMANAGERGSHEET_SPREADSHEET, "", "Spreadsheet ID from the URL"); + + $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCHMANAGERGSHEET_SHEETNAME, "#NAME# Finals", "Variables available: #MATCHID# #NAME# #LOGIN#"); + + $this->maniaControl->getCommandManager()->registerCommandListener('matchgsheet', $this, 'onCommandMatchGSheet', true, 'All MatchManager GSheet plugin commands'); + + $this->access_token = $this->getSecretSetting("access_token"); + + $this->maniaControl->getChat()->sendErrorToAdmins('To use the MatchManagerGSheet plugin, $<$l[https://github.com/AmazingBeu/ManiacontrolPlugins/wiki/MatchManager-GSheet]check the doc$>'); + return true; + } + + /** + * @see \ManiaControl\Plugins\Plugin::unload() + */ + public function unload() { + $this->closeWidgets(); + } + + /** + * Initialize needed database tables + */ + private function initTables() { + $mysqli = $this->maniaControl->getDatabase()->getMysqli(); + $query = 'CREATE TABLE IF NOT EXISTS `' . self::DB_GSHEETSECRETSETTINGS . '` ( + `settingname` VARCHAR(32) NOT NULL, + `value` VARCHAR(255) NOT NULL, + PRIMARY KEY (`settingname`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;'; + $mysqli->query($query); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + } + } + + /** + * Update Widgets on Setting Changes + * + * @param Setting $setting + */ + public function updateSettings(Setting $setting) { + if ($setting->belongsToClass($this)) { + if (($setting->setting == self::SETTING_MATCHMANAGERGSHEET_CLIENT_SECRET && $setting->value == "hidden") || $setting->setting == self::SETTING_MATCHMANAGERGSHEET_CLIENT_ID) { + $this->maniaControl->getChat()->sendErrorToAdmins('Google API Session cleared. You must revalidate a session with //matchgsheet step1'); + + $this->saveSecretSetting("access_token"); + $this->saveSecretSetting("expire"); + $this->saveSecretSetting("refresh_token"); + } + if ($setting->setting == self::SETTING_MATCHMANAGERGSHEET_CLIENT_SECRET && $setting->value != "hidden" && $setting->value != "") { + $this->saveSecretSetting("client_secret",$setting->value); + $this->maniaControl->getSettingManager()->setSetting($this, self::SETTING_MATCHMANAGERGSHEET_CLIENT_SECRET, "hidden"); + } + } + } + + public function onCommandMatchGSheet(array $chatCallback, Player $player) { + $authLevel = $this->maniaControl->getSettingManager()->getSettingValue($this->MatchManagerCore, MatchManagerCore::SETTING_MATCH_AUTHLEVEL); + if (!$this->maniaControl->getAuthenticationManager()->checkRight($player, AuthenticationManager::getAuthLevel($authLevel))) { + $this->maniaControl->getAuthenticationManager()->sendNotAllowed($player); + return; + } + + $text = $chatCallback[1][2]; + $text = explode(" ", $text); + + if (isset($text[1]) && $text[1] == 'step1') { + $this->OAuth2Step1($player); + } elseif (isset($text[1]) && $text[1] == 'step2') { + $this->OAuth2Step2($player); + } elseif (isset($text[1]) && $text[1] == 'check') { + $this->CheckSpeadsheetAccess($player); + } else { + $this->maniaControl->getChat()->sendError('use argument "step1", "step2" or "check"', $player); + } + } + + private function OAuth2Step1(Player $player) { + $clientid = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCHMANAGERGSHEET_CLIENT_ID); + if (empty($clientid)) { + Logger::logError('Client ID empty'); + $this->maniaControl->getChat()->sendError('Client ID empty', $player); + return; + } + $response = WebReader::postUrl('https://oauth2.googleapis.com/device/code?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fspreadsheets&client_id=' . $clientid); + $json = $response->getContent(); + if (!$json) { + Logger::logError('Impossible to Google API: ' . $json); + $this->maniaControl->getChat()->sendError('Impossible to Google API: ' . $json, $player); + return; + } + $data = json_decode($json); + if (!$data) { + Logger::logError('Json parse error: ' . $json); + $this->maniaControl->getChat()->sendError('Json parse error: ' . $json, $player); + return; + } + if (isset($data->device_code)) { + $this->device_code = $data->device_code; + $this->maniaControl->getChat()->sendSuccess('Open $<$l['. $data->verification_url . ']this link$> and type this code: "' . $data->user_code .'"' , $player); + $this->maniaControl->getChat()->sendSuccess('After have validate the App, type the commande "//matchgsheet step2"' , $player); + } elseif (isset($data->error_code)) { + $this->maniaControl->getChat()->sendError('Google refused the request: ' . $data->error_code, $player); + } else { + $this->maniaControl->getChat()->sendError('Unkown error' , $player); + } + } + + private function OAuth2Step2(Player $player) { + $clientid = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCHMANAGERGSHEET_CLIENT_ID); + if (empty($clientid)) { + Logger::logError('Client ID empty'); + $this->maniaControl->getChat()->sendError('Client ID empty', $player); + return; + } + + $clientsecret = $this->getSecretSetting("client_secret"); + if (empty($clientsecret)) { + Logger::logError('Client Secret empty'); + $this->maniaControl->getChat()->sendError('Client Secret empty', $player); + return; + } + + if (empty($this->device_code)) { + Logger::logError('No device_code. Have you run the step 1?'); + $this->maniaControl->getChat()->sendError('No device_code. Have you run the step 1?', $player); + return; + } + + $response = WebReader::postUrl('https://oauth2.googleapis.com/token?grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code&client_id=' . $clientid . '&client_secret=' . $clientsecret . '&device_code=' . $this->device_code); + $json = $response->getContent(); + if (!$json) { + Logger::logError('Impossible to Google API: ' . $json); + $this->maniaControl->getChat()->sendError('Impossible to Google API: ' . $json, $player); + return; + } + $data = json_decode($json); + if (!$data) { + Logger::logError('Json parse error: ' . $json); + $this->maniaControl->getChat()->sendError('Json parse error: ' . $json, $player); + return; + } + if (isset($data->access_token)) { + $this->access_token = $data->access_token; + $this->saveSecretSetting("access_token", $data->access_token); + $this->saveSecretSetting("expire", time() + $data->expires_in); + $this->saveSecretSetting("refresh_token", $data->refresh_token); + $this->maniaControl->getChat()->sendSuccess('Maniacontrol is registered' , $player); + } elseif (isset($data->error_description)) { + Logger::logError('Google refused the request: ' . $data->error_description); + $this->maniaControl->getChat()->sendError('Google refused the request: ' . $data->error_description , $player); + } else { + Logger::logError('Unkown error' . $data->error_description); + $this->maniaControl->getChat()->sendError('Unkown error' , $player); + } + } + + private function refreshTokenIfNeeded() { + Logger::Log('refreshTokenIfNeeded'); + $expire = $this->getSecretSetting("expire"); + $refreshtoken = $this->getSecretSetting("refresh_token"); + $clientid = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCHMANAGERGSHEET_CLIENT_ID); + $clientsecret = $this->getSecretSetting("client_secret"); + + if (!empty($refreshtoken) && !empty($expire) && !empty($clientid) && !empty($clientsecret)) { + if (time() >= $expire) { + $response = WebReader::postUrl('https://oauth2.googleapis.com/token?grant_type=refresh_token&client_id=' . $clientid . '&client_secret=' . $clientsecret . '&refresh_token=' . $refreshtoken); + $json = $response->getContent(); + if (!$json) { + Logger::logError('Impossible to Google API: ' . $json); + return; + } + $data = json_decode($json); + if (!$data) { + Logger::logError('Json parse error: ' . $json); + return; + } + if (isset($data->access_token)) { + $this->access_token = $data->access_token; + $this->saveSecretSetting("access_token", $data->access_token); + $this->saveSecretSetting("expire", time() + $data->expires_in); + } elseif (isset($data->error_description)) { + $this->maniaControl->getChat()->sendError('Google refused the request: ' . $data->error_description , $player); + } else { + $this->maniaControl->getChat()->sendError('Unkown error' , $player); + } + } + return true; + } + return false; + } + + private function saveSecretSetting(string $settingname, string $value = "") { + $mysqli = $this->maniaControl->getDatabase()->getMysqli(); + $query = "INSERT INTO `" . self::DB_GSHEETSECRETSETTINGS . "` ( + `settingname`, + `value` + ) VALUES ( + '" . $settingname . "', + '" . $value . "' + ) ON DUPLICATE KEY UPDATE + `value` = '" . $value . "';"; + $result = $mysqli->query($query); + if ($mysqli->error) { + trigger_error($mysqli->error); + return false; + } + + return $result; + } + + private function getSecretSetting(string $settingname) { + $mysqli = $this->maniaControl->getDatabase()->getMysqli(); + $query = "SELECT `settingname`,`value` FROM `" . self::DB_GSHEETSECRETSETTINGS . "` + WHERE `settingname` = '" . $settingname . "' LIMIT 1"; + $result = $mysqli->query($query); + $array = mysqli_fetch_array($result); + if (isset($array[0])) { + return $array['value']; + } else { + return ""; + } + } + + private function CheckSpeadsheetAccess(Player $player) { + if ($this->refreshTokenIfNeeded()) { + $asyncHttpRequest = new AsyncHttpRequest($this->maniaControl, 'https://sheets.googleapis.com/v4/spreadsheets/' . $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCHMANAGERGSHEET_SPREADSHEET)); + $asyncHttpRequest->setContentType(AsyncHttpRequest::CONTENT_TYPE_JSON); + $asyncHttpRequest->setHeaders(array("Authorization: Bearer " . $this->access_token)); + $asyncHttpRequest->setCallable(function ($json, $error) use ($player) { + if ($error) { + Logger::logError('Error: ' . $error); + $this->maniaControl->getChat()->sendError('Error: ' . $error, $player); + return; + } + $data = json_decode($json); + if (!$data) { + Logger::logError('Json parse error: ' . $json); + $this->maniaControl->getChat()->sendError('Json parse error: ' . $json, $player); + return; + } + if (isset($data->properties->title)) { + $this->maniaControl->getChat()->sendSuccess('Speadsheet name: ' . $data->properties->title, $player); + } else { + $this->maniaControl->getChat()->sendError("Can't access to the Spreadsheet: " . $data->error->message, $player); + } + }); + + $asyncHttpRequest->getData(1000); + } + } + + private function getSheetName() { + $sheetname = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCHMANAGERGSHEET_SHEETNAME); + $login = $this->maniaControl->getServer()->login; + $server_name = $this->maniaControl->getClient()->getServerName(); + + $sheetname = str_replace("#MATCHID#", $this->matchid, $sheetname); + $sheetname = str_replace("#LOGIN#", $login, $sheetname); + $sheetname = str_replace("#NAME#", $server_name, $sheetname); + + return $sheetname; + } + + public function UpdateGSheetData(String $matchid, Array $currentscore, Array $currentteamsscore) { + if ($this->refreshTokenIfNeeded()) { + $sheetname = $this->getSheetName(); + + $data = new \stdClass; + $data->valueInputOption = "USER_ENTERED"; + + $data->data[0] = new \stdClass; + $data->data[0]->range = "'" . $sheetname . "'!B2"; + $data->data[0]->values = array(array($this->matchstatus),array($this->MatchManagerCore->getCountMap()),array($this->MatchManagerCore->getCountRound())); + + $data->data[1] = new \stdClass; + $data->data[1]->range = "'" . $sheetname . "'!D2"; + $data->data[1]->values = $currentscore; + + $data->data[2] = new \stdClass; + $data->data[2]->range = "'" . $sheetname . "'!K2"; + $data->data[2]->values = $currentteamsscore; + + $asyncHttpRequest = new AsyncHttpRequest($this->maniaControl, 'https://sheets.googleapis.com/v4/spreadsheets/' . $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCHMANAGERGSHEET_SPREADSHEET) . '/values:batchUpdate'); + $asyncHttpRequest->setContentType(AsyncHttpRequest::CONTENT_TYPE_JSON); + $asyncHttpRequest->setHeaders(array("Authorization: Bearer " . $this->access_token)); + $asyncHttpRequest->setContent(json_encode($data)); + $asyncHttpRequest->setCallable(function ($json, $error) { + $data = json_decode($json); + if ($error || !$data) { + Logger::logError('Error while Sending data: ' . print_r($error, true)); + } + }); + + $asyncHttpRequest->postData(1000); + } else { + $this->maniaControl->getChat()->sendErrorToAdmins('Impossible to update the Google Sheet'); + } + } + + function onCallbackEndRound(String $matchid, Array $currentscore, Array $currentteamsscore) { + $this->matchstatus = "running"; + $this->UpdateGSheetData($matchid, $currentscore, $currentteamsscore); + } + function onCallbackEndMatch(String $matchid, Array $currentscore, Array $currentteamsscore) { + $this->matchstatus = "ended"; + $this->UpdateGSheetData($matchid, $currentscore, $currentteamsscore); + } + function onCallbackStopMatch(String $matchid, Array $currentscore, Array $currentteamsscore) { + $this->matchstatus = "stopped"; + $this->UpdateGSheetData($matchid, $currentscore, $currentteamsscore); + } + + public function CheckAndPrepareSheet(String $matchid, Array $settings) { + if ($this->refreshTokenIfNeeded()) { + $this->matchid = $matchid; + $asyncHttpRequest = new AsyncHttpRequest($this->maniaControl, 'https://sheets.googleapis.com/v4/spreadsheets/' . $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCHMANAGERGSHEET_SPREADSHEET)); + $asyncHttpRequest->setContentType(AsyncHttpRequest::CONTENT_TYPE_JSON); + $asyncHttpRequest->setHeaders(array("Authorization: Bearer " . $this->access_token)); + $asyncHttpRequest->setCallable(function ($json, $error) { + if ($error) { + Logger::logError('Error: ' . $error); + return; + } + $data = json_decode($json); + if (!$data) { + Logger::logError('Json parse error: ' . $json); + return; + } + if ($data->properties->title) { + $sheetname = $this->getSheetName(); + + $sheetsid = array(); + foreach($data->sheets as $value) { + if ($value->properties->title == $sheetname) { + unset($sheetsid); + $sheetsid = array(); + $sheetsid[0] = $value->properties->sheetId; + break; + } else { + array_push($sheetsid,$value->properties->sheetId); + } + } + $this->matchstatus = "starting"; + $this->PrepareSheet($sheetname, $sheetsid); + + } + }); + + $asyncHttpRequest->getData(1000); + } + } + + private function PrepareSheet(String $sheetname, array $sheetsid) { + if ($this->refreshTokenIfNeeded()) { + Logger::Log("Creating new Sheet: " . $sheetname); + + $data = new \stdClass; + $data->requests = array(); + $i = 0; + + if (count($sheetsid) > 1 || (count($sheetsid) == 1 && $sheetsid[0] == "0")) { + $sheetid = rand(1000000000,2147483646); + while (in_array($sheetid, $sheetsid)) { + $sheetid = rand(1000000000,2147483646); + } + $data->requests[$i] = new \stdClass; + $data->requests[$i]->addSheet = new \stdClass; + $data->requests[$i]->addSheet->properties = new \stdClass; + $data->requests[$i]->addSheet->properties->title = $sheetname; + $data->requests[$i]->addSheet->properties->sheetId = $sheetid; + $i++; + } else { + $sheetid = $sheetsid[0]; + } + + //Merge First & Second Cells + $data->requests[$i] = new \stdClass; + $data->requests[$i]->mergeCells = new \stdClass; + $data->requests[$i]->mergeCells->range = new \stdClass; + $data->requests[$i]->mergeCells->range->sheetId = $sheetid; + $data->requests[$i]->mergeCells->range->startRowIndex = 0; + $data->requests[$i]->mergeCells->range->endRowIndex = 1; + $data->requests[$i]->mergeCells->range->startColumnIndex = 0; + $data->requests[$i]->mergeCells->range->endColumnIndex = 2; + $data->requests[$i]->mergeCells->mergeType = "MERGE_ROWS"; + $i++; + + //Match Infos + $data->requests[$i] = new \stdClass; + $data->requests[$i]->repeatCell = new \stdClass; + $data->requests[$i]->repeatCell->range = new \stdClass; + $data->requests[$i]->repeatCell->range->sheetId = $sheetid; + $data->requests[$i]->repeatCell->range->startRowIndex = 0; + $data->requests[$i]->repeatCell->range->endRowIndex = 4; + $data->requests[$i]->repeatCell->range->startColumnIndex = 0; + $data->requests[$i]->repeatCell->range->endColumnIndex = 1; + $data->requests[$i]->repeatCell->cell = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor->red = 0.6; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor->green = 0.9; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor->blue = 0.6; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->textFormat = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->textFormat->bold = true; + $data->requests[$i]->repeatCell->fields = "userEnteredFormat(backgroundColor,textFormat)"; + + $i++; + + //Score Table + $data->requests[$i] = new \stdClass; + $data->requests[$i]->repeatCell = new \stdClass; + $data->requests[$i]->repeatCell->range = new \stdClass; + $data->requests[$i]->repeatCell->range->sheetId = $sheetid; + $data->requests[$i]->repeatCell->range->startRowIndex = 0; + $data->requests[$i]->repeatCell->range->endRowIndex = 1; + $data->requests[$i]->repeatCell->range->startColumnIndex = 3; + $data->requests[$i]->repeatCell->range->endColumnIndex = 9; + $data->requests[$i]->repeatCell->cell = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor->red = 0.6; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor->green = 0.9; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor->blue = 0.6; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->textFormat = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->textFormat->bold = true; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->horizontalAlignment = "CENTER"; + $data->requests[$i]->repeatCell->fields = "userEnteredFormat(backgroundColor,textFormat,horizontalAlignment)"; + $i++; + + //Team Score Table + $data->requests[$i] = new \stdClass; + $data->requests[$i]->repeatCell = new \stdClass; + $data->requests[$i]->repeatCell->range = new \stdClass; + $data->requests[$i]->repeatCell->range->sheetId = $sheetid; + $data->requests[$i]->repeatCell->range->startRowIndex = 0; + $data->requests[$i]->repeatCell->range->endRowIndex = 1; + $data->requests[$i]->repeatCell->range->startColumnIndex = 10; + $data->requests[$i]->repeatCell->range->endColumnIndex = 14; + $data->requests[$i]->repeatCell->cell = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor->red = 0.6; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor->green = 0.9; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->backgroundColor->blue = 0.6; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->textFormat = new \stdClass; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->textFormat->bold = true; + $data->requests[$i]->repeatCell->cell->userEnteredFormat->horizontalAlignment = "CENTER"; + $data->requests[$i]->repeatCell->fields = "userEnteredFormat(backgroundColor,textFormat,horizontalAlignment)"; + $i++; + + $asyncHttpRequest = new AsyncHttpRequest($this->maniaControl, 'https://sheets.googleapis.com/v4/spreadsheets/' . $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCHMANAGERGSHEET_SPREADSHEET) . ':batchUpdate'); + $asyncHttpRequest->setContentType(AsyncHttpRequest::CONTENT_TYPE_JSON); + $asyncHttpRequest->setHeaders(array("Authorization: Bearer " . $this->access_token)); + $asyncHttpRequest->setContent(json_encode($data)); + $asyncHttpRequest->setCallable(function ($json, $error) { + $data = json_decode($json); + if ($error || !$data) { + Logger::logError('Error while Sending data: ' . print_r($error, true)); + } + }); + $asyncHttpRequest->postData(1000); + + + // Add headers data + $data = new \stdClass; + $data->valueInputOption = "USER_ENTERED"; + + $data->data[0] = new \stdClass; + $data->data[0]->range = "'" . $sheetname . "'!A1"; + $data->data[0]->values = array(array("Informations"),array("Match status:", $this->matchstatus),array("Maps:","0/0"),array("Rounds:","0/0")); + + $data->data[1] = new \stdClass; + $data->data[1]->range = "'" . $sheetname . "'!D1"; + $data->data[1]->values = array(array("Rank","Login", "MatchPoints", "RoundPoints","Time","Team")); + + $data->data[2] = new \stdClass; + $data->data[2]->range = "'" . $sheetname . "'!K1"; + $data->data[2]->values = array(array("Rank","Team ID", "Name", "MatchPoints")); + + $asyncHttpRequest = new AsyncHttpRequest($this->maniaControl, 'https://sheets.googleapis.com/v4/spreadsheets/' . $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCHMANAGERGSHEET_SPREADSHEET) . '/values:batchUpdate'); + $asyncHttpRequest->setContentType(AsyncHttpRequest::CONTENT_TYPE_JSON); + $asyncHttpRequest->setHeaders(array("Authorization: Bearer " . $this->access_token)); + $asyncHttpRequest->setContent(json_encode($data)); + $asyncHttpRequest->setCallable(function ($json, $error) { + $data = json_decode($json); + if ($error || !$data) { + Logger::logError('Error while Sending data: ' . print_r($error, true)); + } + }); + + $asyncHttpRequest->postData(1000); + + // Clear Scoreboards data + $asyncHttpRequest = new AsyncHttpRequest($this->maniaControl, 'https://sheets.googleapis.com/v4/spreadsheets/' . $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCHMANAGERGSHEET_SPREADSHEET) . '/values/' . urlencode("'". $sheetname . "'") . '!D2:N300:clear'); + $asyncHttpRequest->setHeaders(array("Authorization: Bearer " . $this->access_token)); + $asyncHttpRequest->setCallable(function ($json, $error) { + var_dump($json); + $data = json_decode($json); + if ($error || !$data) { + Logger::logError('Error while Sending data: ' . print_r($error, true)); + } + }); + + $asyncHttpRequest->postData(1000); + } + } +}