initial commit
This commit is contained in:
71
src/main/java/com/rit/whatsapp/handler/GrievanceHandler.java
Normal file
71
src/main/java/com/rit/whatsapp/handler/GrievanceHandler.java
Normal file
@@ -0,0 +1,71 @@
|
||||
package com.rit.whatsapp.handler;
|
||||
|
||||
import com.rit.whatsapp.model.UserState;
|
||||
import com.rit.whatsapp.service.SessionService;
|
||||
import com.rit.whatsapp.service.WhatsAppMessageBuilder;
|
||||
import com.rit.whatsapp.service.WhatsAppMessageService;
|
||||
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;
|
||||
import java.util.UUID;
|
||||
|
||||
@Component
|
||||
public class GrievanceHandler {
|
||||
|
||||
private final WhatsAppMessageService messageService;
|
||||
private final SessionService sessionService;
|
||||
|
||||
@Autowired
|
||||
public GrievanceHandler(WhatsAppMessageService messageService, SessionService sessionService) {
|
||||
this.messageService = messageService;
|
||||
this.sessionService = sessionService;
|
||||
}
|
||||
|
||||
public void startGrievanceFlow(String phoneNumber) {
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_GRIEVANCE_CATEGORY);
|
||||
|
||||
List<Map<String, String>> buttons = new ArrayList<>();
|
||||
buttons.add(createButton("grievance_academic", "Academic"));
|
||||
buttons.add(createButton("grievance_hostel", "Hostel"));
|
||||
buttons.add(createButton("grievance_other", "Other"));
|
||||
|
||||
Map<String, Object> buttonMessage = WhatsAppMessageBuilder.buildButtonMessage(
|
||||
"Please select the category for your grievance:",
|
||||
buttons
|
||||
);
|
||||
|
||||
messageService.sendInteractiveMessage(phoneNumber, buttonMessage);
|
||||
}
|
||||
|
||||
public void handleCategorySelection(String phoneNumber, String selectedCategory) {
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_GRIEVANCE_DESC);
|
||||
messageService.sendMessage(phoneNumber, "You selected " + selectedCategory + ". Please type a brief description of your issue:");
|
||||
}
|
||||
|
||||
public void handleGrievanceDescription(String phoneNumber, String description) {
|
||||
// Generate a mock ticket ID
|
||||
String ticketId = "TKT-" + UUID.randomUUID().toString().substring(0, 6).toUpperCase();
|
||||
|
||||
String confirmationMessage = "Thank you. Your grievance has been recorded.\n\n" +
|
||||
"Ticket ID: *" + ticketId + "*\n" +
|
||||
"Department Notified: Yes\n" +
|
||||
"Status: Open\n\n" +
|
||||
"You can check the status of this ticket anytime using the main menu.";
|
||||
|
||||
messageService.sendMessage(phoneNumber, confirmationMessage);
|
||||
|
||||
// Reset state back to main menu
|
||||
sessionService.resetState(phoneNumber);
|
||||
}
|
||||
|
||||
private Map<String, String> createButton(String id, String title) {
|
||||
Map<String, String> btn = new HashMap<>();
|
||||
btn.put("id", id);
|
||||
btn.put("title", title);
|
||||
return btn;
|
||||
}
|
||||
}
|
||||
64
src/main/java/com/rit/whatsapp/handler/LoginHandler.java
Normal file
64
src/main/java/com/rit/whatsapp/handler/LoginHandler.java
Normal file
@@ -0,0 +1,64 @@
|
||||
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.WhatsAppMessageService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class LoginHandler {
|
||||
|
||||
private final WhatsAppMessageService messageService;
|
||||
private final SessionService sessionService;
|
||||
private final ImsApiService imsApiService;
|
||||
private final StudentMenuHandler studentMenuHandler;
|
||||
|
||||
@Autowired
|
||||
public LoginHandler(WhatsAppMessageService messageService,
|
||||
SessionService sessionService,
|
||||
ImsApiService imsApiService,
|
||||
StudentMenuHandler studentMenuHandler) {
|
||||
this.messageService = messageService;
|
||||
this.sessionService = sessionService;
|
||||
this.imsApiService = imsApiService;
|
||||
this.studentMenuHandler = studentMenuHandler;
|
||||
}
|
||||
|
||||
public void startLoginFlow(String phoneNumber) {
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_LOGIN_ID);
|
||||
messageService.sendMessage(phoneNumber, "Welcome to RIT Digital Assistant! 🎓\n\nPlease enter your IMS User ID to login:");
|
||||
}
|
||||
|
||||
public void handleLoginIdInput(String phoneNumber, String imsId) {
|
||||
sessionService.setTempLoginId(phoneNumber, imsId);
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_LOGIN_PASSCODE);
|
||||
messageService.sendMessage(phoneNumber, "Thanks. Now, please enter your IMS Passcode:");
|
||||
}
|
||||
|
||||
public void handlePasscodeInput(String phoneNumber, String passcode) {
|
||||
String imsId = sessionService.getTempLoginId(phoneNumber);
|
||||
|
||||
messageService.sendMessage(phoneNumber, "Authenticating with IMS... ⏳");
|
||||
|
||||
String imsSessionToken = imsApiService.authenticate(imsId, passcode);
|
||||
|
||||
if (imsSessionToken != null) {
|
||||
// Authentication successful
|
||||
sessionService.authenticateUser(phoneNumber, imsId, passcode, imsSessionToken);
|
||||
sessionService.clearTempLoginId(phoneNumber);
|
||||
sessionService.resetState(phoneNumber); // Reset the flow state
|
||||
|
||||
messageService.sendMessage(phoneNumber, "✅ Login Successful!");
|
||||
|
||||
// Show the main menu
|
||||
studentMenuHandler.sendMainMenu(phoneNumber);
|
||||
} else {
|
||||
// Authentication failed
|
||||
sessionService.clearTempLoginId(phoneNumber);
|
||||
sessionService.setUserState(phoneNumber, UserState.AWAITING_LOGIN_ID);
|
||||
messageService.sendMessage(phoneNumber, "❌ Login Failed. Invalid ID or Passcode. Please try again.\n\nEnter your IMS User ID:");
|
||||
}
|
||||
}
|
||||
}
|
||||
117
src/main/java/com/rit/whatsapp/handler/StudentMenuHandler.java
Normal file
117
src/main/java/com/rit/whatsapp/handler/StudentMenuHandler.java
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user