#!/usr/bin/env ruby # -*- coding: utf-8 -*- require 'sqlite3' file = "db/point.sq3" bingoword = %w(もっけ やばち はっこ げっぱ) # 正解キーワード4つ require 'cgi' c = CGI.new(:accept_charset => "UTF-8") # 前回のアクセスで既にcookieが定義されていたら取得 # ブラウザからのcookieは、c.cookies[変数名][0] で受け取る cookie_id=c.cookies["id"][0] # 前回のアクセスで入力された値を取得 form_name=c["playname"] # nameをフォームから取得(もしあれば) form_kwd=c["keyword"] # keywordも取得(もしあれば) form_clr=c["clear"] # クリアボタン if cookie_id == nil # (1)もしcookieからのidがなければ新規生成 # 新規idは、現在時刻を秒(to_i)にした文字列(to_s)と乱数の組み合わせ newid = Time.now.to_i.to_s + "/" + rand(99999).to_s id=newid # 新規idをidとする else # (2)cookieからのidがあればそれをidとする id=cookie_id end # idをすぐcookieで相手ブラウザに送る # 変数の期限を24時間に設定し、expire変数に入れる expire = (Time.now+24*3600).gmtime.strftime("%a, %d %b %Y %H:%M:%S GMT") printf("Content-type: text/html; charset=UTF-8\n") printf("Set-Cookie: id=%s; expires=%s\n\n", id, expire) db = SQLite3::Database.new(file) db.execute("PRAGMA foreign_keys=on") db.execute("CREATE TABLE IF NOT EXISTS " + "users(id text primary key, name text, creation text)") db.execute("CREATE TABLE IF NOT EXISTS " + "point(id, keyword text, FOREIGN KEY(id) REFERENCES users(id))") if form_clr > "" && id > '' # クリアボタンが押されていたら db.execute("DELETE FROM point WHERE id=?", id) end if form_name > "" # formからの名前設定がもしあれば db.execute("REPLACE INTO users VALUES(?, ?, ?)", id, form_name, Time.now.to_s) end point = 0 # 開始直後は0点 # SELECTの検索結果に値があるかは [0] が nil かどうかで判定できる name = db.execute("SELECT name FROM users WHERE id=?", id)[0] if !name # もしユーザのプレイ名が未設定なら title = "○○ゲームへようこそ!" hello = "ポイントゲームを始めましょう。" guide = "あなたのプレイ名を決めます" input = '' else # プレイ名設定済みならキーワード入力 name = name[0] title = sprintf("%s さんのホーム", name) guide = "キーワードを入れてください" input = '' # プレイ名設定済みで、さらにキーワードが入力されていたら if form_kwd > "" index = bingoword.index(form_kwd) # 配列から入力単語(form_kwd)を探索 if index # 見付かった! その単語をdbに入れておく db.execute("REPLACE INTO point VALUES(?, ?)", id, bingoword[index]) end r = db.execute("SELECT count(*) FROM point WHERE id=?", id)[0] point = (r ? r[0] : 0) hello = sprintf("現在のポイントは %dpt です。", 25*point) end r = db.execute("SELECT group_concat(keyword, ',')" + "FROM point WHERE id=?", id)[0] bingos = (r ? r[0] : "") end printf(<<-EOF,
%s
当てたキーワード(%d/%d): %s
EOF title, hello, point, bingoword.length, bingos, guide, input) db.close