HLJU Class Schedule

Export your classes to a ics file.

  1. // ==UserScript==
  2. // @name HLJU Class Schedule
  3. // @namespace https://fuyuhin.me
  4. // @description Export your classes to a ics file.
  5. // @include http://*.hlju.edu.cn/xsxk/index.xk
  6. // @version 0.2
  7. // @grant none
  8. // ==/UserScript==
  9. function get_first_week_num(week_sequence){
  10. return week_sequence.indexOf('1') + 1;
  11. }
  12.  
  13. function get_last_week_num(week_sequence){
  14. return week_sequence.lastIndexOf('1') + 1;
  15. }
  16.  
  17. function date_to_ics_format_string(date) {
  18. var s = '';
  19. s = s + date.getFullYear();
  20. var month = date.getMonth() + 1;
  21. if (month > 9) {
  22. s = s + month.toString();
  23. }
  24. else{
  25. s = s + '0' + month.toString();
  26. }
  27. var d = date.getDate();
  28. if (d > 9) {
  29. s = s + d.toString();
  30. }
  31. else{
  32. s = s + '0' + d.toString();
  33. }
  34. s = s + 'T';
  35. var hour = date.getHours();
  36. if (hour > 9) {
  37. s = s + hour.toString();
  38. }
  39. else{
  40. s = s + '0' + hour.toString();
  41. }
  42. var minute = date.getMinutes();
  43. if (minute > 9) {
  44. s = s + minute.toString();
  45. }
  46. else{
  47. s = s + '0' + minute.toString();
  48. }
  49. s = s + '00';
  50. return s;
  51. }
  52.  
  53. function get_repead_rule(week_sequence, weekday, until_date)
  54. {
  55. var week_array = new Array();
  56. for (var i = 0; i < week_sequence.length; i++) {
  57. if (week_sequence[i] == '1'){
  58. week_array.push(i + 1);
  59. }
  60. }
  61. var interval;
  62. if (week_array[week_array.length - 1] - week_array[0] == week_array.length - 1) {
  63. interval = '1';
  64. }
  65. else{
  66. interval = '2';
  67. }
  68. var byday;
  69. switch(weekday){
  70. case '1': byday = 'MO'; break;
  71. case '2': byday = 'TU'; break;
  72. case '3': byday = 'WE'; break;
  73. case '4': byday = 'TH'; break;
  74. case '5': byday = 'FR'; break;
  75. case '6': byday = 'SA'; break;
  76. case '7': byday = 'SU'; break;
  77. };
  78. var until = date_to_ics_format_string(until_date);
  79. return 'RRULE:FREQ=WEEKLY;UNTIL=' + until + 'Z;INTERVAL=' + interval + ';BYDAY=' + byday + ';WKST=SU';
  80. }
  81.  
  82. function lesson_start_time(begin_session){
  83. switch (begin_session){
  84. case '1': return 0800;
  85. case '2': return 0900;
  86. case '3': return 1020;
  87. case '4': return 1120;
  88. case '5': return 1330;
  89. case '6': return 1430;
  90. case '7': return 1540;
  91. case '8': return 1640;
  92. case '9': return 1830;
  93. case '10': return 1925;
  94. case '11': return 2020;
  95. }
  96. }
  97.  
  98. function lesson_end_time(begin_session){
  99. switch (begin_session){
  100. case '1': return 0850;
  101. case '2': return 0950;
  102. case '3': return 1110;
  103. case '4': return 1210;
  104. case '5': return 1420;
  105. case '6': return 1520;
  106. case '7': return 1630;
  107. case '8': return 1730;
  108. case '9': return 1920;
  109. case '10': return 2015;
  110. case '11': return 2110;
  111. }
  112. }
  113.  
  114. function fuck(week_fuck, weekday_fuck)
  115. {
  116. var a = 0;
  117. var b = 0;
  118. var c = 0;
  119. var d = 0;
  120. a = week_fuck - 1;
  121. b = a * 7;
  122. c = b + weekday_fuck;
  123. d = c - 1;
  124. return d;
  125. }
  126.  
  127. function get_date(week, weekday, time){
  128. var first_monday = new Date("2017-02-27");
  129. var days = 0;
  130. days = fuck(week, parseInt(weekday));
  131. first_monday.setDate(first_monday.getDate() + days);
  132. first_monday.setHours(parseInt(time / 100));
  133. first_monday.setMinutes(parseInt(time % 100));
  134. first_monday.setSeconds(0);
  135. return first_monday;
  136. }
  137.  
  138. function Event(class_info){
  139. this.uid = class_info.jxbid;
  140. this.summary = class_info.kcm;
  141. this.teacher = class_info.skjs;
  142. this.print = function () {
  143. var ics_vevent = '';
  144. var lessons = class_info.pkxxList;
  145. for (var i in lessons) {
  146. var event_begin = 'BEGIN:VEVENT\r\n';
  147. var event_end = 'END:VEVENT\r\n';
  148. var dt_start = get_date(get_first_week_num(lessons[i].zcbh),
  149. parseInt(lessons[i].skxq),
  150. lesson_start_time(lessons[i].ksjc));
  151. var dt_end = get_date(get_first_week_num(lessons[i].zcbh),
  152. parseInt(lessons[i].skxq),
  153. lesson_end_time(lessons[i].jsjc));
  154. ics_vevent = ics_vevent + event_begin +
  155. 'DTSTART;TZID=Asia/Shanghai:' + date_to_ics_format_string(dt_start) + '\r\n' +
  156. 'DTEND;TZID=Asia/Shanghai:' + date_to_ics_format_string(dt_end) + '\r\n' +
  157. get_repead_rule(lessons[i].zcbh, lessons[i].skxq,
  158. get_date(get_last_week_num(lessons[i].zcbh),
  159. parseInt(lessons[i].skxq),
  160. lesson_end_time(lessons[i].jsjc))) + '\r\n' +
  161. 'DTSTAMP:20160822T125937Z\r\n' +
  162. 'UID:' + this.uid + i.toString() + '\r\n' +
  163. 'LOCATION:' + lessons[i].jsmc + '\r\n' +
  164. 'DESCRIPTION:' + lessons[i].zcmc + '\r\n' +
  165. 'SEQUENCE:0\r\n' +
  166. 'STATUS:CONFIRMED\r\n' +
  167. 'SUMMARY:' + this.summary + ' ' + this.teacher + '\r\n' +
  168. 'TRANSP:OPAQUE\r\n' +
  169. event_end;
  170. }
  171. return ics_vevent;
  172. }
  173. }
  174.  
  175. var ics_vevents = '';
  176. for (var key in yxJxbList){
  177. if (yxJxbList[key].pkxxList[0].jsmc !== '') {
  178. var event = new Event(yxJxbList[key]);
  179. ics_vevents = ics_vevents + event.print();
  180. }
  181. }
  182. var event_begin = 'BEGIN:VCALENDAR\r\nPRODID:Fuyuhin.me\r\nVERSION:2.0\r\nCALSCALE:GREGORIAN\r\nMETHOD:PUBLISH\r\nX-WR-CALNAME:HLJU Class Schedule\r\nX-WR-TIMEZONE:Asia/Shanghai\r\nBEGIN:VTIMEZONE\r\nTZID:Asia/Shanghai\r\nX-LIC-LOCATION:Asia/Shanghai\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\n';
  183. var event_end = 'END:VCALENDAR';
  184. var ics_content = event_begin + ics_vevents + event_end;
  185. // console.log(ics_content);
  186. // alert(ics_content);
  187.  
  188. function download(fileName, blob){
  189. var aLink = document.createElement('a');
  190. var evt = document.createEvent("MouseEvents");
  191. evt.initEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  192. aLink.download = fileName;
  193. aLink.href = URL.createObjectURL(blob);
  194. aLink.dispatchEvent(evt);
  195. }
  196.  
  197. function stringToBlob(text) {
  198. var blob = new Blob([text], {"type":'text/plain; charset="UTF-8"'});
  199. return blob;
  200. }
  201.  
  202. var blob = stringToBlob(ics_content);
  203. download('Class.ics', blob);