178 lines
5.6 KiB
PHP
178 lines
5.6 KiB
PHP
<?php
|
|
|
|
|
|
namespace App\Services;
|
|
|
|
|
|
use App\LinkCode;
|
|
use App\UserLink;
|
|
use Carbon\Carbon;
|
|
|
|
class LodestoneLinkingService
|
|
{
|
|
private $codeGeneratorService;
|
|
private $lodestoneCacheService;
|
|
private $lodestoneApiService;
|
|
|
|
public function __construct(
|
|
CodeGeneratorService $codeGeneratorService,
|
|
LodestoneCacheService $lodestoneCacheService,
|
|
LodestoneApiService $lodestoneApiService
|
|
)
|
|
{
|
|
$this->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
|
|
];
|
|
}
|
|
}
|