GG.deals clone: CodeIgniter 4 + MongoDB game price tracker

- Full gg.deals-style UI: deal feed with filters, game pages with price
  history charts, rankings, vouchers, news, prepaids, subscriptions,
  bundles, franchises, wishlist, API docs
- Real data crawlers:
  * gg:crawl (Steam Store API + GOG Catalog + Epic free games)
  * gg:catalog (252K game slugs from gg.deals sitemaps)
  * gg:ggdeals (per-game prices via FlareSolverr session, JSON-LD parsing)
  * gg:seed / gg:crawl-covers (demo seed + Steam CDN cover art)
- 24/7 self-updating scheduler (scripts/scheduler_loop.php, lockfile-protected)
- Tailwind v4 dark/light theme, Alpine.js, Chart.js
This commit is contained in:
deepseek
2026-08-23 07:06:02 +00:00
commit fff7a4b9b9
146 changed files with 15691 additions and 0 deletions
+45
View File
@@ -0,0 +1,45 @@
<?= $this->extend('layout') ?>
<?= $this->section('content') ?>
<div class="max-w-3xl mb-8">
<h1 class="text-2xl font-extrabold text-white tracking-tight mb-4">Frequently Asked Questions</h1>
<div class="space-y-3" x-data="{ open: null }">
<?php
$faqs = [
['What is GG.deals?', 'GG.deals is a price comparison service for digital video games. We track prices across official stores and keyshop marketplaces, maintain historical price data, and help you find the best deal for any PC, PlayStation, Xbox or Switch game.'],
['Are keyshops safe?', 'Keyshops are third-party marketplaces that resell game keys. While most keyshop sellers are legitimate, buying from them carries some risk — keys may be region-locked or purchased with stolen payment methods. We mark keyshop offers clearly and let you disable them entirely in settings.'],
['What is a historical low?', 'A historical low (all-time low) is the lowest price ever recorded for a game on GG.deals. We highlight deals that reach this price with a special "New HL" badge so you know when a deal is truly exceptional.'],
['How does the deal rating work?', 'The deal rating compares the current best price to the game\'s historical low. Deals within 15% of the all-time low get a "Hot" rating, within 40% get "Good", and further away get "Fair" or "High price".'],
['What is a voucher code?', 'Voucher codes are discount codes offered by stores. We list active vouchers on the Vouchers page — copy the code and apply it at checkout to save extra on top of the listed price.'],
['How do I activate a CD key?', 'After buying a key, open the corresponding store client (Steam, GOG, Epic, etc.), go to "Activate a Product" or "Redeem Code", and enter the key. Each platform has a dedicated tutorial on our site.'],
['Can I import my game collection?', 'Yes! Create a free account and connect your Steam profile to automatically track which games you own, plus mark games as owned, wishlisted or ignored for better filtering.'],
['Does GG.deals have an API?', 'Yes — our Game Prices API lets you retrieve the lowest prices by Steam App ID for any game we track. See the API page for documentation and a live demo.'],
];
foreach ($faqs as $i => [$q, $a]): ?>
<div class="bg-card border border-line rounded-xl overflow-hidden">
<button @click="open = open === <?= $i ?> ? null : <?= $i ?>" class="w-full flex items-center justify-between px-5 py-4 text-left hover:bg-elev/50 transition-colors">
<span class="text-[15px] font-semibold text-zinc-100"><?= esc($q) ?></span>
<svg class="w-4 h-4 text-muted transition-transform" :class="open === <?= $i ?> ? 'rotate-180' : ''" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg>
</button>
<div x-show="open === <?= $i ?>" x-cloak class="px-5 pb-4">
<p class="text-sm text-muted leading-relaxed"><?= esc($a) ?></p>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<div class="bg-panel border border-line rounded-2xl p-6 max-w-3xl">
<h2 class="text-sm font-bold text-zinc-200 uppercase tracking-wider mb-4">Tutorials</h2>
<div class="grid sm:grid-cols-2 gap-2.5">
<?php foreach (['activate-steam', 'activate-gog', 'activate-epic', 'activate-origin', 'activate-uplay', 'keyshops-risks'] as $t): ?>
<a href="/page/<?= $t ?>" class="flex items-center gap-3 bg-card border border-line rounded-xl px-4 py-3 hover:border-accent/40 transition-colors group">
<span class="text-lg">📖</span>
<span class="text-sm font-semibold text-zinc-100 group-hover:text-accent"><?= ucwords(str_replace('-', ' ', $t)) ?></span>
</a>
<?php endforeach; ?>
</div>
</div>
<?= $this->endSection() ?>