initial commit

This commit is contained in:
2026-08-19 11:03:29 +05:30
commit 3914e4f304
23 changed files with 3050 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
package com.rit.whatsapp.handler;
import com.rit.whatsapp.model.UserState;
import com.rit.whatsapp.service.ImsApiService;
import com.rit.whatsapp.service.SessionService;
import com.rit.whatsapp.service.WhatsAppMessageBuilder;
import com.rit.whatsapp.service.WhatsAppMessageService;
import com.rit.whatsapp.util.MessageFormatter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class StudentMenuHandler {
private final WhatsAppMessageService messageService;
private final SessionService sessionService;
private final GrievanceHandler grievanceHandler;
private final ImsApiService imsApiService;
@Autowired
public StudentMenuHandler(WhatsAppMessageService messageService,
SessionService sessionService,
GrievanceHandler grievanceHandler,
ImsApiService imsApiService) {
this.messageService = messageService;
this.sessionService = sessionService;
this.grievanceHandler = grievanceHandler;
this.imsApiService = imsApiService;
}
public void sendMainMenu(String phoneNumber) {
sessionService.setUserState(phoneNumber, UserState.MAIN_MENU);
List<Map<String, String>> rows = new ArrayList<>();
rows.add(createRow("student_attendance", "Attendance", "Overall % and Subject-wise"));
rows.add(createRow("student_timetable", "Timetable", "Today's classes and Weekly"));
rows.add(createRow("student_internal_marks", "Internal marks", "CAT 1, CAT 2, Overall"));
rows.add(createRow("student_semester_results", "Semester results", "Latest result and CGPA"));
rows.add(createRow("student_fee_details", "Fee details & receipt", "Fee paid, Pending, Due date"));
rows.add(createRow("student_academic_calendar", "Academic calendar", "Holidays and Important dates"));
rows.add(createRow("student_exam_schedule", "Exam schedule", "Upcoming exams and Hall details"));
rows.add(createRow("student_circulars", "Circulars & Notices", "Department circulars"));
rows.add(createRow("student_raise_grievance", "Raise a grievance \u2B50", "Submit an issue ticket"));
rows.add(createRow("student_contact_department", "Contact department", "Faculty mentor, HOD, etc."));
Map<String, Object> interactiveList = WhatsAppMessageBuilder.buildListMessage(
"RIT Digital Assistant",
"Welcome to the RITz Student Portal! Please select an option from the menu below.",
"Student Menu",
rows
);
messageService.sendInteractiveMessage(phoneNumber, interactiveList);
// Send a separate Logout button since the list is maxed out at 10 items
List<Map<String, String>> logoutBtn = new ArrayList<>();
Map<String, String> btn = new HashMap<>();
btn.put("id", "student_logout");
btn.put("title", "Logout");
logoutBtn.add(btn);
Map<String, Object> logoutMessage = WhatsAppMessageBuilder.buildButtonMessage(
"Need to switch accounts?",
logoutBtn
);
messageService.sendInteractiveMessage(phoneNumber, logoutMessage);
}
public void handleMenuSelection(String phoneNumber, String selectedOptionId) {
String token = sessionService.getImsToken(phoneNumber);
if (token == null) {
messageService.sendMessage(phoneNumber, "Your session has expired. Please type 'Reset' to login again.");
return;
}
switch (selectedOptionId) {
case "student_attendance":
String rawAttendance = imsApiService.getAttendance(token);
messageService.sendMessage(phoneNumber, MessageFormatter.formatAttendance(rawAttendance));
break;
case "student_timetable":
String rawTimetable = imsApiService.getTimetable(token);
messageService.sendMessage(phoneNumber, MessageFormatter.formatTimetable(rawTimetable));
break;
case "student_semester_results":
// Defaulting to semester 1 for now
String rawResults = imsApiService.getResults(token, 1);
messageService.sendMessage(phoneNumber, MessageFormatter.formatResults(rawResults, 1));
break;
case "student_raise_grievance":
grievanceHandler.startGrievanceFlow(phoneNumber);
break;
default:
messageService.sendMessage(phoneNumber, "You selected an option that is currently under development. Please check back later!");
// Resend main menu
sendMainMenu(phoneNumber);
break;
}
}
private Map<String, String> createRow(String id, String title, String description) {
Map<String, String> row = new HashMap<>();
row.put("id", id);
row.put("title", title);
row.put("description", description);
return row;
}
}