From 12a5afcf439e4879bab5a7bf5a92b6834a619c48 Mon Sep 17 00:00:00 2001
From: Tor Andersson <tor@ccxvii.net>
Date: Thu, 21 Sep 2023 22:16:31 +0200
Subject: Add match making.

---
 views/about.pug       | 20 +++++++++++++++
 views/admin_match.pug | 53 ++++++++++++++++++++++++++++++++++++++
 views/header.pug      |  2 ++
 views/match.pug       | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 146 insertions(+)
 create mode 100644 views/admin_match.pug
 create mode 100644 views/match.pug

(limited to 'views')

diff --git a/views/about.pug b/views/about.pug
index dd12772..85522df 100644
--- a/views/about.pug
+++ b/views/about.pug
@@ -74,6 +74,26 @@ html
 				If you want to play with friends, check the "private" checkbox and invite your friends
 				from the join page after you have created the game.
 
+			h2 Matchmaking
+
+			p.
+				The match maker will match players up and start games automatically
+				once there are enough people waiting for the same game.
+				Players will be matched with opponents of similar Elo ratings when possible.
+
+			p.
+				Live tickets expire after 3 hours if you don't get a match.
+				All of your other Live tickets are removed when you get matched for a Live game.
+
+			p.
+				Fast tickets take the time of day into account.
+				Queue up when you want to start playing for the best results.
+
+			p.
+				<i>Don't queue up for too many games!</i>
+				It can take a while for the matches to start,
+				so you may end up with more games than you can handle.
+
 			h2 Privacy statement
 
 			p When you create an account we collect the following personal information:
diff --git a/views/admin_match.pug b/views/admin_match.pug
new file mode 100644
index 0000000..11a6c54
--- /dev/null
+++ b/views/admin_match.pug
@@ -0,0 +1,53 @@
+//- vim:ts=4:sw=4:
+
+mixin show_ticket(ticket)
+	- var setup = SETUP_TABLE[ticket.setup_id]
+	tr
+		td= ticket.name
+		td= ticket.rating
+		td= setup.setup_name
+		td #{ticket.time} UTC
+
+mixin show_ticket_list(list)
+	table
+		thead
+			tr
+				th User
+				th Rating
+				th Title
+				th Age
+		tbody
+			each ticket in list
+				+show_ticket(ticket)
+
+doctype html
+html
+	head
+		include head
+		title Matches
+		style.
+			div.buttons { margin-top: 8px }
+	body
+		include header
+		article
+			h1 Waiting Room - Admin
+
+			p Time is #{new Date().toISOString()}
+
+			h2 Live Tickets
+			if live_tickets.length > 0
+				+show_ticket_list(live_tickets)
+			else
+				p No live tickets.
+
+			h2 Fast Tickets
+			if fast_tickets.length > 0
+				+show_ticket_list(fast_tickets)
+			else
+				p No fast tickets.
+
+			h2 Slow Tickets
+			if slow_tickets.length > 0
+				+show_ticket_list(slow_tickets)
+			else
+				p No slow tickets.
diff --git a/views/header.pug b/views/header.pug
index 454c35a..dfeef5c 100644
--- a/views/header.pug
+++ b/views/header.pug
@@ -6,6 +6,8 @@ header
 		if user
 			if ENABLE_FORUM
 				a(href="/forum") Forum
+			if ENABLE_MATCHES
+				a(href="/games/match") Match
 			a(href="/games/public") Public
 			if user.waiting > 0
 				a(href="/games/active") Games (#{user.waiting})
diff --git a/views/match.pug b/views/match.pug
new file mode 100644
index 0000000..504cef5
--- /dev/null
+++ b/views/match.pug
@@ -0,0 +1,71 @@
+//- vim:ts=4:sw=4:
+
+mixin show_ticket(ticket)
+	- var setup = SETUP_TABLE[ticket.setup_id]
+	label
+		input(type="checkbox" name="tickets" value=ticket.ticket_id)
+		case ticket.pace
+			when 1
+				| #{EMOJI_LIVE} #{setup.setup_name}
+			when 2
+				| #{EMOJI_FAST} #{setup.setup_name}
+			when 3
+				| #{EMOJI_SLOW} #{setup.setup_name}
+
+mixin show_setup(setup)
+	label
+		input(type="checkbox" name="setups" value=setup.setup_id)
+		| #{setup.setup_name}
+
+mixin show_setup_list(list)
+	each setup in list
+		+show_setup(setup)
+
+doctype html
+html
+	head
+		include head
+		title Matches
+		style.
+			label { display: block; margin: 2px 0; user-select: none }
+			div.group, details { margin: 6px 0 }
+			details > summary { user-select: none }
+			details > label { margin-left: 24px }
+	body
+		include header
+		article
+			h1 The Miraculous Match-making Machine
+
+			p People go in one end; games come out the other.
+
+			h2 Tickets
+			if tickets.length > 0
+				form(method="post" action="/api/match/unqueue")
+					each ticket in tickets
+						+show_ticket(ticket)
+					if tickets.length > 7
+						p
+							i Don't sign up for more games than you will be able to handle!
+					p
+						button(name="submit") &#x274c; Delete
+			else
+				p You are not queued for any matches.
+
+			h2 Register
+			if limit
+				p.error= limit
+			else
+				form(method="post" action="/api/match/queue")
+					each title in TITLE_LIST
+						if title.setups.length > 2
+							details
+								summary
+									u= title.title_name
+								+show_setup_list(title.setups)
+						else
+							div.group
+								+show_setup_list(title.setups)
+					p
+						button(name="pace" value=1) #{EMOJI_LIVE} Play Live
+						button(name="pace" value=2) #{EMOJI_FAST} Play Fast
+						button(name="pace" value=3) #{EMOJI_SLOW} Play Slow
-- 
cgit v1.2.3