Add crew designator to events

Distinguish between events for attendees to see and events that are
meant only for the crew.
This commit is contained in:
Hornwitser 2025-03-10 14:40:02 +01:00
parent 40c25f8990
commit db8393c3a9
3 changed files with 96 additions and 20 deletions

View file

@ -32,16 +32,27 @@ const events = [
"d1 12:00 4h clubhouse",
"d2 12:00 4h clubhouse",
"d3 12:00 4h clubhouse",
]
],
},
{ name: "Arcade Setup", crew: true, slots: ["d1 11:00 1h clubhouse"], },
{
name: "Bonfire Stories",
description: "Share your stories as we sit cosily around the campfire.",
slots: ["d2 18:00 2h campfire"]
slots: ["d2 18:00 2h campfire"],
},
{ name: "Stage Rigging", crew: true, slots: ["d1 11:00 7h30m stage"]},
{
name: "Reconfigure for DJ",
crew: true,
slots: [
"d2 19:00 1h stage",
"d3 18:45 1h15m stage",
],
},
{ name: "DJ Alpha", slots: ["d2 20:00 2h stage"] },
{ name: "DJ Bravo", slots: ["d3 20:00 2h stage"] },
{ name: "DJ Charlie", slots: ["d3 22:00 2h stage"] },
{ name: "Prepare Fursuit Games", crew: true, slots: ["d4 17:00 1h clubhouse"] },
{
name: "Fursuit Games",
description: "Playful time for the suiters.",
@ -50,6 +61,8 @@ const events = [
{ name: "Fishing Trip", slots: ["d3 12:00 3h30m outside"]},
{ name: "Opening", slots: ["d1 18:30 1h30m stage"]},
{ name: "Closing", slots: ["d5 16:00 1h stage"]},
{ name: "Stage Teardown", crew: true, slots: ["d5 17:00 4h stage"]},
{ name: "Setup Board Games", crew: true, slots: ["d1 11:30 30m summerhouse"]},
{
name: "Board Games",
slots: [
@ -57,9 +70,18 @@ const events = [
"d2 12:00 4h summerhouse",
"d3 12:00 4h summerhouse",
"d4 12:00 4h summerhouse",
]
],
},
{ name: "Teardown Board Games", crew: true, slots: ["d4 16:00 30m summerhouse"]},
{ name: "📷meet", slots: ["d3 19:00 1h10m summerhouse"]},
{
name: "Prepare Karaoke",
crew: true,
slots: [
"d3 20:00 1h clubhouse",
"d4 20:00 1h clubhouse",
],
},
{
name: "Karaoke",
slots: [
@ -68,9 +90,21 @@ const events = [
],
},
{ name: "Dance", slots: ["d1 20:00 3h stage"]},
{ name: "Prepare Charity Auction", crew: true, slots: ["d4 10:00 3h stage"]},
{ name: "Charity Auction", slots: ["d4 13:00 2h stage"]},
{ name: "Tournament Preparation", crew: true, slots: ["d2 15:00 2h stage"]},
{ name: "Tournament", slots: ["d2 17:00 2h stage"]},
{ name: "Canoe Trip", slots: ["d4 11:00 4h30m outside"]},
{
name: "Dinner Preparations",
crew: true,
slots: [
"d1 14:00 2h campfire",
"d2 14:00 2h campfire",
"d3 14:00 2h campfire",
"d4 14:00 2h campfire",
],
},
{
name: "Dinner",
slots: [
@ -80,10 +114,24 @@ const events = [
"d4 16:00 1h campfire",
],
},
{
name: "Dinner Cleanup",
crew: true,
slots: [
"d1 17:00 1h campfire",
"d2 17:00 1h campfire",
"d3 17:00 1h campfire",
"d4 17:00 1h campfire",
],
},
{ name: "Prepare Film Night", crew: true, slots: ["d4 19:00 2h stage"]},
{ name: "Film Night", slots: ["d4 21:00 2h stage"]},
{ name: "Photo", slots: ["d3 18:00 45m stage"]},
{ name: "Prepare Group Photo", crew: true, slots: ["d3 17:00 1h stage"]},
{ name: "Group Photo", slots: ["d3 18:00 45m stage"]},
{ name: "Setup Artist Alley", crew: true, slots: ["d4 10:00 2h clubhouse"]},
{ name: "Artist Alley", slots: ["d4 12:00 4h clubhouse"]},
{ name: "Feedback Panel", slots: ["d5 18:00 4h clubhouse"]},
{ name: "Teardown Artist Alley", crew: true, slots: ["d4 16:00 1h clubhouse"]},
{ name: "Feedback Panel", slots: ["d5 18:00 1h clubhouse"]},
];
function toId(name: string) {
@ -94,7 +142,7 @@ function toIso(date: Date) {
return date.toISOString().replace(":00.000Z", "Z");
}
function toSlot(origin: Date, id: string, shorthand: string, index: number): TimeSlot {
function toSlot(origin: Date, id: string, shorthand: string, index: number, counts: Map<string, number>): TimeSlot {
const [day, start, duration, location] = shorthand.split(" ");
const [startHours, startMinutes] = start.split(":").map(time => parseInt(time, 10));
const dayNumber = parseInt(day.slice(1));
@ -113,6 +161,7 @@ function toSlot(origin: Date, id: string, shorthand: string, index: number): Tim
start: toIso(startDate),
end: toIso(endDate),
locations: [location],
interested: counts.get(`${id}-${index}`),
};
}
@ -125,13 +174,22 @@ export function generateDemoSchedule(): Schedule {
origin.setUTCSeconds(0);
origin.setUTCMilliseconds(0);
const counts = new Map<string, number>()
for (const account of generateDemoAccounts()) {
for (const id of account.interestedIds ?? []) {
counts.set(id, (counts.get(id) ?? 0) + 1);
}
}
return {
events: events.map(
({ name, description, slots }) => ({
({ name, crew, description, slots }) => ({
id: toId(name),
name,
crew,
description,
slots: slots.map((shorthand, index) => toSlot(origin, toId(name), shorthand, index))
interested: counts.get(toId(name)),
slots: slots.map((shorthand, index) => toSlot(origin, toId(name), shorthand, index, counts))
})
),
locations: locations.map(
@ -178,6 +236,7 @@ export function generateDemoAccounts(): Account[] {
// These have a much higher probability of being in someone's interested list.
const desiredEvent = ["opening", "closing", "fursuit-games"];
const nonCrewEvents = events.filter(event => !event.crew);
for (const account of accounts) {
const interestedIds: string[] = [];
@ -189,7 +248,7 @@ export function generateDemoAccounts(): Account[] {
const eventsToAdd = Math.floor(random() * 10);
while (interestedIds.length < eventsToAdd) {
const event = events[Math.floor(random() * events.length)];
const event = nonCrewEvents[Math.floor(random() * nonCrewEvents.length)];
const eventId = toId(event.name);
if (interestedIds.some(id => id.replace(/-\d+$/, "") === eventId)) {
continue;