Files
2026-08-05 23:59:15 +08:00

61 lines
1.4 KiB
Python

import uuid
import time
from django.core.cache import cache
QR_TOKEN_PREFIX = "qr_token:"
QR_TOKEN_EXPIRE = 300
QR_CONFIRM_EXPIRE = 120
def generate_qr_token():
token = uuid.uuid4().hex
key = f"{QR_TOKEN_PREFIX}{token}"
cache.set(key, {
"status": "waiting",
"user_id": None,
"scan_user_id": None,
"scan_username": None,
"created_at": time.time(),
"expires_at": time.time() + QR_TOKEN_EXPIRE,
}, QR_TOKEN_EXPIRE)
return token
def get_qr_status(token):
key = f"{QR_TOKEN_PREFIX}{token}"
data = cache.get(key)
if not data:
return {"status": "expired"}
return data
def scan_qr(token, user_id, username):
key = f"{QR_TOKEN_PREFIX}{token}"
data = cache.get(key)
if not data or data["status"] != "waiting":
return False
data["status"] = "scanned"
data["scan_user_id"] = user_id
data["scan_username"] = username
data["expires_at"] = time.time() + QR_CONFIRM_EXPIRE
cache.set(key, data, QR_CONFIRM_EXPIRE)
return True
def confirm_qr(token):
key = f"{QR_TOKEN_PREFIX}{token}"
data = cache.get(key)
if not data or data["status"] != "scanned":
return None
data["status"] = "confirmed"
cache.set(key, data, 60)
return data
def cancel_qr(token):
key = f"{QR_TOKEN_PREFIX}{token}"
data = cache.get(key)
if data:
data["status"] = "cancelled"
cache.set(key, data, 60)