CAPS LOCK FILTER if a line is long enough and contains mostly caps.
Shadowban filter blocks messages with configurable substrings present in them. Does not permanently shadowban the user, yet, just drops the message.
Add a test that was missed in a previous commit.
* A certain amount of characters in the message must be latin-ish, if the message is longer than a certain length.
* There must be a certain number of spaces in the message, if the message is longer than a certain length.
* The same message cannot be repeated twice in the same location.
* Switched the separator between parts for the chat control config value from _ to . for the scope.
Split the configuration value into two. Add a tracking object to ChatFilter per user which currently contains the two different last message times. Removed the last message times from the User object. Show chat error messages only in the tab that caused them, not both tabs.
* GameId needs to be an *int not an int so we can tell the difference between lack of value and value 0.
* Add the description strings to DisconnectReason.
* Add Sigil and IdCode to NewPlayer messages.
* Add if join/quit events are being broadcast to JavascriptConfigServlet. It works much better if they are but it should still work if they aren't.
This is done with even more dumb on-resize handling. Tested lightly in Chrome, Edge, and IE, and it seemed to work well enough.
Helps #93, though I don't want to use the f-word just yet.
Cleaned up some synchronization around ConnectedUsers.users while I was in there. The list itself wasn't synchronized, which could have been a slight problem.
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.
This is still a bit clunky, but it seems to be working. This supports running both with Jetty directly, and making a .war to throw at Tomcat. You will still need Postgres to run via Jetty; this is super useful for debugging in Eclipse.
mvn clean package war:exploded jetty:run
mvn clean package war:war
You will need to copy build.properties.example to build.properties and fill in the appropriate information.
Also, use correct date format in the cache filter, as Jetty is more strict.
The /listcardcast output drops leading zeros from the deck codes, due to the string -> number -> string conversion process.
This commit fixes the displayed output by zero-padding the code to ensure it has the full five digits.
I don't know if this same issue manifests elsewhere.
Blank white cards are no longer indicated by an ID of less than -1. There is a new field on WhiteCardData. (They will still have a negative ID, but so will external cards.)
Binds filtering to keyup instead of keydown.
Catches invalid regular expression errors (filter is not set unless
valid).
Fixes empty filter not setting properly.
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.
Increase the ping timeout delay from 45 seconds to 90 seconds, while reducing the timeout on long poll requests on the client side to 30 seconds. (This is still less than the 25 seconds that LongPollServlet will wait.)