FOR-ANTS 포-앤츠
schedule 데이터 불러오는 중
-
필터
정렬

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

chat_history.append(join_payload) await manager.broadcast(join_payload) try: while True: raw = await ws.receive_text() try: data = json.loads(raw) except (json.JSONDecodeError, AttributeError): continue # --- 닉네임 변경 요청 --- if data.get("type") == "rename": new_nick = str(data.get("nickname", "")).strip() if not (MIN_NICKNAME_LEN <= len(new_nick) <= MAX_NICKNAME_LEN): await ws.send_json({ "type": "error", "text": f"닉네임은 {MIN_NICKNAME_LEN}~{MAX_NICKNAME_LEN}자 사이여야 해요.", }) continue if new_nick != nickname and new_nick in manager.taken_nicknames(exclude_ws=ws): await ws.send_json({ "type": "error", "text": f"'{new_nick}'은(는) 이미 사용 중인 닉네임이에요.", }) continue old_nick = nickname nickname = new_nick state = manager.active.get(ws) if state is not None: state["nickname"] = nickname await ws.send_json({"type": "renamed", "nickname": nickname}) rename_payload = { "type": "system", "text": f"{old_nick}님이 '{nickname}'(으)로 닉네임을 변경했습니다.", "online": manager.online_count(), } chat_history.append(rename_payload) await manager.broadcast(rename_payload) continue # --- 신고하기 --- if data.get("type") == "report": target_nickname = str(data.get("target_nickname", ""))[:20] reported_message = str(data.get("message", ""))[:300] report_log.append({ "reporter": nickname, "target": target_nickname, "message": reported_message, "timestamp": _now_kst_iso(), }) logger.info("신고 접수: %s → %s (%s)", nickname, target_nickname, reported_message[:50]) await ws.send_json({"type": "reported_ok"}) continue # --- 일반 채팅 메시지 --- text = str(data.get("message", "")).strip() if not text: continue if len(text) > MAX_MESSAGE_LEN: text = text[:MAX_MESSAGE_LEN] now = time.time() state = manager.active.get(ws) if state is None: break if now - state["last_sent"] < MIN_SEND_INTERVAL_SEC: await ws.send_json({"type": "error", "text": "너무 빠르게 보내고 있어요. 잠시 후 다시 시도해주세요."}) continue state["last_sent"] = now msg_payload = { "type": "message", "nickname": nickname, "message": text, "timestamp": _now_kst_iso(), } chat_history.append(msg_payload) await manager.broadcast(msg_payload) except WebSocketDisconnect: pass finally: manager.disconnect(ws) leave_payload = { "type": "system", "text": f"{nickname}님이 퇴장했습니다.", "online": manager.online_count(), } chat_history.append(leave_payload) await manager.broadcast(leave_payload)