Skip to content

Commit

Permalink
Fix server.properties key miss
Browse files Browse the repository at this point in the history
Update CourseData, change departmentName->departmentId, make serialNumber integer, smaller json size
Update HistorySearch with, smaller file size, include department id for each course, faster fetch time
Update All dept api for multi-language
Update sqlite version
  • Loading branch information
WavJaby committed Feb 20, 2024
1 parent 7edd76e commit 8cf5f81
Show file tree
Hide file tree
Showing 13 changed files with 372 additions and 196 deletions.
2 changes: 1 addition & 1 deletion .idea/dataSources.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/main/java/com/wavjaby/CourseEnrollmentTracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ public void run() {
for (CourseData courseData : newCourseDataList) {
if (courseData.getSerialNumber() == null)
continue;
tableIndex.put(courseData.getSerialNumber(), 0);
tableIndex.put(courseData.getDepartmentId() + '-' + courseData.getSerialNumber(), 0);
}
int i = 0;
for (Map.Entry<String, Integer> entry : tableIndex.entrySet())
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/wavjaby/CourseWatcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -349,11 +349,11 @@ public static String intToString(int integer) {
return integer > 0 ? "+" + integer : String.valueOf(integer);
}

public static List<CourseDataDifference> getDifferent(@NotNull List<CourseData> last, @NotNull List<CourseData> now) {
public static List<CourseDataDifference> getDifferent(List<CourseData> last, @NotNull List<CourseData> now) {
HashMap<String, CourseData> lastCourseDataMap = new HashMap<>();
for (CourseData i : last)
if (i.getSerialNumber() != null)
lastCourseDataMap.put(i.getSerialNumber(), i);
lastCourseDataMap.put(i.getDepartmentId() + '-' + i.getSerialNumber(), i);

List<CourseDataDifference> diff = new ArrayList<>();

Expand Down
14 changes: 2 additions & 12 deletions src/main/java/com/wavjaby/FileHost.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
public class FileHost implements Module {
private static final String TAG = "FileHost";
private static final Logger logger = new Logger(TAG);
private final File fileRoot, quizletFileRot;
private final File fileRoot;
private final FileNameMap fileNameMap = URLConnection.getFileNameMap();

@Override
Expand All @@ -29,13 +29,9 @@ public String getTag() {

public FileHost(PropertiesReader serverSettings) {
String frontendFilePath = serverSettings.getProperty("frontendFilePath", "./");
String quizletFilePath = serverSettings.getProperty("quizletFilePath", "./quizlet");
fileRoot = new File(frontendFilePath);
quizletFileRot = new File(quizletFilePath);
if (!fileRoot.exists())
logger.err("Frontend file path not found");
if (!quizletFileRot.exists())
logger.err("Quizlet file path not found");
}

@SuppressWarnings("unused")
Expand All @@ -45,7 +41,6 @@ public void fileHost(HttpExchange req) {
String path = req.getRequestURI().getPath();
try {
boolean filePass = false;
boolean quizlet = false;
if (path.startsWith("/NCKUpp")) {
path = path.substring(7);
if (path.equals("/")) {
Expand All @@ -55,11 +50,6 @@ public void fileHost(HttpExchange req) {
path.startsWith("/index") ||
path.equals("/web_manifest.json"))
filePass = true;
else if (path.startsWith("/quizlet")) {
path = path.substring(8);
quizlet = true;
filePass = true;
}
}
if (!filePass) {
req.sendResponseHeaders(404, 0);
Expand All @@ -74,7 +64,7 @@ else if (path.startsWith("/quizlet")) {
if (path.lastIndexOf('.') < path.lastIndexOf('/'))
path += ".html";

File file = new File(quizlet ? quizletFileRot : fileRoot, path);
File file = new File(fileRoot, path);

// File not found
if (!file.isFile()) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/wavjaby/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public class Main {
addModule(proxyManager);
String mainDatabasePath = "./database.db";
SQLDriver SQLDriver = new SQLDriver(mainDatabasePath,"jdbc:sqlite:" + mainDatabasePath,
"./sqlite-jdbc-3.40.0.0.jar", "org.sqlite.JDBC", null, null);
"./sqlite-jdbc-3.42.0.1.jar", "org.sqlite.JDBC", null, null);
addModule(SQLDriver);
addModule(new WebSocket());
addModule(new IP());
Expand Down Expand Up @@ -130,7 +130,7 @@ public class Main {
addModule(new CourseWatcher(search, allDept, watchDog, serverSettings));


// logger.log("Server started, " + server.hostname + ':' + server.port);
logger.log("Server started, " + server.hostname + ':' + server.port);

long start = System.currentTimeMillis();
Runtime.getRuntime().addShutdownHook(new Thread(this::stopModules));
Expand Down
89 changes: 73 additions & 16 deletions src/main/java/com/wavjaby/api/AllDept.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
import com.wavjaby.ProxyManager;
import com.wavjaby.api.search.RobotCheck;
import com.wavjaby.api.search.Search;
import com.wavjaby.json.JsonArray;
import com.wavjaby.json.JsonArrayStringBuilder;
import com.wavjaby.json.JsonObject;
import com.wavjaby.json.JsonObjectStringBuilder;
import com.wavjaby.lib.ApiResponse;
import com.wavjaby.lib.Cookie;
import com.wavjaby.lib.HttpResponseData;
Expand All @@ -23,10 +27,7 @@
import java.net.CookieManager;
import java.net.CookieStore;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;

import static com.wavjaby.Main.courseNckuOrg;
import static com.wavjaby.Main.courseNckuOrgUri;
Expand All @@ -36,7 +37,8 @@
public class AllDept implements Module {
private static final String TAG = "AllDept";
private static final Logger logger = new Logger(TAG);
private static final String ALLDEPT_FILE_PATH = "./api_file/alldept.json";
private static final String ALL_DEPT_FILE_PATH = "./api_file/allDept.json";
public static final Map<String, String> deptIdMap = new HashMap<>();
private final RobotCheck robotCheck;
private final ProxyManager proxyManager;
private File allDeptFile;
Expand All @@ -50,25 +52,80 @@ public AllDept(RobotCheck robotCheck, ProxyManager proxyManager) {
@Override
public void start() {
// Read cache
allDeptFile = getFileFromPath(ALLDEPT_FILE_PATH, true, true);
allDeptFile = getFileFromPath(ALL_DEPT_FILE_PATH, true, true);
if (allDeptFile.exists()) {
deptGroup = readFileToString(allDeptFile, false, StandardCharsets.UTF_8);
assert deptGroup != null;
JsonObject jsonObject = new JsonObject(deptGroup);
for (Object i : jsonObject.getArray("deptGroup")) {
for (Object j : ((JsonObject) i).getArray("dept")) {
deptIdMap.put(((JsonArray) j).getString(1), ((JsonArray) j).getString(0));
deptIdMap.put(((JsonArray) j).getString(2), ((JsonArray) j).getString(0));
}
}
}

// Get new dept data
CookieStore cookieStore = new CookieManager().getCookieStore();
Cookie.addCookie("PHPSESSID", "NCKUpp", courseNckuOrgUri, cookieStore);
Search.AllDeptGroupData allDept = getAllDeptGroupData(cookieStore);
if (allDept != null && allDept.getDeptCount() > 0) {
logger.log("Get " + allDept.getDeptCount() + " dept");
deptGroup = allDept.toString();
try {
FileWriter fileWriter = new FileWriter(allDeptFile);
fileWriter.write(deptGroup);
fileWriter.close();
} catch (IOException e) {
logger.errTrace(e);
Cookie.addCookie("cos_lang", "cht", courseNckuOrgUri, cookieStore);
Search.AllDeptGroupData allDeptTW = getAllDeptGroupData(cookieStore);
Cookie.addCookie("cos_lang", "eng", courseNckuOrgUri, cookieStore);
Search.AllDeptGroupData allDeptEN = getAllDeptGroupData(cookieStore);
if (allDeptTW == null || allDeptTW.getDeptCount() == 0 ||
allDeptEN == null || allDeptEN.getDeptCount() == 0) {
logger.err("Failed to get all departments data");
return;
}
if (allDeptTW.getDeptCount() != allDeptEN.getDeptCount()) {
logger.err("Failed to get all departments data, department count not match");
return;
}

int count = allDeptTW.getDeptCount();
logger.log("Get " + count + " departments");


JsonObjectStringBuilder builder = new JsonObjectStringBuilder();
JsonArrayStringBuilder outDeptGroup = new JsonArrayStringBuilder();
List<Search.AllDeptGroupData.Group> groupsTW = allDeptTW.getGroups();
List<Search.AllDeptGroupData.Group> groupsEN = allDeptEN.getGroups();

for (int i = 0; i < groupsTW.size(); i++) {
Search.AllDeptGroupData.Group groupTW = groupsTW.get(i);
Search.AllDeptGroupData.Group groupEN = groupsEN.get(i);
JsonObjectStringBuilder groupOut = new JsonObjectStringBuilder();
groupOut.append("nameTW", groupTW.name);
boolean emptyNameEN = true;
for (int j = 0; j < groupEN.name.length(); j++)
if (groupEN.name.charAt(j) != '*') {
emptyNameEN = false;
break;
}
groupOut.append("nameEN", emptyNameEN ? groupTW.name : groupEN.name);

JsonArrayStringBuilder outDeptData = new JsonArrayStringBuilder();
for (int j = 0; j < groupTW.dept.size(); j++) {
Search.AllDeptGroupData.DeptData deptTW = groupTW.dept.get(j);
Search.AllDeptGroupData.DeptData deptEN = groupEN.dept.get(j);
outDeptData.append(new JsonArrayStringBuilder()
.append(deptTW.id).append(deptTW.name).append(deptEN.name));
deptIdMap.put(deptTW.name, deptTW.id);
deptIdMap.put(deptEN.name, deptTW.id);
}
groupOut.append("dept", outDeptData);
outDeptGroup.append(groupOut);
}

builder.append("deptGroup", outDeptGroup);
builder.append("deptCount", count);
deptGroup = builder.toString();
try {
FileWriter fileWriter = new FileWriter(allDeptFile);
fileWriter.write(deptGroup);
fileWriter.close();
} catch (IOException e) {
logger.errTrace(e);
}
}

Expand Down
86 changes: 55 additions & 31 deletions src/main/java/com/wavjaby/api/search/CourseData.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,38 +4,42 @@
import com.wavjaby.json.JsonObject;
import com.wavjaby.json.JsonObjectStringBuilder;

import java.util.Objects;

public class CourseData {
final String semester;
final String departmentName; // Can be null
final String serialNumber; // Can be null
final String departmentId;
final Integer serialNumber; // Nullable
final String attributeCode;
final String systemNumber;
final Integer forGrade; // Can be null
final String forClass; // Can be null
final String forClassGroup; // Can be null
final String category; // Can be null
final String courseName;
final String courseNote; // Can be null
final String courseLimit; // Can be null
final TagData[] tags; // Can be null
final Float credits; // Can be null
final Boolean required; // Can be null
final String[] instructors; // Can be null
final Integer selected; // Can be null
final Integer available; // Can be null
final TimeData[] timeList; // Can be null
final String btnPreferenceEnter; // Can be null
final String btnAddCourse; // Can be null
final String btnPreRegister; // Can be null
final String btnAddRequest; // Can be null
final Integer forGrade; // Nullable
final String forClass; // Nullable
final String forClassGroup; // Nullable
final String category; // Nullable
final String courseName; // Maybe empty
final String courseNote; // Nullable
final String courseLimit; // Nullable
final TagData[] tags; // Nullable
final Float credits; // Nullable
final Boolean required; // Nullable
final String[] instructors; // Nullable
final Integer selected; // Nullable
final Integer available; // Nullable
final TimeData[] timeList; // Nullable

// User action token(require login)
final String btnPreferenceEnter; // Nullable
final String btnAddCourse; // Nullable
final String btnPreRegister; // Nullable
final String btnAddRequest; // Nullable


public CourseData(JsonObject jsonObject) {
// output
this.semester = jsonObject.getString("y");
this.departmentName = jsonObject.getString("dn");
this.departmentId = jsonObject.getString("dn");

this.serialNumber = jsonObject.getString("sn");
this.serialNumber = (Integer) jsonObject.getObject("sn");
this.attributeCode = jsonObject.getString("ca");
this.systemNumber = jsonObject.getString("cs");

Expand Down Expand Up @@ -84,8 +88,8 @@ public CourseData(JsonObject jsonObject) {
}

public CourseData(String semester,
String departmentName,
String serialNumber, String systemNumber, String attributeCode,
String departmentId,
Integer serialNumber, String systemNumber, String attributeCode,
Integer forGrade, String forClass, String forClassGroup,
String category,
String courseName, String courseNote, String courseLimit, TagData[] tags,
Expand All @@ -95,7 +99,7 @@ public CourseData(String semester,
TimeData[] timeList,
String btnPreferenceEnter, String btnAddCourse, String btnPreRegister, String btnAddRequest) {
this.semester = semester;
this.departmentName = departmentName;
this.departmentId = departmentId;
this.serialNumber = serialNumber;
this.systemNumber = systemNumber;
this.attributeCode = attributeCode;
Expand Down Expand Up @@ -141,6 +145,17 @@ public String toString() {
return name + '|' + colorID + '|';
return name + '|' + colorID + '|' + url;
}

@Override
public boolean equals(Object obj) {
if (obj instanceof TagData) {
TagData other = (TagData) obj;
return Objects.equals(other.name, name) &&
Objects.equals(other.colorID, colorID) &&
Objects.equals(other.url, url);
}
return false;
}
}

public static class TimeData {
Expand Down Expand Up @@ -236,7 +251,7 @@ public String toString() {
// output
JsonObjectStringBuilder jsonBuilder = new JsonObjectStringBuilder();
jsonBuilder.append("y", semester);
jsonBuilder.append("dn", departmentName);
jsonBuilder.append("dn", departmentId);

jsonBuilder.append("sn", serialNumber);
jsonBuilder.append("ca", attributeCode);
Expand Down Expand Up @@ -267,14 +282,23 @@ public String toString() {
else jsonBuilder.append("a", available);

jsonBuilder.append("t", toJsonArray(timeList));
jsonBuilder.append("pe", btnPreferenceEnter);
jsonBuilder.append("ac", btnAddCourse);
jsonBuilder.append("pr", btnPreRegister);
jsonBuilder.append("ar", btnAddRequest);

if (btnPreferenceEnter != null)
jsonBuilder.append("pe", btnPreferenceEnter);
if (btnAddCourse != null)
jsonBuilder.append("ac", btnAddCourse);
if (btnPreRegister != null)
jsonBuilder.append("pr", btnPreRegister);
if (btnAddRequest != null)
jsonBuilder.append("ar", btnAddRequest);
return jsonBuilder.toString();
}

public String getSerialNumber() {
public String getDepartmentId() {
return departmentId;
}

public Integer getSerialNumber() {
return serialNumber;
}

Expand Down
Loading

0 comments on commit 8cf5f81

Please sign in to comment.