diff --git a/bot.js b/bot.js index d88891f..3fbe4cf 100644 --- a/bot.js +++ b/bot.js @@ -555,7 +555,9 @@ bot.onText(/\/match(@padel_nl_bot)?/, async (msg) => { return; } const names = result.players.map(p => p.name).join(', '); - const msgText = 'šŸŽ¾ **Match gevonden!**\n\nšŸ“… ' + result.day + '\nā° ' + result.start + '-' + result.end + '\nšŸ‘„ ' + names + '\n\nReageer met āœ… of āŒ'; + const t1 = (result.proposedTeam1 || []).map(p => p.name).join(' + '); + const t2 = (result.proposedTeam2 || []).map(p => p.name).join(' + '); + const msgText = 'šŸŽ¾ **Match gevonden!**\n\nšŸ“… ' + result.day + '\nā° ' + result.start + '-' + result.end + '\n\nšŸ† **Teams:**\n🟔 ' + t1 + '\nšŸ”µ ' + t2 + '\n\nReageer met āœ… of āŒ'; const opts = { parse_mode: 'Markdown', reply_markup: { @@ -1501,6 +1503,62 @@ bot.on('callback_query', async (query) => { logError('match response error:', e.message); bot.answerCallbackQuery(query.id, { text: 'Fout' }).catch(() => {}); } + } else if (data.startsWith('team_swap_')) { + const matchId = data.split('_')[2]; + try { + const teams = await api('/matches/' + matchId + '/teams'); + if (!teams || !teams.teams) { + return bot.answerCallbackQuery(query.id, { text: 'Geen teams om te wisselen' }).catch(() => {}); + } + // Wissel team1 en team2 + const { team1, team2 } = teams.teams; + await api('/matches/' + matchId + '/teams', 'POST', { + team1: team2, + team2: team1 + }); + + // Haal spelernamen op + const players = await api('/players'); + const getName = id => { const p = players.find(x => x.id === id); return p ? p.name : '?'; }; + const t1 = team2.map(getName).join(' + '); + const t2 = team1.map(getName).join(' + '); + + // Stuur DM naar alle spelers + const matchInfo = await api('/matches/' + matchId); + if (matchInfo && Array.isArray(matchInfo.players)) { + for (const pid of matchInfo.players) { + const p = players.find(x => x.id === pid); + if (p && p.telegram_id) { + sendMsg(p.telegram_id, + 'šŸ”„ **Teams gewisseld!**\n\nNieuwe indeling voor ' + matchInfo.date + ' ' + matchInfo.start + ':\n🟔 ' + t1 + '\nšŸ”µ ' + t2, + { parse_mode: 'Markdown' } + ); + } + } + } + + // Update het originele bericht + bot.editMessageText( + 'šŸŽ¾ **Match — teams gewisseld!**\n\nšŸ“… ' + (matchInfo ? matchInfo.date + ' ' + matchInfo.start : '') + '\n\nšŸ† **Teams:**\n🟔 ' + t1 + '\nšŸ”µ ' + t2 + '\n\nReageer met āœ… of āŒ', + { + chat_id: query.message.chat.id, + message_id: query.message.message_id, + parse_mode: 'Markdown', + reply_markup: { + inline_keyboard: [ + [{ text: 'āœ… Ja, ik kan!', callback_data: 'match_accept_' + matchId }, + { text: 'āŒ Nee', callback_data: 'match_reject_' + matchId }], + [{ text: 'šŸ”„ Weer wisselen', callback_data: 'team_swap_' + matchId }] + ] + } + } + ).catch(e => logError('team_swap edit fail:', e.message)); + + bot.answerCallbackQuery(query.id, { text: 'Teams gewisseld!' }).catch(() => {}); + } catch (e) { + logError('team_swap error:', e.message); + bot.answerCallbackQuery(query.id, { text: 'Fout bij wisselen' }).catch(() => {}); + } } }); @@ -1736,23 +1794,54 @@ async function runMatching() { } } + // Balanceer 4 spelers in 2 teams: hoog + laag vs mid + const sorted = [...best4].sort((a, b) => (a.level || 5) - (b.level || 5)); + const proposedTeam1 = [sorted[0], sorted[3]]; // hoogste + laagste + const proposedTeam2 = [sorted[1], sorted[2]]; // midden twee + const match = await api('/matches', 'POST', { day, start, end, date: matchDateStr, players: best4.map(p => p.id), telegram_ids: best4.filter(p => p.telegram_id).map(p => p.telegram_id) }); + // Sla voorgestelde teams op + await api('/matches/' + match.id + '/teams', 'POST', { + team1: proposedTeam1.map(p => p.id), + team2: proposedTeam2.map(p => p.id) + }); + + const t1names = proposedTeam1.map(p => p.name).join(' + '); + const t2names = proposedTeam2.map(p => p.name).join(' + '); + for (const p of best4) { if (p.telegram_id) { const levels = best4.map(x => x.name + ' (Lv.' + (x.level || '?') + ')').join(', '); sendMsg(p.telegram_id, - 'šŸŽ¾ **Match voorgesteld!**\n\nšŸ“… ' + day + ' ' + matchDateStr + '\nā° ' + start + '-' + end + '\nšŸ‘„ ' + levels + '\n\nšŸ“ ' + peakzLocation + ' — baan vrij!\nReageer met /matches of stuur āœ…/āŒ', + 'šŸŽ¾ **Match voorgesteld!**\n\nšŸ“… ' + day + ' ' + matchDateStr + '\nā° ' + start + '-' + end + '\n\nšŸ† **Teams:**\n🟔 ' + t1names + '\nšŸ”µ ' + t2names + '\n\nšŸ“ ' + peakzLocation + ' — baan vrij!\nStuur /matches om te reageren.', { parse_mode: 'Markdown' } ); } } - return { day, start, end, players: best4, match }; + // Ook naar groeps-chat met team indeling + if (targetChat) { + sendMsg(targetChat, + 'šŸŽ¾ **Match gevonden!**\n\nšŸ“… ' + day + ' ' + matchDateStr + '\nā° ' + start + '-' + end + '\n\nšŸ† **Teams:**\n🟔 ' + t1names + '\nšŸ”µ ' + t2names + '\n\nšŸ“ ' + peakzLocation + '\n\nReageer met āœ… of āŒ', + { + parse_mode: 'Markdown', + reply_markup: { + inline_keyboard: [ + [{ text: 'āœ… Ja, ik kan!', callback_data: 'match_accept_' + match.id }, + { text: 'āŒ Nee', callback_data: 'match_reject_' + match.id }], + [{ text: 'šŸ”„ Andere teams', callback_data: 'team_swap_' + match.id }] + ] + } + } + ); + } + + return { day, start, end, players: best4, match, proposedTeam1, proposedTeam2 }; } } return null;