Veto
Tu peux afficher un veto sur le HUD de trois façons :
- L'importer depuis une room FACEIT ou un match HLTV.
- Le faire étape par étape : chaque ban ou pick apparaît en direct sur l'overlay.
- L'envoyer en une fois, quand ton script connaît déjà toutes les étapes.
Toutes les commandes de veto ont besoin que la fenêtre principale de MyHUD soit ouverte et connectée à ton compte.
Importer depuis FACEIT ou HLTV
Envoie import_match_veto avec l'URL du match :
curl -X POST http://127.0.0.1:44555/api/actions/import_match_veto \
-H 'Content-Type: application/json' \
-d '{"url":"https://www.hltv.org/matches/2370000/vitality-vs-navi","show":true}'import requests
res = requests.post(
"http://127.0.0.1:44555/api/actions/import_match_veto",
json={"url": "https://www.hltv.org/matches/2370000/vitality-vs-navi", "show": True},
timeout=40,
)
print(res.json())const res = await fetch('http://127.0.0.1:44555/api/actions/import_match_veto', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ url: 'https://www.hltv.org/matches/2370000/vitality-vs-navi', show: true }),
});
console.log(await res.json());Pour FACEIT, tu peux aussi envoyer l'id du match au lieu de l'URL :
{ "faceitMatchId": "1-abcdef12-3456-7890-abcd-ef1234567890", "show": true }MyHUD fait alors la même chose que le bouton Appliquer de la page veto :
- il remplit les maps de la série avec les picks et le decider ;
- il affiche le veto sur les pages ouvertes, y compris les sources navigateur d'OBS.
Avec "show": true, il ouvre aussi le panneau veto sur le HUD. Pour lire le veto sans rien modifier, envoie "apply": false.
L'import peut prendre jusqu'à 20 secondes.
Attendre le veto
Tant que les équipes n'ont pas fini le veto, MyHUD répond 409 conflict. Un script peut réessayer jusqu'à obtenir 200 :
import time
import requests
IMPORT_URL = "http://127.0.0.1:44555/api/actions/import_match_veto"
def import_veto(match_id):
while True:
res = requests.post(IMPORT_URL, json={"faceitMatchId": match_id, "show": True}, timeout=40)
body = res.json()
if res.status_code == 200:
return body["result"]
if res.status_code != 409:
raise RuntimeError(f"{body['error']}: {body['message']}")
time.sleep(10) # pas encore de veto
result = import_veto("1-abcdef12-3456-7890-abcd-ef1234567890")
print(result["teamA"]["name"], "vs", result["teamB"]["name"])const IMPORT_URL = 'http://127.0.0.1:44555/api/actions/import_match_veto';
async function importVeto(faceitMatchId: string) {
while (true) {
const res = await fetch(IMPORT_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ faceitMatchId, show: true }),
});
const body = await res.json();
if (res.status === 200) return body.result;
if (res.status !== 409) throw new Error(`${body.error}: ${body.message}`);
await new Promise((resolve) => setTimeout(resolve, 10_000)); // pas encore de veto
}
}
const result = await importVeto('1-abcdef12-3456-7890-abcd-ef1234567890');
console.log(result.teamA.name, 'vs', result.teamB.name);Ne réessaie pas plus vite que toutes les quelques secondes : chaque tentative charge la room FACEIT.
Faire un veto étape par étape
Utilise cette méthode pour un match hors ligne, ou quand ton propre outil gère le veto.
Démarre la session avec le format, les équipes et, si tu veux, le map pool :
jsonPOST /api/actions/veto_start { "boFormat": "bo3", "teamA": { "name": "Vitality" }, "teamB": { "name": "NAVI" }, "mapPool": ["ancient", "anubis", "dust2", "inferno", "mirage", "nuke", "train"] }Envoie chaque map avec
veto_select. MyHUD sait quelle équipe joue et si l'étape est un ban ou un pick :jsonPOST /api/actions/veto_select { "map": "nuke" }Continue jusqu'à ce que le veto soit complet. MyHUD choisit le decider tout seul.
Chaque étape apparaît tout de suite sur l'overlay. Quand le veto est complet, MyHUD remplit les maps de la série.
Le même veto sous forme de script, avec la fonction myhud de Bien démarrer :
myhud("veto_start", {
"boFormat": "bo3",
"teamA": {"name": "Vitality"},
"teamB": {"name": "NAVI"},
"mapPool": ["ancient", "anubis", "dust2", "inferno", "mirage", "nuke", "train"],
})
for map_name in ["nuke", "ancient", "mirage", "inferno", "anubis", "dust2"]:
status = myhud("veto_select", {"map": map_name})
print(status["steps"][-1]) # l'étape qui vient d'être jouée
decider = next(s for s in status["steps"] if s["type"] == "decider")
print("Decider :", decider["map"])type VetoStep = { type: 'ban' | 'pick' | 'decider'; team: 'A' | 'B' | null; map: string };
type VetoStatus = { complete: boolean; steps: VetoStep[] };
await myhud('veto_start', {
boFormat: 'bo3',
teamA: { name: 'Vitality' },
teamB: { name: 'NAVI' },
mapPool: ['ancient', 'anubis', 'dust2', 'inferno', 'mirage', 'nuke', 'train'],
});
let status!: VetoStatus;
for (const map of ['nuke', 'ancient', 'mirage', 'inferno', 'anubis', 'dust2']) {
status = await myhud<VetoStatus>('veto_select', { map });
console.log(status.steps.at(-1)); // l'étape qui vient d'être jouée
}
console.log('Decider :', status.steps.find((s) => s.type === 'decider')?.map);Autres commandes :
| Commande | Effet |
|---|---|
veto_undo | Annule le dernier ban ou pick. Fonctionne aussi après la fin du veto. |
veto_status | Indique quelle équipe joue, le type de la prochaine étape et les maps restantes. |
veto_cancel | Arrête la session et réaffiche le veto d'avant. |
Les règles sont les mêmes que sur la page veto :
- BO1 : bans jusqu'à ce qu'il reste une map, qui est le decider.
- BO3 : bans jusqu'à ce qu'il reste 5 maps, puis 2 picks, 2 bans et le decider.
- BO5 : bans jusqu'à ce qu'il reste 5 maps, puis 4 picks et le decider.
- L'équipe A bannit en premier, sauf si tu envoies
"firstBanner": "B".
Les noms de map peuvent être mirage ou de_mirage.
Envoyer un veto complet
Si ton script a déjà toutes les étapes, envoie-les avec veto_set :
POST /api/actions/veto_set
{
"boFormat": "bo1",
"teamA": { "name": "Vitality" },
"teamB": { "name": "NAVI" },
"steps": [
{ "type": "ban", "team": "A", "map": "nuke" },
{ "type": "ban", "team": "B", "map": "ancient" },
{ "type": "ban", "team": "A", "map": "anubis" },
{ "type": "ban", "team": "B", "map": "dust2" },
{ "type": "ban", "team": "A", "map": "inferno" },
{ "type": "ban", "team": "B", "map": "train" },
{ "type": "decider", "map": "mirage" }
]
}MyHUD vérifie les étapes avec les règles. Si elles ne respectent pas les règles, il répond 400 invalid_payload et ne change rien.
Révéler le veto étape par étape
Si la page veto utilise la révélation progressive, utilise veto_reveal pour afficher les étapes une par une, par exemple depuis un bouton de Stream Deck :
| Payload | Effet |
|---|---|
{ "mode": "next" } | Affiche l'étape suivante. |
{ "mode": "prev" } | Masque la dernière étape affichée. |
{ "mode": "all" } | Affiche toutes les étapes. |
{ "mode": "reset" } | Masque toutes les étapes. |
{ "instant": true } | Désactive la révélation progressive : toutes les étapes s'affichent d'un coup. |
Effacer le veto
reset_veto efface le veto et toutes les maps de la série.
