codeGeneratorService = $codeGeneratorService; $this->lodestoneCacheService = $lodestoneCacheService; $this->lodestoneApiService = $lodestoneApiService; } public function getLinkDiscord($lodestoneId, $discordUserId) { // Check already linked if (UserLink::where('lodestoneId', $lodestoneId)->count() > 0) { return [ 'linked' => true, 'linkCode' => null, 'expires' => null ]; } // Check code exists $linkCode = LinkCode::where('lodestoneId', $lodestoneId)->first(); $expirationTime = Carbon::now()->addMinutes(5); if ($linkCode !== null && $linkCode->expires > Carbon::now()) { $linkCode->expires = $expirationTime; $linkCode->save(); } else { if ($linkCode !== null) $linkCode->delete(); $code = $this->codeGeneratorService->generateCode('discord'); $linkCode = LinkCode::create([ 'lodestoneId' => $lodestoneId, 'discordUserId' => $discordUserId, 'expires' => $expirationTime, 'code' => $code ]); } return [ 'linked' => false, 'linkCode' => $linkCode->code, 'expires' => $linkCode->expires ]; } public function getLinkWebsite($lodestoneId, $hostname, $websiteUserId) { // Check already linked if (UserLink::where('lodestoneId', $lodestoneId)->count() > 0) { return [ 'linked' => true, 'linkCode' => null, 'expires' => null ]; } // Check code exists $linkCode = LinkCode::where('lodestoneId', $lodestoneId)->first(); $expirationTime = Carbon::now()->addMinutes(5); if ($linkCode !== null && $linkCode->expires > Carbon::now()) { $linkCode->expires = $expirationTime; $linkCode->save(); } else { if ($linkCode !== null) $linkCode->delete(); $code = $this->codeGeneratorService->generateCode('discord'); $linkCode = LinkCode::create([ 'lodestoneId' => $lodestoneId, 'websiteHostname' => $hostname, 'websiteUserId' => $websiteUserId, 'expires' => $expirationTime, 'code' => $code ]); } return [ 'linked' => false, 'linkCode' => $linkCode->code, 'expires' => $linkCode->expires ]; } public function validateLinkDiscord($lodestoneId, $discordUserId, $code) { $character = $this->lodestoneCacheService->getCharacterById($lodestoneId, $this->lodestoneApiService)->content; $linkCode = LinkCode::where('expires', '>', Carbon::now()) ->where('lodestoneId', $lodestoneId) ->where('discordUserId', $discordUserId) ->first(); if ($linkCode === null) { // There is no code for that user return $this->getLinkDiscord($lodestoneId, $discordUserId); } if ($linkCode->code !== $code) { // The provided code is not valid return [ 'linked' => false, 'error' => 'Invalid code' ]; } UserLink::updateOrCreate([ 'lodestoneId' => $lodestoneId ], [ 'discordUserId' => $discordUserId ]); $linkCode->delete(); return [ 'linked' => true, 'lodestoneId' => $character['Character']['ID'], 'server' => $character['Character']['Server'], 'name' => $character['Character']['Name'], 'discordUserId' => $discordUserId ]; } public function validateLinkWebsite($lodestoneId, $hostname, $websiteUserId, $code) { $character = $this->lodestoneCacheService->getCharacterById($lodestoneId, $this->lodestoneApiService)->content; $linkCode = LinkCode::where('expires', '>', Carbon::now()) ->where('lodestoneId', $lodestoneId) ->where('websiteHostname', $hostname) ->where('websiteUserId', $websiteUserId) ->first(); if ($linkCode === null) { // There is no code for that user return $this->getLinkWebsite($lodestoneId, $hostname, $websiteUserId); } if ($linkCode->code !== $code) { // The provided code is not valid return [ 'linked' => false, 'error' => 'Invalid code' ]; } UserLink::updateOrCreate([ 'lodestoneId' => $lodestoneId ], [ 'websiteHostname' => $hostname, 'websiteUserId' => $websiteUserId ]); $linkCode->delete(); return [ 'linked' => true, 'lodestoneId' => $character['Character']['ID'], 'server' => $character['Character']['Server'], 'name' => $character['Character']['Name'], 'websiteHostname' => $hostname, 'websiteUserId' => $websiteUserId ]; } }