started protocol documentation
This commit is contained in:
parent
9e044ffad0
commit
47eadb6f86
3 changed files with 111 additions and 2 deletions
110
cockatrice/doc/protocol.txt
Normal file
110
cockatrice/doc/protocol.txt
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
1. Abstract
|
||||||
|
|
||||||
|
The Cockatrice protocol is a client/server protocol intended for communication between
|
||||||
|
a card game client and a suitable server. It is designed with the goal in mind to make
|
||||||
|
playing card games, such as Magic the Gathering, over a network easy while eliminating
|
||||||
|
the possibility of unfair play. Because of that, the server stores all hidden information
|
||||||
|
and transmits pieces of it to clients only when necessary.
|
||||||
|
|
||||||
|
2. Protocol structure
|
||||||
|
|
||||||
|
All communication is done over a TCP/IP connection. The protocol is text based.
|
||||||
|
Strings are encoded in UTF-8 and have UNIX-style line endings (\n).
|
||||||
|
|
||||||
|
There are four distinct types of messages:
|
||||||
|
- Command (section 3)
|
||||||
|
- Response (section 4)
|
||||||
|
- Event (section 5)
|
||||||
|
- List (section 6)
|
||||||
|
|
||||||
|
3. Commands
|
||||||
|
|
||||||
|
A command can only be sent from client to server and has the following structure:
|
||||||
|
{ID}|{command}|{parameter1}|{parameter2}...
|
||||||
|
"ID" is an arbitrary number to be chosen uniquely for each command.
|
||||||
|
"command" is a command identifier (see section 3).
|
||||||
|
It depends on the command identifier what has to be passed as parameters.
|
||||||
|
|
||||||
|
3.1 ping
|
||||||
|
|
||||||
|
Flags:
|
||||||
|
none
|
||||||
|
Parameters:
|
||||||
|
none
|
||||||
|
Valid response codes:
|
||||||
|
ok
|
||||||
|
|
||||||
|
No effect.
|
||||||
|
|
||||||
|
3.2 login
|
||||||
|
|
||||||
|
Flags:
|
||||||
|
none
|
||||||
|
Parameters:
|
||||||
|
User name (string)
|
||||||
|
Password (string)
|
||||||
|
Valid response codes:
|
||||||
|
ok
|
||||||
|
password
|
||||||
|
|
||||||
|
If the supplied credentials are correct, "ok" is returned and the connection state
|
||||||
|
is set to authenticated. (The server is not required to actually check the validity
|
||||||
|
of the credentials.)
|
||||||
|
Otherwise, "password" is returned.
|
||||||
|
|
||||||
|
3.3 list_games
|
||||||
|
|
||||||
|
Flags:
|
||||||
|
login needed
|
||||||
|
Parameters:
|
||||||
|
none
|
||||||
|
Valid response codes:
|
||||||
|
ok
|
||||||
|
|
||||||
|
If the connection state is unauthenticated, "login_needed" is returned.
|
||||||
|
Otherwise, "ok" is returned and for each game currently, a list_games event XXX is
|
||||||
|
sent to the client. The "accepts game list changes" flag of the connection is set.
|
||||||
|
|
||||||
|
3.4 create_game
|
||||||
|
3.5 join_game
|
||||||
|
3.6 leave_game
|
||||||
|
3.7 list_players
|
||||||
|
3.8 say
|
||||||
|
3.9 submit_deck
|
||||||
|
3.10 ready_start
|
||||||
|
3.11 shuffle
|
||||||
|
3.12 draw_cards
|
||||||
|
3.13 reveal_card
|
||||||
|
3.14 move_card
|
||||||
|
3.15 create_token
|
||||||
|
3.16 set_card_attr
|
||||||
|
3.17 inc_counter
|
||||||
|
3.18 add_counter
|
||||||
|
3.19 set_counter
|
||||||
|
3.20 del_counter
|
||||||
|
3.21 list_counters
|
||||||
|
3.22 list_zones
|
||||||
|
3.23 dump_zone
|
||||||
|
3.24 roll_dice
|
||||||
|
3.25 set_active_player
|
||||||
|
3.26 set_active_phase
|
||||||
|
|
||||||
|
4. Responses
|
||||||
|
|
||||||
|
After processing any command, the server sends a response to the client, indicating
|
||||||
|
whether the command was understood and valid.
|
||||||
|
A response can only be sent from server to client and has the following structure:
|
||||||
|
resp|{ID}|{resp-code}
|
||||||
|
|
||||||
|
{ID} is the identifier belonging to the command in question.
|
||||||
|
{resp-code} contains information about the processing of the command. It can have the
|
||||||
|
following values:
|
||||||
|
ok (Success)
|
||||||
|
login_needed (Error: Command requires login)
|
||||||
|
syntax (Error: Invalid command or parameters)
|
||||||
|
context (Error: Command cannot be applied here)
|
||||||
|
password (Error: Wrong login data)
|
||||||
|
|
||||||
|
The response code "syntax" is valid as a response to any command and is
|
||||||
|
hence not explicitly listed in section 3. The response code "login_needed" applies
|
||||||
|
to all commands with the "login needed" flag.
|
|
@ -15,7 +15,6 @@ bool ReturnMessage::send(ReturnCode code)
|
||||||
case ReturnSyntaxError: returnCodeString = "syntax"; break;
|
case ReturnSyntaxError: returnCodeString = "syntax"; break;
|
||||||
case ReturnContextError: returnCodeString = "context"; break;
|
case ReturnContextError: returnCodeString = "context"; break;
|
||||||
case ReturnPasswordWrong: returnCodeString = "password"; break;
|
case ReturnPasswordWrong: returnCodeString = "password"; break;
|
||||||
case ReturnNameNotFound: returnCodeString = "name_not_found"; break;
|
|
||||||
}
|
}
|
||||||
s->msg(QString("resp|%1|%2|%3").arg(msg_id)
|
s->msg(QString("resp|%1|%2|%3").arg(msg_id)
|
||||||
.arg(success ? "ok" : "err")
|
.arg(success ? "ok" : "err")
|
||||||
|
|
|
@ -9,7 +9,7 @@ private:
|
||||||
unsigned int msg_id;
|
unsigned int msg_id;
|
||||||
QString cmd;
|
QString cmd;
|
||||||
public:
|
public:
|
||||||
enum ReturnCode { ReturnNothing, ReturnOk, ReturnLoginNeeded, ReturnSyntaxError, ReturnContextError, ReturnPasswordWrong, ReturnNameNotFound };
|
enum ReturnCode { ReturnNothing, ReturnOk, ReturnLoginNeeded, ReturnSyntaxError, ReturnContextError, ReturnPasswordWrong };
|
||||||
ReturnMessage(QObject *parent = 0) : QObject(parent), msg_id(0) { }
|
ReturnMessage(QObject *parent = 0) : QObject(parent), msg_id(0) { }
|
||||||
unsigned int getMsgId() const { return msg_id; }
|
unsigned int getMsgId() const { return msg_id; }
|
||||||
void setMsgId(unsigned int _msg_id) { msg_id = _msg_id; }
|
void setMsgId(unsigned int _msg_id) { msg_id = _msg_id; }
|
||||||
|
|
Loading…
Reference in a new issue