Read Me:
Q. Why do a chatroom in C++ instead of C#?
A. Because C# has a "stop the world" garbage collector.
Q. Is this application multithreaded?
A. Yes. There are two threads. One sending and receiving messages
from a queue when clients are available and one thread processing messages.
Because only one thread is processing messages, no locking is needed.
websocket is a chatroom websocket server.
Written in C++ using libwebsockets:
https://libwebsockets.org/lws-api-doc-master/html/md_READMEs_README_8coding.html
websocket Port ServerPassword
starts the websocket server listening to Port.
ServerPassword is the password to edit users/chatrooms.
websocket test classname
Runs the test for classname.
websocket test testnumber
testnumber can be from 1 to 5
websocket test all
Runs all the tests.
Clients connect and send commands to the server. The server sends commands back.
Commands consist of the command name then a ( then parameters then )
Numbers are sent comma delimited.
Examples: 3,12,16
Strings are sent with the length in base 10 then a comma then the text.
There's no comma after the text because the length is already known.
Examples: 4,test6,client
messageid is a unique number the client sends with each message.
The messageid if the server response will match the messageid of the client.
If a message comes from another client, that messageid won't match
because each client assigns its own message id.
Commands the client send to the server:
sendtoall(server_password,messageid,message)
Returns success(messageid) or error(message,messageid).
sends privatemessage(chatclientid,userid,username,message) to all users.
If user isn't logged in, userid = 0 and username is blank.
addchatroom(messageid,room_name,question,answer,answer_hashed,server_password)
Adds a chatroom.
Returns chatroomcreated(messageid,chatroomid,room_name) or error(message,messageid).
If server_password is not sent then everyone_can_join and delete_if_unused are true.
question and answer and answer_hashed can be blank.
getchatroomlist(messageid)
Returns a list of all chatrooms. The list is returned with the chatroomlist command.
adduser(messageid,userid,username,password,server_password)
The server_password is required. The idea is that
some other service connects and feeds this from a database.
login(messageid,username,password)
Logs in. Returns success or error messages.
TODO: This will connect to a database.
logout(messageid,disconnect)
Logs the connection out. If disconnect is not 0, then also disconnects.
Sends a success message if disconnect == 0.
Sends an error message if you're already logged out and disconnect == 0.
joinchatroom(messageid,chatroomid,leave_other_chatrooms,answerhashed,server_password)
Joins a chatroom. server_password is for secure chatrooms.
Answerhashed is required for chatrooms with question/answers.
server_password is required the server password was used when the chatroom was added.
If leave_other_chatrooms is not zero then any other chatrooms are left.
send(messageid,chatroomid,message)
Send a chat message to everybody in the chatroom.
leavechatroom(messageid,chatroomid)
Leaves a chatroom. Returns a userleftchatroom message or an error.
getusersinchatroom(messageid,chatroomid)
Returns the list of users/clients in the chatroom. usersinchatroom message.
removechatroom(messageid,chatroomid,server_password)
Removes a chatroom. Requires server password.
Sends a chatroomwasdeleted message to you and everybody in the chatroom.
sendto(messageid,chatclientid,userid,message)
Sends a message to a specific user or chatclientid.
Chatclientid and userid are optional, but you must send at least one.
Sends message to the user or error back to the caller. See msg below.
removeuser(messageid,userid,server_password)
Removes a user from ram. Server_password is required.
nop()
No operation. This is used by the client to keep the connection alive. No response.
getusers(messageid,status,server_password)
Gets the list of users in ram. Server_password is required.
If status == 1, only return users that are logged in.
If status == 2, only return users that are logged off.
If status == 3, return both users logged in and users logged off.
Returns a users message or an error.
Simple games are games where you just ask their name and don't have defined users/passwords.
One person starts a game and tells the gameid to the other person to join the game.
startsimplegame(messageid,gameid,username,gamedata)
Starts a simple chat game.
Returns a simplegamestarted message or an error if gameid is already used.
joinsimplegame(messageid,gameid,username,gamedata)
Joins a simple chat game. Appends gamedata to the game's gamedata.
Returns a simplegamejoined message to all players in the game or an error.
simplegamesetdata(messageid,gameid,offset,newgamedata)
Sets the gamedata in a game. Sends a simplegamedata message or an error. Offset is where to save newgamedata within gamedata. Use -1 to replace.
leavesimplegame(messageid,gameid,offset,newgamedata)
Leaves a simple game. Returns a simplegameleave message to all users in the game or an error. Offset is where to save newgamedata within gamedata. Use -1 to replace.
simplegamechat(messageid,gameid,username,message)
Sends a chat message to usename in a simple game. Sends a simplegamechat message to the user and a success message or an error message to the caller.
simplegameusers(messageid,gameid)
Returns the list of users in a game. Returns a simplegameusers message or an error message.
simplegameusersetdata(messageid,gameid,userdata)
Sets the data for a user in a game. Returns a success message or an error message. Also sends a simplegameuserdata message to all the other users telling them the data change.
simplegameusergetdata(messageid,gameid,username)
Gets the data for a user in a game. Returns a simplegameuserdata message or an error message. If username is left out, returns the user data for all users.
Commands the server sends to the client:
success(messageid)
The message was processed successfully.
error(message,messageid)
The message had an error.
error(message,messageid)
The message had such a bad error, the messageid wasn't parsed out. Messageid might be zero.
chatroomcreated(messageid,chatroomid,room_name,question,answer)
Some user created a chatroom.
chatroomwasdeleted(messageid,chatroomid);
A chatroom was just deleted.
chatroomlist(messageid,[chatroomid,room_name,info])
The list of chatrooms. [ ] is a array. No [ or ] is in the data.
info is a number:
bit 1 = Are you in this chatroom.
bit 2 = Can everybody join this chatroom. If not, then requires server_password to join.
bit 3 = Does this chatroom require a password. This would be an answer to a question.
bit 4 = Will this chatroom be deleted when everybody leaves.
userjoinedchatroom(messageid,chatroomid,chatclientid,userid,username)
The user joined a chatroom.
userleftchatroom(messageid,chatroomid,chatclientid,userid,username)
The user left the chat room.
yourchatclientid(chatclientid)
This is your chatclientid. Each time you connect, you get a different
chat client id.
chat(messageid,chatroomid,chatclientid,userid,message)
A message from somebody in the chatroom.
usersinchatroom(messageid,chatroomid,[chatclientid,userid,username])
List of users in a chatroom.
users(messageid,[userid,username,status])
List of users. status is 1 for logged in, 2 for logged out.
msg(messageid,chatclientid,userid,message)
A private message from the sendto command.
simplegamestarted(messageid,gameid)
A message that the game was started.
simplegamejoined(messageid,gameid,gamedata,user list)
A message that username joined a simple chat game.
simplegamedata(messageid,gameid,username,gamedata)
A message that username set the gamedata for simplegame.
simplegameleave(messageid,gameid,username,gamedata)
A message that username left the simple game.
simplegamechat(messageid,gameid,username,message)
A message from username in a simple chat game.
simplegameusers(messageid,gameid,userlist)
A message listing the users in a game. After each user is Up or Down to denote if the user is connected to the game still.
When a client disconnects, all the other users receive this message with messageid of zero.
simplegameuserdata(messageid,gameid,username,userdata)
A message listing the user data for a user in a game.