Users can specify an identification code when they connect (8-100 characters), only if they are using HTTPS. This code is combined with their nickname and a server-side secret, hashed with SHA-256, and condensed down to 64 bits by XORing every 8th byte with each other, and finally converted to base64 (with the trailing = removed). This code is displayed in a tooltip when hovering over the user's chat (TODO: mobile way to view it).
Sigils have been added to be displayed before the user's name in the chat. Admins get @, users with an ID code get +, and normal users get nothing. The IS_ADMIN field is now deprecated, as this can be determined from the user's sigil. It will be removed eventually, but is still being included in events even though the official client should not be using it anymore.
Kicks and bans are now always displayed to all users, even if the server isn't transmitting quit events normally.
* Fix not being able to scroll the index page. Oops. Cleaned up how that was managed.
* Clean up things in changelog and known issues and future features. Some of it has been done for years, oops.
* Make the label for the join button for passworded games word-wrap.
Fix removing cookies.
Add per-server instance unique IDs for games and users, which will not collide between servers or when servers restart.
Add GeoIP capability.
Add beginning of framework for logging card plays.
Adds cah.GameList methods for creating and applying the filter, as well
as a filter text input element next to the create game button. Filtering
is bound to the input keydown.
- never broadcast when a player joins a game (unless it's a new game)
- removed a duplicate broadcast in this situation as well
- never broadcast when a player leaves a game (unless the game no longer exists)
- never broadcast when a game's options change (unless the state of it having or having not a password changes)
- DO broadcast when a game resets to the lobby state (we were broadcasting when a game started but not when it ended)
In an effort to reduce deadlocks, do not actually hold a lock over the list of players in a game and instead make a copy into an array for looping, in several locations.
Add support for blank white cards, that allow the player to enter their
own answer. (Game host can choose how many to include in the deck; the
default is none.)