Skip to content

Commit 6358da1

Browse files
committed
add sync endpoint
1 parent 7177aa9 commit 6358da1

4 files changed

Lines changed: 128 additions & 8 deletions

File tree

task_api.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from task_database import complete_task, generate_task, get_user, manual_complete_tasks, manual_revert_tasks
1010
from app_setup import app, db
1111
from tasklists import get_task_tier, list_for_tier
12+
from templesync import sync_user_tasks
1213
from user_dao import UserDatabaseObject
1314

1415

@@ -110,3 +111,20 @@ def apiv2_generate_task(user: UserDatabaseObject):
110111
return { 'task_id': generated_task.id }
111112

112113
return { 'error': 'No available tasks to generate' }, HTTPStatus.BAD_REQUEST
114+
115+
116+
@app.route('/api/v2/user/sync', methods=['POST'])
117+
@token_required_v2
118+
def apiv2_sync(user: UserDatabaseObject):
119+
body = request.json
120+
121+
collection_log = set(body['collection_log'])
122+
diaries = body['diaries']
123+
skills = body['skills']
124+
125+
changed_tasks = sync_user_tasks(user.username, collection_log, diaries, skills)
126+
127+
return {
128+
'completed': list(changed_tasks[0]),
129+
'uncompleted': list(changed_tasks[1])
130+
}

task_types.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,16 @@ class CollectionLogVerificationData(VerificationData):
1212
item_ids: list[int]
1313
count: int
1414

15+
@dataclass
16+
class AchievementDiaryVerificationData(VerificationData):
17+
region: str
18+
difficulty: str
19+
20+
@dataclass
21+
class SkillVerificationData(VerificationData):
22+
experience: dict
23+
count: int
24+
1525

1626
@dataclass
1727
class TaskData:

tasklists.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,31 @@
11
import json
2-
from task_types import TaskData, TaskTag, VerificationData, CollectionLogVerificationData
2+
from task_types import AchievementDiaryVerificationData, SkillVerificationData, TaskData, TaskTag, VerificationData, CollectionLogVerificationData
33

4-
def to_verification_data(data: dict) -> VerificationData or None: # type: ignore
4+
def to_verification_data(data: dict) -> VerificationData | None:
55
if data is None:
66
return None
77

88
method: str = data['method']
9-
if (method != "collection-log"):
10-
return None
9+
if method == "collection-log":
10+
return CollectionLogVerificationData(
11+
method=data['method'],
12+
item_ids=data['itemIds'],
13+
count=data['count']
14+
)
15+
elif method == "achievement-diary":
16+
return AchievementDiaryVerificationData(
17+
method=data['method'],
18+
region=data['region'],
19+
difficulty=data['difficulty']
20+
)
21+
elif method == "skill":
22+
return SkillVerificationData(
23+
method=data['method'],
24+
experience=data['experience'],
25+
count=data['count']
26+
)
1127

12-
return CollectionLogVerificationData(method=data['method'],
13-
item_ids=data['itemIds'],
14-
count=data['count'])
28+
return None
1529

1630
def to_task_class(data: dict) -> TaskData:
1731
return TaskData(id=data['id'],

templesync.py

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import requests
2+
from task_database import __set_current_task, __set_task_complete, get_user
23
import tasklists
34
from datetime import datetime, timezone
4-
from task_types import CollectionLogVerificationData, TaskData
5+
from task_types import AchievementDiaryVerificationData, CollectionLogVerificationData, SkillVerificationData, TaskData
56

67

78
def temple_player_data(username: str):
@@ -172,5 +173,82 @@ def format_completed_tasks(completed_tasks: set):
172173
# print(sorted_completed_tasks)
173174
return format_completed_tasks(sorted_completed_tasks)
174175

176+
177+
def sync_user_tasks(username: str, collection_log: set[int], diaries: dict, skills: dict) -> tuple[set[int], set[int]]:
178+
tiers = ['easy', 'medium', 'hard', 'elite', 'master']
179+
tasks = [ task for tier in tiers for task in tasklists.list_for_tier(tier) ]
180+
181+
completed_tasks: set[int] = set()
182+
uncompleted_tasks: set[int] = set()
183+
184+
for task in tasks:
185+
verification_data = task.verification
186+
task_completed = False
187+
188+
if isinstance(verification_data, CollectionLogVerificationData):
189+
task_completed = verify_collection_log(collection_log, verification_data)
190+
elif isinstance(verification_data, AchievementDiaryVerificationData):
191+
task_completed = verify_achievement_diary(diaries, verification_data)
192+
elif isinstance(verification_data, SkillVerificationData):
193+
task_completed = verify_skill(skills, verification_data)
194+
195+
if task_completed:
196+
completed_tasks.add(task.id)
197+
else:
198+
uncompleted_tasks.add(task.id)
199+
200+
user = get_user(username)
201+
old_completed_tasks = set([task.id for task in [
202+
*user.easy.completed_tasks,
203+
*user.medium.completed_tasks,
204+
*user.hard.completed_tasks,
205+
*user.elite.completed_tasks,
206+
*user.master.completed_tasks,
207+
]])
208+
209+
new_completed_tasks: set[int] = set()
210+
new_uncompleted_tasks: set[int] = set()
211+
212+
for task_id in completed_tasks:
213+
if task_id not in old_completed_tasks:
214+
__set_task_complete(username, None, task_id, True)
215+
new_completed_tasks.add(task_id)
216+
217+
for task_id in uncompleted_tasks:
218+
if task_id in old_completed_tasks:
219+
__set_task_complete(username, None, task_id, False)
220+
new_uncompleted_tasks.add(task_id)
221+
222+
current_task_id = user.current_task_id()
223+
if current_task_id in new_completed_tasks:
224+
__set_current_task(username, None, None, False)
225+
226+
return new_completed_tasks, new_uncompleted_tasks
227+
228+
229+
def verify_collection_log(collection_log: set[int], verification_data: CollectionLogVerificationData) -> bool:
230+
log_count = 0
231+
for item_id in verification_data.item_ids:
232+
if item_id in collection_log:
233+
log_count += 1
234+
235+
return log_count >= verification_data.count
236+
237+
238+
def verify_achievement_diary(diaries: dict, verification_data: AchievementDiaryVerificationData) -> bool:
239+
region = verification_data.region
240+
difficulty = verification_data.difficulty
241+
242+
return diaries[region][difficulty]
243+
244+
245+
def verify_skill(skills: dict, verification_data: SkillVerificationData) -> bool:
246+
skill_count = 0
247+
for skill, exp in verification_data.experience.items():
248+
if skills[skill] >= exp:
249+
skill_count += 1
250+
251+
return skill_count >= verification_data.count
252+
175253
if __name__ == "__main__":
176254
print(check_logs('Gerni Task', tasklists.list_for_tier('elite'), 'check'))

0 commit comments

Comments
 (0)