summaryrefslogtreecommitdiff
path: root/views/chat.pug
diff options
context:
space:
mode:
Diffstat (limited to 'views/chat.pug')
-rw-r--r--views/chat.pug93
1 files changed, 93 insertions, 0 deletions
diff --git a/views/chat.pug b/views/chat.pug
new file mode 100644
index 0000000..dfe6f25
--- /dev/null
+++ b/views/chat.pug
@@ -0,0 +1,93 @@
+//- vim:ts=4:sw=4:
+doctype html
+html
+ head
+ include head
+ title Chat Log
+ style.
+ table { width: min(60rem,100%); }
+ td:nth-child(1), td:nth-child(2) { white-space: nowrap; width: 0; }
+ td:nth-child(3) { white-space: nowrap; width: 8rem; }
+ #foot { display: inline-block; padding-top: 8px; }
+ table { border: 1px solid black; }
+ td { border: none; }
+ td a { text-decoration: none; color: black; }
+ tr { background-color: white; }
+ tr.me { background-color: aliceblue; }
+ body
+ include header
+ article
+ h1 Chat Log
+ if page_size > 0
+ p
+ button(onclick="oldest()") Oldest
+ button(onclick="back()") ←
+ button(onclick="next()") →
+ button(onclick="newest()") Newest
+ span#foot
+ p
+ table
+ thead
+ tr
+ th Game
+ th Time
+ th Who
+ th Message
+ tbody
+ if page_size > 0
+ p: a(href="/chat/all") All messages
+
+ script.
+ let chat_data = !{ JSON.stringify(chat).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;") };
+ let page_size = !{ page_size };
+ let me = !{ JSON.stringify(user.name) };
+ let table = document.querySelector("tbody");
+ let foot = document.querySelector("#foot");
+ let chat_lines = [];
+ function add(tr,text,link) {
+ let td = document.createElement("td");
+ if (link) {
+ let a = document.createElement("a");
+ a.href = link;
+ a.textContent = text;
+ td.appendChild(a);
+ } else {
+ td.textContent = text;
+ }
+ tr.appendChild(td);
+ }
+ function format_date(date) {
+ let t = date.toISOString();
+ return t.substring(0,10) + " " + t.substring(11,19);
+ }
+ for (let [game_id,time,user,message] of chat_data) {
+ let tr = document.createElement("tr");
+ if (user === me) tr.className = "me";
+ add(tr,game_id,"/join/"+game_id);
+ add(tr,format_date(new Date(time+"Z")));
+ add(tr,user,"/user/"+user);
+ add(tr,message);
+ chat_lines.push(tr);
+ }
+ function next() { if (page > 0) --page; update(); }
+ function back() { if (page < page_count-1) ++page; update(); }
+ function newest() { page=0; update(); }
+ function oldest() { page=page_count-1; update(); }
+ let chat_size = chat_lines.length;
+ let page_count = Math.ceil(chat_size / page_size);
+ let page = 0;
+ function update() {
+ table.innerHTML = "";
+ for (let i = 0; i < page_size; ++i) {
+ let k = page * page_size + ( page_size - i - 1);
+ if (k >= 0 && k < chat_size)
+ table.appendChild(chat_lines[k]);
+ foot.textContent = `${page_count-page} / ${page_count}`;
+ }
+ }
+ if (page_size > 0) {
+ newest();
+ } else {
+ for (let i = chat_size-1; i >= 0; --i)
+ table.appendChild(chat_lines[i]);
+ }