channel Signup {
out accounts(acDB:Map, signUp(aid:Str, name:Str)) = insert(acDB, aid, {"name": name, "point": 0})
}
channel ChangeName(aid:Str) {
out accounts.{aid}.name(prevName:Str, changeName(name)) = name
}
channel CreateRoom {
out rooms(rmDB:Map, createRoom(rid:Str)) = insert(rmDB, rid, {"members": nil, "battle": false})
}
channel AddRoomMember(rid:Str) {
out rooms.{rid}.members(mList:List, addRoomMember(id:Str)) = append(mList, {"id": id})
}
channel Battle(rid:Str) {
out rooms.{rid}.battle(prevHasWon, battle(hasWon:Bool)) = hasWon
}
channel UpdateName(rid:Str, mno:Int) {
in rooms.{rid}.members.{mno}.id(prevMid:Str, updateName(mid, name)) = mid
in accounts.{mid}.name(prevName:Str, updateName(mid, name)) = name
out rooms.{rid}.members.{mno}.name(prevName:Str, updateName(mid, name)) = name
}
channel UpdatePoint(rid:Str) {
in rooms.{rid}.battle(prevState, updatePoint(hasWon, mid)) = hasWon
for EachMember(mno:Int) {
ref rooms.{rid}.members.{mno}.id(mid:Str, updatePoint(hasWon, mid))
out accounts.{mid}.point(prevPoint:Int, updatePoint(hasWon, mid)) = if(hasWon, prevPoint + 1, prevPoint)
}
}