diff --git a/jstrr.js b/jstrr.js index 6a83a18..34bf123 100644 --- a/jstrr.js +++ b/jstrr.js @@ -373,6 +373,7 @@ tr.style.visibility = tr.classList.contains(team) ? "visible" : visible; } + e.target.scrollIntoView({behavior: "smooth", block: "center"}); if (mystate.collapsed) tbl.addEventListener("click", filterSameTeam); else diff --git a/jtserv/jtserv.rb b/jtserv/jtserv.rb index 2abbd2d..763956d 100755 --- a/jtserv/jtserv.rb +++ b/jtserv/jtserv.rb @@ -421,10 +421,21 @@ textDB = Text.new connections = {} team = Hash.new{|h,k| h[k]=Hash.new} +socksend = lambda{|sock, msg| + begin + sock.send(msg) + rescue + begin + connections.close # Try to close + rescue + end + connections.delete(sock) + end +} broadcast = lambda{|hash| printf("sending %s\n", hash) connections.keys.each do |c| - c.send(JSON.generate(hash)) + socksend.call(c, JSON.generate(hash)) end } countUser = lambda{|user| @@ -504,7 +515,7 @@ end userinfo["text"] = json["text"].to_i si = {"scoreinfo" => db.userScoreInfo(userinfo["user"])} - ws_conn.send(JSON.generate(si)) + socksend.call(ws_conn, JSON.generate(si)) elsif json["finish"] user = userinfo["user"] if user && user > "" @@ -524,7 +535,7 @@ json["finish"] = Time.now.to_f STDERR.printf("Start=%.2f, Finish=%.2f\n", json["start"], json["finish"]) eval = db.evalStep(user, json) - ws_conn.send(JSON.generate(eval)) + socksend.call(ws_conn, JSON.generate(eval)) userinfo.delete("typelist") end elsif json["types"] @@ -538,12 +549,12 @@ text = json["ranking"] mode = json["mode"] rank = db.ranking(text, mode, user) - ws_conn.send(JSON.generate({"ranking": rank, "mode": mode})) + socksend.call(ws_conn, JSON.generate({"ranking": rank, "mode": mode})) elsif json["gettext"] db.updateSkey(user, skey) userinfo.delete("typelist") # Reset running typing information r = textDB.getFilledText(json["gettext"], json["lines"], json["fill"]) - ws_conn.send(JSON.generate({"yourtext" => r})) + socksend.call(ws_conn, JSON.generate({"yourtext" => r})) end else ########## Before authenticated userinfo["trial"] ||= 0 @@ -559,14 +570,14 @@ j = JSON.generate("tmpley" => "notregistered") end p token - ws_conn.send(j) + socksend.call(ws_conn, j) elsif json["skey"] user, skey = json["user"], json["skey"] if countUser.call(user) >= WARNMAX msg = "いったい何回繋いだら気が済むの?\n"+ "限度をわきまえなさい。" - ws_conn.send(JSON.generate({"fail" => "overlimit", - "message" => msg})) + socksend.call(ws_conn, JSON.generate({"fail" => "overlimit", + "message" => msg})) next end skey = db.authKey(user, json["skey"]) @@ -580,10 +591,10 @@ r = {"user"=>user, "skey"=>skey, "scoreinfo"=>si} r["textfiles"] = textDB.textfiles j = JSON.generate(r) - ws_conn.send(j) # Login success by skey + socksend.call(ws_conn, j) # Login success by skey else ## Need too frequent trial barrier here? - ws_conn.send(JSON.generate({"fail" => "nokey"})) + socksend.call(ws_conn, JSON.generate({"fail" => "nokey"})) end elsif json["Passcode"] token = json["Passcode"] @@ -599,22 +610,22 @@ r = {"user"=>user, "skey"=>authkey, "scoreinfo"=>si} r["textfiles"] = textDB.textfiles j = JSON.generate(r) - ws_conn.send(j) # Login success by token+tmpkey + socksend.call(ws_conn, j) # Login success by token+tmpkey else case userinfo["trial"]+=1 when 0..3 when 4..8 sleep 3 else - ws_conn.send(JSON.generate({"user"=>user, "fail"=>"byebye"})) + socksend.call(ws_conn, JSON.generate({"user"=>user, "fail"=>"byebye"})) ws_conn.close next end j = JSON.generate({"user" => user, "fail" => "fail"}) - ws_conn.send(j) # Login failure by token + socksend.call(ws_conn, j) # Login failure by token end else - ws_conn.send("No such user") + socksend(ws_conn, "No such user") ws_conn.close # Force guest out end # broadcast.call({"message" => msg})