assignment mark format
This commit is contained in:
3
.env
Normal file
3
.env
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
DB_URL=jdbc:postgresql://localhost:5432/whatsapp_bot
|
||||||
|
DB_USERNAME=whatsapp_user
|
||||||
|
DB_PASSWORD=RITHosting123
|
||||||
Binary file not shown.
5
pom.xml
5
pom.xml
@@ -43,6 +43,11 @@
|
|||||||
<artifactId>h2</artifactId>
|
<artifactId>h2</artifactId>
|
||||||
<scope>runtime</scope>
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.postgresql</groupId>
|
||||||
|
<artifactId>postgresql</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
|||||||
@@ -198,11 +198,36 @@ public class WebhookController {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ("student_show_menu".equals(selectedButtonId)) {
|
||||||
|
studentMenuHandler.sendStudentMenuDirectly(phoneNumber);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ("student_exam_fees".equals(selectedButtonId)) {
|
if ("student_exam_fees".equals(selectedButtonId)) {
|
||||||
studentMenuHandler.handleExamFees(phoneNumber);
|
studentMenuHandler.handleExamFees(phoneNumber);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ("student_cat1_marks".equals(selectedButtonId)) {
|
||||||
|
studentMenuHandler.handleCat1Marks(phoneNumber);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("student_cat2_marks".equals(selectedButtonId)) {
|
||||||
|
studentMenuHandler.handleCat2Marks(phoneNumber);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("student_cat3_marks".equals(selectedButtonId)) {
|
||||||
|
studentMenuHandler.handleCat3Marks(phoneNumber);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("student_assignment_marks".equals(selectedButtonId)) {
|
||||||
|
studentMenuHandler.handleAssignmentMarks(phoneNumber);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ("student_payment_history".equals(selectedButtonId)) {
|
if ("student_payment_history".equals(selectedButtonId)) {
|
||||||
studentMenuHandler.handlePaymentHistory(phoneNumber);
|
studentMenuHandler.handlePaymentHistory(phoneNumber);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import com.rit.whatsapp.service.WhatsAppMessageService;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -18,11 +20,13 @@ public class GrievanceHandler {
|
|||||||
|
|
||||||
private final WhatsAppMessageService messageService;
|
private final WhatsAppMessageService messageService;
|
||||||
private final SessionService sessionService;
|
private final SessionService sessionService;
|
||||||
|
private final StudentMenuHandler studentMenuHandler;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public GrievanceHandler(WhatsAppMessageService messageService, SessionService sessionService) {
|
public GrievanceHandler(WhatsAppMessageService messageService, SessionService sessionService, @Lazy StudentMenuHandler studentMenuHandler) {
|
||||||
this.messageService = messageService;
|
this.messageService = messageService;
|
||||||
this.sessionService = sessionService;
|
this.sessionService = sessionService;
|
||||||
|
this.studentMenuHandler = studentMenuHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startGrievanceFlow(String phoneNumber) {
|
public void startGrievanceFlow(String phoneNumber) {
|
||||||
@@ -39,6 +43,7 @@ public class GrievanceHandler {
|
|||||||
);
|
);
|
||||||
|
|
||||||
messageService.sendInteractiveMessage(phoneNumber, buttonMessage);
|
messageService.sendInteractiveMessage(phoneNumber, buttonMessage);
|
||||||
|
studentMenuHandler.sendStudentMenuDirectly(phoneNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleCategorySelection(String phoneNumber, String selectedCategory) {
|
public void handleCategorySelection(String phoneNumber, String selectedCategory) {
|
||||||
@@ -60,6 +65,9 @@ public class GrievanceHandler {
|
|||||||
|
|
||||||
// Reset state back to main menu
|
// Reset state back to main menu
|
||||||
sessionService.resetState(phoneNumber);
|
sessionService.resetState(phoneNumber);
|
||||||
|
|
||||||
|
// Display student menu
|
||||||
|
studentMenuHandler.sendStudentMenuDirectly(phoneNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, String> createButton(String id, String title) {
|
private Map<String, String> createButton(String id, String title) {
|
||||||
|
|||||||
@@ -81,22 +81,43 @@ public class StudentMenuHandler {
|
|||||||
weeklyBtn.put("id", "student_weekly_timetable");
|
weeklyBtn.put("id", "student_weekly_timetable");
|
||||||
weeklyBtn.put("title", "Weekly Timetable");
|
weeklyBtn.put("title", "Weekly Timetable");
|
||||||
buttons.add(weeklyBtn);
|
buttons.add(weeklyBtn);
|
||||||
|
|
||||||
|
Map<String, String> menuBtn = new HashMap<>();
|
||||||
|
menuBtn.put("id", "student_show_menu");
|
||||||
|
menuBtn.put("title", "Student Menu");
|
||||||
|
buttons.add(menuBtn);
|
||||||
|
|
||||||
System.out.println("FINAL TODAY TIMETABLE MESSAGE:\n" + todaySchedule);
|
System.out.println("FINAL TODAY TIMETABLE MESSAGE:\n" + todaySchedule);
|
||||||
|
|
||||||
Map<String, Object> buttonMessage = WhatsAppMessageBuilder.buildButtonMessage(todaySchedule, buttons);
|
Map<String, Object> buttonMessage = WhatsAppMessageBuilder.buildButtonMessage(todaySchedule, buttons);
|
||||||
messageService.sendInteractiveMessage(phoneNumber, buttonMessage);
|
messageService.sendInteractiveMessage(phoneNumber, buttonMessage);
|
||||||
|
sendStudentMenuDirectly(phoneNumber);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "student_internal_marks":
|
||||||
|
sendInternalMarksMenu(phoneNumber);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "student_internal_marks":
|
case "student_cat1_marks":
|
||||||
String rawCatMarks = imsApiService.getCatMarks(token);
|
handleCat1Marks(phoneNumber);
|
||||||
String rawAssignmentMarks = imsApiService.getAssignmentMarks(token);
|
|
||||||
sendResponseWithMenu(phoneNumber, MessageFormatter.formatInternalMarks(rawCatMarks, rawAssignmentMarks));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "student_cat2_marks":
|
||||||
|
handleCat2Marks(phoneNumber);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "student_cat3_marks":
|
||||||
|
handleCat3Marks(phoneNumber);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "student_assignment_marks":
|
||||||
|
handleAssignmentMarks(phoneNumber);
|
||||||
|
break;
|
||||||
|
|
||||||
case "student_semester_results":
|
case "student_semester_results":
|
||||||
sendSemesterSelection(phoneNumber, token);
|
sendSemesterSelection(phoneNumber, token);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "student_fee_details": {
|
case "student_fee_details": {
|
||||||
String rawFees = imsApiService.getFees(token);
|
String rawFees = imsApiService.getFees(token);
|
||||||
String bodyText = MessageFormatter.formatAcademicFeesOnly(rawFees);
|
String bodyText = MessageFormatter.formatAcademicFeesOnly(rawFees);
|
||||||
@@ -118,6 +139,7 @@ public class StudentMenuHandler {
|
|||||||
|
|
||||||
Map<String, Object> feeButtonMessage = WhatsAppMessageBuilder.buildButtonMessage(bodyText, feeButtons);
|
Map<String, Object> feeButtonMessage = WhatsAppMessageBuilder.buildButtonMessage(bodyText, feeButtons);
|
||||||
messageService.sendInteractiveMessage(phoneNumber, feeButtonMessage);
|
messageService.sendInteractiveMessage(phoneNumber, feeButtonMessage);
|
||||||
|
sendStudentMenuDirectly(phoneNumber);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,6 +188,7 @@ public class StudentMenuHandler {
|
|||||||
);
|
);
|
||||||
|
|
||||||
messageService.sendInteractiveMessage(phoneNumber, interactiveList);
|
messageService.sendInteractiveMessage(phoneNumber, interactiveList);
|
||||||
|
sendStudentMenuDirectly(phoneNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleSemesterSelection(String phoneNumber, String selectedOptionId) {
|
public void handleSemesterSelection(String phoneNumber, String selectedOptionId) {
|
||||||
@@ -312,6 +335,7 @@ public class StudentMenuHandler {
|
|||||||
"Receipts", formattedHistory, "Download Receipt", receiptRows
|
"Receipts", formattedHistory, "Download Receipt", receiptRows
|
||||||
);
|
);
|
||||||
messageService.sendInteractiveMessage(phoneNumber, listMessage);
|
messageService.sendInteractiveMessage(phoneNumber, listMessage);
|
||||||
|
sendStudentMenuDirectly(phoneNumber);
|
||||||
} else {
|
} else {
|
||||||
sendResponseWithMenu(phoneNumber, formattedHistory);
|
sendResponseWithMenu(phoneNumber, formattedHistory);
|
||||||
}
|
}
|
||||||
@@ -344,6 +368,80 @@ public class StudentMenuHandler {
|
|||||||
rows
|
rows
|
||||||
);
|
);
|
||||||
messageService.sendInteractiveMessage(phoneNumber, interactiveList);
|
messageService.sendInteractiveMessage(phoneNumber, interactiveList);
|
||||||
|
sendStudentMenuDirectly(phoneNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendStudentMenuDirectly(String phoneNumber) {
|
||||||
|
sessionService.setUserState(phoneNumber, UserState.MAIN_MENU);
|
||||||
|
|
||||||
|
Map<String, Object> interactiveList = WhatsAppMessageBuilder.buildListMessage(
|
||||||
|
null,
|
||||||
|
"Select an option from the menu below",
|
||||||
|
"Student Menu",
|
||||||
|
getStudentMenuRows()
|
||||||
|
);
|
||||||
|
messageService.sendInteractiveMessage(phoneNumber, interactiveList);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendInternalMarksMenu(String phoneNumber) {
|
||||||
|
List<Map<String, String>> rows = new ArrayList<>();
|
||||||
|
rows.add(createRow("student_cat1_marks", "CAT 1 Marks", "View CAT 1 (CO1) marks"));
|
||||||
|
rows.add(createRow("student_cat2_marks", "CAT 2 Marks", "View CAT 2 (CO2) marks"));
|
||||||
|
rows.add(createRow("student_cat3_marks", "CAT 3 Marks", "View CAT 3 (CO3) marks"));
|
||||||
|
rows.add(createRow("student_assignment_marks", "Assignment Marks", "View assignments 1-5 marks"));
|
||||||
|
|
||||||
|
Map<String, Object> interactiveList = WhatsAppMessageBuilder.buildListMessage(
|
||||||
|
"Internal Marks",
|
||||||
|
"Select which internal marks you want to view:",
|
||||||
|
"Select Option",
|
||||||
|
rows
|
||||||
|
);
|
||||||
|
messageService.sendInteractiveMessage(phoneNumber, interactiveList);
|
||||||
|
sendStudentMenuDirectly(phoneNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleCat1Marks(String phoneNumber) {
|
||||||
|
String token = sessionService.getImsToken(phoneNumber);
|
||||||
|
if (token == null) {
|
||||||
|
messageService.sendMessage(phoneNumber, "Your session has expired. Please type 'Reset' to login again.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String rawCatMarks = imsApiService.getCatMarks(token);
|
||||||
|
String formatted = com.rit.whatsapp.util.MessageFormatter.formatCat1Marks(rawCatMarks);
|
||||||
|
sendResponseWithMenu(phoneNumber, formatted);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleCat2Marks(String phoneNumber) {
|
||||||
|
String token = sessionService.getImsToken(phoneNumber);
|
||||||
|
if (token == null) {
|
||||||
|
messageService.sendMessage(phoneNumber, "Your session has expired. Please type 'Reset' to login again.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String rawCatMarks = imsApiService.getCatMarks(token);
|
||||||
|
String formatted = com.rit.whatsapp.util.MessageFormatter.formatCat2Marks(rawCatMarks);
|
||||||
|
sendResponseWithMenu(phoneNumber, formatted);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleCat3Marks(String phoneNumber) {
|
||||||
|
String token = sessionService.getImsToken(phoneNumber);
|
||||||
|
if (token == null) {
|
||||||
|
messageService.sendMessage(phoneNumber, "Your session has expired. Please type 'Reset' to login again.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String rawCatMarks = imsApiService.getCatMarks(token);
|
||||||
|
String formatted = com.rit.whatsapp.util.MessageFormatter.formatCat3Marks(rawCatMarks);
|
||||||
|
sendResponseWithMenu(phoneNumber, formatted);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleAssignmentMarks(String phoneNumber) {
|
||||||
|
String token = sessionService.getImsToken(phoneNumber);
|
||||||
|
if (token == null) {
|
||||||
|
messageService.sendMessage(phoneNumber, "Your session has expired. Please type 'Reset' to login again.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String rawAssignmentMarks = imsApiService.getAssignmentMarks(token);
|
||||||
|
String formatted = com.rit.whatsapp.util.MessageFormatter.formatAssignmentMarks(rawAssignmentMarks);
|
||||||
|
sendResponseWithMenu(phoneNumber, formatted);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Map<String, String>> getStudentMenuRows() {
|
private List<Map<String, String>> getStudentMenuRows() {
|
||||||
|
|||||||
@@ -287,10 +287,10 @@ public class MessageFormatter {
|
|||||||
|
|
||||||
public static String formatInternalMarks(String rawCatJson, String rawAssignmentJson) {
|
public static String formatInternalMarks(String rawCatJson, String rawAssignmentJson) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append("\ud83d\udcc8 *Internal Marks*\n\n");
|
sb.append("📈 *INTERNAL MARKS REPORT*\n\n");
|
||||||
|
|
||||||
// --- Parse CAT Marks ---
|
// --- Parse CAT Marks ---
|
||||||
sb.append("*CAT MARKS:*\n");
|
sb.append("✴️ *CAT MARKS:*\n");
|
||||||
if (rawCatJson == null) {
|
if (rawCatJson == null) {
|
||||||
sb.append("❌ Failed to retrieve CAT marks.\n\n");
|
sb.append("❌ Failed to retrieve CAT marks.\n\n");
|
||||||
} else {
|
} else {
|
||||||
@@ -309,39 +309,52 @@ public class MessageFormatter {
|
|||||||
|
|
||||||
if (targetArray != null && targetArray.size() > 0) {
|
if (targetArray != null && targetArray.size() > 0) {
|
||||||
for (JsonNode subject : targetArray) {
|
for (JsonNode subject : targetArray) {
|
||||||
|
String code = subject.has("code") ? subject.get("code").asText() : "";
|
||||||
String name = subject.has("name") ? subject.get("name").asText() :
|
String name = subject.has("name") ? subject.get("name").asText() :
|
||||||
(subject.has("course_name") ? subject.get("course_name").asText() : "Unknown");
|
(subject.has("course_name") ? subject.get("course_name").asText() : "Subject");
|
||||||
|
String co1 = subject.has("co1") ? subject.get("co1").asText().trim() : "";
|
||||||
|
String co2 = subject.has("co2") ? subject.get("co2").asText().trim() : "";
|
||||||
|
String total = subject.has("total") ? subject.get("total").asText().trim() : "";
|
||||||
|
String weightage = subject.has("weightage") ? subject.get("weightage").asText().trim() : "";
|
||||||
|
|
||||||
String marks = "";
|
sb.append("📚 *").append(name).append("*");
|
||||||
if (subject.has("total") && !subject.get("total").asText().isEmpty()) {
|
if (!code.isEmpty()) {
|
||||||
marks = subject.get("total").asText();
|
sb.append(" (").append(code).append(")");
|
||||||
if (subject.has("weightage") && !subject.get("weightage").asText().isEmpty()) {
|
}
|
||||||
marks += " (" + subject.get("weightage").asText() + " wt)";
|
sb.append("\n");
|
||||||
}
|
|
||||||
} else if (subject.has("marks")) {
|
if (!co1.isEmpty() || !co2.isEmpty()) {
|
||||||
marks = subject.get("marks").asText();
|
sb.append(" ├─ ");
|
||||||
|
if (!co1.isEmpty()) sb.append("CO1: ").append(co1);
|
||||||
|
if (!co1.isEmpty() && !co2.isEmpty()) sb.append(" | ");
|
||||||
|
if (!co2.isEmpty()) sb.append("CO2: ").append(co2);
|
||||||
|
sb.append("\n");
|
||||||
|
sb.append(" └─ ");
|
||||||
} else {
|
} else {
|
||||||
marks = "N/A";
|
sb.append(" └─ ");
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append("- *").append(name).append("*: ").append(marks).append("\n");
|
sb.append("*Total*: *").append(total.isEmpty() ? "N/A" : total).append("*");
|
||||||
|
if (!weightage.isEmpty()) {
|
||||||
|
sb.append(" (").append(weightage).append(" wt)");
|
||||||
|
}
|
||||||
|
sb.append("\n\n");
|
||||||
foundData = true;
|
foundData = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!foundData) {
|
if (!foundData) {
|
||||||
sb.append("Details not available in this format.\n");
|
sb.append("Details not available in this format.\n\n");
|
||||||
sb.append("\n*DEBUG RAW CAT JSON:*\n").append(rawCatJson).append("\n");
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
sb.append("⚠️ Error formatting CAT marks.\nRAW JSON: ").append(rawCatJson).append("\n");
|
sb.append("⚠️ Error formatting CAT marks.\n\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append("\n");
|
sb.append("───────────────\n\n");
|
||||||
|
|
||||||
// --- Parse Assignment Marks ---
|
// --- Parse Assignment Marks ---
|
||||||
sb.append("*ASSIGNMENT MARKS:*\n");
|
sb.append("📋 *ASSIGNMENT MARKS:*\n");
|
||||||
if (rawAssignmentJson == null) {
|
if (rawAssignmentJson == null) {
|
||||||
sb.append("❌ Failed to retrieve Assignment marks.\n");
|
sb.append("❌ Failed to retrieve Assignment marks.\n");
|
||||||
} else {
|
} else {
|
||||||
@@ -360,38 +373,256 @@ public class MessageFormatter {
|
|||||||
|
|
||||||
if (targetArray != null && targetArray.size() > 0) {
|
if (targetArray != null && targetArray.size() > 0) {
|
||||||
for (JsonNode subject : targetArray) {
|
for (JsonNode subject : targetArray) {
|
||||||
|
String code = subject.has("code") ? subject.get("code").asText() : "";
|
||||||
String name = subject.has("name") ? subject.get("name").asText() :
|
String name = subject.has("name") ? subject.get("name").asText() :
|
||||||
(subject.has("course_name") ? subject.get("course_name").asText() : "Unknown");
|
(subject.has("course_name") ? subject.get("course_name").asText() : "Subject");
|
||||||
|
String a1 = subject.has("a1") ? subject.get("a1").asText().trim() : "";
|
||||||
|
String a2 = subject.has("a2") ? subject.get("a2").asText().trim() : "";
|
||||||
|
String a3 = subject.has("a3") ? subject.get("a3").asText().trim() : "";
|
||||||
|
String a4 = subject.has("a4") ? subject.get("a4").asText().trim() : "";
|
||||||
|
String a5 = subject.has("a5") ? subject.get("a5").asText().trim() : "";
|
||||||
|
String total = subject.has("total") ? subject.get("total").asText().trim() : "";
|
||||||
|
|
||||||
String marks = "";
|
sb.append("📝 *").append(name).append("*");
|
||||||
if (subject.has("total") && !subject.get("total").asText().isEmpty()) {
|
if (!code.isEmpty()) {
|
||||||
marks = subject.get("total").asText();
|
sb.append(" (").append(code).append(")");
|
||||||
if (subject.has("weightage") && !subject.get("weightage").asText().isEmpty()) {
|
}
|
||||||
marks += " (" + subject.get("weightage").asText() + " wt)";
|
sb.append("\n");
|
||||||
}
|
|
||||||
} else if (subject.has("marks")) {
|
java.util.List<String> assignList = new java.util.ArrayList<>();
|
||||||
marks = subject.get("marks").asText();
|
if (!a1.isEmpty()) assignList.add("A1: " + a1);
|
||||||
|
if (!a2.isEmpty()) assignList.add("A2: " + a2);
|
||||||
|
if (!a3.isEmpty()) assignList.add("A3: " + a3);
|
||||||
|
if (!a4.isEmpty()) assignList.add("A4: " + a4);
|
||||||
|
if (!a5.isEmpty()) assignList.add("A5: " + a5);
|
||||||
|
|
||||||
|
if (!assignList.isEmpty()) {
|
||||||
|
sb.append(" ├─ ").append(String.join(" | ", assignList)).append("\n");
|
||||||
|
sb.append(" └─ ");
|
||||||
} else {
|
} else {
|
||||||
marks = "N/A";
|
sb.append(" └─ ");
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append("- *").append(name).append("*: ").append(marks).append("\n");
|
sb.append("*Total*: *").append(total.isEmpty() ? "N/A" : total).append("*\n\n");
|
||||||
foundData = true;
|
foundData = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!foundData) {
|
if (!foundData) {
|
||||||
sb.append("Details not available in this format.\n");
|
sb.append("Details not available in this format.\n");
|
||||||
sb.append("\n*DEBUG RAW ASSIGNMENT JSON:*\n").append(rawAssignmentJson).append("\n");
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
sb.append("⚠️ Error formatting Assignment marks.\nRAW JSON: ").append(rawAssignmentJson).append("\n");
|
sb.append("⚠️ Error formatting Assignment marks.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String formatCat1Marks(String rawCatJson) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("📈 *CAT 1 MARKS REPORT*\n\n");
|
||||||
|
if (rawCatJson == null) {
|
||||||
|
sb.append("❌ Failed to retrieve CAT 1 marks.\n\n");
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
JsonNode root = mapper.readTree(rawCatJson);
|
||||||
|
boolean foundData = false;
|
||||||
|
|
||||||
|
JsonNode targetArray = null;
|
||||||
|
if (root.has("data")) {
|
||||||
|
if (root.get("data").isArray()) {
|
||||||
|
targetArray = root.get("data");
|
||||||
|
} else if (root.get("data").isObject() && root.get("data").has("subjects") && root.get("data").get("subjects").isArray()) {
|
||||||
|
targetArray = root.get("data").get("subjects");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetArray != null && targetArray.size() > 0) {
|
||||||
|
for (JsonNode subject : targetArray) {
|
||||||
|
String code = subject.has("code") ? subject.get("code").asText() : "";
|
||||||
|
String name = subject.has("name") ? subject.get("name").asText() :
|
||||||
|
(subject.has("course_name") ? subject.get("course_name").asText() : "Subject");
|
||||||
|
String co1 = subject.has("co1") ? subject.get("co1").asText().trim() : "";
|
||||||
|
|
||||||
|
sb.append("📚 *").append(name).append("*");
|
||||||
|
if (!code.isEmpty()) {
|
||||||
|
sb.append(" (").append(code).append(")");
|
||||||
|
}
|
||||||
|
sb.append("\n");
|
||||||
|
sb.append(" └─ *CAT 1 (CO1)*: *").append(co1.isEmpty() ? "N/A" : co1).append("*\n\n");
|
||||||
|
foundData = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundData) {
|
||||||
|
sb.append("Details not available in this format.\n\n");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
sb.append("⚠️ Error formatting CAT 1 marks.\n\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String formatCat2Marks(String rawCatJson) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("📈 *CAT 2 MARKS REPORT*\n\n");
|
||||||
|
if (rawCatJson == null) {
|
||||||
|
sb.append("❌ Failed to retrieve CAT 2 marks.\n\n");
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
JsonNode root = mapper.readTree(rawCatJson);
|
||||||
|
boolean foundData = false;
|
||||||
|
|
||||||
|
JsonNode targetArray = null;
|
||||||
|
if (root.has("data")) {
|
||||||
|
if (root.get("data").isArray()) {
|
||||||
|
targetArray = root.get("data");
|
||||||
|
} else if (root.get("data").isObject() && root.get("data").has("subjects") && root.get("data").get("subjects").isArray()) {
|
||||||
|
targetArray = root.get("data").get("subjects");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetArray != null && targetArray.size() > 0) {
|
||||||
|
for (JsonNode subject : targetArray) {
|
||||||
|
String code = subject.has("code") ? subject.get("code").asText() : "";
|
||||||
|
String name = subject.has("name") ? subject.get("name").asText() :
|
||||||
|
(subject.has("course_name") ? subject.get("course_name").asText() : "Subject");
|
||||||
|
String co2 = subject.has("co2") ? subject.get("co2").asText().trim() : "";
|
||||||
|
|
||||||
|
sb.append("📚 *").append(name).append("*");
|
||||||
|
if (!code.isEmpty()) {
|
||||||
|
sb.append(" (").append(code).append(")");
|
||||||
|
}
|
||||||
|
sb.append("\n");
|
||||||
|
sb.append(" └─ *CAT 2 (CO2)*: *").append(co2.isEmpty() ? "N/A" : co2).append("*\n\n");
|
||||||
|
foundData = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundData) {
|
||||||
|
sb.append("Details not available in this format.\n\n");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
sb.append("⚠️ Error formatting CAT 2 marks.\n\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String formatCat3Marks(String rawCatJson) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("📈 *CAT 3 MARKS REPORT*\n\n");
|
||||||
|
if (rawCatJson == null) {
|
||||||
|
sb.append("❌ Failed to retrieve CAT 3 marks.\n\n");
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
JsonNode root = mapper.readTree(rawCatJson);
|
||||||
|
boolean foundData = false;
|
||||||
|
|
||||||
|
JsonNode targetArray = null;
|
||||||
|
if (root.has("data")) {
|
||||||
|
if (root.get("data").isArray()) {
|
||||||
|
targetArray = root.get("data");
|
||||||
|
} else if (root.get("data").isObject() && root.get("data").has("subjects") && root.get("data").get("subjects").isArray()) {
|
||||||
|
targetArray = root.get("data").get("subjects");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetArray != null && targetArray.size() > 0) {
|
||||||
|
for (JsonNode subject : targetArray) {
|
||||||
|
String code = subject.has("code") ? subject.get("code").asText() : "";
|
||||||
|
String name = subject.has("name") ? subject.get("name").asText() :
|
||||||
|
(subject.has("course_name") ? subject.get("course_name").asText() : "Subject");
|
||||||
|
String co3 = subject.has("co3") ? subject.get("co3").asText().trim() : "";
|
||||||
|
|
||||||
|
sb.append("📚 *").append(name).append("*");
|
||||||
|
if (!code.isEmpty()) {
|
||||||
|
sb.append(" (").append(code).append(")");
|
||||||
|
}
|
||||||
|
sb.append("\n");
|
||||||
|
sb.append(" └─ *CAT 3 (CO3)*: *").append(co3.isEmpty() ? "N/A" : co3).append("*\n\n");
|
||||||
|
foundData = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundData) {
|
||||||
|
sb.append("Details not available in this format.\n\n");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
sb.append("⚠️ Error formatting CAT 3 marks.\n\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String formatAssignmentMarks(String rawAssignmentJson) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("📋 *ASSIGNMENT MARKS:*\n\n");
|
||||||
|
if (rawAssignmentJson == null) {
|
||||||
|
sb.append("❌ Failed to retrieve Assignment marks.\n");
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
JsonNode root = mapper.readTree(rawAssignmentJson);
|
||||||
|
boolean foundData = false;
|
||||||
|
|
||||||
|
JsonNode targetArray = null;
|
||||||
|
if (root.has("data")) {
|
||||||
|
if (root.get("data").isArray()) {
|
||||||
|
targetArray = root.get("data");
|
||||||
|
} else if (root.get("data").isObject() && root.get("data").has("subjects") && root.get("data").get("subjects").isArray()) {
|
||||||
|
targetArray = root.get("data").get("subjects");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetArray != null && targetArray.size() > 0) {
|
||||||
|
for (JsonNode subject : targetArray) {
|
||||||
|
String code = subject.has("code") ? subject.get("code").asText() : "";
|
||||||
|
String name = subject.has("name") ? subject.get("name").asText() :
|
||||||
|
(subject.has("course_name") ? subject.get("course_name").asText() : "Subject");
|
||||||
|
String a1 = subject.has("a1") ? subject.get("a1").asText().trim() : "";
|
||||||
|
String a2 = subject.has("a2") ? subject.get("a2").asText().trim() : "";
|
||||||
|
String a3 = subject.has("a3") ? subject.get("a3").asText().trim() : "";
|
||||||
|
String a4 = subject.has("a4") ? subject.get("a4").asText().trim() : "";
|
||||||
|
String a5 = subject.has("a5") ? subject.get("a5").asText().trim() : "";
|
||||||
|
String total = subject.has("total") ? subject.get("total").asText().trim() : "";
|
||||||
|
|
||||||
|
sb.append("📝 *").append(name).append("*");
|
||||||
|
if (!code.isEmpty()) {
|
||||||
|
sb.append(" (").append(code).append(")");
|
||||||
|
}
|
||||||
|
sb.append("\n");
|
||||||
|
|
||||||
|
java.util.List<String> assignList = new java.util.ArrayList<>();
|
||||||
|
if (!a1.isEmpty()) assignList.add("A1: " + a1);
|
||||||
|
if (!a2.isEmpty()) assignList.add("A2: " + a2);
|
||||||
|
if (!a3.isEmpty()) assignList.add("A3: " + a3);
|
||||||
|
if (!a4.isEmpty()) assignList.add("A4: " + a4);
|
||||||
|
if (!a5.isEmpty()) assignList.add("A5: " + a5);
|
||||||
|
|
||||||
|
if (!assignList.isEmpty()) {
|
||||||
|
sb.append(" ├─ ").append(String.join(" | ", assignList)).append("\n");
|
||||||
|
sb.append(" └─ ");
|
||||||
|
} else {
|
||||||
|
sb.append(" └─ ");
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.append("*Total*: *").append(total.isEmpty() ? "N/A" : total).append("*\n\n");
|
||||||
|
foundData = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundData) {
|
||||||
|
sb.append("Details not available in this format.\n");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
sb.append("⚠️ Error formatting Assignment marks.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
public static String formatFeesAndExamFees(String rawFees, String rawExamFees) {
|
public static String formatFeesAndExamFees(String rawFees, String rawExamFees) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
@@ -898,7 +1129,9 @@ public class MessageFormatter {
|
|||||||
if (schedule.has(day)) {
|
if (schedule.has(day)) {
|
||||||
JsonNode daySchedule = schedule.get(day);
|
JsonNode daySchedule = schedule.get(day);
|
||||||
|
|
||||||
sb.append(label).append("\n");
|
StringBuilder daySb = new StringBuilder();
|
||||||
|
daySb.append("📅 *").append(label).append("*\n");
|
||||||
|
boolean dayHasClasses = false;
|
||||||
|
|
||||||
int maxPeriod = 7;
|
int maxPeriod = 7;
|
||||||
java.util.Iterator<String> fieldNames = daySchedule.fieldNames();
|
java.util.Iterator<String> fieldNames = daySchedule.fieldNames();
|
||||||
@@ -913,7 +1146,6 @@ public class MessageFormatter {
|
|||||||
|
|
||||||
for (int period = 1; period <= maxPeriod; period++) {
|
for (int period = 1; period <= maxPeriod; period++) {
|
||||||
String periodKey = String.valueOf(period);
|
String periodKey = String.valueOf(period);
|
||||||
sb.append(getNumberEmoji(period)).append(" ");
|
|
||||||
|
|
||||||
if (daySchedule.has(periodKey)) {
|
if (daySchedule.has(periodKey)) {
|
||||||
JsonNode details = daySchedule.get(periodKey);
|
JsonNode details = daySchedule.get(periodKey);
|
||||||
@@ -940,16 +1172,15 @@ public class MessageFormatter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!subjects.isEmpty()) {
|
if (!subjects.isEmpty()) {
|
||||||
sb.append(String.join(" / ", subjects)).append("\n");
|
daySb.append(" ").append(getNumberEmoji(period)).append(" ").append(String.join(" / ", subjects)).append("\n");
|
||||||
|
dayHasClasses = true;
|
||||||
hasAnyClasses = true;
|
hasAnyClasses = true;
|
||||||
} else {
|
|
||||||
sb.append("—\n");
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
sb.append("—\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sb.append("\n");
|
if (dayHasClasses) {
|
||||||
|
sb.append(daySb).append("\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,15 +8,14 @@ whatsapp.verify-token=rit_bot_secret_token_123
|
|||||||
# WhatsApp Phone Number ID (You get this from the Meta developer console)
|
# WhatsApp Phone Number ID (You get this from the Meta developer console)
|
||||||
whatsapp.phone-number-id=1236658909534007
|
whatsapp.phone-number-id=1236658909534007
|
||||||
|
|
||||||
# H2 Database Configuration
|
# PostgreSQL Database Configuration
|
||||||
spring.datasource.url=jdbc:h2:file:./db/whatsappbot
|
spring.datasource.url=${DB_URL}
|
||||||
spring.datasource.driverClassName=org.h2.Driver
|
spring.datasource.driver-class-name=org.postgresql.Driver
|
||||||
spring.datasource.username=sa
|
spring.datasource.username=${DB_USERNAME}
|
||||||
spring.datasource.password=password
|
spring.datasource.password=${DB_PASSWORD}
|
||||||
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
|
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
|
||||||
spring.jpa.hibernate.ddl-auto=update
|
spring.jpa.hibernate.ddl-auto=update
|
||||||
spring.h2.console.enabled=true
|
|
||||||
|
|
||||||
# Encryption Secret for Passcodes (Must be 16, 24, or 32 bytes)
|
# Encryption Secret for Passcodes (Must be 16, 24, or 32 bytes)
|
||||||
bot.encryption.secret=12345678901234567890123456789012
|
bot.encryption.secret=12345678901234567890123456789012
|
||||||
whatsapp.api-token=EAAc3Wjql00oBSfSg58drijkqefLn47aI2vYcl8r6GxuwC5vJRt2G8Std3ynf3KnKp9SyuwKXAQfr2Q7hYrNOE66t3dRcS3GAWFbDbikrmvXkbjpIh5V9QNVGI2T4V1VeJAj9d6HMsiHZCAJujaIVLdLleIPti4ok9brnNf1BPwBZA8SZAQ06OUcbSba3SZAQhcoFsh1Utz1g9PLCqsl8Fh9H8ynVJagAxMYqF86sV7fEHKpG6eCp2EkRtfOoE7XbL5AurGkiZA5ZBHiSZCOOujplm3cmgZDZD
|
whatsapp.api-token=EAAc3Wjql00oBSWGWTlmDkMegzpdfKYWqNp0jci6efxyhHArM0371vc3t8XEZA74jgy6reRpS0XTwH1qUSoiJ5t1KjlX3PpY2fUVa1zAaWBDq0FB5YG6ll20pSfZBHHcvAABIweGSkWDY4Oe2znY76JWSlPpD0LXORdiRTZChu1uTMOMSgUxGdaQTiJJzxkVovCrK6jzocjGzwZCCLKAKyxKqLMECDfwgnrxaTqwloQ7oZA1X1ZCstFvPfGQ32LJ59SBeGzTuC3PM8GewZB6uvYiKSuGEAZDZD
|
||||||
|
|||||||
Reference in New Issue
Block a user