Spaces:
Paused
Paused
| // src/handlers/registrationHandler.js (previously selfReg.js) | |
| const logger = require('../logger'); | |
| const whatsapp = require('../services/whatsappService'); | |
| const { User } = require('../database'); // Import User model directly | |
| const config = require('../config'); // Import config for delays | |
| const { sleep } = require('../utils'); // Import sleep directly if needed | |
| const userState = {}; | |
| const REGISTRATION_DELAY_MIN = 2000; // 2 seconds | |
| const REGISTRATION_DELAY_MAX = 3000; // 3 seconds | |
| /** | |
| * Handles the multi-step registration process. Uses whatsappService for communication. | |
| * /restart command functionality has been removed. | |
| */ | |
| async function handleRegistration(jid, messageContent) { // Renamed remoteJid to jid for consistency | |
| logger.debug({ jid }, `[RegistrationHandler] Handling step.`); | |
| const currentState = userState[jid] || { step: 'START', data: {} }; | |
| const delayOptions = { minDelay: config.registrationMinDelay, maxDelay: config.registrationMaxDelay }; | |
| // REMOVED: Global /restart check is removed from here. | |
| try { // Wrap steps in try-catch | |
| switch (currentState.step) { | |
| case 'START': | |
| userState[jid] = { step: 'ASKING_NAME', data: {} }; | |
| // REMOVED: Mention of /restart removed from the prompt | |
| await whatsapp.sendMessageWithTyping(jid, { text: "Hi there! Let's get you registered.\n\nWhat is your full Name?" }, delayOptions); | |
| break; | |
| case 'ASKING_NAME': | |
| if (!messageContent.trim()) { | |
| await whatsapp.sendMessageWithTyping(jid, { text: "Please enter a valid name." }, delayOptions); | |
| break; | |
| } | |
| currentState.data.name = messageContent.trim(); | |
| currentState.step = 'ASKING_REGNO'; | |
| userState[jid] = currentState; | |
| logger.debug({ jid, data: currentState.data }, `[RegistrationHandler] Name received.`); | |
| await whatsapp.sendMessageWithTyping(jid, { text: `Got it, ${currentState.data.name}.\n\nWhat is your Registration Number?` }, delayOptions); | |
| break; | |
| case 'ASKING_REGNO': | |
| if (!messageContent.trim()) { | |
| await whatsapp.sendMessageWithTyping(jid, { text: "Please enter a valid registration number." }, delayOptions); | |
| break; | |
| } | |
| currentState.data.regNo = messageContent.trim(); | |
| currentState.step = 'ASKING_SEMESTER'; | |
| userState[jid] = currentState; | |
| logger.debug({ jid, data: currentState.data }, `[RegistrationHandler] RegNo received.`); | |
| await whatsapp.sendMessageWithTyping(jid, { text: "Great!\n\nWhich Semester are you in? (e.g., 1st, 2nd, 3rd, 4th)" }, delayOptions); | |
| break; | |
| case 'ASKING_SEMESTER': | |
| if (!messageContent.trim()) { | |
| await whatsapp.sendMessageWithTyping(jid, { text: "Please enter a valid semester." }, delayOptions); | |
| break; | |
| } | |
| currentState.data.semester = messageContent.trim(); | |
| currentState.step = 'CONFIRMING'; | |
| userState[jid] = currentState; | |
| logger.debug({ jid, data: currentState.data }, `[RegistrationHandler] Semester received.`); | |
| const confirmationText = `?? *Please confirm your details:* ??\n\n*Name:* ${currentState.data.name}\n*Reg No:* ${currentState.data.regNo}\n*Semester:* ${currentState.data.semester}\n\nIs this correct? Reply with *yes* or *no*.`; | |
| await whatsapp.sendMessageWithTyping(jid, { text: confirmationText }, delayOptions); | |
| break; | |
| case 'CONFIRMING': | |
| const confirmation = messageContent.trim().toLowerCase(); | |
| if (confirmation === 'yes') { | |
| try { | |
| logger.info({ jid, data: currentState.data }, `[RegistrationHandler] User confirmed. Saving data.`); | |
| await sleep(300); // Small pause before DB write | |
| const updateResult = await User.updateOne( | |
| { remoteJid: jid }, | |
| { | |
| $set: { | |
| name: currentState.data.name, | |
| regNo: currentState.data.regNo, | |
| semester: currentState.data.semester, | |
| isRegistered: true, | |
| registrationTimestamp: new Date() | |
| } | |
| }, | |
| { upsert: true } | |
| ); | |
| logger.info({ jid, result: updateResult }, `[RegistrationHandler] MongoDB update result.`); | |
| if (updateResult.acknowledged) { | |
| await whatsapp.sendMessageWithTyping(jid, { text: "✅ Registration successful! Your details have been saved." }, delayOptions); | |
| delete userState[jid]; // Clear state | |
| } else { throw new Error("Database update not acknowledged."); } | |
| } catch (dbError) { | |
| logger.error({ jid, err: dbError }, `[RegistrationHandler] Error saving data during confirmation.`); | |
| // REMOVED: Mention of /restart in error message | |
| await whatsapp.sendMessageWithTyping(jid, { text: "❌ Sorry, there was an error saving your details. Please reply 'yes' again or 'no' to start over." }, delayOptions); | |
| } | |
| } else if (confirmation === 'no') { // Only 'no' triggers restart now | |
| logger.info({ jid }, `[RegistrationHandler] User replied 'no' at confirmation.`); | |
| delete userState[jid]; | |
| userState[jid] = { step: 'ASKING_NAME', data: {} }; | |
| await whatsapp.sendMessageWithTyping(jid, { text: "Okay, let's start over.\n\nWhat is your full Name?" }, delayOptions); | |
| } else { | |
| await whatsapp.sendMessageWithTyping(jid, { text: "Please reply with *yes* or *no*." }, delayOptions); | |
| } | |
| break; | |
| default: // Unhandled state | |
| logger.warn({ jid, state: currentState.step }, `[RegistrationHandler] Unhandled state step.`); | |
| delete userState[jid]; | |
| await whatsapp.sendMessageWithTyping(jid, { text: "Something went wrong during registration. Please send any message to try starting again." }, delayOptions); // Updated generic error | |
| break; | |
| } | |
| } catch (stepError) { // Catch errors in the switch/case logic itself | |
| logger.error({ jid, err: stepError, step: currentState.step }, "[RegistrationHandler] Error during registration step execution."); | |
| try { | |
| // REMOVED: Mention of /restart in generic error message | |
| await whatsapp.sendMessageWithTyping(jid, { text: "An unexpected error occurred during registration. Please try starting again by sending any message." }); | |
| delete userState[jid]; // Reset state on error | |
| } catch (sendErr) { | |
| logger.error({ jid, err: sendErr }, "[RegistrationHandler] Failed to send error message during step error handling."); | |
| } | |
| } | |
| } | |
| module.exports = { handleRegistration }; | |