diff --git a/app.py b/app.py index 3bcb096..f104e0c 100644 --- a/app.py +++ b/app.py @@ -86,7 +86,7 @@ async def today( if not wid: return JSONResponse(status_code=400, content={"error": "workbook_id is required for workbook mode"}) - pid, title, level = await pick_from_workbook(db, wid, pick=workbook_pick) + pid, title, level, current_idx, total_cnt = await pick_from_workbook(db, wid, pick=workbook_pick) if not pid: return JSONResponse(status_code=409, content={"error": "no_more_problems_in_workbook", "workbook_id": wid}) @@ -94,9 +94,10 @@ async def today( solved_url = f"https://solved.ac/problems/id/{pid}" level_text = f"Lv. {level}" if level is not None else "Lv. ?" + progress_text = f"({current_idx}/{total_cnt})" if current_idx and total_cnt else "" discord_payload = { "embeds": [{ - "title": "๐Ÿ”” ์˜ค๋Š˜์˜ ๋ฐฑ์ค€ ์ถ”์ฒœ ๋ฌธ์ œ (๋ฌธ์ œ์ง‘)", + "title": f"๐Ÿ”” ์˜ค๋Š˜์˜ ๋ฐฑ์ค€ ์ถ”์ฒœ ๋ฌธ์ œ (๋ฌธ์ œ์ง‘) {progress_text}", "description": ( f"**{pid}๋ฒˆ: {title}**\n" f"๋‚œ์ด๋„: **{level_text}**\n" @@ -106,7 +107,6 @@ async def today( {"name": "๋ฌธ์ œ ๋งํฌ", "value": f"[๋ฐ”๋กœ๊ฐ€๊ธฐ]({problem_url})", "inline": True}, {"name": "ํ•ด์„ค/์ •๋ณด", "value": f"[Solved.ac]({solved_url})", "inline": True}, ], - "footer": {"text": "๋งค์ผ ์˜ค์ „ 10์‹œ ์ •๊ธฐ ์•Œ๋ฆผ (n8n)"} }] } @@ -155,7 +155,6 @@ async def today( {"name": "๋ฌธ์ œ ๋งํฌ", "value": f"[๋ฐ”๋กœ๊ฐ€๊ธฐ]({problem_url})", "inline": True}, {"name": "ํ•ด์„ค/์ •๋ณด", "value": f"[Solved.ac]({solved_url})", "inline": True}, ], - "footer": {"text": "๋งค์ผ ์˜ค์ „ 10์‹œ ์ •๊ธฐ ์•Œ๋ฆผ (n8n)"} }] } diff --git a/workbook_picker.py b/workbook_picker.py index 6158432..9d94dc1 100644 --- a/workbook_picker.py +++ b/workbook_picker.py @@ -7,7 +7,7 @@ async def pick_from_workbook( db: AsyncSession, workbook_id: int, pick: str = "random", # random | level_asc -) -> Tuple[Optional[int], Optional[str], Optional[int]]: +) -> Tuple[Optional[int], Optional[str], Optional[int], Optional[int], Optional[int]]: """ workbook_id์—์„œ ์•„์ง ๋ณด๋‚ด์ง€ ์•Š์€ ๋ฌธ์ œ 1๊ฐœ ์„ ํƒ + workbook_sends ๊ธฐ๋ก๊นŒ์ง€ ์›์ƒท. pick: @@ -46,17 +46,27 @@ async def pick_from_workbook( FROM candidate ON CONFLICT DO NOTHING RETURNING problem_id + ), + total AS ( + SELECT COUNT(*) AS cnt FROM workbook_problems WHERE workbook_id = :wid + ), + sent AS ( + SELECT COUNT(*) AS cnt FROM workbook_sends WHERE workbook_id = :wid ) - SELECT problem_id, title, level + SELECT candidate.problem_id, candidate.title, candidate.level, + (SELECT cnt FROM sent) + 1 AS current_idx, + (SELECT cnt FROM total) AS total_cnt FROM candidate; """ row = (await db.execute(text(sql), {"wid": workbook_id})).first() if not row: - return None, None, None + return None, None, None, None, None await db.commit() pid = int(row[0]) title = str(row[1]) level = int(row[2]) if row[2] is not None else None - return pid, title, level + current_idx = int(row[3]) + total_cnt = int(row[4]) + return pid, title, level, current_idx, total_cnt