Skip to content
This repository has been archived by the owner on Feb 18, 2018. It is now read-only.

Commit

Permalink
Cleaning up the code. Was getting kind of messy
Browse files Browse the repository at this point in the history
  • Loading branch information
mads-hartmann committed Aug 22, 2011
1 parent de14cb9 commit 4de6ede
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 174 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ EXE=chess.exe
all: $(EXE)

chess.exe:
opa src/networkwrapper.opa src/chat.opa src/board.opa src/column.opa src/game.opa src/main.opa src/position.opa src/types.opa src/user.opa -o $(EXE)
opa src/page.opa src/networkwrapper.opa src/chat.opa src/board.opa src/column.opa src/game.opa src/main.opa src/position.opa src/types.opa src/user.opa -o $(EXE)

run:
./$(EXE)
Expand Down
171 changes: 10 additions & 161 deletions src/main.opa
Original file line number Diff line number Diff line change
Expand Up @@ -8,156 +8,6 @@

package chess

/*
{Pages}
*/

style = ["/resources/style.css"]

show_error(xs: list(string)) =
do Dom.remove_class(#error_container,"no_errors")
do Dom.add_class(#error_container,"has_errors")
do Dom.remove_content(#errors)
List.iter( x -> Dom.transform([#errors +<- <li>{x}</li>]), xs)


fourOfour() = Resource.styled_page("Chess", style,
<div id="fourofour"><h1>404</h1></div>
)

login() = Resource.styled_page("Chess", style,

attempt_login() =
username = Dom.get_value(#username)
password = Dom.get_value(#password)
match User.login(username, password) with
| {true} -> Client.goto("/")
| {false} ->
do show_error(["Wrong combination"])
Dom.give_focus(#username)


<div id="login" class="container">
<div id="error_container" class="error_container no_errors">
<ul id="errors"></ul>
</div>
<div class="content">
<ul onready={ _ -> Dom.give_focus(#username) }>
<li>
<input id=#username placeholder="Username"/>
</li>
<li>
<input id=#password placeholder="Password" type="password" onnewline={ _ -> attempt_login() }/>
</li>
<li>
<input type="submit" value="Login" onclick={ _ -> attempt_login() } />
</li>
</ul>
</div>

</div>
)

singup() = Resource.styled_page("Chess", style,
<div id="signup" class="container">
<div id="error_container" class="error_container no_errors">
<ul id="errors"></ul>
</div>
<div class="content">
<ul>
<li>
<label>Username</label>
<input id=#username type="text" />
</li>
<li>
<label>Email</label>
<input id=#email type="text" />
</li>
<li>
<label>Password</label>
<input id=#password type="text" />
</li>
<li>
<input type="submit" value="Sign up" onclick={ _ ->
username = Dom.get_value(#username)
email = Dom.get_value(#email)
password = Dom.get_value(#password)
match User.create(username, email, password) with
| {success = user } -> Client.goto("/")
| {failure = failure } -> show_error(failure)
} />
</li>
</ul>
</div>
</div>
)

lobby() = User.withUser( user -> (

join_back_onclick() =
do Dom.remove_class(#main, "hidden")
Dom.add_class(#join,"hidden")

create_back_onclick() =
do Dom.remove_class(#main, "hidden")
Dom.add_class(#create,"hidden")

create_game_onclick() =
name = Dom.get_value(#name)
match Game.create(name, user) with
| {success = game } -> Client.goto("/game/" ^ name)
| {failure = xs } -> show_error(xs)

menu_create_a_game_onclick() =
do Dom.remove_class(#create, "hidden")
Dom.add_class(#main, "hidden")

menu_join_a_game_onclick() =
do Dom.remove_class(#join,"hidden")
do Dom.add_class(#main,"hidden")
do Dom.remove_content(#gamesList)
Map.To.val_list(/game)
|> List.filter_map( x -> x, _)
|> List.iter( x -> Dom.transform([#gamesList +<-
<li onclick={_ ->
match Game.join(x.name, user) with
| { success = game } -> Client.goto("/game/" ^ x.name)
| { failure = xs } -> show_error(xs)
}>{x.name}</li>]),
_)

Resource.styled_page("Chess", style,
<div id="lobby" class="container">
<div id="error_container" class="error_container no_errors">
<ul id="errors"></ul>
</div>
<div class="content">
<form>
<ul id=#join class="hidden">
<a class="back" onclick={ _ -> join_back_onclick() }> ← Back</a>
<ul id=#gamesList></ul>
</ul>
<ul id=#create class="hidden">
<a class="back" onclick={ _ -> create_back_onclick() }> ← Back</a>
<li>
<input id=#name type="text" placeholder="Name of game" onnewline={_ -> create_game_onclick() }/>
<a class="button" onclick={ _ -> create_game_onclick() }>Create</a>
</li>
</ul>
<div id=#main>
<ul id=#menu>
<li><a class="button" onclick={_ -> menu_create_a_game_onclick() }>Create a game</a></li>
<li><a class="button" onclick={_ -> menu_join_a_game_onclick() }>Join a game</a></li>
<li><a class="button" onclick={_ -> User.logout()}>Logout</a></li>
</ul>
{ Chat.create(user.name) }
</div>
</form>
</div>
</div>
)
), login())


/* Message received about the state of the game. */
@client message_recieved(msg: message) =
Expand Down Expand Up @@ -205,31 +55,30 @@ boardgame(name: string) = (
</div>

if (Option.get(game.white) == user) then
Resource.styled_page("Chess", style, xml({white}))
Resource.styled_page("Chess", Page.style, xml({white}))
else
Resource.styled_page("Chess", style, xml({black}))
Resource.styled_page("Chess", Page.style, xml({black}))
)
| {none} -> fourOfour()
| {none} -> Page.fourOfour()
)
| {unlogged} -> fourOfour() //Shouldn't be able to happen here as we checked in the routing.
| {unlogged} -> Page.fourOfour() //Shouldn't be able to happen here as we checked in the routing.
)

/*
{Routing logic}
*/

login_required( page: -> resource ) =
if User.is_logged_in() then page() else login()

if User.is_logged_in() then page() else User.login_view()

start(uri) =
match uri with
| { path = [] ... } -> login_required( -> lobby() )
| { path = ["login"] ... } -> login()
| { path = ["signup"] ...} -> singup()
| { path = [] ... } -> login_required( -> Page.main() )
| { path = ["login"] ... } -> User.login_view()
| { path = ["signup"] ...} -> User.signup_view()
| { path = ["game",x|xs] ...} -> login_required( -> boardgame(x) )
| { path = ["user", x|xs] ...} -> User.withUserNamed(x, User.page(_), fourOfour)
| { path = x ...} -> fourOfour()
| { path = ["user", x|xs] ...} -> User.withUserNamed(x, User.page_view(_), Page.fourOfour)
| { path = x ...} -> Page.fourOfour()


/**
Expand Down
113 changes: 113 additions & 0 deletions src/page.opa
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
//
// page.opa
// chess
//
// Created by Mads Hartmann Jensen on 2011-08-22.
// Copyright 2011 Sideways Coding. All rights reserved.
//

package chess



Page = {{

style = ["/resources/style.css"]

/*
views
*/

fourOfour() = default({ some = "fourofour"}, <h1>404</h1>)

default(idOpt: option(string), content) =
(
id = Option.default("", idOpt)
Resource.styled_page("Chess", style,
<div id="{id}" class="container">
<div id="error_container" class="error_container no_errors">
<ul id="errors"></ul>
</div>
<div class="content">
{content}
</div>
</div>
)
)

main() = User.withUser( user -> (

join_back_onclick() =
do Dom.remove_class(#main, "hidden")
Dom.add_class(#join,"hidden")

create_back_onclick() =
do Dom.remove_class(#main, "hidden")
Dom.add_class(#create,"hidden")

create_game_onclick() =
name = Dom.get_value(#name)
match Game.create(name, user) with
| {success = game } -> Client.goto("/game/" ^ name)
| {failure = xs } -> Page.show_error(xs)

menu_create_a_game_onclick() =
do Dom.remove_class(#create, "hidden")
Dom.add_class(#main, "hidden")

menu_join_a_game_onclick() =
do Dom.remove_class(#join,"hidden")
do Dom.add_class(#main,"hidden")
do Dom.remove_content(#gamesList)
Map.To.val_list(/game)
|> List.filter_map( x -> x, _)
|> List.iter( x -> Dom.transform([#gamesList +<-
<li onclick={_ ->
match Game.join(x.name, user) with
| { success = game } -> Client.goto("/game/" ^ x.name)
| { failure = xs } -> Page.show_error(xs)
}>{x.name}</li>]),
_)

Resource.styled_page("Chess", style,
<div id="lobby" class="container">
<div id="error_container" class="error_container no_errors">
<ul id="errors"></ul>
</div>
<div class="content">
<form>
<ul id=#join class="hidden">
<a class="back" onclick={ _ -> join_back_onclick() }> ← Back</a>
<ul id=#gamesList></ul>
</ul>
<ul id=#create class="hidden">
<a class="back" onclick={ _ -> create_back_onclick() }> ← Back</a>
<li>
<input id=#name type="text" placeholder="Name of game" onnewline={_ -> create_game_onclick() }/>
<a class="button" onclick={ _ -> create_game_onclick() }>Create</a>
</li>
</ul>
<div id=#main>
<ul id=#menu>
<li><a class="button" onclick={_ -> menu_create_a_game_onclick() }>Create a game</a></li>
<li><a class="button" onclick={_ -> menu_join_a_game_onclick() }>Join a game</a></li>
<li><a class="button" onclick={_ -> User.logout()}>Logout</a></li>
</ul>
{ Chat.create(user.name) }
</div>
</form>
</div>
</div>
)
), User.login_view())

/*
Actions
*/

show_error(xs: list(string)) =
do Dom.remove_class(#error_container,"no_errors")
do Dom.add_class(#error_container,"has_errors")
do Dom.remove_content(#errors)
List.iter( x -> Dom.transform([#errors +<- <li>{x}</li>]), xs)
}}
67 changes: 55 additions & 12 deletions src/user.opa
Original file line number Diff line number Diff line change
Expand Up @@ -91,19 +91,62 @@ User = {{
View related functions
*/

page(user) =
login_view() =
(
Resource.styled_page("Chess", style,
<div class="container">
<div class="content">
<h1>{user.name}</h1>
<ul>
<li>Games: {user.games}</li>
<li>Wins: {user.wins}</li>
<li>Losses: {user.losses}</li>
</ul>
</div>
</div>
attempt_login() =
username = Dom.get_value(#username)
password = Dom.get_value(#password)
match User.login(username, password) with
| {true} -> Client.goto("/")
| {false} ->
do Page.show_error(["Wrong combination"])
Dom.give_focus(#username)

Page.default({ some = "login"},
<ul onready={ _ -> Dom.give_focus(#username) }>
<li><input id=#username placeholder="Username"/></li>
<li><input id=#password placeholder="Password" type="password" onnewline={ _ -> attempt_login() }/></li>
<li><input type="submit" value="Login" onclick={ _ -> attempt_login() } /></li>
</ul>
)
)

signup_view() = Page.default( {some = "signup"},
<ul>
<li>
<label>Username</label>
<input id=#username type="text" />
</li>
<li>
<label>Email</label>
<input id=#email type="text" />
</li>
<li>
<label>Password</label>
<input id=#password type="text" />
</li>
<li>
<input type="submit" value="Sign up" onclick={ _ ->
username = Dom.get_value(#username)
email = Dom.get_value(#email)
password = Dom.get_value(#password)
match User.create(username, email, password) with
| {success = user } -> Client.goto("/")
| {failure = failure } -> Page.show_error(failure)
} />
</li>
</ul>
)

page_view(user) =
(
Page.default({ some = "user" },
<h1>{user.name}</h1>
<ul>
<li>Games: {user.games}</li>
<li>Wins: {user.wins}</li>
<li>Losses: {user.losses}</li>
</ul>
)
)
}}

0 comments on commit 4de6ede

Please sign in to comment.