Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import threading | |
| from datetime import datetime, timedelta | |
| from huggingface_hub import InferenceClient | |
| ROWS = [chr(i) for i in range(ord("A"), ord("Z") + 1)] | |
| SEATS_PER_ROW = 26 | |
| SECTIONS = { | |
| "left": range(1, 9), | |
| "middle": range(9, 19), | |
| "right": range(19, 27), | |
| } | |
| lock = threading.Lock() | |
| seat_state = { | |
| row: {seat: "available" for seat in range(1, 27)} | |
| for row in ROWS | |
| } | |
| holds = {} | |
| bookings = {} | |
| lock_owner = None | |
| lock_expires_at = None | |
| client = InferenceClient( | |
| base_url="https://router.huggingface.co/v1", | |
| token=os.getenv("HF_TOKEN") | |
| ) | |
| def seat_label(row, seat): | |
| return f"{row}{seat}" | |
| def section_for_seat(seat): | |
| if 1 <= seat <= 8: | |
| return "left" | |
| if 9 <= seat <= 18: | |
| return "middle" | |
| return "right" | |
| def available_seats(): | |
| out = [] | |
| for row in ROWS: | |
| for seat in range(1, 27): | |
| if seat_state[row][seat] == "available": | |
| out.append(seat_label(row, seat)) | |
| return out | |
| def find_best_block(n): | |
| for row in ROWS: | |
| for section_name, seats in SECTIONS.items(): | |
| seats = list(seats) | |
| free_runs = [] | |
| current = [] | |
| for s in seats: | |
| if seat_state[row][s] == "available": | |
| current.append(s) | |
| else: | |
| if current: | |
| free_runs.append(current) | |
| current = [] | |
| if current: | |
| free_runs.append(current) | |
| for run in free_runs: | |
| if len(run) >= n: | |
| return [seat_label(row, s) for s in run[:n]] | |
| return None | |
| def acquire_lock(user_id): | |
| global lock_owner, lock_expires_at | |
| now = datetime.utcnow() | |
| if lock_owner and lock_expires_at and now < lock_expires_at and lock_owner != user_id: | |
| return False, f"Locked by {lock_owner}" | |
| lock_owner = user_id | |
| lock_expires_at = now + timedelta(minutes=10) | |
| return True, f"Lock granted to {user_id}" | |
| def release_lock(user_id): | |
| global lock_owner, lock_expires_at | |
| if lock_owner == user_id: | |
| lock_owner = None | |
| lock_expires_at = None | |
| return True | |
| return False | |
| def hold_seats(user_id, count): | |
| with lock: | |
| ok, msg = acquire_lock(user_id) | |
| if not ok: | |
| return msg, "" | |
| seats = find_best_block(count) | |
| if not seats: | |
| return "Not enough adjacent seats available.", "" | |
| hold_id = f"H{len(holds)+1}" | |
| for seat in seats: | |
| row = seat[0] | |
| num = int(seat[1:]) | |
| seat_state[row][num] = "held" | |
| holds[hold_id] = { | |
| "user_id": user_id, | |
| "seats": seats, | |
| "expires_at": datetime.utcnow() + timedelta(minutes=5), | |
| } | |
| return f"Hold created: {hold_id}", ", ".join(seats) | |
| def confirm_hold(user_id, hold_id): | |
| with lock: | |
| h = holds.get(hold_id) | |
| if not h: | |
| return "Hold not found." | |
| if h["user_id"] != user_id: | |
| return "You do not own this hold." | |
| for seat in h["seats"]: | |
| row = seat[0] | |
| num = int(seat[1:]) | |
| seat_state[row][num] = "booked" | |
| booking_id = f"B{len(bookings)+1}" | |
| bookings[booking_id] = h | |
| del holds[hold_id] | |
| release_lock(user_id) | |
| return f"Booked successfully: {booking_id}" | |
| def chat_with_ai(message, history): | |
| messages = [{"role": "system", "content": "You are a ticketing assistant that helps users book venue seats."}] | |
| for item in history: | |
| messages.append({"role": "user", "content": item[0]}) | |
| messages.append({"role": "assistant", "content": item[1]}) | |
| messages.append({"role": "user", "content": message}) | |
| if os.getenv("HF_TOKEN"): | |
| resp = client.chat.completions.create( | |
| model="meta-llama/Llama-3.1-8B-Instruct", | |
| messages=messages, | |
| max_tokens=200, | |
| temperature=0.2, | |
| ) | |
| return resp.choices[0].message.content | |
| return "HF_TOKEN is not configured." | |
| def render_map(): | |
| rows = [] | |
| for row in ROWS: | |
| vals = [] | |
| for seat in range(1, 27): | |
| status = seat_state[row][seat] | |
| vals.append(f"{seat_label(row, seat)}:{status[0]}") | |
| rows.append(" | ".join(vals)) | |
| return "\n".join(rows) | |
| def ui_action(user_id, group_size): | |
| hold_msg, seats = hold_seats(user_id, int(group_size)) | |
| return render_map(), hold_msg, seats | |
| def confirm_action(user_id, hold_id): | |
| return render_map(), confirm_hold(user_id, hold_id) | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Venue Ticketing System") | |
| with gr.Row(): | |
| user_id = gr.Textbox(label="User ID", value="user1") | |
| group_size = gr.Number(label="Seats needed", value=2, precision=0) | |
| with gr.Row(): | |
| btn_hold = gr.Button("Hold Best Seats") | |
| hold_id = gr.Textbox(label="Hold ID") | |
| btn_confirm = gr.Button("Confirm Hold") | |
| seat_map = gr.Textbox(label="Seat map", lines=18) | |
| hold_result = gr.Textbox(label="Hold result") | |
| booked_result = gr.Textbox(label="Booking result") | |
| #ai_chat = gr.ChatInterface(fn=chat_with_ai, type="messages", title="AI Assistant") | |
| ai_chat = gr.ChatInterface(fn=chat_with_ai, title="Booking Assistant") | |
| btn_hold.click(ui_action, inputs=[user_id, group_size], outputs=[seat_map, hold_result, hold_id]) | |
| btn_confirm.click(confirm_action, inputs=[user_id, hold_id], outputs=[seat_map, booked_result]) | |
| demo.load(render_map, outputs=seat_map) | |
| demo.queue(default_concurrency_limit=1) | |
| demo.launch() |