Skip to content

v2.15

Latest

Choose a tag to compare

@Privex-chat Privex-chat released this 21 Apr 05:33
· 6 commits to main since this release

VRY-UI Comprehensive Update — Change Log

1. Constants Audit (src/constants.py)

  • Added "valaram": "All Random One Site" to gamemodes dict
  • Updated AGENTCOLORLIST RGB values for: breach, brimstone, cypher, chamber, raze, sage, sova, neon, viper, yoru, gekko, vyse, iso, clove; added veto, waylay, miks
  • Fixed typo "As 3" → "Asc 3" in NUMBERTORANKS
  • Added "Bandit" to WEAPONS list (after "Ghost")
  • Added to DEFAULT_CONFIG["flags"]: "short_ranks": false, "truncate_skins": true, "truncate_names": true

2. API Sync Summary

src/requestsV.py

  • Local fetch: replaced infinite while True with bounded retry (max_retries=15, timeout=5, time.sleep(5) on failure)
  • Avoids infinite hang when VALORANT is not running

src/presences.py

  • get_presence(): returns [] on None response instead of crashing
  • get_game_state(): handles both matchPresenceData (current nested API) and flat sessionLoopState (deprecated fallback)
  • get_private_presence(): filters out League of Legends presences; returns None on empty private field or decode error

src/rpc.py

  • Added close() method: safely closes Discord RPC connection; was called by main.py and websocket.py but not implemented

src/rank.py

  • Initialises r = {} before try block, eliminating NameError in exception branches
  • All post-try r accesses use safe .get() chaining
  • "N/a" → "N/A" for consistency
  • WR calculation uses safe intermediate variable; handles ZeroDivisionError for 0-game seasons

src/player_stats.py

  • Full rewrite: match_details_cache dict caches /match-details per match_id for the runtime session (avoids duplicate fetches when multiple players share a match)
  • clear_runtime_cache(): called on MENUS state transition
  • _default_stats(): single source of "N/A" defaults
  • _process_match_data(): all dict access via .get() with defaults

src/colors.py

  • get_rgb_color_from_skin(): wrapped in try/except; safe .get() for contentTierUuid
  • get_agent_from_uuid(): uses agent_dict.get(agentUUID, "Unknown")
  • "N/a" → "N/A" in both gradient functions

3. Incognito Name Resolution (src/names.py)

When VALORANT returns an empty GameName (player in streamer/incognito mode), the client falls back to scraping https://vtl.lol/id/{puuid}:

  • 3 second timeout; User-Agent header to avoid bot-block
  • Parses <title> tag: strips site suffix (| vtl.lol, – vtl.lol)
  • Validates candidate: must contain # and be longer than 2 characters
  • Per-session cache (_incognito_cache) with 1-hour TTL; stores None for failed lookups to prevent retry storms
  • clear_incognito_cache(): called on MENUS transition
  • Fallback display (main.py): when name is empty (vtl.lol also failed), the Name cell shows the agent name in italic gray instead of a confusing blank; when vtl.lol resolved the name and privacy is off, shows the real name prefixed with *

4. Performance Delta

  • PlayerStats.match_details_cache: prevents O(n) duplicate /match-details fetches per lobby
  • Rank.requestMap: already present — now also cleared on MENUS transition alongside player_cache
  • pstats.clear_runtime_cache() + namesClass.clear_incognito_cache() wired into MENUS state transition in VRYWorkerThread._wait_for_state_change()
  • VRYTableWidget.setSortingEnabled(False) during inserts prevents re-sort overhead
  • Allies-first player ordering in INGAME: avoids relying on API order

5. New UI Features (main.py)

Table Enhancements

  • K/D color coding: <0.8 dark red · 0.8–1.2 light gray · ≥1.2 green · ≥2.0 gold
  • HS% color coding: <20% dark red · 20–30% yellow · ≥30% green
  • WR% color coding: <45% dark red · 45–55% light gray · >55% green
  • Leaderboard: #N prefix, gold QColor(255,215,0); empty string when 0
  • Row background tinting: ally rows QColor(0,60,20,50) (green) · enemy rows QColor(80,0,0,50) (red)
  • Self-row bold: QFont.Weight.Bold on all cells of the local player's row
  • Team separator: 4px gray row inserted before the first enemy row in INGAME

Right-click Context Menu

  • Copy Name (if available)
  • Copy PUUID
  • Open on vtl.lol (opens/creates VTL tab, navigates to https://vtl.lol/id/{puuid})
  • Open on tracker.gg (only shown when Name#Tag format available)
  • PUUID stored in Qt.ItemDataRole.UserRole on column 0 for lookup

Keyboard Shortcuts

  • Ctrl+F — toggle Freeze Table
  • Ctrl+R — Refresh Data
  • Ctrl+T — Cycle theme
  • Ctrl+, — Open Settings
  • Ctrl+Q — Exit

Settings Dialog (File → Settings...)

  • Weapon selector (QComboBox from WEAPONS list)
  • Cooldown spinner
  • WebSocket port spinner (restart warning label)
  • Feature flags grid (8 checkboxes)
  • Table columns grid (10 checkboxes)
  • Writes directly to config.json on Save

Compact Mode (View → Compact Mode)

  • Row height 18px (compact) vs 30px (normal)
  • State persisted in QSettings; restored on launch

Animated Polling Dot

  • Green ● blinks at 1Hz while worker is running
  • Stops blinking (dim) when table is frozen

Status Pill

  • Rounded pill label with border-radius: 6px
  • Shows "Waiting for VALORANT..." while initial presence is pending
  • Includes ⚔/🛡 indicator for starting side in PREGAME

Console Tab Improvements

  • Verbosity selector (Quiet / Normal / Debug) — live-updates worker.verbose_level
  • "Clear" and "Copy All" buttons
  • 1000-line rolling buffer (oldest lines removed automatically)
  • Auto-scroll follows new output; pauses when user scrolls up; resumes at bottom

Worker Watchdog

  • QTimer checks every 30s; if no status_signal for >120s while worker is running, logs a warning to the console and resets the timer

Window Position Persistence

  • saveGeometry() / restoreGeometry() via QSettings on close/open

6. Breaking Changes

None. Config schema is additive: new flags.short_ranks, flags.truncate_skins, flags.truncate_names keys default to sensible values if absent.

7. Known Limitations

  • vtl.lol scraping: depends on vtl.lol's HTML structure remaining stable. If the site changes its <title> format, resolution will silently fail and names will fall back to the agent-name display.
  • match_details_cache: cleared only on MENUS transition, not on process restart. If the user closes and re-opens mid-game the cache starts empty.
  • Compact mode QSettings: restored correctly on launch but the menu checkmark state is not reflected until the user opens the View menu.
  • QWebEngineView / vtl.lol tab: some enterprise or locked-down machines may block WebEngine from loading external URLs; the tab will show a blank page.