Changes since tag 0.5.3

commit 9e74215c84581da6aaf821a6d0676d8849e51c5e
Author: FloMoit <kororo@free.fr>
Date:   Sun Apr 5 23:44:47 2026 +0200

    fix: forward-declare HandlePing/HandlePong so OnChatMsgAddon can call them
    
    HandlePing and HandlePong were defined in the Setup Window section, which
    appears after OnChatMsgAddon in the file. In Lua 5.1, references inside a
    function are resolved at compile time: since the locals hadn't been declared
    yet when OnChatMsgAddon was compiled, Lua resolved them as globals (_G).
    Those globals are nil, causing a silent error on every KVPING/KVPONG event.
    
    Fix: add HandlePing and HandlePong to the existing forward-declaration line,
    and assign them with `= function` instead of `local function` so the upvalue
    captured by OnChatMsgAddon gets the correct function when it's called.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

commit 31a15ad999e41a0d2d28b50b8c78ebd2c2cbae94
Author: FloMoit <kororo@free.fr>
Date:   Sun Apr 5 21:55:41 2026 +0200

    feat: add vote setup window with KVPING/KVPONG discovery
    
    Opens an intermediary setup window when /fuloh vote is used instead of
    starting immediately. Shows party keystones and addon-installed players
    gathered via KVPING/KVPONG before the initiator clicks Start Vote.
    
    - Constants: OPCODE_PING/PONG, SETUP_UI block, new localized strings
    - Comms: SendPing/SendPong, SendStart carries duration, ParseMessage
      handles KVPING/KVPONG with explicit pingID field (not sessionID)
    - UI: full setup frame (draggable, ESC-closable, timer spinner 10-120s);
      fix ShowVotingPopup timer to use sessionData.duration instead of
      hardcoded C.VOTE_DURATION
    - KeyVote: OpenSetupWindow, HandlePing/HandlePong, BuildSetupKeystoneList,
      OnSetupStart/OnSetupClose; StartVote accepts optional duration;
      HandleStart stores session.duration; testsetup sub-command added
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

