Compare commits

..

No commits in common. "main" and "no-ssr" have entirely different histories.
main ... no-ssr

51 changed files with 136 additions and 1813 deletions

View File

@ -1,5 +0,0 @@
---
"ottawa-boardgame-sell-bgg": minor
---
feat: add a title to the page

View File

@ -1,5 +0,0 @@
---
"ottawa-boardgame-sell-bgg": minor
---
feat: add empty-state progress loader

View File

@ -1,5 +0,0 @@
---
"ottawa-boardgame-sell-bgg": minor
---
feat: add neighbourhoods

View File

@ -1,5 +0,0 @@
---
"ottawa-boardgame-sell-bgg": minor
---
feat: lazy-load thumbnails (#22)

View File

@ -1,5 +0,0 @@
---
"ottawa-boardgame-sell-bgg": minor
---
maint: read the games from a json file

View File

@ -1,5 +0,0 @@
---
"ottawa-boardgame-sell-bgg": minor
---
add a top menu

View File

@ -1,5 +0,0 @@
---
"ottawa-boardgame-sell-bgg": minor
---
feat: be smarter when updating games

1
.envrc
View File

@ -1,2 +1 @@
export DATABASE_URL=sqlite3:./games.db
export VITE_DB_DIR=/dev/

View File

@ -6,34 +6,6 @@ vars:
GREETING: Hello, World!
tasks:
is-clean: git is-clean
integrate:
deps: [is-clean, test]
cmds:
- git checkout main
- git weld - --no-edit
test:unit:
cmds:
- vitest run
test:
deps: [test:unit, test:e2e]
preview:
deps: [build]
cmds:
- npm exec vite preview
test:e2e:
deps: [build]
cmds:
- npm exec playwright test
export-db:
cmds:
- sqlite3 /home/bggsell/games.db '.mode json' '.once /home/bggsell/db/games.json' 'select * from game'
- sqlite3 /home/bggsell/games.db '.mode json' '.once /home/bggsell/db/sellers.json' 'select * from bgg_user'
export-db:dev:
cmds:
- sqlite3 games.db '.mode json' '.once static/dev/games.json' 'select * from game'
- sqlite3 games.db '.mode json' '.once static/dev/sellers.json' 'select * from bgg_user'
deploy:
deps: [build]
cmds:

View File

@ -17,7 +17,4 @@ server {
location / {
try_files $uri $uri/ $uri.html /index.html =404;
}
location /db/ {
alias /home/bggsell/db/;
}
}

View File

@ -1,11 +0,0 @@
-- migrate:up
alter table bgg_user add column "neighbourhood" text;
insert into bgg_user (username) values ("jmarkmoss");
update bgg_user set neighbourhood="Bells Corners" where username = "yenzie";
-- migrate:down
alter table bgg_user drop column "neighbourhood";

View File

@ -1,8 +0,0 @@
-- migrate:up
insert into bgg_user (username,neighbourhood) VALUES ('ck13','Hintonburg');
-- migrate:down
delete from bgg_user where username = 'ck13';

View File

@ -1,6 +0,0 @@
-- migrate:up
update bgg_user set neighbourhood = 'Beacon Hill' where username = 'gamingduo2';
-- migrate:down

View File

@ -1,7 +0,0 @@
-- migrate:up
insert into bgg_user ( username, neighbourhood )
VALUES( 'Jillybean5001', 'Kemptville');
-- migrate:down

View File

@ -1,7 +1,7 @@
CREATE TABLE IF NOT EXISTS "schema_migrations" (version varchar(255) primary key);
CREATE TABLE bgg_user (
username text primary key
, "neighbourhood" text);
);
CREATE TABLE game (
id integer primary key,
username text,
@ -17,8 +17,4 @@ INSERT INTO "schema_migrations" (version) VALUES
('20240130203603'),
('20240130205124'),
('20240201201248'),
('20240204153045'),
('20240205142447'),
('20240206141649'),
('20240211024145'),
('20240211153145');
('20240204153045');

View File

@ -1,26 +0,0 @@
import { test, expect } from '@playwright/test';
test('hide game', async ({ page }) => {
await page.goto('/');
let nbr_games = 0;
await expect(async () => {
nbr_games = await page
.locator('.game')
.all()
.then((games) => games.length);
expect(nbr_games).toBeGreaterThan(0);
}).toPass();
await page.getByRole('button', { name: 'visibility' }).first().click();
await expect(async () => {
const one_hidden = await page
.locator('.game')
.all()
.then((games) => games.length);
expect(one_hidden).toEqual(nbr_games - 1);
}).toPass({ timeout: 10_000 });
});

View File

@ -1,12 +0,0 @@
import { expect, test } from '@playwright/test';
for (const url of ['/', '/stats/', '/about/', '/cart/']) {
test(url + ' render', async ({ page }) => {
await page.goto(url);
await expect(
page.getByRole('heading', {
name: 'Ottawa board games for sale and trade',
}),
).toBeVisible();
});
}

View File

@ -1,104 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:serif="http://www.serif.com/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1200pt"
height="1200pt"
version="1.1"
viewBox="0 0 1200 1200"
id="svg4"
sodipodi:docname="favicon.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
inkscape:export-filename="/home/yanick/work/javascript/ottawa-boardgame-sell-bgg/favicon/favicon.png"
inkscape:export-xdpi="3.8399999"
inkscape:export-ydpi="3.8399999">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1084"
inkscape:window-height="807"
id="namedview6"
showgrid="false"
inkscape:zoom="0.1475"
inkscape:cx="1719.5047"
inkscape:cy="800"
inkscape:window-x="145"
inkscape:window-y="84"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<path
d="m1199.9 516.23c6.9375-165.09-388.25-245.46-405.37-264.28-8.5312-9.3555 19.801-252.13-194.53-251.95-214.33-0.17969-186.01 242.59-194.54 251.95-17.125 18.816-412.29 99.191-405.36 264.28 6.9102 165.1 216.61 80.305 261.34 128.89 39.121 42.527-183.35 314.75-208.23 487.61-8.1133 56.336 7.7266 67.27 62.48 67.27 99.312 0 194.12-0.058594 281.44-0.058594 39.445 0 53.473-22.668 73.824-53.902 45.047-69.148 99.453-180.29 129.06-180.28 29.594-0.011719 84.012 111.13 129.06 180.27 20.352 31.246 34.367 53.902 73.812 53.902 87.301 0 182.12 0.058593 281.44 0.058593 54.758 0 70.609-10.934 62.484-67.273-24.875-172.86-247.33-445.08-208.23-487.61 44.723-48.574 254.45 36.219 261.34-128.88z"
fill-rule="evenodd"
id="path2"
style="fill:#be0003;fill-opacity:1" />
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Layer 1"
style="display:inline">
<rect
serif:id="trading changer"
x="1288.6348"
y="76.701424"
width="1150.5254"
height="1150.5254"
style="fill:none;stroke-width:35.95391846"
id="rect12" />
<path
inkscape:connector-curvature="0"
d="m 853.24685,471.88905 -58.42019,58.44401 -0.98518,1.04287 c -0.81537,0.96812 -1.05301,1.19912 -1.80039,2.21818 -9.75929,13.75754 -1.39271,36.8396 16.50903,39.87136 7.97249,1.34859 16.32897,-1.45048 22.29046,-7.10805 L 932.77549,464.4498 c 4.96628,-5.24825 7.616,-12.12702 7.41212,-19.46435 -0.5095,-6.21637 -3.09116,-12.02508 -7.41212,-16.58546 L 830.84058,326.4669 c -0.91697,-0.86622 -1.12084,-1.09721 -2.10587,-1.91246 -11.08424,-8.81502 -29.73335,-5.96161 -37.47828,6.36921 -6.08723,9.68123 -4.43304,23.13304 3.56672,31.59136 l 58.4202,58.41855 H 303.19701 c -9.55547,1.07003 -18.75094,5.68135 -22.95634,14.41992 -4.9935,10.39459 -1.93629,23.8209 7.05881,30.97991 4.4568,3.56678 10.13985,4.91704 15.89753,5.55397 z m -488.5214,305.79926 h 550.04641 c 9.52836,-1.07005 18.75097,-5.68132 22.95635,-14.4199 2.20799,-4.63679 1.97038,-6.06348 2.51368,-11.05698 -0.33964,-1.88531 -0.44143,-3.79607 -0.6454,-5.68136 -1.25691,-3.59224 -2.54762,-7.26092 -4.9187,-10.21624 -3.59044,-4.50941 -8.71318,-7.69402 -14.26699,-8.94238 -1.8344,-0.43482 -3.77067,-0.43482 -5.656,-0.63863 H 364.70849 l 58.42027,-58.44401 c 0,0 7.69397,-9.91052 7.4121,-19.43888 0,-1.27384 0,-1.57956 -0.33969,-2.8534 -2.41181,-14.06326 -18.29254,-24.20307 -32.17564,-20.20319 -2.7515,0.78808 -5.37736,2.03814 -7.69398,3.69413 -1.15507,0.84245 -2.242,1.78338 -3.29501,2.7753 L 285.12883,734.17038 c -0.8832,0.94094 -1.12092,1.14477 -1.9023,2.14006 -7.1096,8.91692 -7.26261,22.69992 0,31.7697 0.78138,0.9919 1.0191,1.2229 1.9023,2.14004 l 101.90771,101.93307 c 0.95111,0.86626 1.15491,1.09727 2.13994,1.91239 13.47909,10.72586 37.78393,3.2849 41.01789,-15.66823 1.35879,-7.97419 -1.46077,-16.30522 -7.10647,-22.29219 z"
style="fill:#f9ffff;fill-opacity:1;fill-rule:nonzero;stroke-width:25.4769001"
id="path14" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2"
style="display:none">
<path
inkscape:connector-curvature="0"
d="m 753.00177,630.60031 c -1.2634,-5.24653 -5.9554,-8.93708 -11.3416,-8.93708 h -50.9987 V 546.6353 c 0,-30.12281 -24.508,-54.63003 -54.6308,-54.63003 h -70.2202 c -30.1228,0 -54.6294,24.50722 -54.6294,54.63003 v 75.02793 h -51 c -5.3862,0 -10.0742,3.69055 -11.3309,8.93708 l -67.5869,281.06022 c -2.7331,11.3509 0.012,22.662 7.9197,32.7062 12.9668,16.4579 39.29,27.5096 65.5228,27.5096 h 292.451 c 26.2222,0 52.5547,-11.0517 65.5215,-27.5096 7.9104,-10.0343 10.6435,-21.3454 7.9197,-32.6962 z M 534.50137,546.6353 c 0,-17.26567 14.0441,-31.30973 31.3091,-31.30973 h 70.2202 c 17.2665,0 31.3105,14.04406 31.3105,31.30973 v 75.02793 h -132.8398 z m 259.8546,383.28843 c -8.638,10.9619 -28.0482,18.6223 -47.2099,18.6223 h -292.4509 c -19.151,0 -38.5706,-7.6604 -47.2085,-18.6223 -3.4219,-4.3488 -4.5882,-8.5381 -3.5616,-12.8172 l 65.4431,-272.12301 h 41.8129 v 33.08523 c -12.359,4.7179 -21.1764,16.66733 -21.1764,30.66146 0,18.10367 14.733,32.83593 32.8359,32.83593 18.1043,0 32.8359,-14.73226 32.8359,-32.83593 0,-13.99413 -8.8174,-25.94356 -21.1751,-30.66146 v -33.08523 h 132.8398 v 33.08523 c -12.359,4.7179 -21.1765,16.66733 -21.1765,30.66146 0,18.10367 14.733,32.83593 32.836,32.83593 18.1043,0 32.8359,-14.73226 32.8359,-32.83593 0,-13.99413 -8.8174,-25.94356 -21.1751,-30.66146 v -33.08523 h 41.8129 l 65.4417,272.12301 c 1.0241,4.2791 -0.1463,8.4684 -3.5601,12.8172 z M 522.84057,699.21457 c 5.2465,0 9.5157,4.26911 9.5157,9.51564 0,5.24653 -4.2692,9.51564 -9.5157,9.51564 -5.2465,0 -9.5156,-4.26911 -9.5156,-9.51564 0,-5.24653 4.2691,-9.51564 9.5156,-9.51564 z m 156.1601,0 c 5.2465,0 9.5156,4.26911 9.5156,9.51564 0,5.24653 -4.2691,9.51564 -9.5156,9.51564 -5.2466,0 -9.5157,-4.26911 -9.5157,-9.51564 0,-5.24653 4.2691,-9.51564 9.5157,-9.51564 z m -78.08,-289.24919 c 92.5828,0 167.9006,-75.31711 167.9006,-167.89999 0,-92.58288 -75.3178,-167.899989 -167.9006,-167.899989 -92.5829,0 -167.8994,75.317109 -167.8994,167.899989 0,92.58288 75.3165,167.89999 167.8994,167.89999 z m 0,-312.479699 c 79.7264,0 144.5803,64.863869 144.5803,144.579709 0,79.72581 -64.8645,144.57972 -144.5803,144.57972 -79.7252,0 -144.5791,-64.86388 -144.5791,-144.57972 0,-79.72582 64.8539,-144.579709 144.5791,-144.579709 z m -11.6595,155.342149 v 55.74722 c -9.0875,-1.99489 -16.9965,-6.30385 -22.243,-12.34837 -4.2199,-4.85757 -11.5811,-5.38621 -16.4485,-1.16768 -4.8676,4.2192 -5.3863,11.58034 -1.1704,16.44788 9.4956,10.94197 23.8789,18.32307 39.8579,20.75683 v 10.09416 c 0,6.43351 5.216,11.66013 11.6594,11.66013 6.4435,0 11.6608,-5.21664 11.6608,-11.66013 v -10.10413 c 29.2146,-4.46855 51.3884,-25.39496 51.3884,-50.48072 0,-25.08574 -22.1738,-46.01215 -51.3884,-50.4807 v -55.74723 c 9.0861,1.99489 16.9965,6.30386 22.243,12.34838 4.2186,4.86753 11.5798,5.3862 16.4473,1.16766 4.8675,-4.21918 5.3862,-11.58033 1.1703,-16.44786 -9.4956,-10.94198 -23.8788,-18.31311 -39.8578,-20.75685 v -10.09414 c 0,-6.43353 -5.2173,-11.66013 -11.6608,-11.66013 -6.4436,0 -11.6595,5.21663 -11.6595,11.66013 v 10.10412 c -29.2052,4.46856 -51.3884,25.39496 -51.3884,50.48071 0,25.08576 22.1832,46.01216 51.3884,50.48072 z m 51.3884,28.95583 c 0,12.35836 -12.0093,23.16069 -28.0681,26.77144 v -53.54287 c 16.0588,3.61076 28.0681,14.41309 28.0681,26.77143 z m -51.3884,-106.19801 v 53.54287 c -16.0588,-3.61075 -28.0681,-14.41309 -28.0681,-26.77143 0,-12.35835 12.0093,-23.16069 28.0681,-26.77144 z M 1043.5071,454.36167 889.77157,334.72807 c -3.5217,-2.733 -8.2788,-3.22175 -12.2792,-1.27673 -3.9992,1.955 -6.5326,6.02457 -6.5326,10.47318 v 56.24594 h -154.8634 c -6.4343,0 -11.6608,5.21665 -11.6608,11.66015 v 103.44503 c 0,6.43357 5.2172,11.6602 11.6608,11.6602 h 154.8634 v 56.24596 c 0,4.44857 2.5334,8.51819 6.5326,10.47316 1.6264,0.79795 3.3819,1.18633 5.1175,1.18633 2.5428,0 5.0763,-0.83788 7.1617,-2.45381 l 153.73553,-119.6236 c 2.8434,-2.20435 4.4992,-5.60565 4.4992,-9.19644 0,-3.59081 -1.6558,-7.00207 -4.4992,-9.20642 z M 894.26927,559.34276 v -44.05711 c 0,-6.43358 -5.2159,-11.66009 -11.6594,-11.66009 h -154.8634 v -80.12484 h 154.8634 c 6.4328,0 11.6594,-5.21665 11.6594,-11.66014 V 367.78341 L 1017.3648,463.5681 Z M 497.40577,515.28565 V 411.83061 c 0,-6.43353 -5.216,-11.66015 -11.6595,-11.66015 h -154.8634 v -56.24594 c 0,-4.44861 -2.5335,-8.51818 -6.5339,-10.47318 -3.9991,-1.95499 -8.7669,-1.46625 -12.2778,1.27673 l -153.737,119.6336 c -2.8421,2.20436 -4.4978,5.60565 -4.4978,9.19646 0,3.5908 1.6557,6.99208 4.4978,9.19644 l 153.737,119.62361 c 2.0839,1.62582 4.6174,2.45369 7.1615,2.45369 1.7449,0 3.4911,-0.38825 5.1163,-1.18621 4.0004,-1.95508 6.5339,-6.02458 6.5339,-10.47316 v -56.24595 h 154.8634 c 6.4435,0.0119 11.6595,-5.20673 11.6595,-11.64019 z m -23.3097,-11.66009 h -154.874 c -6.4328,0 -11.6595,5.21662 -11.6595,11.66009 v 44.05711 l -123.0847,-95.78463 123.094,-95.7847 v 44.05718 c 0,6.43351 5.2174,11.66013 11.6608,11.66013 h 154.8634 z"
id="path1517"
style="fill:#be0003;fill-opacity:1;stroke-width:9.97445393" />
<text
style="font-weight:bold;font-size:49.87227249px;font-family:'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif;fill:#be0003;fill-opacity:1;stroke-width:9.97445393"
x="1469.6041"
y="1248.0165"
font-size="5px"
font-weight="bold"
id="text1519">Created by miftahul huda</text>
<text
style="font-weight:bold;font-size:49.87227249px;font-family:'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif;fill:#be0003;fill-opacity:1;stroke-width:9.97445393"
x="1469.6041"
y="1297.8888"
font-size="5px"
font-weight="bold"
id="text1521">from the Noun Project</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@ -1 +0,0 @@
Trade by Bombasticon Studio from <a href="https://thenounproject.com/browse/icons/term/trade/" target="_blank" title="Trade Icons">Noun Project</a> (CC BY 3.0)

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1200pt" height="1200pt" version="1.1" viewBox="0 0 1200 1200" xmlns="http://www.w3.org/2000/svg">
<path d="m1199.9 516.23c6.9375-165.09-388.25-245.46-405.37-264.28-8.5312-9.3555 19.801-252.13-194.53-251.95-214.33-0.17969-186.01 242.59-194.54 251.95-17.125 18.816-412.29 99.191-405.36 264.28 6.9102 165.1 216.61 80.305 261.34 128.89 39.121 42.527-183.35 314.75-208.23 487.61-8.1133 56.336 7.7266 67.27 62.48 67.27 99.312 0 194.12-0.058594 281.44-0.058594 39.445 0 53.473-22.668 73.824-53.902 45.047-69.148 99.453-180.29 129.06-180.28 29.594-0.011719 84.012 111.13 129.06 180.27 20.352 31.246 34.367 53.902 73.812 53.902 87.301 0 182.12 0.058593 281.44 0.058593 54.758 0 70.609-10.934 62.484-67.273-24.875-172.86-247.33-445.08-208.23-487.61 44.723-48.574 254.45 36.219 261.34-128.88z" fill-rule="evenodd"/>
</svg>

Before

Width:  |  Height:  |  Size: 864 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:serif="http://www.serif.com/" viewBox="0 0 32 40" version="1.1" xml:space="preserve" style="" x="0px" y="0px" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.41421"><rect serif:id="trading changer" x="0" y="0" width="32" height="32" style="" fill="none"/><path d="M25.585,11.002l-2.293,2.294l-0.039,0.041c-0.032,0.038 -0.041,0.047 -0.07,0.087c-0.383,0.54 -0.055,1.446 0.648,1.565c0.313,0.053 0.641,-0.057 0.875,-0.279l4.001,-4c0.195,-0.206 0.299,-0.476 0.291,-0.764c-0.02,-0.244 -0.122,-0.472 -0.291,-0.651l-4.001,-4.001c-0.036,-0.034 -0.044,-0.043 -0.083,-0.075c-0.435,-0.346 -1.167,-0.234 -1.471,0.25c-0.239,0.38 -0.174,0.908 0.14,1.24l2.293,2.293l-21.59,0c-0.375,0.042 -0.736,0.223 -0.901,0.566c-0.196,0.408 -0.076,0.935 0.277,1.216c0.175,0.14 0.398,0.193 0.624,0.218l21.59,0Zm-19.175,12.003l21.59,0c0.374,-0.042 0.736,-0.223 0.901,-0.566c0.087,-0.182 0.077,-0.238 0.099,-0.434c-0.008,-0.074 -0.017,-0.149 -0.025,-0.223c-0.05,-0.141 -0.1,-0.285 -0.193,-0.401c-0.141,-0.177 -0.342,-0.302 -0.56,-0.351c-0.072,-0.017 -0.148,-0.017 -0.222,-0.025l-21.59,0l2.293,-2.294c0,0 0.302,-0.389 0.291,-0.763c-0.004,-0.05 -0.004,-0.062 -0.012,-0.112c-0.094,-0.552 -0.718,-0.95 -1.263,-0.793c-0.108,0.031 -0.211,0.08 -0.302,0.145c-0.046,0.033 -0.088,0.07 -0.129,0.109l-4,4c-0.035,0.037 -0.044,0.045 -0.075,0.084c-0.279,0.35 -0.285,0.891 0,1.247c0.031,0.039 0.04,0.048 0.075,0.084l4,4.001c0.037,0.034 0.045,0.043 0.084,0.075c0.529,0.421 1.483,0.129 1.61,-0.615c0.053,-0.313 -0.058,-0.64 -0.279,-0.875l-2.293,-2.293Z" style="" fill-rule="nonzero"/><text x="0" y="47" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by Bombasticon Studio</text><text x="0" y="52" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 96 120" style="enable-background:new 0 0 96 96;" xml:space="preserve"><path d="M63.247,58.786C63.12,58.26,62.65,57.89,62.11,57.89h-5.113v-7.522c0-3.02-2.457-5.477-5.477-5.477h-7.04 c-3.02,0-5.477,2.457-5.477,5.477v7.522H33.89c-0.54,0-1.01,0.37-1.136,0.896l-6.776,28.178c-0.274,1.138,0.001,2.272,0.794,3.279 c1.3,1.65,3.939,2.758,6.569,2.758h29.32c2.629,0,5.269-1.108,6.569-2.758c0.793-1.006,1.067-2.14,0.794-3.278L63.247,58.786z M41.341,50.368c0-1.731,1.408-3.139,3.139-3.139h7.04c1.731,0,3.139,1.408,3.139,3.139v7.522H41.341V50.368z M67.393,88.795 c-0.866,1.099-2.812,1.867-4.733,1.867H33.34c-1.92,0-3.867-0.768-4.733-1.867c-0.343-0.436-0.46-0.856-0.357-1.285l6.561-27.282 h4.192v3.317c-1.239,0.473-2.123,1.671-2.123,3.074c0,1.815,1.477,3.292,3.292,3.292s3.292-1.477,3.292-3.292 c0-1.403-0.884-2.601-2.123-3.074v-3.317h13.318v3.317c-1.239,0.473-2.123,1.671-2.123,3.074c0,1.815,1.477,3.292,3.292,3.292 s3.292-1.477,3.292-3.292c0-1.403-0.884-2.601-2.123-3.074v-3.317h4.192L67.75,87.51C67.853,87.939,67.736,88.359,67.393,88.795z M40.172,65.665c0.526,0,0.954,0.428,0.954,0.954c0,0.526-0.428,0.954-0.954,0.954s-0.954-0.428-0.954-0.954 C39.218,66.093,39.646,65.665,40.172,65.665z M55.828,65.665c0.526,0,0.954,0.428,0.954,0.954c0,0.526-0.428,0.954-0.954,0.954 s-0.954-0.428-0.954-0.954C54.874,66.093,55.302,65.665,55.828,65.665z M48,36.666c9.282,0,16.833-7.551,16.833-16.833 S57.282,3,48,3s-16.833,7.551-16.833,16.833S38.718,36.666,48,36.666z M48,5.338c7.993,0,14.495,6.503,14.495,14.495 c0,7.993-6.503,14.495-14.495,14.495c-7.993,0-14.495-6.503-14.495-14.495C33.505,11.84,40.007,5.338,48,5.338z M46.831,20.912 v5.589c-0.911-0.2-1.704-0.632-2.23-1.238c-0.423-0.487-1.161-0.54-1.649-0.117c-0.488,0.423-0.54,1.161-0.117,1.649 c0.952,1.097,2.394,1.837,3.996,2.081v1.012c0,0.645,0.523,1.169,1.169,1.169s1.169-0.523,1.169-1.169v-1.013 c2.929-0.448,5.152-2.546,5.152-5.061s-2.223-4.613-5.152-5.061v-5.589c0.911,0.2,1.704,0.632,2.23,1.238 c0.423,0.488,1.161,0.54,1.649,0.117c0.488-0.423,0.54-1.161,0.117-1.649c-0.952-1.097-2.394-1.836-3.996-2.081V9.777 c0-0.645-0.523-1.169-1.169-1.169s-1.169,0.523-1.169,1.169v1.013c-2.928,0.448-5.152,2.546-5.152,5.061 C41.679,18.366,43.903,20.464,46.831,20.912z M51.983,23.815c0,1.239-1.204,2.322-2.814,2.684v-5.368 C50.779,21.493,51.983,22.576,51.983,23.815z M46.831,13.168v5.368c-1.61-0.362-2.814-1.445-2.814-2.684 C44.017,14.613,45.221,13.53,46.831,13.168z M92.372,41.117L76.959,29.123c-0.353-0.274-0.83-0.323-1.231-0.128 c-0.401,0.196-0.655,0.604-0.655,1.05v5.639H59.547c-0.645,0-1.169,0.523-1.169,1.169v10.371c0,0.645,0.523,1.169,1.169,1.169 h15.526v5.639c0,0.446,0.254,0.854,0.655,1.05c0.163,0.08,0.339,0.119,0.513,0.119c0.255,0,0.509-0.084,0.718-0.246l15.413-11.993 c0.285-0.221,0.451-0.562,0.451-0.922S92.657,41.338,92.372,41.117z M77.41,51.642v-4.417c0-0.645-0.523-1.169-1.169-1.169H60.715 v-8.033h15.526c0.645,0,1.169-0.523,1.169-1.169v-4.417l12.341,9.603L77.41,51.642z M37.622,47.225V36.853 c0-0.645-0.523-1.169-1.169-1.169H20.927v-5.639c0-0.446-0.254-0.854-0.655-1.05c-0.401-0.196-0.879-0.147-1.231,0.128L3.628,41.117 c-0.285,0.221-0.451,0.562-0.451,0.922s0.166,0.701,0.451,0.922l15.413,11.993c0.209,0.163,0.463,0.246,0.718,0.246 c0.175,0,0.35-0.039,0.513-0.119c0.401-0.196,0.655-0.604,0.655-1.05v-5.639h15.526C37.099,48.393,37.622,47.87,37.622,47.225z M35.285,46.056H19.758c-0.645,0-1.169,0.523-1.169,1.169v4.417L6.249,42.039l12.341-9.603v4.417c0,0.645,0.523,1.169,1.169,1.169 h15.526V46.056z"/><text x="0" y="111" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">Created by miftahul huda</text><text x="0" y="116" fill="#000000" font-size="5px" font-weight="bold" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif">from the Noun Project</text></svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -16,8 +16,9 @@
},
"devDependencies": {
"@changesets/cli": "^2.27.1",
"@playwright/test": "^1.41.2",
"@sveltejs/kit": "^2.5.0",
"@playwright/test": "^1.28.1",
"@sveltejs/adapter-auto": "^3.0.0",
"@sveltejs/kit": "^2.0.0",
"@sveltejs/vite-plugin-svelte": "^3.0.0",
"@types/eslint": "8.56.0",
"eslint": "^8.56.0",
@ -33,15 +34,12 @@
},
"type": "module",
"dependencies": {
"@sveltejs/adapter-node": "^4.0.1",
"@sveltejs/adapter-static": "^3.0.1",
"@vincjo/datatables": "^1.14.4",
"@yanick/updeep-remeda": "^2.2.0",
"beercss": "^3.4.13",
"better-sqlite3": "^9.3.0",
"cheerio": "1.0.0-rc.12",
"node-fetch": "^3.3.2",
"remeda": "^1.40.1",
"svelte-persisted-store": "^0.9.0",
"vite-multiple-assets": "^1.2.10"
"node-fetch": "^3.3.2"
}
}

View File

@ -1,12 +1,11 @@
/** @type {import('@playwright/test').PlaywrightTestConfig} */
const config = {
webServer: {
command: 'npm exec vite preview',
port: 4173,
reuseExistingServer: true,
command: 'npm run build && npm run preview',
port: 4173
},
testDir: 'e2e',
testMatch: /(.+\.)?(test|spec)\.[jt]s/,
testDir: 'tests',
testMatch: /(.+\.)?(test|spec)\.[jt]s/
};
export default config;

View File

@ -77,48 +77,15 @@ export async function update_user_games(db, username) {
'INSERT into game (username, bgg_id, name, thumbnail, notes,price,updated_at) VALUES(@username,@bgg_id,@name,@thumbnail,@notes,@price,@updated_at)',
);
const update = db.prepare(
'UPDATE game set notes=@notes, price=@price, updated_at=@updated_at where username=@username and bgg_id=@bgg_id',
);
const game_present = db.prepare(
'SELECT notes, price from game where username = ? AND bgg_id = ?',
);
const already_there = games
.map(({ bgg_id }) => bgg_id)
.map((id) => `'${id}'`)
.join(',');
await db
.prepare(
`DELETE FROM game where username = @username AND bgg_id not in (${already_there})`,
)
.run({
username,
});
.prepare('DELETE FROM game where username = @username')
.run({ username });
for (let game of games) {
const existing_game = game_present.get(username, game.bgg_id);
if (existing_game) {
if (
['notes', 'price'].some(
(attr) => existing_game[attr] != game[attr],
)
) {
console.log(game.name, 'updating game');
update.run({
...game,
updated_at,
username,
});
}
} else {
console.log(game.name, 'new game!');
insert.run({
username,
updated_at,
...game,
});
}
}
}

View File

@ -1,13 +0,0 @@
<a target="_blank" {href}>{username}</a>
<script>
export let username;
$: href = `https://boardgamegeek.com/collection/user/${username}?trade=1&subtype=boardgame&ff=1`;
</script>
<style>
a {
color: var(--primary);
text-decoration: underline;
}
</style>

View File

@ -1,15 +0,0 @@
export default function clickOutside(node) {
const handleClick = (event) => {
if (node && !node.contains(event.target) && !event.defaultPrevented) {
node.dispatchEvent(new CustomEvent('click_outside', node));
}
};
document.addEventListener('click', handleClick, true);
return {
destroy() {
document.removeEventListener('click', handleClick, true);
},
};
}

View File

@ -1,65 +0,0 @@
import { readable, writable, derived } from 'svelte/store';
import { dev, browser } from '$app/environment';
import u from '@yanick/updeep-remeda';
const prefix = import.meta.env.VITE_DB_DIR ?? '/db/';
console.log({ prefix });
const _games_store = readable([], (set) => {
if (!browser) return;
fetch(prefix + 'games.json')
.then((doc) => doc.json())
.then((games) =>
games.map((game) => ({
...game,
id: [game.username, game.bgg_id].join('!'),
})),
)
.then(set);
});
export const sellers_store = readable({}, (set) => {
if (!browser) return;
fetch(prefix + 'sellers.json')
.then((doc) => doc.json())
.then((sellers_list) =>
set(
Object.fromEntries(
sellers_list.map((seller) => [seller.username, seller]),
),
),
);
});
let stored = localStorage.getItem('games_hidden');
if (stored) stored = JSON.parse(stored);
const games_hidden_store = writable(stored || {});
games_hidden_store.subscribe((data) =>
localStorage.setItem('games_hidden', JSON.stringify(data)),
);
let cart_store_stored = localStorage.getItem('cart');
if (cart_store_stored) cart_store_stored = JSON.parse(cart_store_stored);
export const cart_store = writable(cart_store_stored || {});
cart_store.subscribe((data) =>
localStorage.setItem('cart', JSON.stringify(data)),
);
export const games_store = derived(
[_games_store, games_hidden_store, cart_store],
([$games, $hidden, $cart]) =>
$games.map((game) => ({
...game,
is_hidden: $hidden[game.id],
is_in_cart: $cart[game.id],
})),
);
games_store.toggle_hidden = (id) => {
games_hidden_store.update(u.updateIn(id, (v) => !v));
};
games_store.toggle_cart = (id) => {
cart_store.update(u.updateIn(id, (v) => !v));
};

View File

@ -1,2 +1 @@
export const prerender = true;
export const ssr = false;

View File

@ -1,36 +1,9 @@
<svelte:head>
<title>Ottawa board games, trades and sales</title>
</svelte:head>
<main class="responsive">
<AppTop cart={$cart_store} />
<slot />
</main>
<script>
import 'beercss/dist/cdn/beer.min.css';
// import 'beercss/dist/cdn/beer.min.js';
import { setContext } from 'svelte';
import { dev, browser } from '$app/environment';
import { readable, writable } from 'svelte/store';
import { persisted } from 'svelte-persisted-store';
import u from '@yanick/updeep-remeda';
import AppTop from './AppTop.svelte';
import {
games_store,
sellers_store,
cart_store,
} from '$lib/stores/index.js';
setContext('games', games_store);
setContext('sellers', sellers_store);
setContext('cart', cart_store);
import "beercss/dist/cdn/beer.min.css";
//import beercss from "./dist/cdn/beer.min.js";
</script>
<style>
:global(:root) {
--font-size-10: 1rem;
--font-size-11: 1.5rem;
--font-size-12: 1.75rem;
--font-size-13: 2rem;
--font-size-14: 2.25rem;
}
</style>
<main class="responsive">
<slot/>
</main>

View File

@ -0,0 +1,12 @@
import DB from 'better-sqlite3';
const db_file = process.env.DATABASE_URL.replace('sqlite3:','');
export async function load() {
const db = DB(db_file);
db.pragma('journal_mode = WAL');
return {
games: db.prepare( 'SELECT * from game').all()
};
}

View File

@ -1,28 +1,43 @@
<article>
{#if $games.length == 0}
<div class="medium-height middle-align center-align">
<div class="center-align">
<progress class="circle"></progress>
<h1>Ottawa board games for sale and to trade</h1>
<h5>gathering games...</h5>
</div>
</div>
{:else}
<GameList
games={$games}
sellers={$sellers}
on:toggle_game_visibility={({ detail }) =>
games.toggle_hidden(detail)}
on:toggle_cart={({ detail }) => games.toggle_cart(detail)} />
{/if}
<p>
This is a list of games for sale or trade of people living in the Ottawa
region, taken from their profiles on
<a href="https://boardgamegeek.com">Board Game Geek</a>.
</p>
<p>
If you want to be added to the list of sellers, you can send me a
<a
target="_blank"
href="https://boardgamegeek.com/geekmail/compose?touser=yenzie">
BGG mail</a
>. All I need is your BGG username, and I'll be able to gather all your
games tagged <em>For Trade</em>. If there is a price mentioned in the
<em>Trading Notes</em>
of the game (that is, any number prefixed with a <em>$</em>), it'll be
assumed to be the asking price.
</p>
<p>
Have questions, suggestions, anything else? Discussion of this service
happens in the <a
href="https://boardgamegeek.com/thread/3238117/auto-generating-ottawa-specific-saletrade-page"
>Ottawa Guild</a
>.
</p>
<GameList games={data.games} />
</article>
<script>
import { getContext } from 'svelte';
// TODO hide games I'm not interested in
// TODO add cart
// TODO prettify via beercss
import GameList from './GameList.svelte';
const games = getContext('games');
const sellers = getContext('sellers');
export let data;
function pretty_date(date) {
if (!date) return '';
@ -32,6 +47,13 @@
</script>
<style>
:global(:root) {
--font-size-10: 1rem;
--font-size-11: 1.5rem;
--font-size-12: 1.75rem;
--font-size-13: 2rem;
--font-size-14: 2.25rem;
}
p {
font-size: var(--font-size-10);
max-width: 60em;

View File

@ -1,70 +0,0 @@
<header>
<nav>
<button
class="circle transparent"
on:click={() => (show_menu = !show_menu)}>
<i>menu</i>
</button>
<h5 class="max left-align">
<a href="/">Ottawa board games for sale and trade</a>
</h5>
<a class="" href="/cart/">
{#if cart_size}
<span class="badge circle">{cart_size}</span>
{/if}
<i>shopping_cart</i></a>
</nav>
</header>
<dialog
class="left primary-container"
open={show_menu}
use:clickOutside
on:click_outside={() => (show_menu = false)}>
<nav class="drawer primary-container">
<header></header>
<a href="/" on:click={hide_menu}>
<i>list</i>
<span class="max">listing</span>
</a>
<a href="/sellers" on:click={hide_menu}>
<i>list</i>
<span class="max">listing by sellers</span>
</a>
<a href="/cart/" on:click={hide_menu}>
<i>shopping_cart</i>
<span>cart</span>
</a>
<a href="/stats/" on:click={hide_menu}>
<i>numbers</i>
<span>stats</span>
</a>
<a href="/about/" on:click={hide_menu}>
<i>question_mark</i>
<span>about</span>
</a>
<a class="backsie" on:click={hide_menu}>
<i>arrow_back</i>
<span class="max">back</span>
</a>
</nav>
</dialog>
<script>
import clickOutside from '$lib/directives/clickOutside.js';
let show_menu = false;
const hide_menu = () => (show_menu = false);
export let cart = [];
$: cart_size = Object.values(cart).filter((x) => x).length;
</script>
<style>
.backsie {
margin-top: 2em;
}
dialog {
font-size: var(--font-size-10);
}
</style>

View File

@ -1,145 +0,0 @@
<div
transition:slide={{ delay: 250, duration: 300 }}
class:hidden={is_hidden}
class="game">
<div class="grid top-align">
<div class="s12 m2">
<a
target="_blank"
href={`https://boardgamegeek.com/boardgame/${bgg_id}`}>
<img alt="" loading="lazy" src={thumbnail} height="80" /></a>
</div>
<div class="grid s12 m10">
<div class="s8 left-align">
<div class="max">
{#if is_in_cart}
<i class="star">star</i>
{/if}
<strong>
<a
name={id}
class="game-desc"
target="_blank"
href={`https://boardgamegeek.com/boardgame/${bgg_id}`}>
{name}</a>
</strong>
&nbsp; &nbsp; &nbsp;
<a href={`https://bgg.babyl.ca/#${id}`}><i>link</i></a>
</div>
</div>
<div class="s3">
<div>
<a
target="_blank"
href={`https://boardgamegeek.com/collection/user/${username}?trade=1&subtype=boardgame&ff=1`}
>{username}</a>
&nbsp;
<a
target="_blank"
href={`https://boardgamegeek.com/geekmail/compose?touser=${username}`}>
<i>email</i></a>
</div>
<div class="neighbourhood">
{seller?.neighbourhood ?? ''}
</div>
</div>
<div class="s1 right-align">
{price ? '$' + price : ''}
</div>
<div class="notes s8">
{notes}
</div>
<div class="s4 updated-at">
{#if updated_at}
{pretty_date(updated_at)}
{/if}
</div>
<div class="s1"></div>
<div class="s11 actions">
<button on:click={toggle_cart}
><i>
{#if is_in_cart}
remove_shopping_cart{:else}
add_shopping_cart
{/if}
</i></button>
<button title="hide game" on:click={toggle_game_visibility}
>{#if is_hidden}<i>visibility_off</i>{:else}
<i>visibility</i>
{/if}
</button>
</div>
</div>
</div>
</div>
<script>
// TODO show cart icon with badge
// show cart page
// cart store
import { createEventDispatcher } from 'svelte';
import { slide, fade } from 'svelte/transition';
export let username = '';
export let name = '';
export let is_hidden = false;
export let bgg_id = '';
export let thumbnail = '';
export let seller = {};
export let price = null;
export let notes = '';
export let updated_at = null;
export let is_in_cart = false;
export let id = '';
function pretty_date(date) {
if (!date) return '';
return date.replace(/T.*/, '');
}
const dispatch = createEventDispatcher();
const toggle_game_visibility = () => dispatch('toggle_visibility');
const toggle_cart = () => dispatch('toggle_cart');
</script>
<style>
a {
color: var(--primary);
text-decoration: underline;
}
.grid {
margin-right: 2em;
font-size: var(--font-size-10);
}
.notes {
margin-top: 1em;
margin-left: 1em;
}
.updated-at {
font-size: smaller;
text-align: left;
}
.updated-at::before {
content: 'last update: ';
}
.neighbourhood {
font-size: smaller;
}
.hidden {
opacity: 60%;
}
.actions {
margin-top: 1em;
display: flex;
justify-content: end;
}
.actions button {
margin: 0.5em 2em 0em 1em;
}
.star {
color: darkorange;
font-size: var(--font-size-12);
}
</style>

View File

@ -1,51 +1,58 @@
<div class="options">
<label class="switch icon">
<input type="checkbox" bind:checked={show_hidden} />
<span> show hidden </span>
</label>
<div class="field label prefix border">
<i>search</i>
<input type="text" bind:value={search_text} />
<label>Search</label>
</div>
</div>
<div class="games">
{#each games.filter((game) => {
if (search_text.length < 3) return true;
const target = search_text.toLowerCase();
return game.name.toLowerCase().includes(target) || game.username
.toLowerCase()
.includes(target);
}) as game}
{#if show_hidden || !game.is_hidden}
<Game
on:toggle_visibility={() => toggle_visibility(game.id)}
on:toggle_cart={() => toggle_cart(game.id)}
{...game}
seller={sellers[game.username]} />
<div class="medium-divider"></div>
{#each games as game}
<div class="grid top-align">
<a
class="s12 m2"
target="_blank"
href={`https://boardgamegeek.com/boardgame/${game.bgg_id}`}>
<img src={game.thumbnail} height="80" /></a>
<div class="grid s12 m10">
<div class="s8 left-align">
<strong>
<a
class="game-desc"
target="_blank"
href={`https://boardgamegeek.com/boardgame/${game.bgg_id}`}>
{game.name}</a>
</strong>
</div>
<div class="s3">
<a
target="_blank"
href={`https://boardgamegeek.com/collection/user/${game.username}?trade=1&subtype=boardgame&ff=1`}
>{game.username}</a>
&nbsp;
<a
target="_blank"
href={`https://boardgamegeek.com/geekmail/compose?touser=${game.username}`}>
<i>email</i></a>
</div>
<div class="s1 right-align">
{game.price ? '$' + game.price : ''}
</div>
<div class="notes s8">{game.notes}</div>
{#if game.updated_at}
<div class="s4 updated-at">
{pretty_date(game.updated_at)}
</div>
{/if}
</div>
</div>
<div class="medium-divider"></div>
{/each}
</div>
<script>
import { getContext, createEventDispatcher } from 'svelte';
import Game from './Game.svelte';
export let games = [];
export let sellers = {};
let show_hidden = false;
let search_text = '';
const dispatch = createEventDispatcher();
const toggle_visibility = (id) => dispatch('toggle_game_visibility', id);
const toggle_cart = (id) => dispatch('toggle_cart', id);
export let games;
// add filter
// add sort (user, game, price)
function pretty_date(date) {
if (!date) return '';
return date.replace(/T.*/, '');
}
</script>
<style>
@ -71,21 +78,4 @@
.updated-at::before {
content: 'last update: ';
}
.neighbourhood {
font-size: smaller;
}
.hidden {
opacity: 60%;
}
.switch span {
font-size: var(--font-size-10);
padding-left: 1em;
}
.options {
display: flex;
flex-direction: row-reverse;
}
.options > div {
margin-right: 1em;
}
</style>

View File

@ -1,162 +0,0 @@
<div class="options">
<label class="switch icon">
<input type="checkbox" bind:checked={show_hidden} />
<span> show hidden </span>
</label>
<div class="field label prefix border">
<i>search</i>
<input type="text" bind:value={search_text} />
<label>Search</label>
</div>
</div>
<div class="games">
{#each games.filter((game) => {
if (search_text.length < 3) return true;
const target = search_text.toLowerCase();
return game.name.toLowerCase().includes(target) || game.username
.toLowerCase()
.includes(target);
}) as game}
<<<<<<< HEAD
{#if show_hidden || !game.is_hidden}
<div
transition:slide={{ delay: 250, duration: 300 }}
class:hidden={game.is_hidden}>
<div class="grid top-align">
<a
class="s12 m2"
target="_blank"
href={`https://boardgamegeek.com/boardgame/${game.bgg_id}`}>
<img
loading="lazy"
src={game.thumbnail}
height="80" /></a>
<div class="grid s12 m10">
<div class="s8 left-align">
<strong>
<a
class="game-desc"
target="_blank"
href={`https://boardgamegeek.com/boardgame/${game.bgg_id}`}>
{game.name}</a>
</strong>
</div>
<div class="s3">
<div>
<a
target="_blank"
href={`https://boardgamegeek.com/collection/user/${game.username}?trade=1&subtype=boardgame&ff=1`}
>{game.username}</a>
&nbsp;
<a
target="_blank"
href={`https://boardgamegeek.com/geekmail/compose?touser=${game.username}`}>
<i>email</i></a>
</div>
<div class="neighbourhood">
{sellers[game.username]?.neighbourhood ?? ''}
</div>
</div>
<div class="s1 right-align">
{game.price ? '$' + game.price : ''}
</div>
<div class="notes s8">
{game.notes}
</div>
<div class="s3 updated-at">
{#if game.updated_at}
{pretty_date(game.updated_at)}
{/if}
</div>
<div class="s1">
<div>
<button
class="transparent round"
title="hide game"
on:click={() => toggle_visibility(game.id)}
>{#if game.is_hidden}<i>visibility_off</i
>{:else}
<i>visibility</i>
{/if}
</button>
</div>
</div>
</div>
</div>
<div class="medium-divider"></div>
</div>
=======
{#if show_hidden || !$games_hidden[[game.username, game.bgg_id].join('!')]}
<Game />
<div class="medium-divider"></div>
>>>>>>> 09f4064 (wip)
{/if}
{/each}
</div>
<script>
import { getContext, createEventDispatcher } from 'svelte';
import { slide, fade } from 'svelte/transition';
export let games = [];
export let sellers = {};
let show_hidden = false;
let search_text = '';
const dispatch = createEventDispatcher();
const toggle_visibility = (id) => dispatch('toggle_game_visibility', id);
// add filter
// add sort (user, game, price)
function pretty_date(date) {
if (!date) return '';
return date.replace(/T.*/, '');
}
</script>
<style>
.games {
margin-top: 3em;
}
a {
color: var(--primary);
text-decoration: underline;
}
.grid {
margin-right: 2em;
font-size: var(--font-size-10);
}
.notes {
margin-top: 1em;
margin-left: 1em;
}
.updated-at {
font-size: smaller;
text-align: left;
}
.updated-at::before {
content: 'last update: ';
}
.neighbourhood {
font-size: smaller;
}
.hidden {
opacity: 60%;
}
.switch span {
font-size: var(--font-size-10);
padding-left: 1em;
}
.options {
display: flex;
flex-direction: row-reverse;
}
.options > div {
margin-right: 1em;
}
</style>

View File

@ -1,72 +0,0 @@
<article>
<p>
<code>bgg.babyl.ca</code> is an aggregation of board games for sale or
trade of people living in the Ottawa region, taken from their profiles
on
<a href="https://boardgamegeek.com">Board Game Geek</a>.
</p>
<p>
If you want to be added to the list of sellers, you can send me a
<a
target="_blank"
href="https://boardgamegeek.com/geekmail/compose?touser=yenzie">
BGG mail</a
>. All I need is your BGG username, and I'll be able to gather all your
games tagged <em>For Trade</em>. If there is a price mentioned in the
<em>Trading Notes</em>
of the game (that is, any number prefixed with a <em>$</em>), it'll be
assumed to be the asking price.
</p>
<p>
Have questions, suggestions, anything else? Discussion of this service
happens in the <a
href="https://boardgamegeek.com/thread/3238117/auto-generating-ottawa-specific-saletrade-page"
>Ottawa Guild</a
>.
</p>
<p class="send-off">
Enjoy!<br /> <a href="https://boardgamegeek.com/user/yenzie">`/anick</a>
</p>
<p class="copyright">
note: the site's favicon incorporates the Trade by Bombasticon Studio
from <a
href="https://thenounproject.com/browse/icons/term/trade/"
target="_blank"
title="Trade Icons">Noun Project</a> (CC BY 3.0)
</p>
</article>
<script>
</script>
<style>
.send-off {
margin-top: 3em;
}
p {
font-size: var(--font-size-10);
max-width: 60em;
text-align: justify;
margin-left: 3em;
margin-right: 3em;
}
a {
color: var(--primary);
text-decoration: underline;
}
@media screen and (max-width: 730px) {
p {
font-size: inherit;
margin-left: 1em;
margin-right: 1em;
}
}
.copyright {
margin-top: 5em;
}
</style>

View File

@ -1,62 +0,0 @@
<article>
{#if games.length == 0}
<div class="medium-height middle-align center-align">
<div class="center-align">
<h4 class="center-align">Such restraint</h4>
<h5>No games in cart (yet)</h5>
</div>
</div>
{:else}
<GameList
{games}
sellers={$sellers}
on:toggle_cart={({ detail }) => all_games.toggle_cart(detail)} />
{/if}
</article>
<script>
import { getContext } from 'svelte';
import GameList from './GameList.svelte';
const all_games = getContext('games');
const sellers = getContext('sellers');
$: games = $all_games.filter(({ is_in_cart }) => is_in_cart);
</script>
<style>
p {
font-size: var(--font-size-10);
max-width: 60em;
text-align: justify;
margin-left: 3em;
margin-right: 3em;
}
a {
color: var(--primary);
text-decoration: underline;
}
.game-cell {
display: flex;
}
.game-cell > * {
display: block;
}
.game-desc {
flex: 1;
}
td {
font-size: var(--font-size-10);
}
@media screen and (max-width: 730px) {
h1 {
font-size: var(--font-size-12);
}
p {
font-size: inherit;
margin-left: 1em;
margin-right: 1em;
}
}
</style>

View File

@ -1,113 +0,0 @@
<div
transition:slide={{ delay: 250, duration: 300 }}
class:hidden={is_hidden}
class="game">
<div class="grid top-align">
<div class="s12 m2">
<a
target="_blank"
href={`https://boardgamegeek.com/boardgame/${bgg_id}`}>
<img alt="" loading="lazy" src={thumbnail} height="80" /></a>
</div>
<div class="grid s12 m10">
<div class="s8 left-align">
<div class="max">
<strong>
<a
class="game-desc"
target="_blank"
href={`https://boardgamegeek.com/boardgame/${bgg_id}`}>
{name}</a>
</strong>
</div>
</div>
<div class="s3"></div>
<div class="s1 right-align">
{price ? '$' + price : ''}
</div>
<div class="notes s8">
{notes}
</div>
<div class="s3 updated-at">
{#if updated_at}
{pretty_date(updated_at)}
{/if}
</div>
<div class="actions s1">
<button on:click={toggle_cart}
><i>
{#if is_in_cart}
remove_shopping_cart{:else}
add_shopping_cart
{/if}
</i></button>
</div>
</div>
</div>
</div>
<script>
// TODO show cart icon with badge
// show cart page
// cart store
import { createEventDispatcher } from 'svelte';
import { slide, fade } from 'svelte/transition';
export let username = '';
export let name = '';
export let is_hidden = false;
export let bgg_id = '';
export let thumbnail = '';
export let seller = {};
export let price = null;
export let notes = '';
export let updated_at = null;
export let is_in_cart = false;
function pretty_date(date) {
if (!date) return '';
return date.replace(/T.*/, '');
}
const dispatch = createEventDispatcher();
const toggle_game_visibility = () => dispatch('toggle_visibility');
const toggle_cart = () => dispatch('toggle_cart');
</script>
<style>
a {
color: var(--primary);
text-decoration: underline;
}
.grid {
margin-right: 2em;
font-size: var(--font-size-10);
}
.notes {
margin-top: 1em;
margin-left: 1em;
}
.updated-at {
font-size: smaller;
text-align: left;
}
.updated-at::before {
content: 'last update: ';
}
.neighbourhood {
font-size: smaller;
}
.hidden {
opacity: 60%;
}
.actions {
margin-top: 1em;
display: flex;
justify-content: end;
}
.actions button {
margin: 0.5em 2em 0em 1em;
}
</style>

View File

@ -1,107 +0,0 @@
{#each games_sellers as seller}
<h4>
<BggUser username={seller} />
&nbsp;
<a
target="_blank"
href={`https://boardgamegeek.com/geekmail/compose?touser=${seller}`}>
<i>email</i></a>
<span class="neighbourhood">
{sellers[seller]?.neighbourhood ?? ''}
</span>
<span class="nbr-games"
>{games.filter((game) => game.username == seller).length} game(s)</span>
</h4>
<div class="games">
{#each games.filter((game) => {
return game.username == seller;
}) as game}
{#if show_hidden || !game.is_hidden}
<Game
on:toggle_visibility={() => toggle_visibility(game.id)}
on:toggle_cart={() => toggle_cart(game.id)}
{...game}
seller={sellers[game.username]} />
<div class="medium-divider"></div>
{/if}
{/each}
</div>
{/each}
<script>
import { getContext, createEventDispatcher } from 'svelte';
import Game from './Game.svelte';
import BggUser from '$lib/components/BggUser.svelte';
import u from '@yanick/updeep-remeda';
import * as R from 'remeda';
export let games = [];
export let sellers = {};
$: games_sellers = R.uniq(games.map(({ username }) => username).sort());
let show_hidden = false;
let search_text = '';
const dispatch = createEventDispatcher();
const toggle_visibility = (id) => dispatch('toggle_game_visibility', id);
const toggle_cart = (id) => dispatch('toggle_cart', id);
// add filter
// add sort (user, game, price)
</script>
<style>
h4 {
align-items: baseline;
display: flex;
}
.neighbourhood {
margin-left: 2em;
}
.games {
margin-top: 3em;
}
a {
color: var(--primary);
text-decoration: underline;
}
.grid {
margin-right: 2em;
font-size: var(--font-size-10);
}
.notes {
margin-top: 1em;
margin-left: 1em;
}
.updated-at {
font-size: smaller;
text-align: left;
}
.updated-at::before {
content: 'last update: ';
}
.neighbourhood {
font-size: smaller;
}
.hidden {
opacity: 60%;
}
.switch span {
font-size: var(--font-size-10);
padding-left: 1em;
}
.options {
display: flex;
flex-direction: row-reverse;
}
.options > div {
margin-right: 1em;
}
.nbr-games {
font-size: smaller;
flex: 1;
text-align: right;
}
</style>

View File

@ -1,91 +0,0 @@
<article>
{#if $games.length == 0}
<div class="medium-height middle-align center-align">
<div class="center-align">
<progress class="circle"></progress>
<h5>gathering games...</h5>
</div>
</div>
{:else}
{#each Object.keys($sellers).sort() as username (username)}
<div class="row">
<h4 class="small">
<a name={`seller-${username}`} href={`#seller-${username}`}>
<i>link</i></a>
<BggUser {username} />
</h4>
<span class="max neighbourhood">
{#if $sellers[username].neighbourhood}
({$sellers[username].neighbourhood})
{/if}
</span>
<span class="nbr_games">
{nbr_games_for(username)}
</span>
</div>
<GameList
sellers={$sellers}
games={$games.filter((game) => game.username === username)} />
{/each}
{/if}
</article>
<script>
import { getContext } from 'svelte';
import GameList from './GameList.svelte';
import BggUser from '$lib/components/BggUser.svelte';
const games = getContext('games');
const sellers = getContext('sellers');
const nbr_games_for = (username) =>
$games.filter((game) => game.username === username).length;
</script>
<style>
p {
font-size: var(--font-size-10);
max-width: 60em;
text-align: justify;
margin-left: 3em;
margin-right: 3em;
}
a {
color: var(--primary);
text-decoration: underline;
}
.game-cell {
display: flex;
}
.game-cell > * {
display: block;
}
.game-desc {
flex: 1;
}
td {
font-size: var(--font-size-10);
}
@media screen and (max-width: 730px) {
h1 {
font-size: var(--font-size-12);
}
p {
font-size: inherit;
margin-left: 1em;
margin-right: 1em;
}
}
.nbr_games:after {
content: ' games';
}
.nbr_games:before {
content: 'selling ';
}
a {
padding-right: 1em;
}
</style>

View File

@ -1,121 +0,0 @@
<div transition:slide={{ delay: 250, duration: 300 }} class="game">
<div class="grid top-align">
<div class="s12 m2">
<a
target="_blank"
href={`https://boardgamegeek.com/boardgame/${bgg_id}`}>
<img alt="" loading="lazy" src={thumbnail} height="80" /></a>
</div>
<div class="grid s12 m10">
<div class="s9 left-align">
<div class="max">
{#if is_in_cart}
<i class="star">star</i>
{/if}
<strong>
<a
name={id}
class="game-desc"
target="_blank"
href={`https://boardgamegeek.com/boardgame/${bgg_id}`}>
{name}</a>
</strong>
&nbsp; &nbsp; &nbsp;
<a href={`https://bgg.babyl.ca/#${id}`}><i>link</i></a>
</div>
</div>
<div class="s1 right-align">
{price ? '$' + price : ''}
</div>
<div class="notes s8">
{notes}
</div>
<div class="s4 updated-at">
{#if updated_at}
{pretty_date(updated_at)}
{/if}
</div>
<div class="s1"></div>
<div class="s11 actions">
<button on:click={toggle_cart}
><i>
{#if is_in_cart}
remove_shopping_cart{:else}
add_shopping_cart
{/if}
</i></button>
</div>
</div>
</div>
</div>
<script>
// TODO show cart icon with badge
// show cart page
// cart store
import { createEventDispatcher } from 'svelte';
import { slide, fade } from 'svelte/transition';
export let username = '';
export let name = '';
export let is_hidden = false;
export let bgg_id = '';
export let thumbnail = '';
export let seller = {};
export let price = null;
export let notes = '';
export let updated_at = null;
export let is_in_cart = false;
export let id = '';
function pretty_date(date) {
if (!date) return '';
return date.replace(/T.*/, '');
}
const dispatch = createEventDispatcher();
const toggle_game_visibility = () => dispatch('toggle_visibility');
const toggle_cart = () => dispatch('toggle_cart');
</script>
<style>
a {
color: var(--primary);
text-decoration: underline;
}
.grid {
margin-right: 2em;
font-size: var(--font-size-10);
}
.notes {
margin-top: 1em;
margin-left: 1em;
}
.updated-at {
font-size: smaller;
text-align: left;
}
.updated-at::before {
content: 'last update: ';
}
.neighbourhood {
font-size: smaller;
}
.hidden {
opacity: 60%;
}
.actions {
margin-top: 1em;
display: flex;
justify-content: end;
}
.actions button {
margin: 0.5em 2em 0em 1em;
}
.star {
color: darkorange;
font-size: var(--font-size-12);
}
</style>

View File

@ -1,62 +0,0 @@
<div class="games">
{#each games as game}
<Game
on:toggle_visibility={() => toggle_visibility(game.id)}
on:toggle_cart={() => toggle_cart(game.id)}
{...game}
seller={sellers[game.username]} />
<div class="medium-divider"></div>
{/each}
</div>
<script>
import { getContext, createEventDispatcher } from 'svelte';
import Game from './Game.svelte';
export let games = [];
export let sellers = {};
const toggle_cart = (id) => dispatch('toggle_cart', id);
</script>
<style>
.games {
margin-top: 3em;
}
a {
color: var(--primary);
text-decoration: underline;
}
.grid {
margin-right: 2em;
font-size: var(--font-size-10);
}
.notes {
margin-top: 1em;
margin-left: 1em;
}
.updated-at {
font-size: smaller;
text-align: left;
}
.updated-at::before {
content: 'last update: ';
}
.neighbourhood {
font-size: smaller;
}
.hidden {
opacity: 60%;
}
.switch span {
font-size: var(--font-size-10);
padding-left: 1em;
}
.options {
display: flex;
flex-direction: row-reverse;
}
.options > div {
margin-right: 1em;
}
</style>

View File

@ -1,50 +0,0 @@
<article>
<p>Currently listing {nbr_games} games from {nbr_sellers} sellers.</p>
{#each Object.keys($sellers).sort() as username (username)}
<div class="row">
<BggUser {username} />
<span class="max neighbourhood">
{#if $sellers[username].neighbourhood}
({$sellers[username].neighbourhood})
{/if}
</span>
<span class="nbr_games">
{nbr_games_for(username)}
</span>
</div>
{/each}
</article>
<script>
// TODO avatars?
import { getContext } from 'svelte';
import BggUser from '$lib/components/BggUser.svelte';
const games = getContext('games');
const sellers = getContext('sellers');
$: nbr_games = $games.length;
$: nbr_sellers = Object.values($sellers).length;
const nbr_games_for = (username) =>
$games.filter((game) => game.username === username).length;
</script>
<style>
.nbr_games:after {
content: ' games';
}
.nbr_games:before {
content: 'selling ';
}
div {
margin-left: 2em;
margin-right: 2em;
}
article {
font-size: var(--font-size-10);
}
</style>

View File

@ -6,7 +6,6 @@ const users = db.prepare('SELECT username from bgg_user').all();
await Promise.all(
users.map(({ username }) => {
console.log(username);
return update_user_games(db, username)
.then(() => console.log(username, 'is done'))
.catch((e) => console.error(e));

View File

@ -1,5 +0,0 @@
[{"id":1,"username":"yenzie","thumbnail":"https://cf.geekdo-images.com/Y8O1DDS98cuhoyJilK05yA__thumb/img/2sWM-5WS-Wtgl2J02XTTLEw21f0=/fit-in/200x150/filters:strip_icc()/pic4801857.jpg","bgg_id":"234900","name":"Frutticola","notes":"Asking $10","price":10,"updated_at":"2024-02-04T22:51:46.675Z"},
{"id":2,"username":"yenzie","thumbnail":"https://cf.geekdo-images.com/lAOFQuc8GsmbtOmY6oBZOg__thumb/img/VsRQHC2uIYYH04UlkOYHBI41nTk=/fit-in/200x150/filters:strip_icc()/pic3574728.jpg","bgg_id":"202096","name":"Marvel Dice Masters: Iron Man and War Machine Starter Set","notes":"Free for whoever wants it! Asking $0","price":0,"updated_at":"2024-02-04T22:51:46.675Z"},
{"id":3,"username":"yenzie","thumbnail":"https://cf.geekdo-images.com/quvyGpE7kwbd2Mt1H5iLwQ__thumb/img/Vf5PvYElsfOG28LqJimwPC6rqw4=/fit-in/200x150/filters:strip_icc()/pic3019101.jpg","bgg_id":"179275","name":"One Deck Dungeon","notes":"sold with One Deck Dungeon: Forest of Shadows. $30","price":30,"updated_at":"2024-02-04T22:51:46.675Z"},
{"id":4,"username":"yenzie","thumbnail":"https://cf.geekdo-images.com/rfkpP2id0JwDWw5694PRQQ__thumb/img/5A9VoUaZ1B5Wx1t0n74mfLBHW2o=/fit-in/200x150/filters:strip_icc()/pic3496794.jpg","bgg_id":"224821","name":"One Deck Dungeon: Forest of Shadows","notes":"","price":null,"updated_at":"2024-02-04T22:51:46.675Z"},
{"id":5,"username":"yenzie","thumbnail":"https://cf.geekdo-images.com/9sLpe24JNXTwVYIOjt0ODw__thumb/img/eJ_RkqDZfrKaqtm1jeqsjVfwKFQ=/fit-in/200x150/filters:strip_icc()/pic3766231.jpg","bgg_id":"225885","name":"Unbroken","notes":"Asking $15","price":15,"updated_at":"2024-02-04T22:51:46.675Z"}]

View File

@ -1,2 +0,0 @@
[{"username":"yenzie","neighbourhood":"Bells Corners"},
{"username":"jmarkmoss","neighbourhood":null}]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,234 +0,0 @@
[{"id":479,"username":"yenzie","thumbnail":"https://cf.geekdo-images.com/Y8O1DDS98cuhoyJilK05yA__thumb/img/2sWM-5WS-Wtgl2J02XTTLEw21f0=/fit-in/200x150/filters:strip_icc()/pic4801857.jpg","bgg_id":"234900","name":"Frutticola","notes":"Asking $10","price":10,"updated_at":"2024-02-04T17:40:42.798Z"},
{"id":480,"username":"yenzie","thumbnail":"https://cf.geekdo-images.com/lAOFQuc8GsmbtOmY6oBZOg__thumb/img/VsRQHC2uIYYH04UlkOYHBI41nTk=/fit-in/200x150/filters:strip_icc()/pic3574728.jpg","bgg_id":"202096","name":"Marvel Dice Masters: Iron Man and War Machine Starter Set","notes":"Free for whoever wants it! Asking $0","price":0,"updated_at":"2024-02-04T17:40:42.798Z"},
{"id":481,"username":"yenzie","thumbnail":"https://cf.geekdo-images.com/quvyGpE7kwbd2Mt1H5iLwQ__thumb/img/Vf5PvYElsfOG28LqJimwPC6rqw4=/fit-in/200x150/filters:strip_icc()/pic3019101.jpg","bgg_id":"179275","name":"One Deck Dungeon","notes":"sold with One Deck Dungeon: Forest of Shadows. $30","price":30,"updated_at":"2024-02-04T17:40:42.798Z"},
{"id":482,"username":"yenzie","thumbnail":"https://cf.geekdo-images.com/rfkpP2id0JwDWw5694PRQQ__thumb/img/5A9VoUaZ1B5Wx1t0n74mfLBHW2o=/fit-in/200x150/filters:strip_icc()/pic3496794.jpg","bgg_id":"224821","name":"One Deck Dungeon: Forest of Shadows","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.798Z"},
{"id":483,"username":"yenzie","thumbnail":"https://cf.geekdo-images.com/9sLpe24JNXTwVYIOjt0ODw__thumb/img/eJ_RkqDZfrKaqtm1jeqsjVfwKFQ=/fit-in/200x150/filters:strip_icc()/pic3766231.jpg","bgg_id":"225885","name":"Unbroken","notes":"Asking $15","price":15,"updated_at":"2024-02-04T17:40:42.798Z"},
{"id":484,"username":"dprcooke","thumbnail":"https://cf.geekdo-images.com/i8ryx8pqPonNNUXyRWjQaw__thumb/img/0-JW3OU-6XDoUKqhQudJIbRX0Bc=/fit-in/200x150/filters:strip_icc()/pic265703.jpg","bgg_id":"4324","name":"Risk: The Lord of the Rings","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.887Z"},
{"id":485,"username":"dprcooke","thumbnail":"https://cf.geekdo-images.com/d3iaz_7qM30j8UW-pSy3CQ__thumb/img/Qb3SGdVwW9lsebpEjJEJ9x2tVZ8=/fit-in/200x150/filters:strip_icc()/pic2075421.png","bgg_id":"161876","name":"Star Trek: Attack Wing Gavroche Independent Expansion Pack","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.887Z"},
{"id":486,"username":"dprcooke","thumbnail":"https://cf.geekdo-images.com/kxSiVWBtygEMpb07r_qrIQ__thumb/img/XXlz3tpLsDaBAr1PtrgbiCK4PDE=/fit-in/200x150/filters:strip_icc()/pic3038989.jpg","bgg_id":"183446","name":"Star Trek: Attack Wing U.S.S. Constellation Expansion Pack","notes":"New","price":null,"updated_at":"2024-02-04T17:40:42.887Z"},
{"id":487,"username":"dprcooke","thumbnail":"https://cf.geekdo-images.com/LRuwX_qAGXDSWRF2fufzAw__thumb/img/zN5w-EtX4DTGPoYsqwqXquGUIs0=/fit-in/200x150/filters:strip_icc()/pic6863747.jpg","bgg_id":"143405","name":"Sylvion","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.887Z"},
{"id":488,"username":"dprcooke","thumbnail":"https://cf.geekdo-images.com/73-XmNhAumpOm0ENKVnygQ__thumb/img/FSI-x30x1IfDMSm0jIAeWtzkC94=/fit-in/200x150/filters:strip_icc()/pic77888.jpg","bgg_id":"3457","name":"Tabula","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.887Z"},
{"id":489,"username":"dprcooke","thumbnail":"https://cf.geekdo-images.com/aZN8c8XyssNJSPtaEQ3i_w__thumb/img/EldnBmGyfS9-EyuPUvGdkvDo4nQ=/fit-in/200x150/filters:strip_icc()/pic872066.jpg","bgg_id":"24396","name":"War on Terror","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.887Z"},
{"id":490,"username":"jpedro13","thumbnail":"https://cf.geekdo-images.com/BP8wmweza3oodDYrv0hcfQ__thumb/img/gZWiV6ZvBNMwTQ6YFE-JwgrPDlc=/fit-in/200x150/filters:strip_icc()/pic3286675.png","bgg_id":"185709","name":"Beasts of Balance","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.932Z"},
{"id":491,"username":"jpedro13","thumbnail":"https://cf.geekdo-images.com/i_xw8FdCs_uBtLXozr9yYA__thumb/img/2Ms__Icv3J4xGG1bjfxGhAJ04aQ=/fit-in/200x150/filters:strip_icc()/pic3663847.jpg","bgg_id":"231442","name":"Beasts of Balance: More Beasts Expansion Pack","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.932Z"},
{"id":492,"username":"jpedro13","thumbnail":"https://cf.geekdo-images.com/f11qdOFEnn1fcOZ7M-rylg__thumb/img/KOfwbfothWKt8cMdBmDt2psBnOE=/fit-in/200x150/filters:strip_icc()/pic2379664.jpg","bgg_id":"149155","name":"Dead Man's Draw","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.932Z"},
{"id":493,"username":"jpedro13","thumbnail":"https://cf.geekdo-images.com/8iDLxghL7Y0Z-ivMNvUcOw__thumb/img/QwM1MZ8RPoezFlS0FfSjRFvne4A=/fit-in/200x150/filters:strip_icc()/pic3779699.jpg","bgg_id":"230785","name":"Dream Catchers","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.932Z"},
{"id":494,"username":"jpedro13","thumbnail":"https://cf.geekdo-images.com/m_RzXpHURC0_xLkvRSR_sw__thumb/img/OfgWmkGJj5BgOO0zFHEtP5CHfbU=/fit-in/200x150/filters:strip_icc()/pic3043734.jpg","bgg_id":"70323","name":"King of Tokyo","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.932Z"},
{"id":495,"username":"jpedro13","thumbnail":"https://cf.geekdo-images.com/QjwNUQRiBv2uBKqg1pPtHg__thumb/img/6cNbw0WeQAZ8bHFQOAnQHYrcfdY=/fit-in/200x150/filters:strip_icc()/pic3616670.jpg","bgg_id":"147183","name":"King of Tokyo: Halloween","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.932Z"},
{"id":496,"username":"jpedro13","thumbnail":"https://cf.geekdo-images.com/ukYD9rs-jvEK-s9BhgqBEA__thumb/img/2okiMTHBkUJ1yBpAZbFeBTq4-yo=/fit-in/200x150/filters:strip_icc()/pic3330452.jpg","bgg_id":"127067","name":"King of Tokyo: Power Up!","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.932Z"},
{"id":497,"username":"jpedro13","thumbnail":"https://cf.geekdo-images.com/0SFLHa5hNmtdL0LpqCN2kA__thumb/img/DBscKuzoek17BGUcjPLVgQeoNTc=/fit-in/200x150/filters:strip_icc()/pic2513302.jpg","bgg_id":"176361","name":"One Night Revolution","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.932Z"},
{"id":498,"username":"jpedro13","thumbnail":"https://cf.geekdo-images.com/tinE1f2lauIsEL4aC9aU-w__thumb/img/9tewdwxUKcqikj0QlVSUmwRPK68=/fit-in/200x150/filters:strip_icc()/pic384313.jpg","bgg_id":"38453","name":"Space Alert","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.932Z"},
{"id":499,"username":"jpedro13","thumbnail":"https://cf.geekdo-images.com/81z-qIsx51gT1PDRGQ_dDA__thumb/img/wzNpF81MUGkBCoCR8VIHwZyQK4I=/fit-in/200x150/filters:strip_icc()/pic7739376.jpg","bgg_id":"123540","name":"Tokaido","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.932Z"},
{"id":500,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/qwFz_zhMjIxRjgAIx__8WQ__thumb/img/PPRNQrHRGq48IhY6PlOXg95aYUw=/fit-in/200x150/filters:strip_icc()/pic5335069.png","bgg_id":"302260","name":"Abandon All Artichokes","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":501,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/hgUDu_oG0uhnOWX4WM2vXA__thumb/img/KlzN2TK2WVHgCimiLG_aoEZXVQA=/fit-in/200x150/filters:strip_icc()/pic4070329.jpg","bgg_id":"234487","name":"Altiplano","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":502,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/YDY6ZHqdRyDMvpfQO_jV7A__thumb/img/AJf9NTVOgyXyntg2jjZW1FuR9aM=/fit-in/200x150/filters:strip_icc()/pic4853982.jpg","bgg_id":"269511","name":"Cooper Island","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":503,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/UTBiMz6852dq3K_yfpgpLQ__thumb/img/JNsz6atITE84iWPiiq7ki1LaSGY=/fit-in/200x150/filters:strip_icc()/pic5998666.jpg","bgg_id":"262941","name":"Dominant Species: Marine","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":504,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/kzq5HwLrw2XXVKp-vfLBQw__thumb/img/mRa-6gy7lo77iWnsCGvNqxk_uTM=/fit-in/200x150/filters:strip_icc()/pic4779112.png","bgg_id":"281658","name":"Hats","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":505,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/Tygk_sCQEIpa7PUxsl2TmA__thumb/img/QNTDALrYI4_MCxyN14Z2tF2egrY=/fit-in/200x150/filters:strip_icc()/pic4783810.jpg","bgg_id":"281960","name":"Kingdomino Duel","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":506,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/9lQIIxg_l6G-ZWmTqEHlOA__thumb/img/uiCYTRqVF3TMqfpFGM-O0az_Q4A=/fit-in/200x150/filters:strip_icc()/pic1949286.jpg","bgg_id":"156009","name":"Port Royal","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":507,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/2JtiVmiksEpMZ-Aby-iMWg__thumb/img/Git0GAfPfQRmDbRSfhxqBetN4AA=/fit-in/200x150/filters:strip_icc()/pic1878035.jpg","bgg_id":"144733","name":"Russian Railroads","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":508,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/SvW9cN5oSkHfaU6Znt8hRA__thumb/img/LphAbQd2Dpc0DGEodKP6I0P2hYQ=/fit-in/200x150/filters:strip_icc()/pic5410757.png","bgg_id":"309105","name":"Sagani","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":509,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/wHg4fOf48cs1kw1PDOk1tQ__thumb/img/6l-jqYlfECK1SVSsUs7FXUheKzQ=/fit-in/200x150/filters:strip_icc()/pic3958793.jpg","bgg_id":"118048","name":"Targi","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":510,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/QA6YRlqQaplVuXFg5hwCYA__thumb/img/DWQ2yp7NsuCAKY1D4Ezj4M2yHQ4=/fit-in/200x150/filters:strip_icc()/pic7584068.jpg","bgg_id":"105037","name":"Tournay","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":511,"username":"gamingduo2","thumbnail":"https://cf.geekdo-images.com/yLZJCVLlIx4c7eJEWUNJ7w__thumb/img/VNToqgS2-pOGU6MuvIkMPKn_y-s=/fit-in/200x150/filters:strip_icc()/pic4458123.jpg","bgg_id":"266192","name":"Wingspan","notes":"","price":null,"updated_at":"2024-02-04T17:40:42.994Z"},
{"id":512,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/2ZLY5VQr9T3aBFdF39V_ow__thumb/img/YEU9u99w-MebMIPQ5jcRPa8ab28=/fit-in/200x150/filters:strip_icc()/pic2803570.png","bgg_id":"190026","name":"100 Swords: The Darkness Dungeon Builder Set","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":513,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/b9vFOVnX0sHrkblg4fgyHg__thumb/img/iVOI4ByRzQ_Noj0Dfq-jog83SAg=/fit-in/200x150/filters:strip_icc()/pic2802377.png","bgg_id":"178153","name":"100 Swords: The Red Dragon's Dungeon","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":514,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/GXOOQI9WH0xzeEDZqPFUXw__thumb/img/A26zuxVMWdvCo65mk1CLBwPDz44=/fit-in/200x150/filters:strip_icc()/pic82673.jpg","bgg_id":"17008","name":"Award Show","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":515,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/pWUe-w4DpXdcmH6GqbZqCw__thumb/img/T03oThwiFNU19-9XppxmcQ7_rMs=/fit-in/200x150/filters:strip_icc()/pic24006.jpg","bgg_id":"98","name":"Axis & Allies","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":516,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/4FT81TOSXB4S1GT3j3oWnA__thumb/img/fvgStoSole8NADokNTD9ss-xGB0=/fit-in/200x150/filters:strip_icc()/pic2532938.jpg","bgg_id":"32484","name":"The Battle for Hill 218","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":517,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/YavI9_NzIxl0tkoyxQlfAA__thumb/img/2gAfR9HIhxDOF70x0Cm7n4AQ2kE=/fit-in/200x150/filters:strip_icc()/pic1657374.jpg","bgg_id":"141594","name":"Fleet Admiral","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":518,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/9hK1x-jTuJIJgeRE5jpjGg__thumb/img/-bEoGpHj29j_8hhy3ySQC8tijZo=/fit-in/200x150/filters:strip_icc()/pic2302963.png","bgg_id":"168037","name":"Good Cop Bad Cop: Bombers and Traitors","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":519,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/_Z3f513K1T7Nd99UGtyC9Q__thumb/img/v61Nk7eHaXuDkMsalSV7FzJt_Fs=/fit-in/200x150/filters:strip_icc()/pic3496684.jpg","bgg_id":"144239","name":"Impulse","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":520,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/xzr4Tjp1pM5zUfit5YAeNA__thumb/img/9GXaqizIhSQuun_zYk3HdUBuMzk=/fit-in/200x150/filters:strip_icc()/pic3187811.jpg","bgg_id":"987","name":"Kingmaker","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":521,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/DKDV18kTtTnPklW9K0Pj0A__thumb/img/sP5ghp6naepXNmD8LxAJHbMFRds=/fit-in/200x150/filters:strip_icc()/pic4733806.jpg","bgg_id":"155495","name":"KUNE v LAKIA: A Chronicle Of A Royal Lapine Divorce Foretold","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":522,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/vfDBkYygiVGfErwJPfBrUQ__thumb/img/D1wf2AcUdBU9eladzXtchg5ZsxE=/fit-in/200x150/filters:strip_icc()/pic619657.jpg","bgg_id":"29096","name":"Letter of Marque","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":523,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/5LsS58GuWL_8sTFKqROnrg__thumb/img/85wCDhLUICvrIVVg3qDUKlknaJE=/fit-in/200x150/filters:strip_icc()/pic2620938.jpg","bgg_id":"172596","name":"Monster My Neighbor","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":524,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/JKpn-Hu-9kq8yBUiUPrxsQ__thumb/img/tQswk4oDX4F9aVxocWcAi4rQph4=/fit-in/200x150/filters:strip_icc()/pic1758569.jpg","bgg_id":"102435","name":"Navajo Wars","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":525,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/_E8uOWDLZCbsDr1lC_q12A__thumb/img/a6gD0LvW0yEogSl9-x0oXPjEIs8=/fit-in/200x150/filters:strip_icc()/pic2330461.jpg","bgg_id":"150298","name":"One Zero One","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":526,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/EhVocrnC-cNfLjONvi34Iw__thumb/img/2YQyWhBtTdsgUWZlhtEWIoaPwaw=/fit-in/200x150/filters:strip_icc()/pic3037469.jpg","bgg_id":"176803","name":"Overseers","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":527,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/HvcM-fp_KXGGqdDJSCTzyA__thumb/img/9qIQP9ZfEgzPwrQezjObBvmZ8m4=/fit-in/200x150/filters:strip_icc()/pic771625.jpg","bgg_id":"75782","name":"The Phantom League","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":528,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/7_ii1bBvafL7iWMOp3J8zQ__thumb/img/GepvvW6L9-DdJdkzxoN-eZBenmM=/fit-in/200x150/filters:strip_icc()/pic1075209.jpg","bgg_id":"86049","name":"The Phantom League: Mostly Harmless","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":529,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/XztwcLsUe1GYNYkhfmMcfA__thumb/img/JANsnlPqp5fLLp1qfKb3Nl_76LI=/fit-in/200x150/filters:strip_icc()/pic3709025.jpg","bgg_id":"214322","name":"Santorini: Tyche Promo Card","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":530,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/UNiF8nNkyHmVNevFdMEozg__thumb/img/g6iTMwVCpss-Xlu_LK_SClF6o3Q=/fit-in/200x150/filters:strip_icc()/pic6968520.jpg","bgg_id":"1574","name":"Tactics II","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":531,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/p7rUAAOcX2gAWhLE5xqlPg__thumb/img/d3iBina2qU_qeJUqT2yPjzCXnZE=/fit-in/200x150/filters:strip_icc()/pic3130408.jpg","bgg_id":"138201","name":"They Who Were 8","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":532,"username":"skeletonhat","thumbnail":"https://cf.geekdo-images.com/JqjrRNe_uYMHccaRry8qLQ__thumb/img/paffLbiAI3hO6NQxX1FHuU0gJW8=/fit-in/200x150/filters:strip_icc()/pic2908587.png","bgg_id":"191364","name":"Twilight Squabble","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.010Z"},
{"id":533,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/lYlQrXNnP8ZfKURi0a5IJw__thumb/img/CaJ2zz2cR2dxeWqppWt8wpchMCA=/fit-in/200x150/filters:strip_icc()/pic267077.jpg","bgg_id":"8166","name":"Anno 1503","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":534,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/rKOHJmJWSjKPMVGZlCr6vQ__thumb/img/jFmP_QAwm8uzABZb14xgMgLadqc=/fit-in/200x150/filters:strip_icc()/pic5335995.jpg","bgg_id":"18723","name":"Aye, Dark Overlord! The Red Box","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":535,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/h0gqNM2ospfE840kCwZqAw__thumb/img/x8_dGrLRVv2b2IBwwyAapgAugBI=/fit-in/200x150/filters:strip_icc()/pic1510797.jpg","bgg_id":"9571","name":"Baha","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":536,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/cmLmxs-es1f1eQWaKkqBdg__thumb/img/UUQA6nrH9u5QolcsM0jvuS1L3F0=/fit-in/200x150/filters:strip_icc()/pic68506.jpg","bgg_id":"638","name":"Blitz und Donner","notes":"German Kosmos edition, 2000, like new with English rules and reference sheets","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":537,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/vhSwPyIL6n4kkmkaxfS6Zg__thumb/img/tBwBgfb9ySruH2saOLXoLucj4eU=/fit-in/200x150/filters:strip_icc()/pic49310.jpg","bgg_id":"10997","name":"Boomtown","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":538,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/-syehqO7X0z9fP_pDz6tNA__thumb/img/lb5FDKlpXQLLKJEffDZ6RweF-1g=/fit-in/200x150/filters:strip_icc()/pic224062.jpg","bgg_id":"30340","name":"The Celestial Companions","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":539,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/d9aLszER_r_HlClIBJJzFA__thumb/img/x74I_V6ZdukteJZfhEQQB8TDc9A=/fit-in/200x150/filters:strip_icc()/pic6312644.png","bgg_id":"121193","name":"Cover Your Assets","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":540,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/4z8Tf1yClJ-dXC7IXDG0DA__thumb/img/_KqNpUrgRsMMmcOgSIdCAw3XRr8=/fit-in/200x150/filters:strip_icc()/pic336139.jpg","bgg_id":"16035","name":"Cranium Whoonu","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":541,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/gcbbremGajn-O9f8sFssqw__thumb/img/wEf57oajpIILrGFepIgwDlG4VSE=/fit-in/200x150/filters:strip_icc()/pic174912.jpg","bgg_id":"24932","name":"Cranium Zooreka!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":542,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/lAqx0ImmY0RC8wWJCTEDGg__thumb/img/7gUqBEz6utoM-11Y0xYdL59Of7c=/fit-in/200x150/filters:strip_icc()/pic994535.jpg","bgg_id":"72132","name":"Dragon Rampage","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":543,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/YyU0eWjIbIwbdx2gbK4Grw__thumb/img/osDaYkNmnx0VOhnW69HpuVbXO7o=/fit-in/200x150/filters:strip_icc()/pic1063390.jpg","bgg_id":"76247","name":"Eaten by Zombies!","notes":"English, Good condition, light wear. ","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":544,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/B1QyvCL5mvIWsKlmFxdQlA__thumb/img/TrSJuS4EN9wGZKKOHjFX_w-X_YY=/fit-in/200x150/filters:strip_icc()/pic2392501.jpg","bgg_id":"938","name":"Enchanted Forest","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":545,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/Q4OkoDhcqHcGlkmrR3362A__thumb/img/uwGSS8H3Zo1bMnie9jU2GE0i9zs=/fit-in/200x150/filters:strip_icc()/pic484579.jpg","bgg_id":"75","name":"Falling","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":546,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/bSzQH7fVlvMj-ZYoGYKVfQ__thumb/img/NlB9tcanuWR0e5Q1p0BkPgrQ1BA=/fit-in/200x150/filters:strip_icc()/pic196233.jpg","bgg_id":"13729","name":"Flandern 1302","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":547,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/Yajl3ARqFgBHMw8C1ALZrA__thumb/img/ndCUV55MphCWAv4-u8SmwneS0UQ=/fit-in/200x150/filters:strip_icc()/pic59362.jpg","bgg_id":"11801","name":"Frog Rally","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":548,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/gn85w-jhVSqd4e8RJ7ahEw__thumb/img/SC4E1m3Q0bbfuank7JQS4SlhSIs=/fit-in/200x150/filters:strip_icc()/pic587284.jpg","bgg_id":"247","name":"Gloria Picktoria","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":549,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/d-nb2hUIkGqiA9o0pJoXjw__thumb/img/Edco377RbashsgUTVc_oB84xYIs=/fit-in/200x150/filters:strip_icc()/pic3784837.jpg","bgg_id":"2379","name":"Guesstures","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":550,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/r8WbdsuH5CFPXk4gEONSsA__thumb/img/GzxsLhIHK2LcB6a06eaurREeP38=/fit-in/200x150/filters:strip_icc()/pic1173495.png","bgg_id":"113246","name":"Happy Birthday","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":551,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/ny_BR0rt9-Kmg6L8L0o0lA__thumb/img/8JpuOJZ6EDRLQtDe-IJ291Qa4qU=/fit-in/200x150/filters:strip_icc()/pic311222.jpg","bgg_id":"19100","name":"Hazienda","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":552,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/n4j2ZCnkf0T_EW2q851Fag__thumb/img/D6ThHQwnlnclZM6MJ8bdAw_xoI4=/fit-in/200x150/filters:strip_icc()/pic72867.jpg","bgg_id":"6711","name":"Hit the Deck","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":553,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/yapOEWh121CU4AW2kQh7Aw__thumb/img/5U5rkzZiKVCx5NwSpXfCS8CXgAU=/fit-in/200x150/filters:strip_icc()/pic290424.jpg","bgg_id":"27388","name":"Hop to It!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":554,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/JWd1DxBxa_fSiOjeFQqRGg__thumb/img/vnJ350xR5D3xpXQ1coconeVjVsY=/fit-in/200x150/filters:strip_icc()/pic3471966.jpg","bgg_id":"29107","name":"Hop! Hop! Hop!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":555,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/o0yk_vESfqXVWifWenvccw__thumb/img/5UVcerCV_n4N9hAroXKpBr_4i8A=/fit-in/200x150/filters:strip_icc()/pic1590863.jpg","bgg_id":"125605","name":"I'm the Boss!: The Card Game","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":556,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/qQX8uhrRVm6OMzCTAY29jA__thumb/img/BSNKXrMSx-Jl1mJa7FCgsm6DmwM=/fit-in/200x150/filters:strip_icc()/pic277863.jpg","bgg_id":"21920","name":"Leonardo da Vinci","notes":"Good condition, smoke-free, English edition, wear on box","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":557,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/de6pEWgiIn3GPT-5S8Qpkg__thumb/img/8FO8i_zllvqdASu0lPQ6WVyBsF0=/fit-in/200x150/filters:strip_icc()/pic195746.jpg","bgg_id":"398","name":"Loco!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":558,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/mw6BeNpxOSX19StElU7zIA__thumb/img/cO-Lxp5e8obNWNZP6pQorIovjOY=/fit-in/200x150/filters:strip_icc()/pic26540.jpg","bgg_id":"6675","name":"Madeline Game","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":559,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/BPJDeSSatiiw1eTAnxx5-g__thumb/img/Lslbt68cs39OKA2XO0idRyjEG1Q=/fit-in/200x150/filters:strip_icc()/pic44952.jpg","bgg_id":"9440","name":"Maharaja: The Game of Palace Building in India","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":560,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/PaQGjuf63FO1AS6oj9EWmA__thumb/img/xMQuz9ozebq_vDEF06pL_3GJXYA=/fit-in/200x150/filters:strip_icc()/pic1083892.jpg","bgg_id":"37738","name":"Master Builder","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":561,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/Ca8jE5MAPHdEr4N0FgCcFg__thumb/img/hz2JFiXGdei5jk5-8XE8dwawx0Y=/fit-in/200x150/filters:strip_icc()/pic135137.jpg","bgg_id":"902","name":"Meuterer","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":562,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/kzLZY_DHTh-hBcqXP34a5w__thumb/img/82b4hCqE8tTLkwexnLrp3ubGU_c=/fit-in/200x150/filters:strip_icc()/pic4330533.jpg","bgg_id":"590","name":"Mille Bornes","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":563,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/XACkCb3JL0uvF6xOn0lRSg__thumb/img/MSoqR2WLqhqV9mkayMmd11sNanY=/fit-in/200x150/filters:strip_icc()/pic4595026.jpg","bgg_id":"40398","name":"Monopoly Deal Card Game","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":564,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/MaztFyG9tOYYW9oFKTGUsQ__thumb/img/QzJrZ8MTMQqyUfktF1v68h7h1Bo=/fit-in/200x150/filters:strip_icc()/pic1514260.jpg","bgg_id":"21754","name":"Nottingham","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":565,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/IHYBF2QWcZwlYfH4doj06Q__thumb/img/XkT-0Bj73aLec9BYdqWSqIpIKis=/fit-in/200x150/filters:strip_icc()/pic1494028.jpg","bgg_id":"1234","name":"Once Upon a Time: The Storytelling Card Game","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":566,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/RFF8G4A7DLRpvpEUzgXMng__thumb/img/nxCCSqrAJiMTIKwnBc5ayt37sPI=/fit-in/200x150/filters:strip_icc()/pic1027489.jpg","bgg_id":"16147","name":"Papa Boa","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":567,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/AGwVx_Q59km8VHKIy-MW-g__thumb/img/4qYgLPwLaxY0cE_Zy-ESDxvAoAw=/fit-in/200x150/filters:strip_icc()/pic485541.jpg","bgg_id":"42223","name":"Partini Mixers: Fast and Fabulous","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":568,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/bkFWnxaucaeuSo9qTjhVTA__thumb/img/DB_6lhnpHguIrkXl8uok59ske3g=/fit-in/200x150/filters:strip_icc()/pic354168.jpg","bgg_id":"45","name":"Pirates Dice","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":569,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/sKuQWe43KZ_ftW0jpOkoOQ__thumb/img/OiKaf3IVHiCRhsy7FEKnJCRvLiY=/fit-in/200x150/filters:strip_icc()/pic235982.jpg","bgg_id":"17025","name":"Poison","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":570,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/5a8L3N0-7qVbFC2dfksung__thumb/img/FDMwM0TD30618qp70MNKtDzYWBU=/fit-in/200x150/filters:strip_icc()/pic1077693.jpg","bgg_id":"91984","name":"Québec","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":571,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/MNSbTGYpKn4F1UR8VBv-oA__thumb/img/eYb2GtR6NzKqAuQBzjKu_y-bSfI=/fit-in/200x150/filters:strip_icc()/pic2259938.jpg","bgg_id":"167059","name":"Ready, Set, Count!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":572,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/FUyJ12REPB7P0lYrJo50lA__thumb/img/6vhs-omn8b7MAZvvEw6bhuBt0Kg=/fit-in/200x150/filters:strip_icc()/pic48609.jpg","bgg_id":"368","name":"Relationship Tightrope","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":573,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/Oem1TTtSgxOghRFCoyWRPw__thumb/img/5cltSV60oVvjL3Ag_KTJbmTdU6w=/fit-in/200x150/filters:strip_icc()/pic4916782.jpg","bgg_id":"181","name":"Risk","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":574,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/rzUEoSG6pjvYMs0nrjlMDA__thumb/img/dlggukc5lvSPJ9f6bFit3bRzktg=/fit-in/200x150/filters:strip_icc()/pic193282.jpg","bgg_id":"136","name":"Robin Hood","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":575,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/mVmmntn2oQd0PfFrWBvwIQ__thumb/img/RUmuGCB40FQH0en0R2nrcsSO7DE=/fit-in/200x150/filters:strip_icc()/pic404651.jpg","bgg_id":"320","name":"Scrabble","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":576,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/kBE0J-0Ft4UM1jsqlZ919A__thumb/img/VpKMxfRTR5NtuLCvkyinMX6Bw-g=/fit-in/200x150/filters:strip_icc()/pic2367364.jpg","bgg_id":"171361","name":"Spy Tag","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":577,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/Zjhbnc6BJDWW3rTvZV6d5Q__thumb/img/FuA2nAYnugnk4YLq3gfpxYrjhCA=/fit-in/200x150/filters:strip_icc()/pic221815.jpg","bgg_id":"4062","name":"Swap!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":578,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/ZJZNzkPylwg861foo9KAdQ__thumb/img/odn8piT1eiQrAuE-5PbJv10GXt8=/fit-in/200x150/filters:strip_icc()/pic71666.jpg","bgg_id":"2030","name":"Twinkle, Twinkle, Little Star","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":579,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/ZUJnPfVk2RpoRNTJfhwOGw__thumb/img/tRFViJasw9fqNTFnTThKrpzinfc=/fit-in/200x150/filters:strip_icc()/pic182374.jpg","bgg_id":"2393","name":"Xiangqi","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":580,"username":"willgreg","thumbnail":"https://cf.geekdo-images.com/mPsQNYkOrKFtqup9YoSr2w__thumb/img/OwGBX_Rh2KuosYL4p4Tm4Z7kkhg=/fit-in/200x150/filters:strip_icc()/pic1050232.jpg","bgg_id":"1319","name":"Zauberberg","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.035Z"},
{"id":581,"username":"dasyl","thumbnail":"https://cf.geekdo-images.com/HzKUJxIZ6XpfNDQvNAdRhA__thumb/img/HliCQuyUdaOPNblf7nQ6qG9b67c=/fit-in/200x150/filters:strip_icc()/pic87502.jpg","bgg_id":"19154","name":"Dear World","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.046Z"},
{"id":582,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/r4mN8yoGRCSzsMLUBM50Lg__thumb/img/FGXJdD6PFbiTXB1Zv6Sf01Di_Z4=/fit-in/200x150/filters:strip_icc()/pic1199237.jpg","bgg_id":"1899","name":"13 Dead End Drive","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":583,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/JwHlzdCiymZLrjqwt3ZbjA__thumb/img/cG_Nh546UT7Q3L0cI-6OPR7KJ8s=/fit-in/200x150/filters:strip_icc()/pic1975896.jpg","bgg_id":"156119","name":"7 Wonders: Leaders Wil","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":584,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/YnDdBXF0c3VhNQmY-KJ0gQ__thumb/img/D444aZQ7psDx001KUH36-Tgfx40=/fit-in/200x150/filters:strip_icc()/pic3695314.png","bgg_id":"141932","name":"The Agents","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":585,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/74yrrQLPMSj2q_b_UAFo2A__thumb/img/0KKKuixsPxr4dcz9FxLq2u2HjQA=/fit-in/200x150/filters:strip_icc()/pic1847505.jpg","bgg_id":"151173","name":"The Agents: Black Ops","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":586,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/yXB3vRHl_1iSapvFH5mlKg__thumb/img/gp5pSQxgEffJCpZs95MfPQut5AM=/fit-in/200x150/filters:strip_icc()/pic1844614.jpg","bgg_id":"147402","name":"The Agents: Mission: Critical","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":587,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/Zk4tHbBMCEktTJ2MGXjjZQ__thumb/img/znevQ4dh76I6U-IGHHLEzyh7NR4=/fit-in/200x150/filters:strip_icc()/pic1844615.jpg","bgg_id":"147401","name":"The Agents: The 'Secret' Agents","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":588,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/l_JGFbDQwhGBRNyViQfwrQ__thumb/img/oze7c70ATMxH1zzIyf7bcAprmbU=/fit-in/200x150/filters:strip_icc()/pic1674976.jpg","bgg_id":"90419","name":"Airlines Europe","notes":"Like New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":589,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/sLYuYeAFEYTuHBJ5qAbbPQ__thumb/img/4LB3Ur2BuZkL9rZqNp9_tjWrTaw=/fit-in/200x150/filters:strip_icc()/pic1207030.jpg","bgg_id":"118063","name":"Android: Infiltration","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":590,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/DP20jf4R3RcsjJUwwV1vCw__thumb/img/SWczusxnG6IavIPNQXwvorFfqwo=/fit-in/200x150/filters:strip_icc()/pic2382123.jpg","bgg_id":"69789","name":"Ascension: Deckbuilding Game","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":591,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/L-xuJsLMDA-gYDmE12-3iQ__thumb/img/b798O8qXlTlm_tXK-W54-bBvbR4=/fit-in/200x150/filters:strip_icc()/pic1514751.jpg","bgg_id":"122294","name":"Ascension: Immortal Heroes","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":592,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/_04xA-d-rfygm0c49HE4vA__thumb/img/P-6cf4TEk7ewzrfP9d-8c-TxAY4=/fit-in/200x150/filters:strip_icc()/pic1170986.jpg","bgg_id":"3955","name":"BANG!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":593,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/fcLVBfmRzDNuXFKtLyo5Hg__thumb/img/692v5IMXmgaXLr4RcSgAcrf0sfQ=/fit-in/200x150/filters:strip_icc()/pic728057.jpg","bgg_id":"66508","name":"BANG! Wild West Show","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":594,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/v-Ct5ZMRc9wYsuJ0p7SGsw__thumb/img/wb35DEkNfserSA8vY2SpbnHyUt0=/fit-in/200x150/filters:strip_icc()/pic299525.jpg","bgg_id":"31088","name":"Battle of the Sexes: Bedroom Edition","notes":"Great condition. 8/10. Bought it used, played once, still in Great condition.","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":595,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/4pMxXwMH62SnoeowmyxyYA__thumb/img/48RrCZUjhhiaA0APTQv5aaOakDI=/fit-in/200x150/filters:strip_icc()/pic94218.jpg","bgg_id":"14708","name":"Battle of the Sexes: IQ Test","notes":"Great condition. 8/10. Bought it used, played once, still in Great condition.","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":596,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/IOHj2BPw0iHrJLkt2yPMRQ__thumb/img/ud0R_fTrdymDRZlWpmpgyOMd-wc=/fit-in/200x150/filters:strip_icc()/pic1917224.jpg","bgg_id":"147303","name":"Carcassonne: South Seas","notes":"Good","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":597,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/XtPzNxENbV1RsBeJDXmwOg__thumb/img/MK2rTWQBztPQiUbfR1-Lcfypcog=/fit-in/200x150/filters:strip_icc()/pic4889864.jpg","bgg_id":"131014","name":"Carcassonne: Winter Edition","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":598,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/-xDhpXhw5w5GeiL92h4kGg__thumb/img/z__w8Au5ZekkCR3s4SJuf31jZoo=/fit-in/200x150/filters:strip_icc()/pic6619523.png","bgg_id":"248447","name":"Courtier: Power Promo Cards","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":599,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/QkZnaTGfhiinYuJGm6ZVuQ__thumb/img/QsTk97fDl1Qej7na536xUlxVXp4=/fit-in/200x150/filters:strip_icc()/pic6619826.png","bgg_id":"182080","name":"Dominare: Promo Cards","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":600,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/2fgPg6Be--w97zoycObUgg__thumb/img/OrjzwJVfE8Qnk8e5efbae5EaSeY=/fit-in/200x150/filters:strip_icc()/pic4815198.jpg","bgg_id":"283355","name":"Dune","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":601,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/VW3dlHQB39XK189yiUTU6w__thumb/img/FeCwBcBcRMPKYg0P7e42_oXpZtM=/fit-in/200x150/filters:strip_icc()/pic7420359.jpg","bgg_id":"296579","name":"Dune: Ixians & Tleilaxu","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":602,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/wNCSCl961fMzDUhwetfjTg__thumb/img/sc0S7TSpC40Mg9EEmufj-XqXcBw=/fit-in/200x150/filters:strip_icc()/pic1236119.jpg","bgg_id":"100423","name":"Elder Sign","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":603,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/KxGzG9seGqnbDpct9Ih-LQ__thumb/img/Z7N3eXaZWztw9xA5n5YSFLxnY3U=/fit-in/200x150/filters:strip_icc()/pic1483756.jpg","bgg_id":"132128","name":"Escape: The Curse of the Temple Queenie 2: Doomed","notes":"New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":604,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/ZHVqbVFjE1V51i3lNB647g__thumb/img/89Zrc2watXBBGyz7ftPSttIPkiE=/fit-in/200x150/filters:strip_icc()/pic4672956.jpg","bgg_id":"182874","name":"Grand Austria Hotel","notes":"Like New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":605,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/gJ3a43M966bYfmo0imOXzg__thumb/img/MCGSnQOMG6YigIqliUUh9hOyTrY=/fit-in/200x150/filters:strip_icc()/pic7173612.jpg","bgg_id":"320780","name":"Grand Austria Hotel: Let's Waltz!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":606,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/htibdX4BUeQxMhIx_Z3zoA__thumb/img/4q81p56vZUSdjI4shikqjmKHuig=/fit-in/200x150/filters:strip_icc()/pic463733.jpg","bgg_id":"10659","name":"Hex Hex","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":607,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/K6lsriCeYeBBI8nfbSHpKQ__thumb/img/aTrXZPXISrvV3r_Gl1zcHzRq-f4=/fit-in/200x150/filters:strip_icc()/pic288584.jpg","bgg_id":"33040","name":"Humans!!!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":608,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/lPn48TQ2hVCRj9JPlIlmiQ__thumb/img/HL7R_63m1Pygy_V0RVvMnlTGczQ=/fit-in/200x150/filters:strip_icc()/pic666757.jpg","bgg_id":"66941","name":"Humans!!! 2: Sea Food","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":609,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/WKl0ygTtMS6dT4cUPx2CnA__thumb/img/uY87ZR1ROxvkXZcah2JAA9Y1HWQ=/fit-in/200x150/filters:strip_icc()/pic1365221.jpg","bgg_id":"119108","name":"Humans!!! 3: ZombieCon","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":610,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/-hk8f8iGk_DyWyMrfiPBkg__thumb/img/dBqYOO8uLXAumxUGuYtuiRGQ1Y8=/fit-in/200x150/filters:strip_icc()/pic1116080.jpg","bgg_id":"110327","name":"Lords of Waterdeep","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":611,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/ChZSk2MECGjo_WUjuKkfPw__thumb/img/f7adBspmKpTr-g3fq3Xz5BUgUXw=/fit-in/200x150/filters:strip_icc()/pic1590236.jpg","bgg_id":"134342","name":"Lords of Waterdeep: Scoundrels of Skullport","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":612,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/o5EyvF7qZD-VcQnvXqyKsg__thumb/img/FM9bnkcCBf2xLPekW97-YNhD_yU=/fit-in/200x150/filters:strip_icc()/pic2034049.jpg","bgg_id":"143789","name":"Machi Koro: Harbor","notes":"No box. Included into Machi Koro Base Box","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":613,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/pwHNR0n-N1APONSCQo_n1g__thumb/img/9dQhcZtpdvEGvGUuxwSR1GNUDU4=/fit-in/200x150/filters:strip_icc()/pic372144.jpg","bgg_id":"4076","name":"Management Material (General Office Edition)","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":614,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/EJnPZ9BFJ28AyhLMI44v4Q__thumb/img/WhInASp4Fq5LUQmNqeosc5FM_7s=/fit-in/200x150/filters:strip_icc()/pic32088.jpg","bgg_id":"7259","name":"Management Material: Information Technology Edition","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":615,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/UW3yUTkgPHMPJUeO8e9vWg__thumb/img/r_aH12fMza6eR-SXmfpBMSteEmI=/fit-in/200x150/filters:strip_icc()/pic55941.jpg","bgg_id":"12599","name":"Marriage Material","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":616,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/i6G_5oiey_7T4ksKm7e4ig__thumb/img/O1X2ptpFv0b79KZjV9C0_L70aXE=/fit-in/200x150/filters:strip_icc()/pic6619815.png","bgg_id":"248448","name":"Mercante: Shipment & Fleeting Promo Cards","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":617,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/VZ74hUUhQ06kTE9L2Gtgog__thumb/img/Uz6wI2IbIDwnlSLQEl0xUF56UAA=/fit-in/200x150/filters:strip_icc()/pic290059.jpg","bgg_id":"24141","name":"Monopoly: Family Guy","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":618,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/J-ts3MW0UhDzs621TR6cog__thumb/img/8hVkpMC5pDLr6ARI_4gI4N3aF5M=/fit-in/200x150/filters:strip_icc()/pic1871016.jpg","bgg_id":"1927","name":"Munchkin","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":619,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/3Mjt1-JxuXV_hamkypi0mw__thumb/img/5KiCIZrcPJ6AkX9FJb0E2RGxM3Y=/fit-in/200x150/filters:strip_icc()/pic2896170.jpg","bgg_id":"72321","name":"The Networks","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":620,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/AZQBu91NvyW1QxVoJOewSA__thumb/img/7rA6f7ua4GP45Hbukmu2IrRMs4s=/fit-in/200x150/filters:strip_icc()/pic3719798.jpg","bgg_id":"226711","name":"The Networks: Executives","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":621,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/kbHlYVYuSDObM5Ec3g-c1g__thumb/img/jocZy2v3-wC0pPDn-BOOj2EeXuE=/fit-in/200x150/filters:strip_icc()/pic2900779.jpg","bgg_id":"194003","name":"The Networks: On the Air","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":622,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/d1g8Yh14XHf63H3VOC93AA__thumb/img/DwCJeQSpNHs_cX8FfWwNlKqDRSQ=/fit-in/200x150/filters:strip_icc()/pic199316.jpg","bgg_id":"25554","name":"Notre Dame","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":623,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/HjIdXLuB5btRLk4OFgtnMg__thumb/img/de_btpbLUWeAiFSJ9047wrOk1bQ=/fit-in/200x150/filters:strip_icc()/pic1117436.jpg","bgg_id":"76065","name":"Pictionary Card Game","notes":"Like New, 9.5/10. Played once.","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":624,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/J897fuu-nl83_o90uOakVQ__thumb/img/s18kO6_0qCpGwK6IQZ9UhyJFjL8=/fit-in/200x150/filters:strip_icc()/pic3691155.jpg","bgg_id":"24480","name":"The Pillars of the Earth","notes":"Like New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":625,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/0HlGcCJC-RtRp9dhsj5g_A__thumb/img/XgXfxo86uo2QEXICaNLMcI5dqs0=/fit-in/200x150/filters:strip_icc()/pic334977.jpg","bgg_id":"31753","name":"The Pillars of the Earth: Expansion Set","notes":"Like New - No Box (Included in Base Game)","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":626,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/JRbCxYjxUsHatzwcdqijQw__thumb/img/RxLIPckhyYBlMnD6NYXXoWIh6Jk=/fit-in/200x150/filters:strip_icc()/pic2818719.jpg","bgg_id":"118536","name":"Police Precinct","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":627,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/Kr2QmITqa4X2DsSAnNio6Q__thumb/img/_8vLvfcvJ8pYILVWucjUfccoUFE=/fit-in/200x150/filters:strip_icc()/pic7608015.jpg","bgg_id":"156009","name":"Port Royal","notes":"Like New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":628,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/Vzns6XSMQ5osqIROTMe1Cw__thumb/img/WVibhtppCziO_Cx-MlXb4DBjBoY=/fit-in/200x150/filters:strip_icc()/pic2635736.jpg","bgg_id":"181899","name":"Port Royal: Ein Auftrag geht noch...","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":629,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/-DOqixs8uwKUvvWPKI4f9w__thumb/img/xLs-ldTPwaADbvzkOpF0sgWzwck=/fit-in/200x150/filters:strip_icc()/pic5261714.jpg","bgg_id":"28143","name":"Race for the Galaxy","notes":"Like New. 9.5/10, played twice, with Sleeves for all. Sleeves not included in any possible trade.","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":630,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/8o3y3jU2Xo0uc5tfFNnKZA__thumb/img/mk7zEttMs7vuE40xEk-jP-0Gsk4=/fit-in/200x150/filters:strip_icc()/pic766053.jpg","bgg_id":"75774","name":"Rattus: Judge Promo Card","notes":"Like New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":631,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/cAPTkL2BR3snLO71dkH8rw__thumb/img/5lDn1W82rlLXtVG7nPIYR9Orn-4=/fit-in/200x150/filters:strip_icc()/pic2576459.jpg","bgg_id":"41114","name":"The Resistance","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":632,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/V4udzGnIq-KA-N02erYUtA__thumb/img/XcqjgSwEaplb79mjRL17xwMb5Z4=/fit-in/200x150/filters:strip_icc()/pic2243281.png","bgg_id":"163322","name":"The Resistance: Hidden Agenda & Hostile Intent","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":633,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/B0oEVgeqs4_rT8oyb1_Juw__thumb/img/oZkHYUMtcGVwg_gz6OjtuiD3vmU=/fit-in/200x150/filters:strip_icc()/pic1772936.jpg","bgg_id":"144733","name":"Russian Railroads","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":634,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/vFe4l7tvqYKq2LZprffJWw__thumb/img/75ZzvxYGWISSUAV3pHoP5dLiEmk=/fit-in/200x150/filters:strip_icc()/pic2658044.png","bgg_id":"156943","name":"Saint Pétersbourg (deuxième édition)","notes":"Like New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":635,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/Yoidfpvt2eACASYUpbmsyg__thumb/img/oN0BjMknoiCwD-o5qeSCOxVPKF0=/fit-in/200x150/filters:strip_icc()/pic246360.jpg","bgg_id":"9217","name":"Saint Petersburg","notes":"Very Good/Like New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":636,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/1fEewarXkwjdLINUsUym3Q__thumb/img/N5CrTUi0Bq9rsHTztbMwB3NfWMo=/fit-in/200x150/filters:strip_icc()/pic2298046.png","bgg_id":"156943","name":"Saint Petersburg (Second Edition)","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":637,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/oxogZn9hWIzRD4U_RA--kg__thumb/img/sLpqKpCxdPpi7hW8LJJ3frY39l0=/fit-in/200x150/filters:strip_icc()/pic106675.jpg","bgg_id":"21367","name":"Sankt Petersburg: Das Bankett","notes":"Sleeved, Like new","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":638,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/JYqwG_v1B3RhpB7NcmeDOA__thumb/img/QOG1zO0uvqxGTDF9V_OewVPMvNE=/fit-in/200x150/filters:strip_icc()/pic70547.jpg","bgg_id":"15062","name":"Shadows over Camelot","notes":"Used. Very Good","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":639,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/vcibhFq6RIEVMgknZN9nkQ__thumb/img/_2U5jeZlYIOvbx26lWMm2tzXy44=/fit-in/200x150/filters:strip_icc()/pic94813.jpg","bgg_id":"2980","name":"The Simpsons Trivia Game","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":640,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/tinE1f2lauIsEL4aC9aU-w__thumb/img/9tewdwxUKcqikj0QlVSUmwRPK68=/fit-in/200x150/filters:strip_icc()/pic384313.jpg","bgg_id":"38453","name":"Space Alert","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":641,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/-TeGiWlPmL08oUOZM0xAAA__thumb/img/VxqwojJGyZ4_szp0g7QpgfAJkxw=/fit-in/200x150/filters:strip_icc()/pic1586888.jpg","bgg_id":"10292","name":"Street Fighter II","notes":"Great condition. 8/10. Bought it used, played once, still in Great condition.","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":642,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/tT6BlZZeFA3suBaK4H44mg__thumb/img/61UCtCvupRSvaoFDO2Uy5v3vrS4=/fit-in/200x150/filters:strip_icc()/pic3017371.jpg","bgg_id":"123260","name":"Suburbia","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":643,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/Cb0O0BhsKubx9MaqP-KLAg__thumb/img/tvhBrm7298L1-SFEPfv_m4DwQ3Q=/fit-in/200x150/filters:strip_icc()/pic1722753.jpg","bgg_id":"145196","name":"Suburbia Inc","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":644,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/bK6d6GP8kJp8k1jBos3phA__thumb/img/bmOfG7z9CwPMNTUiAQlbygjXGps=/fit-in/200x150/filters:strip_icc()/pic5592530.jpg","bgg_id":"315708","name":"Tapestry: Plans and Ploys","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":645,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/URkI3cTZ9NHdlPNRPSd2_g__thumb/img/FExSgdWqAgTCgouj74VMAlYHo_s=/fit-in/200x150/filters:strip_icc()/pic2891964.jpg","bgg_id":"167791","name":"Terraforming Mars","notes":"Like new","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":646,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/XuQN5HlG2bLbQu3AlQQgbQ__thumb/img/tf_tuTOtgXvRhibhHIa0uKh4l6Y=/fit-in/200x150/filters:strip_icc()/pic3767139.jpg","bgg_id":"231965","name":"Terraforming Mars: Venus Next","notes":"Like new","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":647,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/DhOKyXGyHNaDNoqfKtRieQ__thumb/img/rpuV6fjARO8MltgzjJ03qJ1Ntqw=/fit-in/200x150/filters:strip_icc()/pic2332319.jpg","bgg_id":"21790","name":"Thurn and Taxis","notes":"Like New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":648,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/0K1AOciqlMVUWFPLTJSiww__thumb/img/RDvu2FvsYVVH8icp1VsilUlqUGI=/fit-in/200x150/filters:strip_icc()/pic66668.jpg","bgg_id":"14996","name":"Ticket to Ride: Europe","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":649,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/3ehfArjNEAu0kjvnyrz9DA__thumb/img/FTdVefIVxe_HW498HFQBkaPNbu0=/fit-in/200x150/filters:strip_icc()/pic811926.jpg","bgg_id":"82216","name":"Trivial Pursuit: Steal Card Game","notes":"Like New. 9/10. Played once.","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":650,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/TWthoHKG1nhsj5GvHIdrKA__thumb/img/CNWbH4EAcmrmGBZ5zTx8Bd0djro=/fit-in/200x150/filters:strip_icc()/pic2850296.jpg","bgg_id":"171623","name":"The Voyages of Marco Polo","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":651,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/jQmkn-BBlR65kuKCJFIfJw__thumb/img/EllCwMkZEE1CAq3qJUCLsG4iipE=/fit-in/200x150/filters:strip_icc()/pic2850546.jpg","bgg_id":"186554","name":"The Voyages of Marco Polo: The New Characters","notes":"Like New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":652,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/YzAhOB8pMjySXnZahB5kUQ__thumb/img/KpvwtIoVJCADDRRVdMveHQuKjVQ=/fit-in/200x150/filters:strip_icc()/pic4787902.png","bgg_id":"249086","name":"The Voyages of Marco Polo: The Secret Path of Marco Polo","notes":"Like New","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":653,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/BxHQLD5nnVltDWXt4OKsgQ__thumb/img/Xf9hEf74SZfcOi0ZbNhdUW6BTt0=/fit-in/200x150/filters:strip_icc()/pic3938502.jpg","bgg_id":"244114","name":"Yellow & Yangtze","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":654,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/MLkRHrISvHx8plwBsCk9iw__thumb/img/AW6pHylkGBmfTSdI15DqRJ0JH6w=/fit-in/200x150/filters:strip_icc()/pic2525171.jpg","bgg_id":"2471","name":"Zombies!!!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":655,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/vbVobV7lSYeoLsdehyQm7Q__thumb/img/Pfj4Ehf0pZ__iACYGYqnaQiSUKM=/fit-in/200x150/filters:strip_icc()/pic1325450.jpg","bgg_id":"125394","name":"Zombies!!! 11: Death Inc.","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":656,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/L2iX_Nq2P1hxy7_g6-OLLw__thumb/img/pBHOJ_F69Gh3qlTP7oqkOnbV2j8=/fit-in/200x150/filters:strip_icc()/pic239961.jpg","bgg_id":"3651","name":"Zombies!!! 2: Zombie Corps(e)","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":657,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/qyM2hZP_YVUEqfQJVBcXVw__thumb/img/ptE-0c8rkfglusHe2m2ZIoacyuw=/fit-in/200x150/filters:strip_icc()/pic45130.jpg","bgg_id":"6113","name":"Zombies!!! 3: Mall Walkers","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":658,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/9gCRHMwGL4DZvTfdwx2x2Q__thumb/img/e0lrfJ5WCFNugYUDyo30WukjEjs=/fit-in/200x150/filters:strip_icc()/pic77247.jpg","bgg_id":"7810","name":"Zombies!!! 3.5: Not Dead Yet","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":659,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/aa0Sh2u34TM-9OQRyE8iwA__thumb/img/5comnnUUrDtFFX2WzcRWT5dnk3w=/fit-in/200x150/filters:strip_icc()/pic320060.jpg","bgg_id":"10167","name":"Zombies!!! 4: The End...","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":660,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/mYmSD3Je-iNGqfYoqVJ3Ow__thumb/img/wbr_PMZ2e3NYBnZfWrE5GtXzydg=/fit-in/200x150/filters:strip_icc()/pic445860.jpg","bgg_id":"20494","name":"Zombies!!! 5: School's Out Forever","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":661,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/_IHFjEr0K2rH_G6OXF3w9g__thumb/img/8s-S00OaHhdawdkA5kxl9Oao4iE=/fit-in/200x150/filters:strip_icc()/pic2462598.jpg","bgg_id":"28734","name":"Zombies!!! 6: Six Feet Under","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":662,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/0V5qFriRB4uxujqCJdCewA__thumb/img/SoG6leeXbn1JRYVghh1bu-3tE5w=/fit-in/200x150/filters:strip_icc()/pic302171.jpg","bgg_id":"34132","name":"Zombies!!! 7: Send in the Clowns","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":663,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/Zk5oBrHmnRnMhCyzKDh6xQ__thumb/img/cAAHeI7DB5eTwkkUT8S-mfJ8TCU=/fit-in/200x150/filters:strip_icc()/pic426906.jpg","bgg_id":"40674","name":"Zombies!!! 8: Jailbreak","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":664,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/kOgDB3shEPk14LkkyvwmUw__thumb/img/XK8CsUlc30rzqd9vP_ucicORut4=/fit-in/200x150/filters:strip_icc()/pic666766.jpg","bgg_id":"66942","name":"Zombies!!! 9: Ashes to Ashes","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":665,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/PvQ9TzAGKRpNgLOvyDNvjQ__thumb/img/t1ZwtxX19eAASpjYid8MYALoseM=/fit-in/200x150/filters:strip_icc()/pic1006135.jpg","bgg_id":"99407","name":"Zombies!!! X: Feeding the Addiction","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":666,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/2GZeockjNypzXDieZ2FM9A__thumb/img/cmPXiDZM4WHPDrTE5eQj8MU4FcU=/fit-in/200x150/filters:strip_icc()/pic1131233.jpg","bgg_id":"108665","name":"Zpocalypse","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":667,"username":"xXazn_romeoXx","thumbnail":"https://cf.geekdo-images.com/zUNmgEBWyEnvt0yfVGOuRQ__thumb/img/0_iKo3aY2Cyyyu2gJ4tGI_Ju1uA=/fit-in/200x150/filters:strip_icc()/pic1351008.jpg","bgg_id":"126966","name":"Zpocalypse: Zmaster","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.100Z"},
{"id":668,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/wQ2L_ahr-B9X9y4_4rEBzQ__thumb/img/T_fhicNzBEapy9QjudQhRc6RERw=/fit-in/200x150/filters:strip_icc()/pic114699.jpg","bgg_id":"1749","name":"Alien Hotshots","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":669,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/JqH8I6ZCmYs0ipOESuIvbg__thumb/img/wPTeF_gfrnNWc8EbhegR00A_iyY=/fit-in/200x150/filters:strip_icc()/pic117949.jpg","bgg_id":"12511","name":"Artifact","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":670,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/7pSqJj3t8HHYkn5tx5OpFA__thumb/img/LD7XS_JBIfmDPuNWqbAZbtqNPCE=/fit-in/200x150/filters:strip_icc()/pic3747298.jpg","bgg_id":"235533","name":"Beta Colony","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":671,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/uIDZwP38gJpn0al02PlHNw__thumb/img/zYDdPncqT1grqNpeSzuAS7LzvkY=/fit-in/200x150/filters:strip_icc()/pic2796694.jpg","bgg_id":"166286","name":"Bottom of the 9th","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":672,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/LZpwC8dzzgGhyRpDMuvLHw__thumb/img/l1vQFWFybstW17gmnukVKzzshRg=/fit-in/200x150/filters:strip_icc()/pic2618286.jpg","bgg_id":"181935","name":"Bottom of the 9th: Big League Support","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":673,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/CRCJYRmiflsCpzzK69rlNw__thumb/img/cLCJ5JVQCAOO5UhEvnigD0-5PvI=/fit-in/200x150/filters:strip_icc()/pic2619291.jpg","bgg_id":"181922","name":"Bottom of the 9th: Fanatic","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":674,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/Gwx2_ee5DBBXs1LckwBYpg__thumb/img/H73-HjbG9EIoWoUGM4UoaHwQZ1s=/fit-in/200x150/filters:strip_icc()/pic2619287.jpg","bgg_id":"181927","name":"Bottom of the 9th: Scholar","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":675,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/SZBGa06zcRTY3hFRTY8Z8A__thumb/img/0z0Wt0u81YD8BcvediSa1PA0G8Q=/fit-in/200x150/filters:strip_icc()/pic2618307.jpg","bgg_id":"181933","name":"Bottom of the 9th: Sentinels of the Ninth","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":676,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/m8E8SzbVcptbObZvcwiWmQ__thumb/img/mlmhCkFZiPttO0uM1Dm9RJPc_jE=/fit-in/200x150/filters:strip_icc()/pic2618312.jpg","bgg_id":"181924","name":"Bottom of the 9th: Unity","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":677,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/qp1bFTyCQqoc-4B9En5NjA__thumb/img/_YUr2h7a9wdsovXTZ9fQ4j8TbCk=/fit-in/200x150/filters:strip_icc()/pic2618275.jpg","bgg_id":"181930","name":"Bottom of the 9th: Wraith","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":678,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/okM0dq_bEXnbyQTOvHfwRA__thumb/img/88274KiOg94wziybVHyW8AeOiXg=/fit-in/200x150/filters:strip_icc()/pic6544250.png","bgg_id":"822","name":"Carcassonne","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":679,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/g9q--tONTL86x2D4NKiM8g__thumb/img/opBzVTp4iK4LfozCr3doTYGwTHE=/fit-in/200x150/filters:strip_icc()/pic2659943.jpg","bgg_id":"2993","name":"Carcassonne: Expansion 1 Inns & Cathedrals","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":680,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/L4k50H_P0oLJaqvTrb8ENA__thumb/img/xlzGcVmSjeUndxbcUS1s06k2kgM=/fit-in/200x150/filters:strip_icc()/pic4134883.jpg","bgg_id":"66646","name":"Carcassonne: Expansion 8 Bridges, Castles and Bazaars","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":681,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/LK1zB7jxVDitS2peR-7VTg__thumb/img/Wm15FvF78Pl0ZfQ-oVH_t5woTac=/fit-in/200x150/filters:strip_icc()/pic1013538.png","bgg_id":"92332","name":"Carcassonne: The Phantom","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":682,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/YDY6ZHqdRyDMvpfQO_jV7A__thumb/img/AJf9NTVOgyXyntg2jjZW1FuR9aM=/fit-in/200x150/filters:strip_icc()/pic4853982.jpg","bgg_id":"269511","name":"Cooper Island","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":683,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/tmqogaBs1ZnNyhi9YKN1qA__thumb/img/kjYCIEKe9YI_FcZkNG6UIp26qSE=/fit-in/200x150/filters:strip_icc()/pic125474.jpg","bgg_id":"13284","name":"Cowpoker","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":684,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/20Tg2sF-oo8lVnMrxRkxhg__thumb/img/yqvkZRD4dk1wag5TuAXMC7uTecc=/fit-in/200x150/filters:strip_icc()/pic3188824.jpg","bgg_id":"209222","name":"Drachenturm","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":685,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/Rr2tK2caPxzFLRvMbrf4sQ__thumb/img/0lj1n-lPKqm9d2Ztmd1a3Dtw5oQ=/fit-in/200x150/filters:strip_icc()/pic6499900.jpg","bgg_id":"350948","name":"Familiar Tales","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":686,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/s9oGMCo1fcfV4Dk3EnqLZw__thumb/img/AKxMMz2DTbBrEynhDROla8fdjJ4=/fit-in/200x150/filters:strip_icc()/pic3146943.png","bgg_id":"177736","name":"A Feast for Odin","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":687,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/Q1_8tun2NCVSzJ2peFu5mg__thumb/img/OQfR4jeVXltsVJ59mDtB870EQoE=/fit-in/200x150/filters:strip_icc()/pic3789942.jpg","bgg_id":"236902","name":"A Feast for Odin: Lofoten, Orkney, and Tierra del Fuego","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":688,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/hzgTiNWQ7Vh3Ywr9OhXvtQ__thumb/img/bSQOOl58QL4daQjquCaVqQ47JAs=/fit-in/200x150/filters:strip_icc()/pic4278032.jpg","bgg_id":"216788","name":"A Feast for Odin: The Norwegians","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":689,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/vuxezjNowOBYgYQQ7b5eVA__thumb/img/2q8kyue4GNC-o0RB_23wg58Zx6M=/fit-in/200x150/filters:strip_icc()/pic2337868.png","bgg_id":"170202","name":"Floating Market","notes":"Good condition but for a slice on the box cover from a knife upon opening.","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":690,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/C-l4zMG4TBWAj3l5fpmVcQ__thumb/img/jOamRqWX4ehMxaMFNeFphKE4HYg=/fit-in/200x150/filters:strip_icc()/pic3291982.jpg","bgg_id":"158600","name":"Hanamikoji","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":691,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/QKo6ujrTGJBgXoG1oEuoAQ__thumb/img/owRLmPoUxcdR0JBDl5BzZ3RFLhI=/fit-in/200x150/filters:strip_icc()/pic3968823.jpg","bgg_id":"223750","name":"Hardback","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":692,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/VGP4ZTOzo4OHjHiDBDfx1Q__thumb/img/EcU2AzVuptcrjEhUohyC9VBn4Ro=/fit-in/200x150/filters:strip_icc()/pic7049926.jpg","bgg_id":"180901","name":"Joraku","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":693,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/yetm7Pm1q8pHZHKzTdbRzQ__thumb/img/IjEOV5bv87acgT8QSeq986nZE9A=/fit-in/200x150/filters:strip_icc()/pic6555174.png","bgg_id":"352567","name":"Jurassic World: The Legacy of Isla Nublar","notes":"Good","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":694,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/Q_R2gkpJwV-oKNey6eeIcQ__thumb/img/BbmMGq1NLQwWJXrsV-mNs98X3zY=/fit-in/200x150/filters:strip_icc()/pic2568580.jpg","bgg_id":"132497","name":"Lift it!","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":695,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/-19XPXmTn9QyyvqwpcFkBw__thumb/img/T3jn8ks3g0zLyISTRQkIr0D1WSE=/fit-in/200x150/filters:strip_icc()/pic5231006.jpg","bgg_id":"298047","name":"Marvel United","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":696,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/OfTGMtXxWRsOXeKZwigX4A__thumb/img/iq3iQevT3FZSY3lQU7S2AdUa1uE=/fit-in/200x150/filters:strip_icc()/pic5831506.jpg","bgg_id":"321731","name":"Marvel United: Kickstarter Promos Box","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":697,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/9oQJGvSl2QcVucUuN5nEjA__thumb/img/LX7-iLy_QxBhzy4MedNzIKmZfow=/fit-in/200x150/filters:strip_icc()/pic5263265.jpg","bgg_id":"302669","name":"Marvel United: Rise of the Black Panther","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":698,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/n4J5LebMj0DQD016qW7ABw__thumb/img/Nbu-AYVIop-1yvVfs5zjKowtlEQ=/fit-in/200x150/filters:strip_icc()/pic3184103.jpg","bgg_id":"209010","name":"Mechs vs. Minions","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":699,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/246rJgxtKzCuVTmsAfn62g__thumb/img/Xl0HLaiNdPQSwyqUIy1Td1-hLRA=/fit-in/200x150/filters:strip_icc()/pic4171243.jpg","bgg_id":"251293","name":"Megaland","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":700,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/kzLZY_DHTh-hBcqXP34a5w__thumb/img/82b4hCqE8tTLkwexnLrp3ubGU_c=/fit-in/200x150/filters:strip_icc()/pic4330533.jpg","bgg_id":"590","name":"Mille Bornes","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":701,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/7qJ3qL1f6RaPGlbtC3A_qQ__thumb/img/Fz-orLJt707QUUcEZ0jHT8a-HrU=/fit-in/200x150/filters:strip_icc()/pic26270.jpg","bgg_id":"6607","name":"Munchkin Fu","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":702,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/Ch1eXrMKHaKsgye9va96JA__thumb/img/Wxrl9x0uphwukgZ5Yfp-irY8oKE=/fit-in/200x150/filters:strip_icc()/pic56781.jpg","bgg_id":"14087","name":"Munchkin Fu 2: Monky Business","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":703,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/gCeKvj1ULixFOJ7uFawkcg__thumb/img/xD_r6E6ZwYKXH-rtVPhGZoVleC4=/fit-in/200x150/filters:strip_icc()/pic2225998.jpg","bgg_id":"150658","name":"Pandemic: The Cure","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":704,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/pp-2Aiu1XiMYvb9uP2cR_A__thumb/img/YTSQ1er-4kgSz5NDFNt2LNRhv7M=/fit-in/200x150/filters:strip_icc()/pic3142427.jpg","bgg_id":"207017","name":"Pandemic: The Cure Experimental Meds","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":705,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/iZl2U-2BjftbWfLw5y25Vg__thumb/img/36X5ESX-n44TFPf8V97Cvr1yPao=/fit-in/200x150/filters:strip_icc()/pic7069377.jpg","bgg_id":"141572","name":"Paperback","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":706,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/eEJ8pHZw_jrvfLVrysyZ1g__thumb/img/vRwF_OtQmW6qpmR68gDWzVsnWhU=/fit-in/200x150/filters:strip_icc()/pic3583166.jpg","bgg_id":"8531","name":"PDQ: The Pretty Darn Quick Word Game","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":707,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/LeaLDlTTmeN639MfuflcMw__thumb/img/CSPEyoFAcA3WwtzDekp3Mfepcek=/fit-in/200x150/filters:strip_icc()/pic2286966.jpg","bgg_id":"811","name":"Rummikub","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":708,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/GRp__UYY-wM-i2fg4Qzefw__thumb/img/qLl_YEnA_TiXfhinS8yqAARKUFY=/fit-in/200x150/filters:strip_icc()/pic3911078.jpg","bgg_id":"242277","name":"Scythe: The Rise of Fenris","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":709,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/Z1ihG_FHEKuf1Et53f2Dzg__thumb/img/3LXpXcuoBQGQACl-Yw4fGqls2GM=/fit-in/200x150/filters:strip_icc()/pic6349029.png","bgg_id":"291845","name":"Three Sisters","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":710,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/ZMs9DL6SI2OzKlMOoJnygQ__thumb/img/I3QYLXp0H8kyJIz2YHI2Iu3VxfI=/fit-in/200x150/filters:strip_icc()/pic336874.jpg","bgg_id":"9284","name":"Treasure Falls","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":711,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/ZfJuaaqZr_QH3kYxBsZgxA__thumb/img/b4A6lFz7luZ-rWaygKvsAdUfQu8=/fit-in/200x150/filters:strip_icc()/pic3372426.jpg","bgg_id":"216091","name":"Unlock!: Escape Adventures The Formula","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"},
{"id":712,"username":"jme198","thumbnail":"https://cf.geekdo-images.com/JPe6N9izQjpfc3VJWj6wgA__thumb/img/yMDQP3MQV223wEk26IpIRSQQmMk=/fit-in/200x150/filters:strip_icc()/pic130309.jpg","bgg_id":"2887","name":"The Yeti Slalom","notes":"","price":null,"updated_at":"2024-02-04T17:40:43.163Z"}]

6
tests/test.js Normal file
View File

@ -0,0 +1,6 @@
import { expect, test } from '@playwright/test';
test('index page has expected h1', async ({ page }) => {
await page.goto('/');
await expect(page.getByRole('heading', { name: 'Welcome to SvelteKit' })).toBeVisible();
});

View File

@ -1,10 +1,9 @@
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vitest/config';
import DynamicPublicDirectory from 'vite-multiple-assets';
export default defineConfig({
plugins: [sveltekit()],
test: {
include: ['src/**/*.{test,spec}.{js,ts}'],
},
include: ['src/**/*.{test,spec}.{js,ts}']
}
});