small changes here and there. a debug function (SPOT), css, start of a navigation bar.
373
default.css
Normal file
|
@ -0,0 +1,373 @@
|
||||||
|
body {
|
||||||
|
background-position: top center;
|
||||||
|
background-attachment: fixed;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
text-align: center;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: verdana, lucida, arial, helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main {
|
||||||
|
background: none;
|
||||||
|
width: 600px;
|
||||||
|
padding: 0px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main h1, h2, h3 {
|
||||||
|
font-family: sans-serif, arial;
|
||||||
|
font-weight: normal;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
color: #acacac;
|
||||||
|
font-variant: small-caps;
|
||||||
|
padding: 0 1em;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main h2 {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main h3 {
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#head {
|
||||||
|
width: 600px;
|
||||||
|
height: 120px;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background-image: url(cryptobox-img/vault_pingu.png);
|
||||||
|
background-position: top right;
|
||||||
|
background-attachment: scroll;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 600px;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content a {
|
||||||
|
line-height: 1.2em;
|
||||||
|
color: #000000;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content a:visited {
|
||||||
|
color: #acacac;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content p {
|
||||||
|
font-size: 0.9em;
|
||||||
|
padding: 0 1em;
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu {
|
||||||
|
text-align: center;
|
||||||
|
border-top: 1px solid #5e5e5e;
|
||||||
|
border-bottom: 1px solid #5e5e5e;
|
||||||
|
background-color: #ACE149;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu a:link, #menu a:visited {
|
||||||
|
color: #5e5e5e;
|
||||||
|
margin: 5px;
|
||||||
|
text-decoration: none;
|
||||||
|
border: none;
|
||||||
|
padding: 4px;
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu a:hover {
|
||||||
|
color: #8e8e8e;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words {
|
||||||
|
width: 565px;
|
||||||
|
padding: 1.1em 0em 1.1em 1.1em;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words h1{
|
||||||
|
font-size: 1.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words h2{
|
||||||
|
font-size: 1.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words ol, #words ul {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words ol li {
|
||||||
|
padding: 0 1em;
|
||||||
|
line-height: 1.7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words ul li {
|
||||||
|
padding: 0 1em;
|
||||||
|
line-height: 1.7em;
|
||||||
|
list-style: none;
|
||||||
|
background: url(cryptobox-img/list.gif) center left no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer {
|
||||||
|
clear: both;
|
||||||
|
text-align: center;
|
||||||
|
border-top: 1px solid #5e5e5e;
|
||||||
|
border-bottom: 1px solid #5e5e5e;
|
||||||
|
background-color: #ACE149;
|
||||||
|
font-size: 0.8em;
|
||||||
|
color: #5e5e5e;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer a:link, #footer a:visited {
|
||||||
|
color: white;
|
||||||
|
margin: 5px;
|
||||||
|
text-decoration: none;
|
||||||
|
border: none;
|
||||||
|
padding: 4px;
|
||||||
|
color: #5e5e5e;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#confirmtext span {
|
||||||
|
color: red;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------=-=-=- warnings, errors and success messages-=-=-=-------- */
|
||||||
|
|
||||||
|
#words div.warning,div.error,div.success {
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
color: #707070;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words .warning,.error,.success {
|
||||||
|
border: 1px dashed #808080;
|
||||||
|
text-align: center;
|
||||||
|
color: #5e5e5e;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 0.9em;
|
||||||
|
padding-left: 40px;
|
||||||
|
padding-right: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words .warning {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words .error {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words .success {
|
||||||
|
/* background-color: #90EE90; */
|
||||||
|
}
|
||||||
|
|
||||||
|
#words div.warning,div.error,div.success h1,h2 {
|
||||||
|
color: #808080;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words .warning,.error,.success a {
|
||||||
|
// TODO: WHY line-height???
|
||||||
|
// line-height: 5em;
|
||||||
|
color: #5e5e5e;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words .note {
|
||||||
|
text-align: center;
|
||||||
|
color: #F48659;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------=-=-=- Forms -=-=-=--------------------- */
|
||||||
|
/* pretty forms and buttons */
|
||||||
|
input {
|
||||||
|
border: 1px solid #333333;
|
||||||
|
color: #333333;
|
||||||
|
background: #fff;
|
||||||
|
padding: 2px 5px 1px 5px;
|
||||||
|
font-size: 1em;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
input:hover {
|
||||||
|
background: #fff;
|
||||||
|
border: 1px solid #ACE149;
|
||||||
|
color: #7DA721;
|
||||||
|
font-size: 1em;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
font-family: arial, verdana, helvetica;
|
||||||
|
font-size: 1.1em;
|
||||||
|
border: 1px solid #BFBFBF;
|
||||||
|
color: #949494;
|
||||||
|
padding: 2px 5px 1px 5px;
|
||||||
|
width: 450px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea:hover {
|
||||||
|
background: #fff;
|
||||||
|
border: 1px solid #ACE149;
|
||||||
|
color: #7DA721;
|
||||||
|
|
||||||
|
}
|
||||||
|
/* the submit buttons have to have id="submit" for the following style: ------------------------------------- */
|
||||||
|
input#submit {
|
||||||
|
background-color: #ACE149;
|
||||||
|
border: 1px solid #222222;
|
||||||
|
color: #222;
|
||||||
|
font-size: 0.8em;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
input#submit:hover {
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid #222;
|
||||||
|
color: #222;
|
||||||
|
font-size: 0.8em;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
/* the submit buttons have to have id="goban" for the following style, for use in goban display ------------- */
|
||||||
|
input#goban {
|
||||||
|
padding: 0px;
|
||||||
|
border: 0px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#words form label {
|
||||||
|
min-width: 20em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words form p {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------=-=-=- language selection -=-=-=------------- */
|
||||||
|
|
||||||
|
#lang {
|
||||||
|
position: fixed;
|
||||||
|
float: right;
|
||||||
|
right: 5px;
|
||||||
|
top: 5px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#lang a {
|
||||||
|
color: #acacac;
|
||||||
|
font-family: verdana, lucida, arial, helvetica, sans-serif;
|
||||||
|
font-size: smaller;
|
||||||
|
}
|
||||||
|
|
||||||
|
#lang a:hover {
|
||||||
|
color: #707070;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------=-=-=- documentation -=-=-=------------- */
|
||||||
|
|
||||||
|
#doc ol,ul li {
|
||||||
|
text-align: left;
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#doc dl dt {
|
||||||
|
text-align: left;
|
||||||
|
margin-left: 20px;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
#doc h1 {
|
||||||
|
padding-top: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#doc h2 {
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#doc h3 {
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------=-=-=- special things -=-=-=------------- */
|
||||||
|
|
||||||
|
#partition_info p {
|
||||||
|
margin-left: 10%;
|
||||||
|
margin-right: 10%;
|
||||||
|
font-family: monospace
|
||||||
|
}
|
||||||
|
|
||||||
|
#words a.popup {
|
||||||
|
line-height: inherit;
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words a.popup:hover {
|
||||||
|
text-decoration: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words a.popup span {
|
||||||
|
display: none;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 10px;
|
||||||
|
left: 9%;
|
||||||
|
width: 80%;
|
||||||
|
background: #f0f0f0;
|
||||||
|
padding: 10px;
|
||||||
|
border-color: #e0e0e0;
|
||||||
|
border-width: 2px;
|
||||||
|
border-style: solid;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words a.popup:hover span {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words a.popup span p {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#words a.popup span h3 {
|
||||||
|
color: #909090;
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
|
@ -1,5 +1,7 @@
|
||||||
import psql,login
|
import psql,login
|
||||||
|
|
||||||
|
DEBUG = 1
|
||||||
|
|
||||||
def delete_game(gamename,username):
|
def delete_game(gamename,username):
|
||||||
"""
|
"""
|
||||||
get name of game and name of user.
|
get name of game and name of user.
|
||||||
|
@ -24,6 +26,7 @@ def main(req,form):
|
||||||
manage the removal of game from game slots of players and
|
manage the removal of game from game slots of players and
|
||||||
delete game from database.
|
delete game from database.
|
||||||
"""
|
"""
|
||||||
|
if DEBUG:
|
||||||
req.write(str(form.keys())+" sessionid in form:"+form["sessionid"]+"<hr>")
|
req.write(str(form.keys())+" sessionid in form:"+form["sessionid"]+"<hr>")
|
||||||
try:
|
try:
|
||||||
gamename = form["game"]
|
gamename = form["game"]
|
||||||
|
@ -41,7 +44,7 @@ def main(req,form):
|
||||||
#delete table
|
#delete table
|
||||||
psql.drop_table(gamename)
|
psql.drop_table(gamename)
|
||||||
#now display game overview form.
|
#now display game overview form.
|
||||||
login.game_overview_form(req,player,form["sessionid"])
|
login.game_overview_form(req,form,player,form["sessionid"])
|
||||||
|
|
||||||
else:
|
else:
|
||||||
req.write('Error: You have to select a game to delete it!')
|
req.write('Error: You have to select a game to delete it!')
|
16
documentation/development/DATABASE
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
this file describes the database of the game.
|
||||||
|
there are currently 2 types of tables in the game.
|
||||||
|
|
||||||
|
One is the user table. this table is unique.
|
||||||
|
do the following to get the details:
|
||||||
|
cd webgo
|
||||||
|
python
|
||||||
|
import psql
|
||||||
|
print psql.create_user_table.__doc__
|
||||||
|
|
||||||
|
the other one is a goban table. for each game there exists one goban
|
||||||
|
table. do the following to get the details:
|
||||||
|
cd webgo
|
||||||
|
python
|
||||||
|
import psql
|
||||||
|
print psql.create_goban_table.__doc__
|
1
documentation/development/README
Normal file
|
@ -0,0 +1 @@
|
||||||
|
this is webgo, a browser-based version of go.
|
|
@ -1,6 +1,8 @@
|
||||||
from mod_python import *
|
from mod_python import *
|
||||||
import psql,helper,login
|
import psql,helper,login
|
||||||
|
|
||||||
|
DEBUG = 1
|
||||||
|
|
||||||
def display_game_creation_form(req,sessionid,username):
|
def display_game_creation_form(req,sessionid,username):
|
||||||
"""
|
"""
|
||||||
prints a html form with multiple drop-down lists for choosing players,
|
prints a html form with multiple drop-down lists for choosing players,
|
||||||
|
@ -21,7 +23,7 @@ def display_game_creation_form(req,sessionid,username):
|
||||||
<p>Goban Size: %s fields </p>
|
<p>Goban Size: %s fields </p>
|
||||||
<input type="hidden" name="sessionid" value="%s">
|
<input type="hidden" name="sessionid" value="%s">
|
||||||
<input type="hidden" name="username" value="%s">
|
<input type="hidden" name="username" value="%s">
|
||||||
<input type="submit" name="create" value="create game">
|
<input type="submit" id="submit" name="create" value="create game">
|
||||||
</form>
|
</form>
|
||||||
""" % (p1data,p2data,gobansize,sessionid,username)
|
""" % (p1data,p2data,gobansize,sessionid,username)
|
||||||
|
|
||||||
|
@ -54,7 +56,7 @@ def process_creation_form(req,form):
|
||||||
#display form again
|
#display form again
|
||||||
display_game_creation_form(req,form["sessionid"],username)
|
display_game_creation_form(req,form["sessionid"],username)
|
||||||
#TODO:game created, now display game overview form
|
#TODO:game created, now display game overview form
|
||||||
login.game_overview_form(req,username,form["sessionid"])
|
login.game_overview_form(req,form,username,form["sessionid"])
|
||||||
else:
|
else:
|
||||||
#give error message
|
#give error message
|
||||||
req.write("Sorry, you must be one of the players!<br>")
|
req.write("Sorry, you must be one of the players!<br>")
|
||||||
|
@ -97,6 +99,7 @@ def main(req,form):
|
||||||
gets a request object and a util.FieldStorage form.
|
gets a request object and a util.FieldStorage form.
|
||||||
returns nothing.
|
returns nothing.
|
||||||
"""
|
"""
|
||||||
|
if DEBUG:
|
||||||
req.write(str(form.keys())+"<hr>")
|
req.write(str(form.keys())+"<hr>")
|
||||||
|
|
||||||
username = form["username"]
|
username = form["username"]
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"""
|
"""
|
||||||
a simple script using pil to generate the goban from background, grid and stone images.
|
a simple script using pil to generate the goban from background, grid and stone images.
|
||||||
"""
|
"""
|
||||||
import Image
|
import Image,ImageOps
|
||||||
gridlist = ["bottomleftline","bottomline","bottomrightline",
|
gridlist = ["bottomleftline","bottomline","bottomrightline",
|
||||||
"centerline","hoshi","leftline","rightline",
|
"centerline","hoshi","leftline","rightline",
|
||||||
"topleftline", "topline","toprightline"]
|
"topleftline", "topline","toprightline"]
|
||||||
|
@ -15,11 +15,13 @@ for item in gridlist:
|
||||||
bg = Image.open("imgsource/background.png").convert("RGBA")
|
bg = Image.open("imgsource/background.png").convert("RGBA")
|
||||||
img = Image.open("imgsource/"+item+".png").convert("RGBA")
|
img = Image.open("imgsource/"+item+".png").convert("RGBA")
|
||||||
bg.paste(img,None,img)
|
bg.paste(img,None,img)
|
||||||
|
#bg = Image.composite(img,bg,img)
|
||||||
bg.save("img/"+item+".png")
|
bg.save("img/"+item+".png")
|
||||||
tmp = bg #for the black stones
|
tmp = bg #for the white stones
|
||||||
|
tmp2 = bg #for the black stones
|
||||||
#filling with white stones
|
#filling with white stones
|
||||||
bg.paste(whitestone,None,whitestone)
|
tmp.paste(whitestone,None,whitestone)
|
||||||
bg.save("img/"+item+"_white.png")
|
tmp.save("img/"+item+"_white.png")
|
||||||
#filling with black stones
|
#filling with black stones
|
||||||
tmp.paste(blackstone,None,blackstone)
|
tmp2.paste(blackstone.convert("RGB"),None,blackstone)
|
||||||
tmp.save("img/"+item+"_black.png")
|
tmp2.save("img/"+item+"_black.png")
|
||||||
|
|
29
goban.py
|
@ -1,5 +1,6 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
DEBUG = 1
|
||||||
|
|
||||||
import sys,string
|
import sys,string
|
||||||
import cgi
|
import cgi
|
||||||
|
@ -24,7 +25,7 @@ def display_goban(goban,req,form):
|
||||||
hoshis9x9 = [(3,3),(3,7),(5,5),(7,3),(7,7)]
|
hoshis9x9 = [(3,3),(3,7),(5,5),(7,3),(7,7)]
|
||||||
|
|
||||||
|
|
||||||
data += '<form method="post">'
|
data += '<p><form method="post">'
|
||||||
data += """<input type="hidden" name="sessionid" value="%s">
|
data += """<input type="hidden" name="sessionid" value="%s">
|
||||||
<input type="hidden" name="username" value="%s">
|
<input type="hidden" name="username" value="%s">
|
||||||
<input type="hidden" name="game" value="%s">
|
<input type="hidden" name="game" value="%s">
|
||||||
|
@ -49,30 +50,30 @@ def display_goban(goban,req,form):
|
||||||
sy = str(y)
|
sy = str(y)
|
||||||
# check position:
|
# check position:
|
||||||
if (x == 1) and (y == 1): # upper left
|
if (x == 1) and (y == 1): # upper left
|
||||||
data += '<input type=image src="img/topleftline'+stone+'.png" name="('+sx+','+sy+')">'
|
data += '<input type=image id="goban" src="img/topleftline'+stone+'.png" name="('+sx+','+sy+')">'
|
||||||
elif (x == 1) and (y == size): # upper right
|
elif (x == 1) and (y == size): # upper right
|
||||||
data += '<input type=image src="img/toprightline'+stone+'.png" name="('+sx+','+sy+')"><br>'
|
data += '<input type=image id="goban" src="img/toprightline'+stone+'.png" name="('+sx+','+sy+')"><br>'
|
||||||
elif (x == size) and (y == size): # lower right
|
elif (x == size) and (y == size): # lower right
|
||||||
data += '<input type=image src="img/bottomrightline'+stone+'.png" name="('+sx+','+sy+')"><br>'
|
data += '<input type=image id="goban" src="img/bottomrightline'+stone+'.png" name="('+sx+','+sy+')"><br>'
|
||||||
elif (x == size) and (y == 1): # lower left
|
elif (x == size) and (y == 1): # lower left
|
||||||
data += '<input type=image src="img/bottomleftline'+stone+'.png" name="('+sx+','+sy+')">'
|
data += '<input type=image id="goban" src="img/bottomleftline'+stone+'.png" name="('+sx+','+sy+')">'
|
||||||
elif (y == 1): #left line
|
elif (y == 1): #left line
|
||||||
data += '<input type=image src="img/leftline'+stone+'.png" name="('+sx+','+sy+')">'
|
data += '<input type=image id="goban" src="img/leftline'+stone+'.png" name="('+sx+','+sy+')">'
|
||||||
elif (x == 1): # top line
|
elif (x == 1): # top line
|
||||||
data += '<input type=image src="img/topline'+stone+'.png" name="('+sx+','+sy+')">'
|
data += '<input type=image id="goban" src="img/topline'+stone+'.png" name="('+sx+','+sy+')">'
|
||||||
elif (y == size): # right line
|
elif (y == size): # right line
|
||||||
data += '<input type=image src="img/rightline'+stone+'.png" name="('+sx+','+sy+')"><br>'
|
data += '<input type=image id="goban" src="img/rightline'+stone+'.png" name="('+sx+','+sy+')"><br>'
|
||||||
elif (x == size): #bottom line
|
elif (x == size): #bottom line
|
||||||
data += '<input type=image src="img/bottomline'+stone+'.png" name="('+sx+','+sy+')">'
|
data += '<input type=image id="goban" src="img/bottomline'+stone+'.png" name="('+sx+','+sy+')">'
|
||||||
else: # hoshi or empty inner field
|
else: # hoshi or empty inner field
|
||||||
defaultfield = '<input type=image src="img/centerline'+stone+'.png" name="('+sx+','+sy+')">'
|
defaultfield = '<input type=image id="goban" src="img/centerline'+stone+'.png" name="('+sx+','+sy+')">'
|
||||||
#too lazy to make special images for hoshi fields with stones:
|
#too lazy to make special images for hoshi fields with stones:
|
||||||
if goban[(x,y)] == 1:
|
if goban[(x,y)] == 1:
|
||||||
hoshifield = '<input type=image src="img/centerline_white.png" name="('+sx+','+sy+')">'
|
hoshifield = '<input type=image id="goban" src="img/centerline_white.png" name="('+sx+','+sy+')">'
|
||||||
elif goban[(x,y)] == 2:
|
elif goban[(x,y)] == 2:
|
||||||
hoshifield = '<input type=image src="img/centerline_black.png" name="('+sx+','+sy+')">'
|
hoshifield = '<input type=image id="goban" src="img/centerline_black.png" name="('+sx+','+sy+')">'
|
||||||
else: #empty hoshi
|
else: #empty hoshi
|
||||||
hoshifield = '<input type=image src="img/hoshi.png" name="('+sx+','+sy+')">'
|
hoshifield = '<input type=image id="goban" src="img/hoshi.png" name="('+sx+','+sy+')">'
|
||||||
if size == 19: # 9 hoshis
|
if size == 19: # 9 hoshis
|
||||||
if (x,y) in hoshis19x19:
|
if (x,y) in hoshis19x19:
|
||||||
data += hoshifield
|
data += hoshifield
|
||||||
|
@ -89,7 +90,7 @@ def display_goban(goban,req,form):
|
||||||
else:
|
else:
|
||||||
data += defaultfield
|
data += defaultfield
|
||||||
data += '\n<input type="hidden" name="play" value="foo">'
|
data += '\n<input type="hidden" name="play" value="foo">'
|
||||||
data += '\n</form>'
|
data += '\n</form></p>'
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
|
29
helper.py
|
@ -1,14 +1,39 @@
|
||||||
import string
|
import string
|
||||||
|
|
||||||
|
DEBUG = 1
|
||||||
|
|
||||||
def header():
|
def header():
|
||||||
"""return html header"""
|
"""return html header"""
|
||||||
data = """
|
data = """
|
||||||
<html><HEAD>
|
|
||||||
|
|
||||||
</HEAD><body>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>WebGo</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta http-equiv="pragma" content="no-cache" />
|
||||||
|
<meta http-equiv="cache-control" content="no-cache" />
|
||||||
|
<meta http-equiv="expires" content="0" />
|
||||||
|
<link rel="stylesheet" media="screen" href="default.css" type="text/css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1> WebGo </h1>
|
||||||
"""
|
"""
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
def debug(req,form, optstr = ""):
|
||||||
|
"""
|
||||||
|
print various debug infos, e.g. form content.
|
||||||
|
gets request, util.FieldStorage form, optional extra string.
|
||||||
|
returns nothing, writes with request.write.
|
||||||
|
"""
|
||||||
|
if DEBUG:
|
||||||
|
if optstr == "":
|
||||||
|
req.write(str(form.keys()))
|
||||||
|
else:
|
||||||
|
req.write(optstr)
|
||||||
|
|
||||||
def footer():
|
def footer():
|
||||||
"""return html footer"""
|
"""return html footer"""
|
||||||
data = """
|
data = """
|
||||||
|
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.7 KiB |
|
@ -1,6 +1,5 @@
|
||||||
import psql
|
import psql
|
||||||
|
|
||||||
|
|
||||||
def clear():
|
def clear():
|
||||||
try:
|
try:
|
||||||
psql.drop_table("users")
|
psql.drop_table("users")
|
||||||
|
|
55
login.py
|
@ -5,17 +5,16 @@ def process_form(req,form):
|
||||||
"""
|
"""
|
||||||
reads username and password from form
|
reads username and password from form
|
||||||
"""
|
"""
|
||||||
req.write(str(form.keys()))
|
|
||||||
#req.write("<br>"+"name="+form['name']+", password="+form['password']+"<hr>")
|
#req.write("<br>"+"name="+form['name']+", password="+form['password']+"<hr>")
|
||||||
if form.keys() != []:
|
if form.keys() != []:
|
||||||
|
|
||||||
if ("name" in form.keys()) and ("password" in form.keys()):
|
if ("name" in form.keys()) and ("password" in form.keys()):
|
||||||
#extract name and password
|
#extract name and password
|
||||||
name = form["name"]
|
name = form["name"]
|
||||||
password = form["password"]
|
password = form["password"]
|
||||||
sessionid = form["sessionid"]
|
sessionid = form["sessionid"]
|
||||||
origpassword = psql.get_user_info(name,"password")
|
origpassword = psql.get_user_info(name,"password")
|
||||||
req.write('<hr>--password:'+str(password)+' ---origpassword:'+str(origpassword)+'<hr>')
|
#debug:
|
||||||
|
helper.debug(req,form,'<hr>--password:'+str(password)+' ---origpassword:'+str(origpassword)+'<hr>')
|
||||||
#check if user exists (else we would get an error string)
|
#check if user exists (else we would get an error string)
|
||||||
if origpassword != "no such user": #no error message, now check password
|
if origpassword != "no such user": #no error message, now check password
|
||||||
if password == origpassword:
|
if password == origpassword:
|
||||||
|
@ -23,7 +22,7 @@ def process_form(req,form):
|
||||||
psql.set_user_sessionid(name,sessionid)
|
psql.set_user_sessionid(name,sessionid)
|
||||||
psql.set_user_timeout(name)
|
psql.set_user_timeout(name)
|
||||||
#now display list of games.
|
#now display list of games.
|
||||||
game_overview_form(req,name,sessionid)
|
game_overview_form(req,form,name,sessionid)
|
||||||
else:
|
else:
|
||||||
req.write("Login incorrect. Please try again.<br>")
|
req.write("Login incorrect. Please try again.<br>")
|
||||||
req.write(login_form())
|
req.write(login_form())
|
||||||
|
@ -35,9 +34,9 @@ def process_form(req,form):
|
||||||
req.write(login_form())
|
req.write(login_form())
|
||||||
|
|
||||||
|
|
||||||
def game_overview_form(req,user,sessionid):
|
def game_overview_form(req,form,user,sessionid):
|
||||||
"""
|
"""
|
||||||
gets the name of a user and the queue of games.
|
gets: request object, util.FieldStorage form, name of user, sessionid.
|
||||||
prints a form with the option to select,create and delete games.
|
prints a form with the option to select,create and delete games.
|
||||||
"""
|
"""
|
||||||
data = helper.header()+ """
|
data = helper.header()+ """
|
||||||
|
@ -45,7 +44,8 @@ def game_overview_form(req,user,sessionid):
|
||||||
<form method="post">
|
<form method="post">
|
||||||
"""
|
"""
|
||||||
gamelist = psql.get_user_game_list(user)
|
gamelist = psql.get_user_game_list(user)
|
||||||
req.write(str(gamelist)+"<hr>\n")
|
#debug
|
||||||
|
helper.debug(req,form,str(gamelist)+"<hr>\n")
|
||||||
#display list of current games
|
#display list of current games
|
||||||
counter = 10
|
counter = 10
|
||||||
tmp = ""
|
tmp = ""
|
||||||
|
@ -61,16 +61,16 @@ def game_overview_form(req,user,sessionid):
|
||||||
tmp += '<input type="hidden" name="sessionid" value="%s">\n' % sessionid
|
tmp += '<input type="hidden" name="sessionid" value="%s">\n' % sessionid
|
||||||
tmp += '<input type="hidden" name="username" value="%s">\n' % user
|
tmp += '<input type="hidden" name="username" value="%s">\n' % user
|
||||||
data += tmp
|
data += tmp
|
||||||
data += '<input type=submit name="play" value="Play selected game">\n<input type=submit name="delete" value="Delete selected game">\n</form>'
|
data += '<input type=submit id="submit" name="play" value="Play selected game">\n<input type=submit id="submit" name="delete" value="Delete selected game">\n</form>'
|
||||||
#now comes the option for creating new games.
|
#now comes the option for creating new games.
|
||||||
data += "<h2>Start a new Game</h2>\n"
|
data += "<h2>New Game:</h2>\n"
|
||||||
if counter > 0:
|
if counter > 0:
|
||||||
data+= "You have %s free game slots.<br>" % counter
|
data+= "You have %s free game slots.<br>" % counter
|
||||||
data += """
|
data += """
|
||||||
<form method="post">
|
<form method="post">
|
||||||
<input type="hidden" name="sessionid" value="%s">
|
<input type="hidden" name="sessionid" value="%s">
|
||||||
<input type="hidden" name="username" value="%s">
|
<input type="hidden" name="username" value="%s">
|
||||||
<input type=submit name="create" value="Start a new game">
|
<input type=submit id="submit" name="create" value="Start a new game">
|
||||||
</form>
|
</form>
|
||||||
""" % (sessionid, user)
|
""" % (sessionid, user)
|
||||||
else:
|
else:
|
||||||
|
@ -92,27 +92,44 @@ def login_form():
|
||||||
<p>Pasword:<br>
|
<p>Pasword:<br>
|
||||||
<input name="password" size="40"></p>
|
<input name="password" size="40"></p>
|
||||||
<input type="hidden" name="sessionid" value="%s">
|
<input type="hidden" name="sessionid" value="%s">
|
||||||
<p><input type="submit" value="login"></p>
|
<p><input type="submit" id ="submit" value="login"></p>
|
||||||
</form>
|
</form>
|
||||||
""" % helper.generate_session_id()
|
""" % helper.generate_session_id()
|
||||||
data += helper.footer()
|
data += helper.footer()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
def navigation_bar(username,sessionid):
|
||||||
|
"""
|
||||||
|
gets username and sessionid
|
||||||
|
writes the following to req:
|
||||||
|
- a button to return to the game overview
|
||||||
|
- a logout button
|
||||||
|
returns string
|
||||||
|
"""
|
||||||
|
#TODO: buttons
|
||||||
|
data="""
|
||||||
|
<form method="post">
|
||||||
|
<input type="hidden" name="sessionid" value="%s">
|
||||||
|
<input type="hidden" name="username" value="%s">
|
||||||
|
<input type="submit" id="submit" name="logout" value="logout">
|
||||||
|
<input type="submit" id="submit" name="game overview" value="game overview">
|
||||||
|
</form>
|
||||||
|
""" % (username,sessionid)
|
||||||
|
return(data)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main(req,form):
|
def main(req,form):
|
||||||
req.write((str(form.keys())+"<hr>"))
|
#debug
|
||||||
|
helper.debug(req,form)
|
||||||
|
#req.write(helper.footer())
|
||||||
if "sessionid" not in form.keys():
|
if "sessionid" not in form.keys():
|
||||||
req.write(login_form())
|
req.write(login_form())
|
||||||
elif ("create" in form.keys()) and ("username" in form.keys()):
|
elif ("create" in form.keys()) and ("username" in form.keys()):
|
||||||
#user wants to create a new game
|
|
||||||
#gamecreation = apache.import_module("gamecreation")
|
|
||||||
#gamecreation.main(req,form)
|
|
||||||
#gamecreation.main(req,form)
|
|
||||||
pass
|
pass
|
||||||
|
elif ("game overview" in form.keys()) and ("username" in form.keys()) and ("sessionid" in form.keys()):
|
||||||
|
game_overview_form(req,form,form["username"],form["sessionid"])
|
||||||
else:
|
else:
|
||||||
process_form(req,form)
|
process_form(req,form)
|
||||||
|
|
17
main.py
|
@ -1,9 +1,3 @@
|
||||||
#!/usr/bin/python
|
|
||||||
"""
|
|
||||||
simple cgi wrapper for a cgi script, prints the error of the script as html
|
|
||||||
taken from http://gnosis.cx/publish/programming/feature_5min_python.html
|
|
||||||
modified a little
|
|
||||||
"""
|
|
||||||
import sys, traceback,string,time
|
import sys, traceback,string,time
|
||||||
import init_webgo,psql
|
import init_webgo,psql
|
||||||
|
|
||||||
|
@ -32,7 +26,7 @@ def handler(req):
|
||||||
|
|
||||||
#if sessionid=sesssionid and time < timeout:
|
#if sessionid=sesssionid and time < timeout:
|
||||||
# set_timeout
|
# set_timeout
|
||||||
|
helper = apache.import_module("helper")
|
||||||
if (psql.get_user_info(username,'timeout') > int(time.time())) and (sessionid == psql.get_user_info(username,'sessionid')):
|
if (psql.get_user_info(username,'timeout') > int(time.time())) and (sessionid == psql.get_user_info(username,'sessionid')):
|
||||||
psql.set_user_timeout(username)
|
psql.set_user_timeout(username)
|
||||||
if "create" in form.keys():
|
if "create" in form.keys():
|
||||||
|
@ -48,6 +42,11 @@ def handler(req):
|
||||||
#call login.py
|
#call login.py
|
||||||
login = apache.import_module("login")
|
login = apache.import_module("login")
|
||||||
login.main(req,form)
|
login.main(req,form)
|
||||||
|
else:
|
||||||
|
#call login.py
|
||||||
|
login = apache.import_module("login")
|
||||||
|
login.main(req,form)
|
||||||
|
|
||||||
return apache.OK
|
return apache.OK
|
||||||
except:
|
except:
|
||||||
errtime = '----- '+ time.ctime(time.time()) +' -----\n'
|
errtime = '----- '+ time.ctime(time.time()) +' -----\n'
|
||||||
|
@ -92,7 +91,3 @@ def ErrorMsg(escape=0):
|
||||||
import cgi
|
import cgi
|
||||||
body = cgi.escape(body)
|
body = cgi.escape(body)
|
||||||
return body
|
return body
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#start(req)
|
|
|
@ -1,6 +1,8 @@
|
||||||
import goban,helper,psql
|
import goban,helper,psql,login
|
||||||
import string
|
import string
|
||||||
|
|
||||||
|
DEBUG = 1
|
||||||
|
|
||||||
def is_my_turn(req,form,gobandict):
|
def is_my_turn(req,form,gobandict):
|
||||||
"""
|
"""
|
||||||
gets request and util.FiedStorage form.
|
gets request and util.FiedStorage form.
|
||||||
|
@ -74,11 +76,12 @@ def main(req,form):
|
||||||
if is_my_turn(req,form,gobandict):
|
if is_my_turn(req,form,gobandict):
|
||||||
data += ("Its your turn.<br>")
|
data += ("Its your turn.<br>")
|
||||||
else:
|
else:
|
||||||
data+= ("This is not your turn. Look, but don't touch ;)<br>")
|
data+= ("This is not your turn. You have to wait for the move of the other player.<br>")
|
||||||
|
|
||||||
|
|
||||||
#print goban
|
#print goban
|
||||||
data += goban.display_goban(gobandict,req,form)
|
data += goban.display_goban(gobandict,req,form)
|
||||||
|
data += login.navigation_bar(form["username"],form["sessionid"])
|
||||||
data += helper.footer()
|
data += helper.footer()
|
||||||
req.write(data)
|
req.write(data)
|
||||||
|
|
||||||
|
|
2
psql.py
|
@ -1,6 +1,8 @@
|
||||||
import helper
|
import helper
|
||||||
import pgdb,sys
|
import pgdb,sys
|
||||||
|
|
||||||
|
DEBUG = 1
|
||||||
|
|
||||||
dbusername="webgouser"
|
dbusername="webgouser"
|
||||||
dbpassword="webgopassword"
|
dbpassword="webgopassword"
|
||||||
dbname="webgo"
|
dbname="webgo"
|
||||||
|
|