diff --git a/index.html b/index.html index a8f052e..c32252c 100644 --- a/index.html +++ b/index.html @@ -12,7 +12,11 @@

TEAM: NAME:

--> -

:

+

: + + +

TEXT:

RANK: diff --git a/jstrr.css b/jstrr.css index 3b74f9b..af4db04 100644 --- a/jstrr.css +++ b/jstrr.css @@ -1,7 +1,9 @@ body {background: blue;} +body.secret {background: black; color: white;} div#typing {margin: 1em 1ex; border-top: double cyan 5px;} div#typing pre { min-height: 3em; border: 1px solid navy; margin: 0 1ex; padding: 0 0.5ex; + font-size: 150%; } span.text {xcolor: blue;} span.text::first-line {background: white;} diff --git a/jstrr.js b/jstrr.js index 2b39260..e3549a3 100644 --- a/jstrr.js +++ b/jstrr.js @@ -159,7 +159,8 @@ "start": mystate.start, "finish": finish, "miss": mystate.miss, - "types": sum + "types": sum, + "trrmode": mystate.trrmode }); } function trr(e) { @@ -545,7 +546,11 @@ for (id of ["miss", "ratio", "types", "time", "score"]) { setElementIDText(id, ""); } - setElementIDText("comment", "自主練は BS で開始よ。"); + if (area[nArea] && area[nArea].textContent + && area[nArea].textContent >= 0) + setElementIDText("comment", "自主練は BS で開始よ。"); + else + setElementIDText("comment", "まずTEXTを選択するところからよ。"); setElementIDText("info", "Ready..."); } function tryLogin() { @@ -588,13 +593,36 @@ document.getElementById("reset").addEventListener("click", _reset); } } + function logout() { + _reset(); + location.reload(); + } + function trrmode(ev) { + document.body.classList.remove(mystate["trrmode"]); + document.body.classList.add(mystate["trrmode"] = ev.target.value); + _entryFocus(); + } + function setupTrrMode() { + var modesel = document.getElementById("trrmode"); + modesel.addEventListener("change", trrmode); + modesel.options[0].selected = true; + } + var wsInitRetry = 10; function wsInit() { - loginhead.textContent = "Connecting Server....." + loginhead.textContent = "Connecting Server....."+wsInitRetry; + input.disabled = true; // Start with input prompt disabled ws = new WebSocket(wsURL); + ws.onerror = (e) => { + console.log("Oh..."); + if (--wsInitRetry > 0) + setTimeout(wsInit, 5000); + }; infoBox.removeEventListener("click", wsInit); var typing = document.getElementById("typing"); ws.onopen = function () { console.log("WS-OK"); + input.disabled = false; + input.focus(); infoBox.classList.remove("warn"); loginhead.textContent = "jsTRR"; initLogin(); @@ -628,6 +656,8 @@ infoBox = entry.insertAdjacentHTML( "afterend", '

'); infoBox = document.getElementById("info"); + document.getElementById("logout").addEventListener("click", logout); + setupTrrMode() wsInit(); } document.addEventListener("DOMContentLoaded", init, false); diff --git a/jtserv/jtserv.rb b/jtserv/jtserv.rb index eebbf47..a7c1f84 100755 --- a/jtserv/jtserv.rb +++ b/jtserv/jtserv.rb @@ -146,6 +146,17 @@ rval end ################### Trr STEP Calculation ################### + def msgSecret(s) + if s > 300 + "こんな高い得点を出す方がどうして秘密にしておくの?" + elsif s > 200 + "業界標準を越えてるわ。秘密にする必要は全くないわよ。" + elsif s > 120 + "恥ずかしくない点だわ。秘密にするのはもうやめましょう。" + else + "公開するとちょっと恥ずかしい点だわ。しばらく秘密で続けましょう。" + end + end def msgBeginner(s) if s <= 0 "0点というのは問題だわ。これからかなりの努力が必要よ。道のりは長いけど頑張りましょう。" @@ -247,6 +258,7 @@ update = nil # Break Hiscore pass = nil # Go to next step beginner = nil # Beginner flag + secret = (/secret/i =~ h["trrmode"].to_s) time = h["finish"] - h["start"] types = h["types"].to_i miss = h["miss"].to_i @@ -272,7 +284,8 @@ end # p score # user, at, text, step, score, types, miss, time - @db.execute(<<~EOF, user, text, step, score, types, miss, time) + secret or + @db.execute(<<~EOF, user, text, step, score, types, miss, time) REPLACE INTO score VALUES( ?, datetime('now', 'localtime'), ?, ?, ?, ?, ?, ?); EOF @@ -280,6 +293,8 @@ recbreaker = (score > highscore && highscore/100 != score/100) msg = if score > 750 "そんなことでいいの? 恥を知りなさい。" + elsif secret + msgSecret(score) elsif beginner msgBeginner(score) elsif pass # STEP clear!