forked from kyabe2718/pyeeic2019bot
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathassignment_notify.py
160 lines (139 loc) · 7.18 KB
/
assignment_notify.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#! /bin/usr/python3
import re
from datetime import timezone, timedelta, datetime, date
import wiki
# タイムゾーンの生成
JST = timezone(timedelta(hours=+9), 'JST')
def getToday(time_zone: timezone):
now = datetime.now(tz=time_zone)
return date(year=now.year, month=now.month, day=now.day)
class AssignmentList:
def __init__(self, assginment_page_content: str):
self.list = self.getAllAssignmentList(assginment_page_content)
def getAllAssignmentList(self, assignment_page_content: str):
"""
ret = {
'教科名1' : [
{'assignment_title': '課題名', 'deadline_day': 'xxxx-xx-xx', 'deadline_detail': '締め切りの詳細'},
{'assignment_title': '課題名2', 'deadline_day': 'yyyy-yy-yy', 'deadline_detail': '締め切りの詳細2'}
],
'教科名2' : [
{'assignment_title': '課題名', 'deadline_day': 'xxxx-xx-xx', 'deadline_detail': '締め切りの詳細'},
]
}
"""
subject_pattern = re.compile(r'^\s*==\s*([^=]*?)\s*==\s*$')
assignment_pattern = re.compile(r'^\s*===\s*([^=]*?)\s*===\s*$')
deadline_day_pattern = re.compile(r'^\s*\*\s*期日:\s*(\d{4}-\d{1,2}-\d{1,2})\s*$')
deadline_detail_pattern = re.compile(r'^\s*\*\s*期限:\s*(.*)$')
data = {}
lines = assignment_page_content.splitlines()
subject = ''
assignment = {}
for line in lines:
"""
一行ずつ見ていく
最初に教科名が来るはずなので教科名を保存しておき(subject),
課題名(assignment_title), 締め切り(deadline_day, deadline_detail)をkeyにするdictを
data[subject]に追加
戻値は教科名をkeyとしたdict.
各valueはassignment_title, deadline_day, deadline_detailをkeyにもつdict
deadline_dayはyear-month-dayの形にのみマッチする
"""
subject_match = subject_pattern.match(line)
assignment_match = assignment_pattern.match(line)
deadline_day_match = deadline_day_pattern.match(line)
deadline_detail_match = deadline_detail_pattern.match(line)
is_something_written = (line != '')
if not is_something_written:
continue
if subject == '' and not subject_match:
# まだ教科名が来ていないなら,何もせず次の行へ
continue
if subject_match:
if 'assignment_title' in assignment.keys() and 'assignment_title' in assignment.keys() and 'assignment_title' in assignment.keys():
# assignmentの条件が揃った状態で次の科目に来たら,課題を登録する
data[subject].append(assignment)
assignment = {}
subject = subject_match.group(1)
if subject not in data.keys():
data[subject] = []
elif assignment_match:
if 'assignment_title' in assignment.keys() and 'assignment_title' in assignment.keys() and 'assignment_title' in assignment.keys():
# assignmentの条件が揃った状態で次の課題に来たら,課題を登録する
data[subject].append(assignment)
assignment = {}
assignment['assignment_title'] = assignment_match.group(1)
elif deadline_day_match:
dt = datetime.strptime(deadline_day_match.group(1), '%Y-%m-%d')
assignment['deadline_day'] = date(dt.year, dt.month, dt.day)
elif deadline_detail_match:
assignment['deadline_detail'] = deadline_detail_match.group(1)
elif is_something_written:
if 'something_written' not in assignment.keys():
assignment['something_written'] = line
else:
assignment['something_written'] += '\n' + line
# assignmentの条件が揃った状態で一番最後に来たら,課題を登録する
if 'assignment_title' in assignment.keys() and 'assignment_title' in assignment.keys() and 'assignment_title' in assignment.keys():
data[subject].append(assignment)
return data
def getAssignmentListSinceUntil(self, since: date, until: date):
ret = {}
for subject in self.list:
for assignment in self.list[subject]:
if since <= assignment['deadline_day'] <= until:
if subject not in ret:
ret[subject] = [assignment]
else:
ret[subject].append(assignment)
return ret
class AssignmentListMgr:
def __init__(self, wiki_session: wiki.MediaWikiSession, page_name: str):
self.wiki_session = wiki_session
self.page_name = page_name
content = self.wiki_session.getPageContent(self.page_name)
self.assignment_list = AssignmentList(content)
self.last_update_time = datetime.now(tz=JST)
def updateAssignmentList(self):
content = self.wiki_session.getPageContent(self.page_name)
new_assignment_list = AssignmentList(content)
new_assignment = {}
for subject, assignments in new_assignment_list.list.items():
if subject not in self.assignment_list.list.keys():
new_assignment[subject] = assignments
continue
for assignment in assignments:
if assignment not in self.assignment_list.list[subject]:
if subject not in new_assignment:
new_assignment[subject] = [assignment]
else:
new_assignment[subject].append(assignment)
print(new_assignment)
self.assignment_list = new_assignment_list
self.last_update_time = datetime.now(tz=JST)
return new_assignment
def getNotDeadlineAssignmentList(self):
# 今日から一年後まで
return self.assignment_list.getAssignmentListSinceUntil(
since=getToday(JST), until=getToday(JST) + timedelta(weeks=52))
def getTommorowAssignmentList(self):
# 明日提出の課題一覧
return self.assignment_list.getAssignmentListSinceUntil(
since=getToday(JST) + timedelta(days=1), until=getToday(JST) + timedelta(days=1))
def getNextWeekAssignmentList(self):
# 来週提出の課題一覧
return self.assignment_list.getAssignmentListSinceUntil(
since=getToday(JST) + timedelta(days=1), until=getToday(JST) + timedelta(weeks=1))
def parseAssignmentList(assignment_list):
s = ""
for subject in assignment_list:
s += "*" + subject + "*\n"
for index, assignment in enumerate(assignment_list[subject]):
print(assignment)
s += str(index + 1) + ". " + assignment['assignment_title'] + "\n"
s += " 期日 " + str(assignment['deadline_day']) + "\n"
s += " 期限 " + assignment['deadline_detail'] + "\n"
if 'something_written' in assignment.keys():
s += " 補足 " + assignment['something_written'] + "\n"
return s