FFXIV_Lodestone_Handler/app/Services/LodestoneLinkingService.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)->where('discordUserId', $discordUserId)->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)->where('websiteUserId', $websiteUserId)->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('website');
$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
];
}
}