From cbb60a19d948b18bf52d6254ca6a021ee4ded4d6 Mon Sep 17 00:00:00 2001 From: Matteo Benedetto Date: Thu, 21 Aug 2025 17:02:41 +0200 Subject: [PATCH] Implement Score API Client and User Profile Integration - Added ScoreAPIClient for communication with the Mice Game Score API, including methods for user signup, score submission, and leaderboard retrieval. - Developed a simple profile manager demo to showcase user profile management and API integration. - Created a test script for the Score API to validate all endpoints and functionality. - Introduced UserProfileIntegration to manage user profiles, including local storage and API synchronization. - Added a JSON file for user profiles with sample data for testing and demonstration purposes. --- .../rpgchip03_town.mid | Bin 0 -> 5059 bytes README_PROFILE_MANAGER.md | 308 +++ api.log | 2091 +++++++++++++++++ api_requirements.txt | 6 + engine/scoring.py | 32 +- engine/sdl2.py | 50 +- keycode.txt | 9 - mice_game.db | Bin 0 -> 32768 bytes profile_manager.py | 875 +++++++ rats.py | 79 +- score_api.py | 547 +++++ score_api_client.py | 307 +++ simple_profile_demo.py | 112 + test_score_api.py | 140 ++ units/__pycache__/rat.cpython-313.pyc | Bin 10049 -> 10026 bytes user_profile_integration.py | 339 +++ user_profiles.json | 64 + 17 files changed, 4923 insertions(+), 36 deletions(-) create mode 100644 15_melodic_rpg_chiptunes_mid/rpgchip03_town.mid create mode 100644 README_PROFILE_MANAGER.md create mode 100644 api.log create mode 100644 api_requirements.txt delete mode 100644 keycode.txt create mode 100644 mice_game.db create mode 100644 profile_manager.py create mode 100644 score_api.py create mode 100644 score_api_client.py create mode 100644 simple_profile_demo.py create mode 100644 test_score_api.py create mode 100644 user_profile_integration.py create mode 100644 user_profiles.json diff --git a/15_melodic_rpg_chiptunes_mid/rpgchip03_town.mid b/15_melodic_rpg_chiptunes_mid/rpgchip03_town.mid new file mode 100644 index 0000000000000000000000000000000000000000..6cf11a3a0794ea8329a99b33632bc17ea710f7b2 GIT binary patch literal 5059 zcmeHKO>Yxd6umdq0mN8#oMar!#&~98EK^k|ZzPZ^H6;Rqo~E11 z8o7~Jpnh%oFCegCS3WlV7hU%+uyD`#=6EJ!g1VtnE3a0tuqgU@nL5Jf<3G61Y zw9G9br-U5tY)cZAfh}jS%vnc#eRy7Pzc^a&2Nh#0NtP|A+={>^m@@V+gPU?Z+$b46 zA;FSE71%1UHDGJNy09)dZ5q2Nk!!3g5ixaO>%eZqZVz*M`!(1)a_Y!Y7RrdcYrrNL z?!h?g(Re@DGImQMJ(b)vRyDRN(Mf)BNG^3_>&dFEr97FhwIsb^uT+-;`~o=rlU}*N zy1=q#@=tA|6PZ#=t(mox>vimP9eXjp1%GSkEBmBQ#<;)E75fs0RnzyX(ht%(?0XgX z%=!Pz0F~TI%ipI3)mL0w9Mti>)h!KHh^tpu*}JKUE}?r zX>3!XhOv#58z-XyP7T~fo%+KKo{(V4A;5V7&T9kP2G)o5QAf+zmPEd>zC^@yfb9Ug z1G_WK>Fu{+JILuEM_DK%@@@m0V7Le4tViShz%$m9NKYjRwv(*d zcFL3aT1y<#r!Jhz_w|+hXnpYaGc_}w+C(QZrIuPVYbVz(_UdMI^Wb|!U)d*hGRFPM zoj&<+?*KP4z>Q4jvhOwF6UTLO*uhQQL9g1#YXir5BaY|jJjWsVuz%E){m|aWVai7} zATHfc?~BfS95Sxm)j4B~HIo}_<2=)6KUO5hRHttR literal 0 HcmV?d00001 diff --git a/README_PROFILE_MANAGER.md b/README_PROFILE_MANAGER.md new file mode 100644 index 0000000..8863865 --- /dev/null +++ b/README_PROFILE_MANAGER.md @@ -0,0 +1,308 @@ +# Game Profile Manager + +A PySDL2-based user profile management system designed for gamepad-only control with virtual keyboard input. This system allows players to create, edit, delete, and select user profiles for games using only gamepad inputs or directional keys, with no need for physical keyboard text input. + +## Features + +- **640x480 Resolution**: Optimized for retro gaming systems and handheld devices +- **Create New Profiles**: Add new user profiles with custom names using virtual keyboard +- **Profile Selection**: Browse and select active profiles +- **Edit Settings**: Modify profile settings including difficulty, volume levels, and preferences +- **Delete Profiles**: Remove unwanted profiles +- **Gamepad/Directional Navigation**: Full control using only gamepad/joystick inputs or arrow keys +- **Virtual Keyboard**: Text input using directional controls - no physical keyboard typing required +- **JSON Storage**: Profiles stored in human-readable JSON format +- **Persistent Settings**: All changes automatically saved + +## Installation + +### Requirements +- Python 3.6+ +- PySDL2 +- SDL2 library + +### Setup +```bash +# Install required Python packages +pip install pysdl2 + +# For Ubuntu/Debian users, you may also need: +sudo apt-get install libsdl2-dev libsdl2-ttf-dev + +# Make launcher executable +chmod +x launch_profile_manager.sh +``` + +## Usage + +### Running the Profile Manager +```bash +# Method 1: Use the launcher script +./launch_profile_manager.sh + +# Method 2: Run directly with Python +python3 profile_manager.py +``` + +### Gamepad Controls + +#### Standard Gamepad Layout (Xbox/PlayStation compatible) +- **D-Pad/Hat**: Navigate menus up/down/left/right, control virtual keyboard cursor +- **Button 0 (A/X)**: Confirm selection, enter menus, select virtual keyboard characters +- **Button 1 (B/Circle)**: Go back, cancel action +- **Button 2 (X/Square)**: Delete profile, backspace in virtual keyboard +- **Button 3 (Y/Triangle)**: Reserved for future features + +#### Keyboard Controls (Alternative) +- **Arrow Keys**: Navigate menus and virtual keyboard cursor +- **Enter/Space**: Confirm selection, select virtual keyboard characters +- **Escape**: Go back, cancel action +- **Delete/Backspace**: Delete profile, backspace in virtual keyboard +- **Tab**: Reserved for future features + +#### Virtual Keyboard Text Input +When creating or editing profile names: +1. **Navigate**: Use D-Pad/Arrow Keys to move cursor over virtual keyboard +2. **Select Character**: Press A/Enter to add character to profile name +3. **Backspace**: Press X/Delete to remove last character +4. **Complete**: Navigate to "DONE" and press A/Enter to finish input +5. **Cancel**: Navigate to "CANCEL" and press A/Enter to abort + +#### Navigation Flow +1. **Main Menu**: Create Profile → Select Profile → Edit Settings → Exit +2. **Profile List**: Choose from existing profiles, or go back +3. **Create Profile**: Use virtual keyboard to enter name, confirm with directional controls +4. **Edit Profile**: Adjust settings using left/right navigation + +### Display Specifications +- **Resolution**: 640x480 pixels (4:3 aspect ratio) +- **Optimized for**: Retro gaming systems, handheld devices, embedded systems +- **Font Scaling**: Adaptive font sizes for optimal readability at low resolution + +### Profile Structure + +Profiles are stored in `user_profiles.json` with the following structure: + +```json +{ + "profiles": { + "PlayerName": { + "name": "PlayerName", + "created_date": "2024-01-15T10:30:00", + "last_played": "2024-01-20T14:45:00", + "games_played": 25, + "total_score": 15420, + "best_score": 980, + "settings": { + "difficulty": "normal", + "sound_volume": 75, + "music_volume": 60, + "screen_shake": true, + "auto_save": true + }, + "achievements": [ + "first_win", + "score_500" + ] + } + }, + "active_profile": "PlayerName" +} +``` + +## Integration with Games + +### Loading Active Profile +```python +import json + +def load_active_profile(): + try: + with open('user_profiles.json', 'r') as f: + data = json.load(f) + active_name = data.get('active_profile') + if active_name and active_name in data['profiles']: + return data['profiles'][active_name] + except (FileNotFoundError, json.JSONDecodeError): + pass + return None + +# Usage in your game +profile = load_active_profile() +if profile: + difficulty = profile['settings']['difficulty'] + sound_volume = profile['settings']['sound_volume'] +``` + +### Updating Profile Stats +```python +def update_profile_stats(score, game_completed=True): + try: + with open('user_profiles.json', 'r') as f: + data = json.load(f) + + active_name = data.get('active_profile') + if active_name and active_name in data['profiles']: + profile = data['profiles'][active_name] + + if game_completed: + profile['games_played'] += 1 + profile['total_score'] += score + profile['best_score'] = max(profile['best_score'], score) + profile['last_played'] = datetime.now().isoformat() + + with open('user_profiles.json', 'w') as f: + json.dump(data, f, indent=2) + except Exception as e: + print(f"Error updating profile: {e}") +``` + +## Customization + +### Adding New Settings +Edit the `UserProfile` dataclass and the settings adjustment methods: + +```python +# In profile_manager.py, modify the UserProfile.__post_init__ method +def __post_init__(self): + if self.settings is None: + self.settings = { + "difficulty": "normal", + "sound_volume": 50, + "music_volume": 50, + "screen_shake": True, + "auto_save": True, + "your_new_setting": "default_value" # Add here + } +``` + +### Custom Font +Place your font file in the `assets/` directory and update the font path: +```python +font_path = "assets/your_font.ttf" +``` + +### Screen Resolution +The application is optimized for 640x480 resolution. To change resolution, modify the window size in the init_sdl method: +```python +self.window = sdl2.ext.Window( + title="Profile Manager", + size=(your_width, your_height) # Change from (640, 480) +) +``` + +### Virtual Keyboard Layout +Customize the virtual keyboard characters by modifying the keyboard_chars list: +```python +self.keyboard_chars = [ + ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], + ['K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'], + ['U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4'], + ['5', '6', '7', '8', '9', '0', '_', '-', ' ', '<'], + ['DONE', 'CANCEL', '', '', '', '', '', '', '', ''] +] +``` + +## Troubleshooting + +### No Gamepad Detected +- Ensure your gamepad is connected before starting the application +- Try different USB ports +- Check if your gamepad is recognized by your system +- The application will show "No gamepad detected - using keyboard fallback" +- Virtual keyboard works with both gamepad and keyboard controls + +### Font Issues +- Ensure the font file exists in the assets directory +- The system will fall back to default font if custom font is not found +- Supported font formats: TTF, OTF +- Font sizes are automatically scaled for 640x480 resolution + +### Virtual Keyboard Not Responding +- Ensure you're in text input mode (creating/editing profile names) +- Use arrow keys or D-Pad to navigate the virtual keyboard cursor +- Press Enter/A button to select characters +- The virtual keyboard cursor should be visible as a highlighted character + +### Profile Not Saving +- Check file permissions in the application directory +- Ensure sufficient disk space +- Verify JSON format is not corrupted + +### Resolution Issues +- The application is designed for 640x480 resolution +- On higher resolution displays, the window may appear small +- This is intentional for compatibility with retro gaming systems +- Content is optimized and readable at this resolution + +## File Structure +``` +project_directory/ +├── profile_manager.py # Main application (640x480, virtual keyboard) +├── launch_profile_manager.sh # Launcher script +├── user_profiles.json # Profile data storage +├── test_profile_manager.py # Test suite for core functions +├── game_profile_integration.py # Example game integration +├── assets/ +│ └── decterm.ttf # Font file (optional) +└── README_PROFILE_MANAGER.md # This documentation +``` + +## Development Notes + +### Virtual Keyboard Implementation +The virtual keyboard is implemented as a 2D grid of characters: +- Cursor position tracked with (keyboard_cursor_x, keyboard_cursor_y) +- Character selection adds to input_text string +- Special functions: DONE (confirm), CANCEL (abort), < (backspace) +- Fully navigable with directional controls only + +### Screen Layout for 640x480 +- Header area: 0-80px (titles, status) +- Content area: 80-400px (main UI elements) +- Controls area: 400-480px (help text, instructions) +- All elements scaled and positioned for optimal readability + +### Adding New Screens +1. Add screen name to `current_screen` handling +2. Create render method (e.g., `render_new_screen()`) +3. Add navigation logic in input handlers +4. Update screen transitions in confirm/back handlers + +### Gamepad Button Mapping +The application uses SDL2's joystick interface. Button numbers may vary by controller: +- Most modern controllers follow the Xbox layout +- PlayStation controllers map similarly but may have different button numbers +- Test with your specific controller and adjust mappings if needed + +### Performance Considerations +- Rendering is capped at 60 FPS for smooth operation +- Input debouncing prevents accidental rapid inputs +- JSON operations are minimized and occur only when necessary +- Virtual keyboard rendering optimized for 640x480 resolution +- Font scaling automatically adjusted for readability + +### Adding Support for Different Resolutions +To support different screen resolutions, modify these key areas: +1. Window initialization in `init_sdl()` +2. Panel and button positioning in render methods +3. Font size scaling factors +4. Virtual keyboard grid positioning + +### Gamepad Integration Notes +- Uses SDL2's joystick interface for maximum compatibility +- Button mapping follows standard Xbox controller layout +- Hat/D-Pad input prioritized over analog sticks for precision +- Input timing designed for responsive but not accidental activation + +## Target Platforms + +This profile manager is specifically designed for: +- **Handheld Gaming Devices**: Steam Deck, ROG Ally, etc. +- **Retro Gaming Systems**: RetroPie, Batocera, etc. +- **Embedded Gaming Systems**: Custom arcade cabinets, portable devices +- **Low-Resolution Displays**: 640x480, 800x600, and similar resolutions +- **Gamepad-Only Environments**: Systems without keyboard access + +## License +This profile manager is provided as-is for educational and personal use. Designed for integration with retro and handheld gaming systems. diff --git a/api.log b/api.log new file mode 100644 index 0000000..9249f7e --- /dev/null +++ b/api.log @@ -0,0 +1,2091 @@ +nohup: input ignorato +/home/enne2/Dev/mice/score_api.py:112: DeprecationWarning: + on_event is deprecated, use lifespan event handlers instead. + + Read more about it in the + [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). + + @app.on_event("startup") +INFO: Started server process [41455] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) +Starting Mice Game Score API... +Available endpoints: + POST /signup/{device_id}/{user_id} - Register new user + POST /score/{device_id}/{user_id} - Submit score + GET /users/{device_id} - Get all users for device + GET /scores/{device_id}/{user_id} - Get user scores + GET /leaderboard/{device_id} - Get device leaderboard + +INFO: 127.0.0.1:54554 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:37394 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53716 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:45032 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:45048 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:45052 - "GET /leaderboard/global/top?limit=3 HTTP/1.1" 200 OK +INFO: 127.0.0.1:60562 - "POST /signup/DEV-TEST001/Alice HTTP/1.1" 400 Bad Request +INFO: 127.0.0.1:60570 - "POST /signup/DEV-TEST001/Bob HTTP/1.1" 400 Bad Request +INFO: 127.0.0.1:60584 - "POST /signup/DEV-TEST001/Charlie HTTP/1.1" 400 Bad Request +INFO: 127.0.0.1:33868 - "POST /signup/DEV-TEST0001/Alice HTTP/1.1" 200 OK +INFO: 127.0.0.1:33872 - "POST /score/DEV-TEST0001/Alice HTTP/1.1" 200 OK +INFO: 127.0.0.1:33876 - "POST /signup/DEV-TEST0001/Bob HTTP/1.1" 200 OK +INFO: 127.0.0.1:33888 - "POST /score/DEV-TEST0001/Bob HTTP/1.1" 200 OK +INFO: 127.0.0.1:33894 - "POST /signup/DEV-TEST0001/Charlie HTTP/1.1" 200 OK +INFO: 127.0.0.1:33898 - "POST /score/DEV-TEST0001/Charlie HTTP/1.1" 200 OK +INFO: 127.0.0.1:36590 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:37554 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:37570 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:52058 - "POST /score/DEV-3A2D87B7/MAT HTTP/1.1" 200 OK +INFO: 127.0.0.1:46986 - "POST /score/DEV-3A2D87B7/MAT HTTP/1.1" 200 OK +INFO: 127.0.0.1:47002 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47004 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47006 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47020 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47026 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47040 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47048 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47058 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47064 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47070 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47078 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47092 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47100 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47108 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47114 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47118 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47128 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47130 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47140 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47154 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47160 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47168 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47178 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47184 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47190 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47194 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47200 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47216 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47218 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47232 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47238 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47250 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47258 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47268 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47278 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47288 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47290 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47306 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47316 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47326 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47336 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47348 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47358 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47362 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47366 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47380 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47386 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47400 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47408 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47422 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47432 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47442 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47458 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47466 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47476 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47492 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47494 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47496 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47508 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47512 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47514 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47530 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47544 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47560 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47570 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47572 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47582 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47594 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47598 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47606 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47612 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47626 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47630 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47640 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47656 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47672 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47684 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47692 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47706 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47714 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47716 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47718 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47720 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47728 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47736 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47752 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47766 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47782 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47794 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47802 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47816 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47820 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47824 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47832 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47848 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47858 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47874 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47880 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47890 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47896 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47900 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47910 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47924 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47926 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47928 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47938 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47948 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47954 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47960 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47964 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47980 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47982 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47992 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48002 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48008 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48022 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48028 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48036 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48046 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48058 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48064 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48078 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48082 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48092 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48094 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48096 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48110 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48120 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48128 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48130 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48144 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48150 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48152 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48162 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48164 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48168 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48174 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48184 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48196 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48198 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48214 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48218 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48228 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48244 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48248 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48252 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48262 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48268 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48280 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48282 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48284 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48300 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48306 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48320 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48322 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48338 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48352 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48356 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48370 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48372 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48380 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48384 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48390 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48396 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48402 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48414 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48430 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48432 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48434 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48440 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48442 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48448 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48464 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48476 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48490 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48504 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48516 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48520 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48528 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48544 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48552 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48556 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48558 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48570 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48580 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48582 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48598 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48610 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48622 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48624 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48632 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48634 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48644 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48660 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48662 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48670 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48680 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48690 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48694 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48710 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48716 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48722 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48738 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48750 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48754 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48756 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48770 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48784 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48796 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48806 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48808 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48820 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48826 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48834 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48848 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48858 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48860 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48868 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48878 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48890 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48906 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48922 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48936 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48942 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48944 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48950 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48962 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48978 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48992 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48994 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49002 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49006 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49016 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49020 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49026 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49040 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49046 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49058 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49070 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49082 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49096 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49098 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49108 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49110 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49116 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49130 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49132 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49138 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49142 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49150 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49156 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46122 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46126 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46138 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46150 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46162 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46178 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46180 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46194 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46196 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46202 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46206 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46220 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46236 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46244 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46250 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46262 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46270 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46280 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46286 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46292 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46298 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46312 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46322 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46334 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46336 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46344 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46354 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46370 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46372 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46378 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46382 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46388 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46402 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46408 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46418 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46428 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46438 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46450 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46464 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46468 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46474 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46482 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46484 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46496 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46500 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46502 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46518 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46528 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46542 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46550 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46554 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46564 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46566 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46582 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46590 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46604 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46616 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46630 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46634 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46640 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46646 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46662 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46674 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46682 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46686 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46696 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46702 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46718 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46724 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46740 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46748 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46762 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46778 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46780 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46794 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46798 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46800 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46814 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46820 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46836 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46850 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46854 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46870 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46880 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46892 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46908 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46922 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46928 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46934 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46938 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46946 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46956 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46972 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46974 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46988 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47002 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47016 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47032 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47042 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47050 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47052 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47056 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47070 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47074 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47082 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47084 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47094 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47102 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47110 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47124 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47138 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47148 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47156 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47164 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47172 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47174 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47178 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47184 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47186 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47194 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47196 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47200 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47210 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47224 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47232 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47248 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47256 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47264 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47280 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47294 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47308 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47320 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47326 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47330 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47342 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47346 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47358 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47372 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47380 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47382 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47398 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47400 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47408 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47414 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47426 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47436 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47442 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47458 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47464 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47470 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47478 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47484 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47500 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47502 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47518 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47522 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47528 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47538 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47546 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47548 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47560 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47562 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47568 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47576 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47582 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47594 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47608 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47610 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47626 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47632 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47644 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47658 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47666 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47668 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47672 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47674 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47690 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47698 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47708 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47722 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47734 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47744 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47748 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47754 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47766 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47774 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47788 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47802 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47806 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47820 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47822 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47826 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47840 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47848 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47862 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47874 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47888 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47900 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47914 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47930 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47938 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47944 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47954 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47960 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47972 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47980 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47986 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47988 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47990 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47996 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48004 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48020 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48028 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48044 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48052 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48064 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48076 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48088 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48092 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48096 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48104 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48114 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48124 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48132 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48144 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48160 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48162 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48164 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48176 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48186 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48190 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48200 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48212 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48220 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48226 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48228 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48234 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48240 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48252 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48268 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48272 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48276 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48288 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48300 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48314 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48322 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48326 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48338 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48352 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48366 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48378 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48394 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48410 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48412 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48420 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48436 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48440 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48450 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48466 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48468 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48484 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48498 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48510 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48522 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48532 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48544 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48558 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48572 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48574 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48582 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48586 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48596 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48598 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48612 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48624 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48638 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48646 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48658 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48660 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48668 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48674 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48690 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48702 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48718 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48726 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48740 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48748 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48754 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48760 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48776 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48788 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48794 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48800 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48812 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48818 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48826 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48836 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48852 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48860 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48870 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48882 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48892 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48908 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48916 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48922 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48930 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48938 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48942 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48954 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48960 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48966 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48980 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48992 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49002 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49014 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49018 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49020 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49036 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49042 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49054 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49060 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49072 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49084 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49086 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49100 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49114 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49126 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49136 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49146 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49156 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49172 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49182 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49198 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49206 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49214 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49226 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49234 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49250 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49264 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49272 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49286 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49292 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49298 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49304 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49320 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49336 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49346 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49348 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49350 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49364 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49372 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49386 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49390 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49396 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49410 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49412 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49420 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49422 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49428 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49440 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49454 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49464 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49468 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49474 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49478 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49486 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49490 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49500 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49512 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49514 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49518 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49524 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49536 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49544 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49554 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49558 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49570 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49576 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49590 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49600 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49614 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49620 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49630 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49636 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49644 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49650 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49658 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49664 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49678 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49690 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49700 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55566 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55568 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55578 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55592 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55594 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55610 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55616 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55630 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55632 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55646 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55658 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55668 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55678 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55694 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55710 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55722 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55732 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55744 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55760 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55776 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55780 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55788 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55802 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55814 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55822 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55826 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55840 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55846 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55850 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55866 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55880 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55884 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55886 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55902 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55908 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55916 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55930 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55942 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55950 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55958 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55974 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55988 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55992 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55994 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55998 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56002 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56014 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56024 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56028 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56042 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56048 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56062 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56078 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56082 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56084 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56088 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56092 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56096 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56108 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56112 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56114 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56122 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56124 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56128 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56138 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56152 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56154 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56158 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56162 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56164 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56176 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56188 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56198 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56204 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56208 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56212 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56218 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56220 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56236 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56246 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56260 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56270 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56276 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56292 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56294 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56310 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56322 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56336 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56338 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56346 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56348 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56364 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56380 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56390 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56402 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56408 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56424 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56434 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56448 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56460 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56472 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56486 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56498 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56500 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56502 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56516 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56530 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56544 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56558 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56572 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56578 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56592 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56604 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56616 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56630 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56632 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56634 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56650 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56656 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56672 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56678 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56692 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56700 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56702 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56704 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56708 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56714 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56726 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56732 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56736 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56738 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56754 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56766 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56772 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56776 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56784 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56800 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56802 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56818 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56826 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56834 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56846 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56856 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56860 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56862 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56874 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56882 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56892 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56908 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56924 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56936 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56938 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56940 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56952 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56964 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56966 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56968 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56980 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56996 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57002 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57008 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57022 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57034 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57036 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57050 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57054 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57066 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57072 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57086 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57088 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57094 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57104 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57114 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57126 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57132 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57146 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57150 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57160 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57176 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57182 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57196 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57212 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57226 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57230 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57238 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57254 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57270 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57278 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57290 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57298 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57308 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57318 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57334 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57336 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57352 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57358 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57364 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57374 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57388 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57398 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57412 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57424 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57436 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57448 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57452 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57464 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57478 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57484 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57494 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57498 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57512 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57516 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57532 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57536 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57538 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57546 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57554 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57562 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57568 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57576 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57582 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57590 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57606 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57612 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57624 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57634 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57638 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57648 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57662 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57676 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57678 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57682 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57684 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57692 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57702 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57712 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57724 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57728 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57730 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57736 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57738 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57742 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57750 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57758 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57760 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57772 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57784 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57794 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57810 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57822 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57832 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57842 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57856 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57866 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57874 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57886 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57892 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57896 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57900 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57906 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57914 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57930 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57942 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57944 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57960 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57974 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57980 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57982 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57990 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57998 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58012 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58016 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58028 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58044 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58050 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58052 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58056 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58070 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58072 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58086 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58088 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58102 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58116 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58128 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58138 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58146 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58150 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58154 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58156 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58162 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58178 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58194 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58206 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58222 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58234 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58238 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58252 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58262 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58278 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58282 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58286 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58300 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58306 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58322 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58324 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58340 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58348 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58360 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58364 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58374 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58376 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58380 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58384 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58398 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58412 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58422 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58432 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58444 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58452 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58466 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58474 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58482 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58484 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58486 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58488 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58494 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58502 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58508 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58522 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58526 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58534 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58540 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58546 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58552 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58562 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58578 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58588 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58600 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58616 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58628 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58636 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58640 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58652 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58668 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58680 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58686 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58694 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58698 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58706 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58712 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58720 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58734 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58738 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58754 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58768 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58776 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58784 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58790 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58800 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58802 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58808 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58824 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58840 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58856 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58864 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58866 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58882 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58886 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58892 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58894 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58904 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58906 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58922 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58924 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58926 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58932 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58938 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58952 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58964 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58980 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58986 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58994 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59004 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59020 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59024 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59032 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59036 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59046 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59060 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59064 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59080 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59096 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59100 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59104 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59114 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59122 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59130 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59134 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59136 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59140 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59142 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59146 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59156 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59158 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59168 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:52974 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:52988 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:52996 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53000 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53014 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53028 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53042 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53046 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53050 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53052 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53060 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53072 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53086 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53092 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53100 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53106 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53122 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53136 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53144 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53152 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53164 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53174 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53186 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53196 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53202 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53204 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53208 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53212 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53222 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53226 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53240 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53252 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53264 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53268 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53278 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53286 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53298 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53310 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53320 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53332 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53344 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53354 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53358 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53360 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53362 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53370 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53378 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53380 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53394 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53398 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53410 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53426 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53442 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53450 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53454 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53464 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53478 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53486 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53502 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53514 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53522 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53530 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53540 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53554 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53564 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53566 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53578 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53592 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53602 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53610 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53614 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53626 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53632 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53634 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53648 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53654 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53656 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53658 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53664 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53680 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53692 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53704 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53720 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53732 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53742 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53756 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53760 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53774 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53786 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53794 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53798 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53808 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53816 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53828 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53836 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53838 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53844 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53854 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53858 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53860 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53862 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53868 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53878 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53890 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53892 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53894 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53908 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53916 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53928 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53944 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53952 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53958 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53960 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53962 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53964 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53978 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53994 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54006 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54012 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54026 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54034 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54042 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54050 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54064 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54080 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54088 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49134 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49142 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:60208 - "POST /score/DEV-3A2D87B7/MAT HTTP/1.1" 200 OK +INFO: 127.0.0.1:49486 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49502 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:45430 - "POST /score/DEV-3A2D87B7/MAT HTTP/1.1" 200 OK +INFO: 127.0.0.1:45436 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:45448 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:45460 - "GET /leaderboard/global/top?limit=4 HTTP/1.1" 200 OK +INFO: 127.0.0.1:53574 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:53580 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56580 - "POST /score/DEV-3A2D87B7/MAT HTTP/1.1" 200 OK +INFO: 127.0.0.1:56582 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56586 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56590 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56592 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56602 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56612 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56620 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56624 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56638 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56654 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56668 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56676 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56684 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56698 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56708 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56724 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56728 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56744 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56748 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56754 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56762 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56768 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56782 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56790 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56802 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56804 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56820 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56828 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56838 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56846 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56858 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56874 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56884 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56890 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56898 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56914 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56930 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56936 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56946 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56962 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:56964 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56978 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:56984 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57000 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57004 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57014 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57028 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57038 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57044 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57060 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57068 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57078 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57088 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57092 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57104 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57106 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57122 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57136 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57144 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57160 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57168 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57180 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57184 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57192 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57194 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57200 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57202 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57218 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57226 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57258 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57262 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57272 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57286 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57302 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57316 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57330 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57344 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57356 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57368 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57378 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57388 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57396 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57408 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57420 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57434 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57448 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57460 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57476 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57486 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57496 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57512 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57528 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57538 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57550 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57562 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57574 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57590 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57602 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57610 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57626 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57642 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57656 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57658 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57660 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57662 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57666 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57672 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57674 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57676 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57680 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57692 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57702 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57708 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57712 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57716 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57732 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57742 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57752 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57768 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57776 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57782 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57792 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57796 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57808 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57822 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57834 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57840 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57848 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57850 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57860 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57874 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57876 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57892 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57898 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57908 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57914 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57922 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57938 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57954 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57966 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57974 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:57986 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:57990 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58000 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58016 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58030 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58046 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58056 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58072 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58076 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58088 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58098 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58100 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58104 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58116 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58128 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58144 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58146 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58148 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58154 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58166 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58176 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58186 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58190 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58200 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58202 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58206 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58210 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58220 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58234 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58248 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58256 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58272 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58282 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58298 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58302 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58308 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58320 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58332 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58338 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58344 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58354 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58362 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58378 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58386 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58390 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58402 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58408 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58412 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58424 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58426 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58428 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58434 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58446 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58452 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58466 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58472 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58486 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58488 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58494 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58498 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58506 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58514 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58516 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58524 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58538 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58546 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58558 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58566 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58568 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58576 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58578 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58584 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58592 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58606 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58618 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58632 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58634 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58644 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58658 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58662 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58666 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58680 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58688 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58700 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58714 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58726 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58740 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58746 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58756 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58760 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58762 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58766 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58774 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58786 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58798 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58812 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58818 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58828 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58844 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58856 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58860 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58866 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58874 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58888 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58894 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58900 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58902 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58912 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58918 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58920 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58926 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58940 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58946 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58948 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58952 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58958 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58962 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:58974 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58990 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:58992 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59008 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59020 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59026 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59030 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59042 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59048 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59062 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59076 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59090 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59096 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59110 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59120 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59130 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59138 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59148 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59156 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59162 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59176 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59182 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59194 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59210 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59226 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59240 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59244 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59256 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59272 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59286 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59288 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59294 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59308 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59324 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59328 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59344 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59352 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59354 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59366 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59376 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59386 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59400 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59416 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59420 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59424 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59432 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59438 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59448 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59450 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59452 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59458 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59460 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59472 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59480 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59492 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59496 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59510 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59524 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59538 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:59554 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:59566 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46404 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46414 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46420 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46430 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46442 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46458 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46472 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46486 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46502 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46518 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46530 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46540 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46552 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46568 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46570 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46586 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46596 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46602 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46608 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46618 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46620 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46624 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46626 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46642 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46656 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46658 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46674 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46690 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46696 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46710 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46712 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46726 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46736 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46738 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46748 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46760 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46776 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46790 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46792 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46794 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46804 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46816 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46822 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46834 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46850 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46854 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46862 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46870 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46882 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46886 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46892 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46904 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46908 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46916 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46922 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46936 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46948 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46964 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46972 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46976 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46992 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47006 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47008 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47010 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47024 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47040 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47044 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47060 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47068 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47076 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47082 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47098 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47112 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47114 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47128 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47140 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47148 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47150 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47158 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47162 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47176 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47180 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47182 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47192 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47208 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47224 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47238 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47250 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47252 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47256 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47270 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47274 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47278 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47288 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47300 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47308 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47318 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47328 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47344 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47360 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47376 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47382 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47392 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47408 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47420 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47428 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47430 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47446 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47448 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47462 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47476 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47484 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47496 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47510 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47520 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47532 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47540 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47556 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47566 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47582 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47596 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47612 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47620 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47630 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47636 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47652 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47664 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47668 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47678 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47688 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47696 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47700 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47704 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47720 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47732 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47736 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47748 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47752 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47758 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47760 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47762 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47764 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47774 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47776 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47782 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47792 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47796 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47810 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47812 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47828 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47838 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47854 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47862 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47878 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47894 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47900 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47916 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47922 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47932 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47940 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47954 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47966 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47968 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47972 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:47976 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47978 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:47988 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48002 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48010 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48014 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48030 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48036 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48050 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48064 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48066 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48072 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48080 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48082 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48098 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48114 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48122 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48132 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48134 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48144 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48152 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48154 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48166 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48176 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48178 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48188 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48204 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48220 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48230 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48244 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48258 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48268 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48280 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48284 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48290 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48306 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48316 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48322 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48328 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48344 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48360 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48362 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48376 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48386 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48390 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48400 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48402 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48412 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48420 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48428 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48432 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48440 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48442 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48454 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48464 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48468 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48484 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48500 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48506 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48516 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48530 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48536 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48546 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48560 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48576 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48590 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48592 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48598 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48610 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48614 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48620 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48630 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48644 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48654 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48666 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48676 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48680 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48694 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48700 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48714 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48722 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48730 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48746 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48754 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48770 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48784 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48800 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48804 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48808 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48812 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48820 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48836 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48850 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48854 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48866 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48872 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48876 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48892 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48896 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48902 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48906 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48908 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48922 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48928 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48940 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48946 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48958 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48960 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:48976 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:48984 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49000 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49006 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49020 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49034 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49042 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49046 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49054 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49068 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49076 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49092 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49100 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49114 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49128 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49132 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49144 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49152 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49158 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49170 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49176 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49186 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49188 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49190 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49204 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49208 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49216 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49228 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49238 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49240 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49244 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49248 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49254 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49256 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49266 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49278 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49288 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49290 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49300 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49304 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49310 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49320 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49322 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49338 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49350 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49360 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49376 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49388 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49404 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49420 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49430 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49444 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49456 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49458 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49468 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49472 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49488 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49494 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49496 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49512 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49524 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49530 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49534 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49538 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49552 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49568 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49578 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49588 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49590 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49600 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49604 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49620 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49630 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49632 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49648 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49656 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49662 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49676 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:49692 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49706 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:49712 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54280 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54284 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54288 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54290 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54300 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54302 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54314 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54316 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54328 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54336 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54346 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54352 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54366 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54378 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54384 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54396 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54406 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54410 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54420 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54426 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54434 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54436 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54450 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54456 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54464 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54468 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54472 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54484 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54496 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54510 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54516 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54532 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54538 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54554 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54562 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54566 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54578 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54588 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54598 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54606 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54618 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54620 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54622 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54636 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54640 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54654 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54668 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54678 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54682 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54688 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54700 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54716 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54720 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54732 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54738 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54748 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54754 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54756 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54768 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54776 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54782 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54790 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54794 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54796 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54798 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54810 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54820 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54836 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54844 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54856 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54868 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54880 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54888 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54896 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54906 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54918 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54926 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54930 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54942 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54956 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54958 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54960 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54974 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:54984 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:54996 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55000 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55004 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55014 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55026 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55032 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55036 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55040 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55042 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55044 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55050 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55054 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55064 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55074 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55090 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55102 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55108 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55124 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55140 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55152 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55160 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55162 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55172 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55176 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55190 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55194 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55196 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55210 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55216 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55220 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55230 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55244 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55248 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55260 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55276 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55282 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55284 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55300 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55312 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55314 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55322 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55328 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55344 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55354 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55360 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55374 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55384 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55386 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55398 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55412 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55426 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55440 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55452 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55464 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55466 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55472 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55488 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55490 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55506 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55516 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55530 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55538 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55546 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55558 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55574 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55590 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55594 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55602 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55610 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55618 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55622 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55630 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55642 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55652 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55666 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55676 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55678 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55692 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55694 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55696 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55712 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55714 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55730 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55740 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55750 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55760 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55766 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55778 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55786 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55792 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55798 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55804 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55820 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55834 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55836 - "GET /leaderboard/global/top?limit=5 HTTP/1.1" 200 OK +INFO: 127.0.0.1:55290 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:55302 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:45726 - "POST /score/DEV-3A2D87B7/MAT HTTP/1.1" 200 OK +INFO: 127.0.0.1:45730 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:45734 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:45738 - "GET /leaderboard/global/top?limit=4 HTTP/1.1" 200 OK +INFO: 127.0.0.1:34510 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:34524 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:46148 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:46154 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:52734 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:52740 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:41304 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:41308 - "GET /users/DEV-3A2D87B7 HTTP/1.1" 200 OK diff --git a/api_requirements.txt b/api_requirements.txt new file mode 100644 index 0000000..6398244 --- /dev/null +++ b/api_requirements.txt @@ -0,0 +1,6 @@ +# API Requirements for Mice Game Score API +fastapi>=0.104.1 +uvicorn[standard]>=0.24.0 +pydantic>=2.5.0 +sqlite3 # Built into Python +python-multipart>=0.0.6 diff --git a/engine/scoring.py b/engine/scoring.py index 719f602..ab9ccf6 100644 --- a/engine/scoring.py +++ b/engine/scoring.py @@ -6,17 +6,35 @@ class Scoring: # ==================== SCORING ==================== def save_score(self): + # Save to traditional scores.txt file with open("scores.txt", "a") as f: - f.write(f"{datetime.datetime.now()} - {self.points}\n") + player_name = getattr(self, 'profile_integration', None) + if player_name and hasattr(player_name, 'get_profile_name'): + name = player_name.get_profile_name() + device_id = player_name.get_device_id() + f.write(f"{datetime.datetime.now()} - {self.points} - {name} - {device_id}\n") + else: + f.write(f"{datetime.datetime.now()} - {self.points} - Guest\n") def read_score(self): table = [] - with open("scores.txt") as f: - rows = f.read().splitlines() - for row in rows: - table.append(row.split(" - ")) - table.sort(key=lambda x: int(x[1]), reverse=True) - return table[:3] + try: + with open("scores.txt") as f: + rows = f.read().splitlines() + for row in rows: + parts = row.split(" - ") + if len(parts) >= 2: + # Handle both old format (date - score) and new format (date - score - name - device) + if len(parts) >= 4: + table.append([parts[0], parts[1], parts[2], parts[3]]) # date, score, name, device + elif len(parts) >= 3: + table.append([parts[0], parts[1], parts[2], "Unknown"]) # date, score, name, unknown device + else: + table.append([parts[0], parts[1], "Guest", "Unknown"]) # date, score, guest, unknown device + table.sort(key=lambda x: int(x[1]), reverse=True) + except FileNotFoundError: + pass + return table[:5] # Return top 5 scores instead of 3 def add_point(self, value): self.points += value \ No newline at end of file diff --git a/engine/sdl2.py b/engine/sdl2.py index 5a2caf3..89d6b97 100644 --- a/engine/sdl2.py +++ b/engine/sdl2.py @@ -200,32 +200,52 @@ class GameWindow: self.target_size[0] - 100, self.target_size[1] - 100, "win", filling=(255, 255, 255)) - # Draw main text - self.draw_text(text, self.fonts[self.target_size[1]//20], "center", sdl2.ext.Color(0, 0, 0)) + # Calculate layout positions to avoid overlaps + title_y = self.target_size[1] // 4 # Title at 1/4 of screen height - # Draw subtitle if provided - if subtitle := kwargs.get("subtitle"): - self.draw_text(subtitle, self.fonts[self.target_size[1]//30], - ("center", self.target_size[1] // 2 + 50), sdl2.ext.Color(0, 0, 0)) + # Draw main text (title) + self.draw_text(text, self.fonts[self.target_size[1]//20], + ("center", title_y), sdl2.ext.Color(0, 0, 0)) - # Draw image if provided + # Draw image if provided - position it below title + image_bottom_y = title_y + 60 # Default position if no image if image := kwargs.get("image"): image_size = self.get_image_size(image) + image_y = title_y + 50 self.draw_image(self.target_size[0] // 2 - image_size[0] // 2 - self.w_offset, - self.target_size[1] // 2 - image_size[1] * 2 - self.h_offset, + image_y - self.h_offset, image, "win") + image_bottom_y = image_y + image_size[1] + 20 - # Draw scores if provided + # Draw subtitle if provided - handle multi-line text, position below image + if subtitle := kwargs.get("subtitle"): + subtitle_lines = subtitle.split('\n') + base_y = image_bottom_y + 20 + line_height = 25 # Fixed line height for consistent spacing + + for i, line in enumerate(subtitle_lines): + if line.strip(): # Only draw non-empty lines + self.draw_text(line.strip(), self.fonts[self.target_size[1]//35], + ("center", base_y + i * line_height), sdl2.ext.Color(0, 0, 0)) + + # Draw scores if provided - position at bottom if scores := kwargs.get("scores"): - sprite = self.factory.from_text("Scores:", color=sdl2.ext.Color(0, 0, 0), - fontmanager=self.fonts[self.target_size[1]//20]) - sprite.position = (self.target_size[0] // 2 - 50, self.target_size[1] // 2 + 30) + scores_start_y = self.target_size[1] * 3 // 4 # Bottom quarter of screen + sprite = self.factory.from_text("High Scores:", color=sdl2.ext.Color(0, 0, 0), + fontmanager=self.fonts[self.target_size[1]//25]) + sprite.position = (self.target_size[0] // 2 - sprite.size[0] // 2, scores_start_y) self.renderer.copy(sprite, dstrect=sprite.position) for i, score in enumerate(scores[:5]): - score_text = " - ".join(score) - self.draw_text(score_text, self.fonts[self.target_size[1]//40], - ("center", self.target_size[1] // 2 + 50 + 30 * (i + 1)), + if len(score) >= 4: # New format: date, score, name, device + score_text = f"{score[2]}: {score[1]} pts ({score[3]})" + elif len(score) >= 3: # Medium format: date, score, name + score_text = f"{score[2]}: {score[1]} pts" + else: # Old format: date, score + score_text = f"Guest: {score[1]} pts" + + self.draw_text(score_text, self.fonts[self.target_size[1]//45], + ("center", scores_start_y + 30 + 25 * (i + 1)), sdl2.ext.Color(0, 0, 0)) def start_dialog(self, **kwargs): diff --git a/keycode.txt b/keycode.txt deleted file mode 100644 index 614f0e5..0000000 --- a/keycode.txt +++ /dev/null @@ -1,9 +0,0 @@ -Pressed: 13 -Pressed: 13 -Pressed: 13 -Pressed: 13 -Released: 13 -Pressed: 1073741912 -Released: 1073741912 -Pressed: 1073742048 -Released: 1073742048 diff --git a/mice_game.db b/mice_game.db new file mode 100644 index 0000000000000000000000000000000000000000..07899335ddb8060857bdeb71b432595baf5d091d GIT binary patch literal 32768 zcmeI5PiWg#9LFU~w(P|AE3};!N{3(=5}KGNS&}Wm#*{`aris%!&S+s^+*n;blBSK_ z(hdgu*JE#Ehn@#LY_QXgg|UrY*7h(MJr;H>J?u1g>h>%-o-8X~b||Ff`#|y2`@P@q z_ul8ph9~`g%G$Z*PR~;=ZSQQgdP<2q#PK}$j-qfJca$AzcI=iUtBAWN?2`}G_o^P{ ziXUFfk-s=;`dco4k37t;XCG#7WpnHl1q46<1V8`;KmY_l00cl_GJ*G`lx)oKw>nqa z-px+?X0yAoz2kM8z0Q``?X|Y92IuLMb=PUQO0~A+o>$`fDXTRl=sP>qo%)fd>v?Tuadmasb!tPe%94A^Szm4_>Zt$W;!g5^YPIfGPuKkE&JHFOUMr>U zo^tDM?WDUFFjwMw4bjY<6;kqv6a0l>6|QZv9cHuZUAyjGVb{;-sW`eWqr%xMY|`^g zbMDhOc}bRK{_}!w(_eW1Phv#hZ#po`y0PQ6*jhE&#(KgPvf1kPnyrmq=Y}__+j^~f zZrz>CeJ+ub-;#OG|4t1+x32es?^x4^(^UNrf&I+*d;1)#i1|kx`HoyB$5{mh1V8`; zKmY_l00ck)1V8`;KmY^|Jb@K4#T_d+&dJNIoz0H7Xak44BXqi@7EsdLE63Z|&dM1(LWM<0QWcSei z)0kS(buHGIZdxX-^1--PoJQYN$!3m00ck)1V8`;KmY_l00cnb)g|z{c&xz3+|>||h=&V& zn&6a?c<~{^Szm2}hogr>`zP%nSrT00ck)1V8`;KmY_l00ck) z1YT(Z8D5ZiKjL4UN(eK2kPMS$bM8O*XQdzipUvIn$OCehWdLaT=lP%WU*s?5Y3_OM z0TZBr00@8p2!H?xfB*=900@8p2)tkdG%K;-^K{yYJh2T&d7E}PmYYuROGCA(RV-6l zQFS`CAB~b`YerGmXjwC9W?vfARx3q|mdi{ly&ny&WS3}>mQ~%bsI*TFY8JIhxl$>c zDT&4XCo*w?|Jjd6i48*k{Q!S0+4scsB2Unz^tjG$B)=|7ERvt;j6Gn_{1mI@hwM{f zKXanGO-n_cY8JI=5T7Sbfblb3sltuDaRE;0ZCUV7yzlO)Pn;Br1s8+Fp`2YJH z`GZ9OJR>f(V67 z_?-d${eL$9H%GoEUy_f=GxC`Hz~TVb$lGL&9AN?!5C8!X009sH0T2KI5C8!X009tq z`3d;x^O48p*|^5(xW=it#!OseI<8ULE2}@{_m0FQB;&LCgEs&~rXa+*i_QNJ_WyS{ z@;mvFd_``POXM_}C7Jxw{4e=$@^@bTCB_Uu00ck)1V8`;KmY_l00ck)1P&a5Hw1?d zhpLaJH)LbPp 0: + self.gamepad = sdl2.SDL_JoystickOpen(0) + print(f"Gamepad detected: {sdl2.SDL_JoystickName(self.gamepad).decode()}") + else: + print("No gamepad detected - using keyboard fallback") + + def load_profiles(self): + """Load profiles from JSON file""" + if os.path.exists(self.profiles_file): + try: + with open(self.profiles_file, 'r') as f: + data = json.load(f) + self.profiles = { + name: UserProfile(**profile_data) + for name, profile_data in data.get('profiles', {}).items() + } + self.active_profile = data.get('active_profile') + except (json.JSONDecodeError, KeyError) as e: + print(f"Error loading profiles: {e}") + self.profiles = {} + + def save_profiles(self): + """Save profiles to JSON file""" + data = { + 'profiles': { + name: asdict(profile) + for name, profile in self.profiles.items() + }, + 'active_profile': self.active_profile + } + + try: + with open(self.profiles_file, 'w') as f: + json.dump(data, f, indent=2) + except IOError as e: + print(f"Error saving profiles: {e}") + + def create_profile(self, name: str) -> bool: + """Create a new profile""" + if name in self.profiles or not name.strip(): + return False + + now = datetime.now().isoformat() + profile = UserProfile( + name=name.strip(), + created_date=now, + last_played=now + ) + + self.profiles[name.strip()] = profile + self.save_profiles() + return True + + def delete_profile(self, name: str) -> bool: + """Delete a profile""" + if name in self.profiles: + del self.profiles[name] + if self.active_profile == name: + self.active_profile = None + self.save_profiles() + return True + return False + + def set_active_profile(self, name: str) -> bool: + """Set the active profile""" + if name in self.profiles: + self.active_profile = name + self.profiles[name].last_played = datetime.now().isoformat() + self.save_profiles() + return True + return False + + def handle_gamepad_input(self): + """Handle gamepad input with debouncing""" + if not self.gamepad: + return + + current_time = time.time() + + # D-pad navigation + hat_state = sdl2.SDL_JoystickGetHat(self.gamepad, 0) + + # Up + if hat_state & sdl2.SDL_HAT_UP: + if self.can_process_input('up', current_time): + self.navigate_up() + + # Down + if hat_state & sdl2.SDL_HAT_DOWN: + if self.can_process_input('down', current_time): + self.navigate_down() + + # Left + if hat_state & sdl2.SDL_HAT_LEFT: + if self.can_process_input('left', current_time): + self.navigate_left() + + # Right + if hat_state & sdl2.SDL_HAT_RIGHT: + if self.can_process_input('right', current_time): + self.navigate_right() + + # Buttons + button_count = sdl2.SDL_JoystickNumButtons(self.gamepad) + for i in range(min(button_count, 16)): # Limit to reasonable number + if sdl2.SDL_JoystickGetButton(self.gamepad, i): + if self.can_process_input(f'button_{i}', current_time): + self.handle_button_press(i) + + def can_process_input(self, input_key: str, current_time: float) -> bool: + """Check if enough time has passed to process input (debouncing)""" + delay = 0.15 # 150ms delay + if input_key not in self.last_button_time: + self.last_button_time[input_key] = current_time + return True + + if current_time - self.last_button_time[input_key] > delay: + self.last_button_time[input_key] = current_time + return True + + return False + + def handle_button_press(self, button: int): + """Handle gamepad button presses""" + # Button mappings (common gamepad layout) + # 0: A/Cross - Confirm + # 1: B/Circle - Back + # 2: X/Square - Delete/Special + # 3: Y/Triangle - Menu + + if button == 0: # A/Confirm + self.handle_confirm() + elif button == 1: # B/Back + self.handle_back() + elif button == 2: # X/Delete + self.handle_delete() + elif button == 3: # Y/Menu + self.handle_menu() + + def navigate_up(self): + """Navigate up in current screen""" + if self.current_screen == "main_menu": + self.selected_index = max(0, self.selected_index - 1) + elif self.current_screen == "profile_list": + self.selected_index = max(0, self.selected_index - 1) + elif self.current_screen == "edit_profile": + self.selected_index = max(0, self.selected_index - 1) + elif self.current_screen == "create_profile" and self.input_active: + # Virtual keyboard navigation + self.vk_cursor_y = max(0, self.vk_cursor_y - 1) + # Adjust x cursor if current row is shorter + max_x = len(self.virtual_keyboard[self.vk_cursor_y]) - 1 + self.vk_cursor_x = min(self.vk_cursor_x, max_x) + + def navigate_down(self): + """Navigate down in current screen""" + if self.current_screen == "main_menu": + max_index = 3 # Create, Select, Settings, Exit (0-3) + self.selected_index = min(max_index, self.selected_index + 1) + elif self.current_screen == "profile_list": + max_index = len(self.profiles) # Profiles + Back + self.selected_index = min(max_index, self.selected_index + 1) + elif self.current_screen == "edit_profile": + max_index = 5 # 4 settings + save + back (0-5) + self.selected_index = min(max_index, self.selected_index + 1) + elif self.current_screen == "create_profile" and self.input_active: + # Virtual keyboard navigation + max_y = len(self.virtual_keyboard) - 1 + self.vk_cursor_y = min(max_y, self.vk_cursor_y + 1) + # Adjust x cursor if current row is shorter + max_x = len(self.virtual_keyboard[self.vk_cursor_y]) - 1 + self.vk_cursor_x = min(self.vk_cursor_x, max_x) + + def navigate_left(self): + """Navigate left (for adjusting values)""" + if self.current_screen == "edit_profile": + self.adjust_setting(-1) + elif self.current_screen == "create_profile" and self.input_active: + # Virtual keyboard navigation + self.vk_cursor_x = max(0, self.vk_cursor_x - 1) + + def navigate_right(self): + """Navigate right (for adjusting values)""" + if self.current_screen == "edit_profile": + self.adjust_setting(1) + elif self.current_screen == "create_profile" and self.input_active: + # Virtual keyboard navigation + max_x = len(self.virtual_keyboard[self.vk_cursor_y]) - 1 + self.vk_cursor_x = min(max_x, self.vk_cursor_x + 1) + + def handle_confirm(self): + """Handle confirm action (A button)""" + if self.current_screen == "main_menu": + if self.selected_index == 0: # Create Profile + self.current_screen = "create_profile" + self.input_text = "" + self.input_active = True + elif self.selected_index == 1: # Select Profile + self.current_screen = "profile_list" + self.selected_index = 0 + elif self.selected_index == 2: # Settings + if self.active_profile: + self.current_screen = "edit_profile" + self.selected_index = 0 + elif self.selected_index == 3: # Exit + self.running = False + + elif self.current_screen == "profile_list": + profile_names = list(self.profiles.keys()) + if self.selected_index < len(profile_names): + # Select profile + profile_name = profile_names[self.selected_index] + self.set_active_profile(profile_name) + self.current_screen = "main_menu" + self.selected_index = 0 + else: # Back option + self.current_screen = "main_menu" + self.selected_index = 1 + + elif self.current_screen == "create_profile": + if self.input_active: + # Handle virtual keyboard selection + self.handle_virtual_keyboard_input() + else: + # Start text input mode + self.input_active = True + self.vk_cursor_x = 0 + self.vk_cursor_y = 0 + + elif self.current_screen == "edit_profile": + if self.selected_index == 4: # Save (index 4) + self.save_profiles() + self.current_screen = "main_menu" + self.selected_index = 0 + elif self.selected_index == 5: # Back (index 5) + self.current_screen = "main_menu" + self.selected_index = 0 + + def handle_back(self): + """Handle back action (B button)""" + if self.current_screen == "main_menu": + self.running = False + elif self.current_screen in ["profile_list", "create_profile", "edit_profile"]: + self.current_screen = "main_menu" + self.selected_index = 0 + self.input_active = False + + def handle_delete(self): + """Handle delete action (X button)""" + if self.current_screen == "profile_list": + profile_names = list(self.profiles.keys()) + if self.selected_index < len(profile_names): + profile_name = profile_names[self.selected_index] + self.delete_profile(profile_name) + self.selected_index = min(self.selected_index, len(self.profiles) - 1) + elif self.current_screen == "create_profile": + # Delete character from input + if self.input_text: + self.input_text = self.input_text[:-1] + + def handle_menu(self): + """Handle menu action (Y button)""" + pass # Reserved for future use + + def handle_virtual_keyboard_input(self): + """Handle virtual keyboard character selection""" + if self.vk_cursor_y >= len(self.virtual_keyboard): + return + + row = self.virtual_keyboard[self.vk_cursor_y] + if self.vk_cursor_x >= len(row): + return + + selected_char = row[self.vk_cursor_x] + + if selected_char == ' 5: + color = sdl2.ext.Color(alpha, alpha, alpha * 2) + self.renderer.draw_line((0, y, 640, y), color) + + if self.current_screen == "main_menu": + self.render_main_menu() + elif self.current_screen == "profile_list": + self.render_profile_list() + elif self.current_screen == "create_profile": + self.render_create_profile() + elif self.current_screen == "edit_profile": + self.render_edit_profile() + + self.renderer.present() + + def render_main_menu(self): + """Render main menu screen with improved layout""" + # Draw background gradient effect + self.renderer.fill((0, 0, 640, 120), self.colors['dark_gray']) + + # Title + title = "Profile Manager" + self.draw_text(title, 320, 20, self.colors['light_blue'], 'title', center=True) + + # Subtitle with active profile + if self.active_profile: + active_text = f"Active: {self.active_profile}" + self.draw_text(active_text, 320, 60, self.colors['light_green'], 'medium', center=True) + else: + self.draw_text("No active profile", 320, 60, self.colors['yellow'], 'medium', center=True) + + # Menu panel + panel_x, panel_y = 120, 140 + panel_width, panel_height = 400, 220 + self.draw_panel(panel_x, panel_y, panel_width, panel_height, + self.colors['dark_gray'], self.colors['gray']) + + # Menu items with proper spacing + menu_items = [ + "Create Profile", + "Select Profile", + "Edit Settings", + "Exit" + ] + + button_width = 280 + button_height = 35 + button_x = panel_x + 60 + start_y = panel_y + 20 + + for i, item in enumerate(menu_items): + button_y = start_y + i * (button_height + 10) + selected = (i == self.selected_index) + self.draw_button(item, button_x, button_y, button_width, button_height, selected) + + # Controls help panel + help_panel_y = 380 + self.draw_panel(10, help_panel_y, 620, 80, + self.colors['black'], self.colors['dark_gray']) + + self.draw_text("Controls:", 20, help_panel_y + 8, + self.colors['light_blue'], 'small') + + self.draw_text("↑↓ Navigate Enter Confirm Escape Back", 20, help_panel_y + 30, + self.colors['light_gray'], 'tiny') + + def render_profile_list(self): + """Render profile selection screen with improved layout""" + # Header + self.renderer.fill((0, 0, 640, 70), self.colors['dark_gray']) + self.draw_text("Select Profile", 320, 15, self.colors['light_blue'], 'title', center=True) + + profile_names = list(self.profiles.keys()) + + if not profile_names: + # No profiles message + self.draw_panel(120, 100, 400, 150, self.colors['dark_gray'], self.colors['gray']) + self.draw_text("No profiles found", 320, 150, self.colors['yellow'], 'large', center=True) + self.draw_text("Create one first", 320, 180, + self.colors['light_gray'], 'medium', center=True) + + # Back button + self.draw_button("← Back", 270, 300, 100, 30, True) + else: + # Profile list panel + panel_height = min(280, len(profile_names) * 55 + 60) + self.draw_panel(30, 80, 580, panel_height, + self.colors['black'], self.colors['gray']) + + # Profile entries + for i, name in enumerate(profile_names): + profile = self.profiles[name] + + entry_y = 95 + i * 50 + entry_selected = (i == self.selected_index) + + # Profile entry background + entry_color = self.colors['blue'] if entry_selected else self.colors['dark_gray'] + border_color = self.colors['light_blue'] if entry_selected else self.colors['gray'] + self.draw_panel(40, entry_y, 560, 40, entry_color, border_color) + + # Profile name + name_color = self.colors['white'] if entry_selected else self.colors['light_gray'] + self.draw_text(name, 50, entry_y + 5, name_color, 'medium') + + # Profile stats (compact) + stats_text = f"Games: {profile.games_played} • Score: {profile.best_score}" + stats_color = self.colors['light_gray'] if entry_selected else self.colors['gray'] + self.draw_text(stats_text, 50, entry_y + 22, stats_color, 'tiny') + + # Active indicator + if name == self.active_profile: + self.draw_text("★", 580, entry_y + 12, + self.colors['light_green'], 'small') + + # Back button + back_y = 95 + len(profile_names) * 50 + 10 + back_selected = (self.selected_index == len(profile_names)) + self.draw_button("← Back", 270, back_y, 100, 30, back_selected) + + # Instructions + self.draw_panel(10, 420, 620, 40, self.colors['black'], self.colors['dark_gray']) + self.draw_text("Enter: Select • Escape: Back • Delete: Remove", + 320, 435, self.colors['light_gray'], 'tiny', center=True) + + def render_create_profile(self): + """Render profile creation screen with virtual keyboard""" + # Header + self.renderer.fill((0, 0, 640, 80), self.colors['dark_gray']) + self.draw_text("Create Profile", 320, 15, self.colors['light_blue'], 'title', center=True) + + # Input field + input_x, input_y = 120, 90 + input_width, input_height = 400, 30 + + input_bg = self.colors['white'] if self.input_active else self.colors['light_gray'] + input_border = self.colors['blue'] if self.input_active else self.colors['gray'] + self.draw_panel(input_x, input_y, input_width, input_height, input_bg, input_border, 2) + + # Input text + display_text = self.input_text if self.input_text else "Profile Name" + text_color = self.colors['black'] if self.input_text else self.colors['gray'] + self.draw_text(display_text, input_x + 10, input_y + 8, text_color, 'medium') + + if self.input_active: + # Virtual keyboard + self.render_virtual_keyboard() + else: + # Start input instruction + self.draw_text("Press Enter to start typing", 320, 150, + self.colors['yellow'], 'medium', center=True) + + # Back button + self.draw_button("← Back", 270, 200, 100, 30, True) + + # Instructions + if not self.input_active: + self.draw_panel(50, 400, 540, 60, self.colors['black'], self.colors['dark_gray']) + self.draw_text("Enter: Start Input • Escape: Back", 320, 420, + self.colors['light_gray'], 'small', center=True) + + def render_virtual_keyboard(self): + """Render the virtual keyboard""" + kb_start_x = 50 + kb_start_y = 150 + key_width = 45 + key_height = 30 + + for row_idx, row in enumerate(self.virtual_keyboard): + row_y = kb_start_y + row_idx * (key_height + 5) + + # Special handling for bottom row (commands) + if row_idx == len(self.virtual_keyboard) - 1: + # Bottom row with command keys + key_widths = [80, 80, 80, 80] # Wider keys for commands + x_offset = 140 # Center the bottom row + else: + key_widths = [key_width] * len(row) + x_offset = kb_start_x + + current_x = x_offset + for col_idx, char in enumerate(row): + selected = (row_idx == self.vk_cursor_y and col_idx == self.vk_cursor_x) + + # Key background + if selected: + self.draw_panel(current_x, row_y, key_widths[col_idx], key_height, + self.colors['blue'], self.colors['light_blue']) + text_color = self.colors['white'] + else: + self.draw_panel(current_x, row_y, key_widths[col_idx], key_height, + self.colors['dark_gray'], self.colors['gray']) + text_color = self.colors['light_gray'] + + # Key text + display_char = char + if char == ' bool: + """Validate device ID format""" + return device_id.startswith("DEV-") and len(device_id) == 12 + +def validate_user_id(user_id: str) -> bool: + """Validate user ID format""" + return len(user_id.strip()) > 0 and len(user_id) <= 50 + +def user_exists(conn, user_id: str, device_id: str) -> bool: + """Check if user exists in database""" + cursor = conn.cursor() + cursor.execute( + "SELECT 1 FROM users WHERE user_id = ? AND device_id = ?", + (user_id, device_id) + ) + return cursor.fetchone() is not None + +def user_id_unique_globally(conn, user_id: str) -> bool: + """Check if user_id is globally unique (across all devices)""" + cursor = conn.cursor() + cursor.execute("SELECT 1 FROM users WHERE user_id = ?", (user_id,)) + return cursor.fetchone() is None + + +# API Endpoints + +@app.get("/") +def read_root(): + """API root endpoint""" + return { + "message": "Mice Game Score API", + "version": "1.0.0", + "endpoints": [ + "GET /users/{device_id} - Get all users for device", + "POST /signup/{device_id}/{user_id} - Register new user", + "POST /score/{device_id}/{user_id} - Submit score" + ] + } + +@app.post("/signup/{device_id}/{user_id}") +def signup_user(device_id: str, user_id: str): + """ + Register a new user for a device + - device_id: Device identifier (format: DEV-XXXXXXXX) + - user_id: Unique user identifier + """ + # Validate inputs + if not validate_device_id(device_id): + raise HTTPException( + status_code=400, + detail="Invalid device_id format. Must be 'DEV-XXXXXXXX'" + ) + + if not validate_user_id(user_id): + raise HTTPException( + status_code=400, + detail="Invalid user_id. Must be 1-50 characters long" + ) + + conn = get_db_connection() + + try: + # Check if user_id is globally unique + if not user_id_unique_globally(conn, user_id): + raise HTTPException( + status_code=409, + detail=f"User ID '{user_id}' already exists. Choose a different user ID." + ) + + # Check if user already exists for this device + if user_exists(conn, user_id, device_id): + raise HTTPException( + status_code=409, + detail=f"User '{user_id}' already registered for device '{device_id}'" + ) + + # Register the user + cursor = conn.cursor() + now = datetime.now().isoformat() + + cursor.execute( + "INSERT INTO users (user_id, device_id, created_at, last_active) VALUES (?, ?, ?, ?)", + (user_id, device_id, now, now) + ) + + conn.commit() + + return { + "success": True, + "message": f"User '{user_id}' successfully registered for device '{device_id}'", + "user": { + "user_id": user_id, + "device_id": device_id, + "created_at": now + } + } + + except HTTPException: + raise + except Exception as e: + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + finally: + close_db_connection(conn) + +@app.post("/score/{device_id}/{user_id}") +def submit_score(device_id: str, user_id: str, score_data: Score): + """ + Submit a score for a registered user + - device_id: Device identifier + - user_id: User identifier + - score_data: Score information (score, game_completed) + """ + # Validate inputs + if not validate_device_id(device_id): + raise HTTPException( + status_code=400, + detail="Invalid device_id format. Must be 'DEV-XXXXXXXX'" + ) + + if not validate_user_id(user_id): + raise HTTPException( + status_code=400, + detail="Invalid user_id" + ) + + if score_data.score < 0: + raise HTTPException( + status_code=400, + detail="Score must be non-negative" + ) + + conn = get_db_connection() + + try: + # Check if user exists and is registered for this device + if not user_exists(conn, user_id, device_id): + raise HTTPException( + status_code=404, + detail=f"User '{user_id}' not registered for device '{device_id}'. Please signup first." + ) + + # Add the score + cursor = conn.cursor() + timestamp = datetime.now().isoformat() + + cursor.execute( + "INSERT INTO scores (user_id, device_id, score, game_completed, timestamp) VALUES (?, ?, ?, ?, ?)", + (user_id, device_id, score_data.score, score_data.game_completed, timestamp) + ) + + # Update user's last_active timestamp + cursor.execute( + "UPDATE users SET last_active = ? WHERE user_id = ? AND device_id = ?", + (timestamp, user_id, device_id) + ) + + conn.commit() + + # Get user's statistics + cursor.execute( + """ + SELECT + COUNT(*) as total_games, + MAX(score) as best_score, + AVG(score) as avg_score, + SUM(score) as total_score + FROM scores + WHERE user_id = ? AND device_id = ? + """, + (user_id, device_id) + ) + + stats = cursor.fetchone() + + return { + "success": True, + "message": f"Score {score_data.score} submitted successfully", + "score_id": cursor.lastrowid, + "user_stats": { + "user_id": user_id, + "device_id": device_id, + "total_games": stats["total_games"], + "best_score": stats["best_score"], + "average_score": round(stats["avg_score"], 2) if stats["avg_score"] else 0, + "total_score": stats["total_score"] + } + } + + except HTTPException: + raise + except Exception as e: + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + finally: + close_db_connection(conn) + +@app.get("/users/{device_id}") +def get_device_users(device_id: str) -> List[UserResponse]: + """ + Get all registered users for a specific device + - device_id: Device identifier + """ + # Validate device_id + if not validate_device_id(device_id): + raise HTTPException( + status_code=400, + detail="Invalid device_id format. Must be 'DEV-XXXXXXXX'" + ) + + conn = get_db_connection() + + try: + cursor = conn.cursor() + + # Get users with their statistics + cursor.execute( + """ + SELECT + u.user_id, + u.device_id, + u.created_at, + u.last_active, + COUNT(s.id) as total_scores, + COALESCE(MAX(s.score), 0) as best_score + FROM users u + LEFT JOIN scores s ON u.user_id = s.user_id AND u.device_id = s.device_id + WHERE u.device_id = ? + GROUP BY u.user_id, u.device_id, u.created_at, u.last_active + ORDER BY u.last_active DESC + """, + (device_id,) + ) + + users = cursor.fetchall() + + if not users: + return [] + + return [ + UserResponse( + user_id=user["user_id"], + device_id=user["device_id"], + created_at=user["created_at"], + last_active=user["last_active"], + total_scores=user["total_scores"], + best_score=user["best_score"] + ) + for user in users + ] + + except Exception as e: + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + finally: + close_db_connection(conn) + +# Additional useful endpoints + +@app.get("/scores/{device_id}/{user_id}") +def get_user_scores(device_id: str, user_id: str, limit: int = 10) -> List[ScoreResponse]: + """ + Get recent scores for a user + - device_id: Device identifier + - user_id: User identifier + - limit: Maximum number of scores to return (default: 10) + """ + if not validate_device_id(device_id) or not validate_user_id(user_id): + raise HTTPException(status_code=400, detail="Invalid device_id or user_id") + + if limit < 1 or limit > 100: + raise HTTPException(status_code=400, detail="Limit must be between 1 and 100") + + conn = get_db_connection() + + try: + # Check if user exists + if not user_exists(conn, user_id, device_id): + raise HTTPException( + status_code=404, + detail=f"User '{user_id}' not found for device '{device_id}'" + ) + + cursor = conn.cursor() + cursor.execute( + """ + SELECT id, user_id, device_id, score, game_completed, timestamp + FROM scores + WHERE user_id = ? AND device_id = ? + ORDER BY timestamp DESC + LIMIT ? + """, + (user_id, device_id, limit) + ) + + scores = cursor.fetchall() + + return [ + ScoreResponse( + id=score["id"], + user_id=score["user_id"], + device_id=score["device_id"], + score=score["score"], + game_completed=bool(score["game_completed"]), + timestamp=score["timestamp"] + ) + for score in scores + ] + + except HTTPException: + raise + except Exception as e: + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + finally: + close_db_connection(conn) + +@app.get("/leaderboard/{device_id}") +def get_device_leaderboard(device_id: str, limit: int = 10): + """ + Get leaderboard for a device (top scores) + - device_id: Device identifier + - limit: Maximum number of entries to return (default: 10) + """ + if not validate_device_id(device_id): + raise HTTPException(status_code=400, detail="Invalid device_id") + + if limit < 1 or limit > 100: + raise HTTPException(status_code=400, detail="Limit must be between 1 and 100") + + conn = get_db_connection() + + try: + cursor = conn.cursor() + cursor.execute( + """ + SELECT + user_id, + MAX(score) as best_score, + COUNT(*) as total_games, + MAX(timestamp) as last_play + FROM scores + WHERE device_id = ? + GROUP BY user_id + ORDER BY best_score DESC, last_play DESC + LIMIT ? + """, + (device_id, limit) + ) + + leaderboard = cursor.fetchall() + + return [ + { + "rank": idx + 1, + "user_id": entry["user_id"], + "best_score": entry["best_score"], + "total_games": entry["total_games"], + "last_play": entry["last_play"] + } + for idx, entry in enumerate(leaderboard) + ] + + except Exception as e: + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + finally: + close_db_connection(conn) + + +@app.get("/leaderboard/global/top") +def get_global_leaderboard(limit: int = 10): + """ + Get global leaderboard across all devices (absolute top scores) + - limit: Maximum number of entries to return (default: 10) + """ + if limit < 1 or limit > 100: + raise HTTPException(status_code=400, detail="Limit must be between 1 and 100") + + conn = get_db_connection() + + try: + cursor = conn.cursor() + cursor.execute( + """ + SELECT + user_id, + device_id, + MAX(score) as best_score, + COUNT(*) as total_games, + MAX(timestamp) as last_play + FROM scores + GROUP BY user_id, device_id + ORDER BY best_score DESC, last_play DESC + LIMIT ? + """, + (limit,) + ) + + leaderboard = cursor.fetchall() + + return [ + { + "rank": idx + 1, + "user_id": entry["user_id"], + "device_id": entry["device_id"], + "best_score": entry["best_score"], + "total_games": entry["total_games"], + "last_play": entry["last_play"] + } + for idx, entry in enumerate(leaderboard) + ] + + except Exception as e: + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + finally: + close_db_connection(conn) + + +if __name__ == "__main__": + import uvicorn + + print("Starting Mice Game Score API...") + print("Available endpoints:") + print(" POST /signup/{device_id}/{user_id} - Register new user") + print(" POST /score/{device_id}/{user_id} - Submit score") + print(" GET /users/{device_id} - Get all users for device") + print(" GET /scores/{device_id}/{user_id} - Get user scores") + print(" GET /leaderboard/{device_id} - Get device leaderboard") + print() + + # Initialize database + init_database() + + uvicorn.run(app, host="0.0.0.0", port=8000) diff --git a/score_api_client.py b/score_api_client.py new file mode 100644 index 0000000..4aca071 --- /dev/null +++ b/score_api_client.py @@ -0,0 +1,307 @@ +#!/usr/bin/env python3 +""" +Score API Client for Mice Game +Client module to integrate with the FastAPI score server +""" + +import requests +import json +from typing import Optional, List, Dict, Any +import time + + +class ScoreAPIClient: + """Client for communicating with the Mice Game Score API""" + + def __init__(self, api_base_url: str = "http://localhost:8000", timeout: int = 5): + """ + Initialize the API client + + Args: + api_base_url: Base URL of the API server + timeout: Request timeout in seconds + """ + self.api_base_url = api_base_url.rstrip('/') + self.timeout = timeout + + def _make_request(self, method: str, endpoint: str, data: Optional[Dict] = None) -> Optional[Dict[str, Any]]: + """ + Make HTTP request to API + + Args: + method: HTTP method (GET, POST, etc.) + endpoint: API endpoint + data: Request data for POST requests + + Returns: + Response JSON or None if error + """ + url = f"{self.api_base_url}{endpoint}" + + try: + if method.upper() == "GET": + response = requests.get(url, timeout=self.timeout) + elif method.upper() == "POST": + response = requests.post(url, json=data, timeout=self.timeout) + else: + raise ValueError(f"Unsupported HTTP method: {method}") + + if response.status_code == 200: + return response.json() + elif response.status_code in [400, 404, 409]: + # Client errors - return the error details + return {"error": True, "status": response.status_code, "detail": response.json()} + else: + return {"error": True, "status": response.status_code, "detail": "Server error"} + + except requests.exceptions.ConnectionError: + return {"error": True, "detail": "Could not connect to score server"} + except requests.exceptions.Timeout: + return {"error": True, "detail": "Request timeout"} + except Exception as e: + return {"error": True, "detail": str(e)} + + def signup_user(self, device_id: str, user_id: str) -> Dict[str, Any]: + """ + Register a new user + + Args: + device_id: Device identifier + user_id: User identifier + + Returns: + Response dictionary with success/error status + """ + endpoint = f"/signup/{device_id}/{user_id}" + response = self._make_request("POST", endpoint) + + if response is None: + return {"success": False, "message": "Failed to connect to server"} + + if response.get("error"): + return {"success": False, "message": response.get("detail", "Unknown error")} + + return response + + def submit_score(self, device_id: str, user_id: str, score: int, game_completed: bool = True) -> Dict[str, Any]: + """ + Submit a score for a user + + Args: + device_id: Device identifier + user_id: User identifier + score: Game score + game_completed: Whether the game was completed + + Returns: + Response dictionary with success/error status + """ + endpoint = f"/score/{device_id}/{user_id}" + data = { + "user_id": user_id, + "device_id": device_id, + "score": score, + "game_completed": game_completed + } + + response = self._make_request("POST", endpoint, data) + + if response is None: + return {"success": False, "message": "Failed to connect to server"} + + if response.get("error"): + return {"success": False, "message": response.get("detail", "Unknown error")} + + return response + + def get_device_users(self, device_id: str) -> List[Dict[str, Any]]: + """ + Get all users registered for a device + + Args: + device_id: Device identifier + + Returns: + List of user dictionaries + """ + endpoint = f"/users/{device_id}" + response = self._make_request("GET", endpoint) + + if response is None: + return [] + + # Check if it's an error response (dict with error field) or success (list) + if isinstance(response, dict) and response.get("error"): + return [] + + # If it's a list (successful response), return it + if isinstance(response, list): + return response + + return [] + + def get_user_scores(self, device_id: str, user_id: str, limit: int = 10) -> List[Dict[str, Any]]: + """ + Get recent scores for a user + + Args: + device_id: Device identifier + user_id: User identifier + limit: Maximum number of scores to return + + Returns: + List of score dictionaries + """ + endpoint = f"/scores/{device_id}/{user_id}?limit={limit}" + response = self._make_request("GET", endpoint) + + if response is None: + return [] + + # Check if it's an error response (dict with error field) or success (list) + if isinstance(response, dict) and response.get("error"): + return [] + + # If it's a list (successful response), return it + if isinstance(response, list): + return response + + return [] + + def get_leaderboard(self, device_id: str, limit: int = 10) -> List[Dict[str, Any]]: + """ + Get leaderboard for a device + + Args: + device_id: Device identifier + limit: Maximum number of entries to return + + Returns: + List of leaderboard entries + """ + endpoint = f"/leaderboard/{device_id}?limit={limit}" + response = self._make_request("GET", endpoint) + + if response is None: + return [] + + # Check if it's an error response (dict with error field) or success (list) + if isinstance(response, dict) and response.get("error"): + return [] + + # If it's a list (successful response), return it + if isinstance(response, list): + return response + + return [] + + def get_global_leaderboard(self, limit: int = 10) -> List[Dict[str, Any]]: + """ + Get global leaderboard across all devices + + Args: + limit: Maximum number of entries to return + + Returns: + List of global leaderboard entries + """ + endpoint = f"/leaderboard/global/top?limit={limit}" + response = self._make_request("GET", endpoint) + + if response is None: + return [] + + # Check if it's an error response (dict with error field) or success (list) + if isinstance(response, dict) and response.get("error"): + return [] + + # If it's a list (successful response), return it + if isinstance(response, list): + return response + + return [] + + def is_server_available(self) -> bool: + """ + Check if the API server is available + + Returns: + True if server is reachable, False otherwise + """ + response = self._make_request("GET", "/") + return response is not None and not response.get("error") + + def user_exists(self, device_id: str, user_id: str) -> bool: + """ + Check if a user is registered for a device + + Args: + device_id: Device identifier + user_id: User identifier + + Returns: + True if user exists, False otherwise + """ + users = self.get_device_users(device_id) + return any(user["user_id"] == user_id for user in users) + + +# Convenience functions for easy integration +def create_api_client(api_url: str = "http://localhost:8000") -> ScoreAPIClient: + """Create and return an API client instance""" + return ScoreAPIClient(api_url) + +def test_connection(api_url: str = "http://localhost:8000") -> bool: + """Test if the API server is available""" + client = ScoreAPIClient(api_url) + return client.is_server_available() + + +# Example usage and testing +if __name__ == "__main__": + # Example usage + print("Testing Score API Client...") + + # Create client + client = ScoreAPIClient() + + # Test server connection + if not client.is_server_available(): + print("ERROR: API server is not available. Start it with: python score_api.py") + exit(1) + + print("API server is available!") + + # Example device and user + device_id = "DEV-CLIENT01" + user_id = "ClientTestUser" + + # Test user signup + print(f"\nTesting user signup: {user_id}") + result = client.signup_user(device_id, user_id) + print(f"Signup result: {result}") + + # Test score submission + print(f"\nTesting score submission...") + result = client.submit_score(device_id, user_id, 1750, True) + print(f"Score submission result: {result}") + + # Test getting users + print(f"\nGetting users for device {device_id}:") + users = client.get_device_users(device_id) + for user in users: + print(f" User: {user['user_id']}, Best Score: {user['best_score']}") + + # Test getting user scores + print(f"\nGetting scores for {user_id}:") + scores = client.get_user_scores(device_id, user_id) + for score in scores: + print(f" Score: {score['score']}, Time: {score['timestamp']}") + + # Test leaderboard + print(f"\nLeaderboard for device {device_id}:") + leaderboard = client.get_leaderboard(device_id) + for entry in leaderboard: + print(f" Rank {entry['rank']}: {entry['user_id']} - {entry['best_score']} pts") + + print("\nClient testing completed!") diff --git a/simple_profile_demo.py b/simple_profile_demo.py new file mode 100644 index 0000000..7773cec --- /dev/null +++ b/simple_profile_demo.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +""" +Simple Profile Manager with API Integration Demo +""" + +import json +from user_profile_integration import UserProfileIntegration + +def main(): + print("=== Profile Manager with API Integration ===") + + # Initialize the integration + integration = UserProfileIntegration() + + print(f"\\nDevice ID: {integration.get_device_id()}") + print(f"Active Profile: {integration.get_profile_name()}") + print(f"API Server: {'Connected' if integration.api_enabled else 'Offline'}") + + while True: + print("\\n=== MAIN MENU ===") + print("1. Show Profile Info") + print("2. View Online Leaderboard") + print("3. View All Device Users") + print("4. Submit Test Score") + print("5. Create New Profile") + print("6. Exit") + + try: + choice = input("\\nSelect option (1-6): ").strip() + + if choice == "1": + # Show profile info + info = integration.get_profile_info() + if info: + print(f"\\n=== PROFILE INFO ===") + for key, value in info.items(): + print(f"{key.replace('_', ' ').title()}: {value}") + else: + print("No active profile loaded") + + elif choice == "2": + # Show leaderboard + if not integration.api_enabled: + print("API server not available") + continue + + print(f"\\n=== LEADERBOARD ===") + leaderboard = integration.get_device_leaderboard(10) + if leaderboard: + for entry in leaderboard: + print(f"{entry['rank']}. {entry['user_id']}: {entry['best_score']} pts ({entry['total_games']} games)") + else: + print("No scores recorded yet") + + elif choice == "3": + # Show all users + if not integration.api_enabled: + print("API server not available") + continue + + print(f"\\n=== DEVICE USERS ===") + users = integration.get_all_device_users() + if users: + for user in users: + print(f"{user['user_id']}: Best {user['best_score']}, {user['total_scores']} games") + else: + print("No users registered yet") + + elif choice == "4": + # Submit test score + if not integration.current_profile: + print("No active profile to submit score for") + continue + + try: + score = int(input("Enter test score: ")) + result = integration.update_game_stats(score, True) + if result: + print(f"Score {score} submitted successfully!") + else: + print("Failed to submit score") + except ValueError: + print("Invalid score entered") + + elif choice == "5": + # Create new profile - simplified for demo + name = input("Enter new profile name: ").strip() + if not name: + print("Name cannot be empty") + continue + + success = integration.register_new_user(name) + if success or not integration.api_enabled: + print(f"Profile '{name}' created successfully!") + else: + print("Failed to create profile") + + elif choice == "6": + print("Goodbye!") + break + + else: + print("Invalid choice") + + except KeyboardInterrupt: + print("\\nGoodbye!") + break + except Exception as e: + print(f"Error: {e}") + +if __name__ == "__main__": + main() diff --git a/test_score_api.py b/test_score_api.py new file mode 100644 index 0000000..2399131 --- /dev/null +++ b/test_score_api.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +""" +Test script for Mice Game Score API +""" + +import requests +import json +import time + +API_BASE_URL = "http://localhost:8000" + +def test_api(): + """Test all API endpoints""" + print("Testing Mice Game Score API...") + print("=" * 50) + + # Test device and user IDs + device_id = "DEV-TEST001" + user1 = "TestUser1" + user2 = "TestUser2" + + try: + # 1. Test root endpoint + print("\n1. Testing root endpoint:") + response = requests.get(f"{API_BASE_URL}/") + print(f"Status: {response.status_code}") + print(f"Response: {response.json()}") + + # 2. Test user signup + print(f"\n2. Testing user signup for {user1}:") + response = requests.post(f"{API_BASE_URL}/signup/{device_id}/{user1}") + print(f"Status: {response.status_code}") + print(f"Response: {response.json()}") + + print(f"\n3. Testing user signup for {user2}:") + response = requests.post(f"{API_BASE_URL}/signup/{device_id}/{user2}") + print(f"Status: {response.status_code}") + print(f"Response: {response.json()}") + + # 4. Test duplicate signup (should fail) + print(f"\n4. Testing duplicate signup for {user1} (should fail):") + response = requests.post(f"{API_BASE_URL}/signup/{device_id}/{user1}") + print(f"Status: {response.status_code}") + print(f"Response: {response.json()}") + + # 5. Test getting users for device + print(f"\n5. Testing get users for device {device_id}:") + response = requests.get(f"{API_BASE_URL}/users/{device_id}") + print(f"Status: {response.status_code}") + print(f"Response: {response.json()}") + + # 6. Test score submission + print(f"\n6. Testing score submission for {user1}:") + score_data = { + "user_id": user1, + "device_id": device_id, + "score": 1500, + "game_completed": True + } + response = requests.post( + f"{API_BASE_URL}/score/{device_id}/{user1}", + json=score_data + ) + print(f"Status: {response.status_code}") + print(f"Response: {response.json()}") + + # 7. Test more score submissions + scores_to_test = [ + (user1, 2000, True), + (user1, 1200, False), + (user2, 1800, True), + (user2, 2500, True) + ] + + print(f"\n7. Testing multiple score submissions:") + for user, score, completed in scores_to_test: + score_data = { + "user_id": user, + "device_id": device_id, + "score": score, + "game_completed": completed + } + response = requests.post( + f"{API_BASE_URL}/score/{device_id}/{user}", + json=score_data + ) + print(f" {user} - Score: {score}, Completed: {completed} -> Status: {response.status_code}") + time.sleep(0.1) # Small delay between requests + + # 8. Test score submission for non-registered user (should fail) + print(f"\n8. Testing score submission for non-registered user (should fail):") + score_data = { + "user_id": "NonExistentUser", + "device_id": device_id, + "score": 1000, + "game_completed": True + } + response = requests.post( + f"{API_BASE_URL}/score/{device_id}/NonExistentUser", + json=score_data + ) + print(f"Status: {response.status_code}") + print(f"Response: {response.json()}") + + # 9. Test getting user scores + print(f"\n9. Testing get scores for {user1}:") + response = requests.get(f"{API_BASE_URL}/scores/{device_id}/{user1}") + print(f"Status: {response.status_code}") + scores = response.json() + print(f"Number of scores: {len(scores)}") + for score in scores: + print(f" Score: {score['score']}, Completed: {score['game_completed']}, Time: {score['timestamp']}") + + # 10. Test leaderboard + print(f"\n10. Testing leaderboard for device {device_id}:") + response = requests.get(f"{API_BASE_URL}/leaderboard/{device_id}") + print(f"Status: {response.status_code}") + leaderboard = response.json() + print("Leaderboard:") + for entry in leaderboard: + print(f" Rank {entry['rank']}: {entry['user_id']} - Best Score: {entry['best_score']} ({entry['total_games']} games)") + + # 11. Test final user list + print(f"\n11. Final user list for device {device_id}:") + response = requests.get(f"{API_BASE_URL}/users/{device_id}") + users = response.json() + for user in users: + print(f" {user['user_id']}: Best Score: {user['best_score']}, Total Games: {user['total_scores']}") + + print("\n" + "=" * 50) + print("API Testing completed successfully!") + + except requests.exceptions.ConnectionError: + print("ERROR: Could not connect to API server.") + print("Make sure the API server is running with: python score_api.py") + except Exception as e: + print(f"ERROR: {e}") + +if __name__ == "__main__": + test_api() diff --git a/units/__pycache__/rat.cpython-313.pyc b/units/__pycache__/rat.cpython-313.pyc index ea9145d5f853b8f8eff6798c814dc4039cf98d50..01d170aceb03b9c3eb5e5909d71103a09baa051d 100644 GIT binary patch delta 603 zcma)&&r4KM6vyvaA2$?r6Nb*>*o zZiL&7TN-($ogV3jYtH9$(#K4yAWL|kD$3h9Nj1w-*nGj(DCu&uYK}f4&_rRG+7S+dNJvjS+3R2zC%Cv{C|fPF0WuD v=S4VdSAmcDTxZuZ>#K|gMr~C#tcxJU0zcq;q;Gn5d~RyuTJRP>a%2AhtO1rh delta 590 zcmZ4GchHabGcPX}0}$N2u{6VPBkxb%$x2+plV|gaPu>HhkMfF5j^yK=d{A5rh=nKj z^BGSr;}V&CjZcM9Z1QhDSs*FNp9_@Jn!HIscrw2LC+jW-hEV3o2gJ3ZBK(ts1caG@ zLV*GzJXR4542h~h6%0W#lmBx{PtFryW0ar#TR;&=`U*%u)lEJsAjqgV`MQ8IqcTv^ zl2K@~si2McEz#1v%#!$m{Nl`#%>2CK_@vad{G!y!g@WFUVUza?o|Z7VC~9(D)Z(J3 z#SW4EvO8r@FkKe)zQW> ele) & 0xff) + for ele in range(0,8*6,8)][::-1]) + system_info += f"-{mac}" + except: + pass + + # Create hash and take first 8 characters + device_hash = hashlib.md5(system_info.encode()).hexdigest()[:8].upper() + return f"DEV-{device_hash}" + + def load_active_profile(self): + """Load the currently active profile""" + try: + with open(self.profiles_file, 'r') as f: + data = json.load(f) + active_name = data.get('active_profile') + if active_name and active_name in data['profiles']: + self.current_profile = data['profiles'][active_name] + print(f"Loaded profile: {self.current_profile['name']}") + + # Sync with API if available + if self.api_enabled: + self.sync_profile_with_api() + + return True + except (FileNotFoundError, json.JSONDecodeError) as e: + print(f"Could not load profile: {e}") + + self.current_profile = None + return False + + def get_profile_name(self): + """Get current profile name or default""" + return self.current_profile['name'] if self.current_profile else "Guest Player" + + def get_device_id(self): + """Get the unique device identifier""" + return self.device_id + + def get_setting(self, setting_name, default_value=None): + """Get a setting from the current profile, or return default""" + if self.current_profile and 'settings' in self.current_profile: + return self.current_profile['settings'].get(setting_name, default_value) + return default_value + + def sync_profile_with_api(self): + """Ensure current profile is registered with the API server""" + if not self.current_profile or not self.api_enabled: + return False + + profile_name = self.current_profile['name'] + + # Check if user exists on server + if not self.api_client.user_exists(self.device_id, profile_name): + print(f"Registering {profile_name} with score server...") + result = self.api_client.signup_user(self.device_id, profile_name) + if result.get('success'): + print(f"✓ {profile_name} registered successfully") + return True + else: + print(f"✗ Failed to register {profile_name}: {result.get('message')}") + return False + else: + print(f"✓ {profile_name} already registered on server") + return True + + def register_new_user(self, user_id): + """Register a new user both locally and on the API server""" + if not self.api_enabled: + print("API server not available - user will only be registered locally") + return True + + result = self.api_client.signup_user(self.device_id, user_id) + if result.get('success'): + print(f"✓ {user_id} registered with server successfully") + return True + else: + print(f"✗ Failed to register {user_id} with server: {result.get('message')}") + return False + + def update_game_stats(self, score, completed=True): + """Update the current profile's game statistics""" + if not self.current_profile: + print("No profile loaded - stats not saved") + return False + + # Submit score to API first if available + if self.api_enabled: + profile_name = self.current_profile['name'] + result = self.api_client.submit_score( + self.device_id, + profile_name, + score, + completed + ) + if result.get('success'): + print(f"✓ Score {score} submitted to server successfully") + # Print server stats if available + if 'user_stats' in result: + stats = result['user_stats'] + print(f" Server stats - Games: {stats['total_games']}, Best: {stats['best_score']}") + else: + print(f"✗ Failed to submit score to server: {result.get('message')}") + + try: + # Update local profile + with open(self.profiles_file, 'r') as f: + data = json.load(f) + + profile_name = self.current_profile['name'] + if profile_name in data['profiles']: + profile = data['profiles'][profile_name] + + # Update statistics + if completed: + profile['games_played'] += 1 + print(f"Game completed for {profile_name}! Total games: {profile['games_played']}") + + profile['total_score'] += score + if score > profile['best_score']: + profile['best_score'] = score + print(f"New best score for {profile_name}: {score}!") + + profile['last_played'] = datetime.now().isoformat() + + # Update our local copy + self.current_profile = profile + + # Save back to file + with open(self.profiles_file, 'w') as f: + json.dump(data, f, indent=2) + + print(f"Local profile stats updated: Score +{score}, Total: {profile['total_score']}") + return True + + except Exception as e: + print(f"Error updating profile stats: {e}") + + return False + + def add_achievement(self, achievement_id): + """Add an achievement to the current profile""" + if not self.current_profile: + return False + + try: + with open(self.profiles_file, 'r') as f: + data = json.load(f) + + profile_name = self.current_profile['name'] + if profile_name in data['profiles']: + profile = data['profiles'][profile_name] + + if achievement_id not in profile['achievements']: + profile['achievements'].append(achievement_id) + self.current_profile = profile + + with open(self.profiles_file, 'w') as f: + json.dump(data, f, indent=2) + + print(f"Achievement unlocked for {profile_name}: {achievement_id}") + return True + + except Exception as e: + print(f"Error adding achievement: {e}") + + return False + + def get_profile_info(self): + """Get current profile information for display""" + if self.current_profile: + info = { + 'name': self.current_profile['name'], + 'games_played': self.current_profile['games_played'], + 'best_score': self.current_profile['best_score'], + 'total_score': self.current_profile['total_score'], + 'achievements': len(self.current_profile['achievements']), + 'difficulty': self.current_profile['settings'].get('difficulty', 'normal'), + 'device_id': self.device_id, + 'api_connected': self.api_enabled + } + return info + return None + + def get_device_leaderboard(self, limit=10): + """Get leaderboard for the current device from API server""" + if not self.api_enabled: + print("API server not available - cannot get leaderboard") + return [] + + leaderboard = self.api_client.get_leaderboard(self.device_id, limit) + return leaderboard + + def get_global_leaderboard(self, limit=10): + """Get global leaderboard across all devices from API server""" + if not self.api_enabled: + print("API server not available - cannot get global leaderboard") + return [] + + leaderboard = self.api_client.get_global_leaderboard(limit) + return leaderboard + + def get_all_device_users(self): + """Get all users registered for this device from API server""" + if not self.api_enabled: + print("API server not available - cannot get user list") + return [] + + users = self.api_client.get_device_users(self.device_id) + return users + + def get_user_server_scores(self, user_id=None, limit=10): + """Get recent scores from server for a user (defaults to current profile)""" + if not self.api_enabled: + return [] + + if user_id is None: + if not self.current_profile: + return [] + user_id = self.current_profile['name'] + + scores = self.api_client.get_user_scores(self.device_id, user_id, limit) + return scores + + def reload_profile(self): + """Reload the current profile from disk (useful for external profile changes)""" + return self.load_active_profile() + + +# Convenience functions for quick integration +def get_active_profile(): + """Quick function to get active profile info""" + integration = UserProfileIntegration() + return integration.get_profile_info() + +def update_profile_score(score, completed=True): + """Quick function to update profile score""" + integration = UserProfileIntegration() + return integration.update_game_stats(score, completed) + +def get_profile_setting(setting_name, default_value=None): + """Quick function to get a profile setting""" + integration = UserProfileIntegration() + return integration.get_setting(setting_name, default_value) + +def get_device_leaderboard(limit=10): + """Quick function to get device leaderboard""" + integration = UserProfileIntegration() + return integration.get_device_leaderboard(limit) + +def get_global_leaderboard(limit=10): + """Quick function to get global leaderboard""" + integration = UserProfileIntegration() + return integration.get_global_leaderboard(limit) + + +if __name__ == "__main__": + # Test the integration + print("Testing User Profile Integration with API...") + + integration = UserProfileIntegration() + print(f"Device ID: {integration.get_device_id()}") + print(f"Profile Name: {integration.get_profile_name()}") + print(f"API Connected: {integration.api_enabled}") + + info = integration.get_profile_info() + if info: + print(f"Profile Info: {info}") + else: + print("No profile loaded") + + # Test settings + difficulty = integration.get_setting('difficulty', 'normal') + sound_volume = integration.get_setting('sound_volume', 50) + print(f"Settings - Difficulty: {difficulty}, Sound: {sound_volume}%") + + # Test API features if connected + if integration.api_enabled: + print("\nTesting API features...") + + # Get leaderboard + leaderboard = integration.get_device_leaderboard(5) + if leaderboard: + print("Device Leaderboard:") + for entry in leaderboard: + print(f" {entry['rank']}. {entry['user_id']}: {entry['best_score']} pts ({entry['total_games']} games)") + else: + print("No leaderboard data available") + + # Get all users + users = integration.get_all_device_users() + print(f"\nTotal users on device: {len(users)}") + for user in users: + print(f" {user['user_id']}: Best {user['best_score']}, {user['total_scores']} games") + + # Test score submission + if integration.current_profile: + print(f"\nTesting score submission for {integration.current_profile['name']}...") + result = integration.update_game_stats(1234, True) + print(f"Score update result: {result}") + else: + print("API features not available - server offline") diff --git a/user_profiles.json b/user_profiles.json new file mode 100644 index 0000000..9c75de1 --- /dev/null +++ b/user_profiles.json @@ -0,0 +1,64 @@ +{ + "profiles": { + "Player1": { + "name": "Player1", + "created_date": "2024-01-15T10:30:00", + "last_played": "2024-01-20T14:45:00", + "games_played": 25, + "total_score": 15420, + "best_score": 980, + "settings": { + "difficulty": "normal", + "sound_volume": 75, + "music_volume": 60, + "screen_shake": true, + "auto_save": true + }, + "achievements": [ + "first_win", + "score_500", + "games_played_10" + ] + }, + "Alice": { + "name": "Alice", + "created_date": "2024-01-10T09:15:00", + "last_played": "2025-08-21T13:00:29.825909", + "games_played": 43, + "total_score": 33000, + "best_score": 1250, + "settings": { + "difficulty": "hard", + "sound_volume": 50, + "music_volume": 80, + "screen_shake": false, + "auto_save": true + }, + "achievements": [ + "first_win", + "score_500", + "score_1000", + "games_played_10", + "games_played_25", + "hard_mode_master" + ] + }, + "MAT": { + "name": "MAT", + "created_date": "2025-08-21T13:24:53.489189", + "last_played": "2025-08-21T16:43:50.615171", + "games_played": 2, + "total_score": 1234, + "best_score": 1234, + "settings": { + "difficulty": "normal", + "sound_volume": 50, + "music_volume": 50, + "screen_shake": true, + "auto_save": true + }, + "achievements": [] + } + }, + "active_profile": "MAT" +} \ No newline at end of file