176 lines
5.3 KiB
PHP
176 lines
5.3 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
ini_set('display_errors', '1');
|
|
error_reporting(E_ALL);
|
|
session_start();
|
|
|
|
if (!isset($_SESSION['user_id'])) {
|
|
header('Location: ../login.php');
|
|
exit;
|
|
}
|
|
|
|
$config = require __DIR__ . '/../../config/database.php';
|
|
$telegramConfig = require __DIR__ . '/../../config/telegram.php';
|
|
|
|
$dsn = sprintf(
|
|
'mysql:host=%s;dbname=%s;charset=%s',
|
|
$config['host'],
|
|
$config['dbname'],
|
|
$config['charset'] ?? 'utf8mb4'
|
|
);
|
|
|
|
$pdo = new PDO(
|
|
$dsn,
|
|
$config['user'],
|
|
$config['pass'],
|
|
[
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
]
|
|
);
|
|
|
|
$userId = (int) $_SESSION['user_id'];
|
|
$loggedIn = true;
|
|
$publicBasePath = '../';
|
|
$pageTitle = 'Telegram verbinden - AstroTools';
|
|
$headerIntroPre = 'Konto';
|
|
$headerIntroTitle = 'Telegram verbinden';
|
|
$headerIntroSub = 'Bot-Verknüpfung für spätere Benachrichtigungen.';
|
|
|
|
function h(?string $value): string
|
|
{
|
|
return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
|
|
}
|
|
|
|
function generateTelegramLinkToken(int $length = 32): string
|
|
{
|
|
return bin2hex(random_bytes(max(16, (int) ceil($length / 2))));
|
|
}
|
|
|
|
$stmtUser = $pdo->prepare("
|
|
SELECT
|
|
`id`,
|
|
`username`,
|
|
`telegram_username`,
|
|
`telegram_chat_id`,
|
|
`telegram_link_token`,
|
|
`telegram_link_token_expires_at`,
|
|
`telegram_connected_at`
|
|
FROM `app_users`
|
|
WHERE `id` = :id
|
|
LIMIT 1
|
|
");
|
|
$stmtUser->execute([':id' => $userId]);
|
|
$user = $stmtUser->fetch();
|
|
|
|
if (!$user) {
|
|
$_SESSION = [];
|
|
session_destroy();
|
|
header('Location: ../login.php');
|
|
exit;
|
|
}
|
|
|
|
$now = new DateTimeImmutable('now');
|
|
$token = trim((string) ($user['telegram_link_token'] ?? ''));
|
|
$expiresAt = !empty($user['telegram_link_token_expires_at'])
|
|
? new DateTimeImmutable((string) $user['telegram_link_token_expires_at'])
|
|
: null;
|
|
|
|
if ($token === '' || !$expiresAt instanceof DateTimeImmutable || $expiresAt <= $now) {
|
|
$token = generateTelegramLinkToken(32);
|
|
$expiresAt = $now->modify('+30 minutes');
|
|
|
|
$stmtRefresh = $pdo->prepare("
|
|
UPDATE `app_users`
|
|
SET
|
|
`telegram_link_token` = :token,
|
|
`telegram_link_token_expires_at` = :expires_at,
|
|
`updated_at` = NOW()
|
|
WHERE `id` = :id
|
|
");
|
|
$stmtRefresh->execute([
|
|
':token' => $token,
|
|
':expires_at' => $expiresAt->format('Y-m-d H:i:s'),
|
|
':id' => $userId,
|
|
]);
|
|
|
|
$stmtUser->execute([':id' => $userId]);
|
|
$user = $stmtUser->fetch();
|
|
}
|
|
|
|
$botUsername = trim((string) ($telegramConfig['bot_username'] ?? ''));
|
|
$deepLink = $botUsername !== ''
|
|
? 'https://t.me/' . $botUsername . '?start=connect_' . $token
|
|
: null;
|
|
?>
|
|
<?php require __DIR__ . '/../header.php'; ?>
|
|
|
|
<div class="card">
|
|
<h2>Telegram-Verknüpfung</h2>
|
|
<p class="hint">
|
|
Diese Verbindung merkt sich die Chat-ID deines Telegram-Kontos, damit spaeter ein Bot dir Inhalte direkt schicken kann.
|
|
</p>
|
|
|
|
<table class="data-table mb-lg">
|
|
<tr><td>Status</td><td><?= !empty($user['telegram_chat_id']) ? 'Verbunden' : 'Noch nicht verbunden' ?></td></tr>
|
|
<tr><td>Aktiver Code</td><td><strong><?= h($token) ?></strong></td></tr>
|
|
<tr><td>Gueltig bis</td><td><?= h($expiresAt?->format('d.m.Y H:i')) ?></td></tr>
|
|
<tr><td>Aktueller Telegram-Username</td><td><?= h(!empty($user['telegram_username']) ? '@' . ltrim((string) $user['telegram_username'], '@') : '—') ?></td></tr>
|
|
<tr><td>Aktuelle Chat-ID</td><td><?= h($user['telegram_chat_id'] ?? '—') ?></td></tr>
|
|
</table>
|
|
|
|
<?php if ($deepLink !== null): ?>
|
|
<p>
|
|
<a class="btn btn-primary" href="<?= h($deepLink) ?>" target="_blank" rel="noopener">Bot in Telegram öffnen</a>
|
|
</p>
|
|
<div class="telegram-qr-block">
|
|
<div class="telegram-qr-image" id="telegramConnectQrLarge" data-telegram-link="<?= h($deepLink) ?>"></div>
|
|
<p class="hint">QR-Code mit dem Handy scannen. Telegram öffnet dann direkt den richtigen Bot mit deinem Verknüpfungslink.</p>
|
|
</div>
|
|
<?php else: ?>
|
|
<p class="hint">
|
|
In `config/telegram.php` ist noch kein Bot-Username hinterlegt. Du kannst den Code trotzdem schon verwenden und spaeter an den Bot senden.
|
|
</p>
|
|
<?php endif; ?>
|
|
|
|
<div class="form-stack">
|
|
<p>So funktioniert es:</p>
|
|
<ol>
|
|
<li>Oeffne den Telegram-Bot.</li>
|
|
<li>Sende den Startbefehl <code>/start connect_<?= h($token) ?></code>.</li>
|
|
<li>Der Bot verknuepft deinen Chat mit deinem Benutzerkonto.</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<p class="hint">
|
|
Nach erfolgreicher Verknüpfung kannst du zurück zu <a href="<?= h($publicBasePath . 'settings.php') ?>">Einstellungen</a>.
|
|
</p>
|
|
</div>
|
|
|
|
<?php if ($deepLink !== null): ?>
|
|
<script src="<?= h($publicBasePath . 'js/qrcode.min.js') ?>"></script>
|
|
<script>
|
|
(function () {
|
|
const qrEl = document.getElementById('telegramConnectQrLarge');
|
|
if (!qrEl || typeof QRCode === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
const qrLink = qrEl.getAttribute('data-telegram-link');
|
|
if (!qrLink) {
|
|
return;
|
|
}
|
|
|
|
new QRCode(qrEl, {
|
|
text: qrLink,
|
|
width: 280,
|
|
height: 280,
|
|
correctLevel: QRCode.CorrectLevel.M
|
|
});
|
|
})();
|
|
</script>
|
|
<?php endif; ?>
|
|
|
|
<?php require __DIR__ . '/../footer.php'; ?>
|