Add ticketing.py
commit
b17451d2d0
|
@ -0,0 +1,100 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
# Simple event ticketing system
|
||||||
|
# Generate QR codes, share to attendees
|
||||||
|
# Each ticket can be used only once
|
||||||
|
|
||||||
|
import random, string, qrcode, os.path, time, re
|
||||||
|
from pathlib import Path
|
||||||
|
from flask import Flask, request, escape
|
||||||
|
|
||||||
|
# Domain name for the service
|
||||||
|
domain = "v-space.hu"
|
||||||
|
|
||||||
|
# Generate QR code and save to file
|
||||||
|
def gen_qr(qdata, qid):
|
||||||
|
data = qdata
|
||||||
|
filename = qid + ".png"
|
||||||
|
img = qrcode.make(data)
|
||||||
|
img.save(filename)
|
||||||
|
|
||||||
|
# Generate random string
|
||||||
|
def random_string(length):
|
||||||
|
letters = string.ascii_lowercase
|
||||||
|
return ''.join(random.choice(letters) for i in range(length))
|
||||||
|
|
||||||
|
# Burn QR (filename touch with _burned)
|
||||||
|
def burn_qr(ticket):
|
||||||
|
# Allow burning only when event starts, https://time.is/Unix_time_converter
|
||||||
|
now = int( time.time() )
|
||||||
|
if now < 1670223600:
|
||||||
|
return "The time has not come yet."
|
||||||
|
|
||||||
|
# Burning if the event is open
|
||||||
|
ticket = str(ticket)
|
||||||
|
if os.path.exists(ticket+".png"+"_burned") == True:
|
||||||
|
return "Problem: you can't reuse tickets! Call the organizers if you think this is a mistake or incident."
|
||||||
|
if os.path.exists(ticket+".png") == True:
|
||||||
|
Path(ticket+".png"+"_burned").touch()
|
||||||
|
print(ticket + " burned!")
|
||||||
|
# Idea: add NFT minting here
|
||||||
|
return "Ticket burned, get you swagz! Welcome to PMC!"
|
||||||
|
else:
|
||||||
|
print("Ticket NOT found!")
|
||||||
|
return "Ticket NOT found!"
|
||||||
|
|
||||||
|
# Generate the tickets and save them to tickets.txt
|
||||||
|
def generate_tickets(amount):
|
||||||
|
ticket_file = open("tickets.txt", "w")
|
||||||
|
for x in range(amount):
|
||||||
|
rand_val = random_string(16)
|
||||||
|
# Save logs
|
||||||
|
ticket_val = "https://" + domain + "/ticket?id=" + rand_val
|
||||||
|
print("Ticket: " + ticket_val)
|
||||||
|
ticket_file.write(ticket_val + " \n")
|
||||||
|
# Generate the QR code image files
|
||||||
|
gen_qr(ticket_val, rand_val)
|
||||||
|
ticket_file.close()
|
||||||
|
|
||||||
|
# Cleanup ticketing system
|
||||||
|
# TODO, dangerously removing all files listed in tickets.txt, needs validation/verification/etc
|
||||||
|
#def ticket_cleanup():
|
||||||
|
# surely = input("Are you sure you want to remove all .png, _burned and tickets.txt files from this directory? [y/n] ")
|
||||||
|
# if surely == "y":
|
||||||
|
# import subprocess
|
||||||
|
# ticket_file = open("tickets.txt", "r")
|
||||||
|
# Lines = ticket_file.readlines()
|
||||||
|
# for line in Lines:
|
||||||
|
# line = line.strip()
|
||||||
|
# subprocess.run(["rm", line])
|
||||||
|
# line = line + "_burned"
|
||||||
|
# subprocess.run(["rm", line])
|
||||||
|
# subprocess.run(["rm", "tickets.txt"])
|
||||||
|
|
||||||
|
generate_tickets(100)
|
||||||
|
|
||||||
|
# Web service
|
||||||
|
app = Flask(__name__)
|
||||||
|
@app.route('/ticket',methods=['GET'])
|
||||||
|
def r00t():
|
||||||
|
ticket_id = escape(request.args.get('id'))
|
||||||
|
ticket_id = re.sub('[^a-zA-Z0-9]', '', ticket_id) # Whitelist based XSS Protection
|
||||||
|
try:
|
||||||
|
return "<html><body><h2>PMC ticketing system, click to <a href=\"/ticket/burn?id=" + ticket_id + "\">burn</a>!</h2></body></html>"
|
||||||
|
except:
|
||||||
|
return "PMC ticketing system: id missing from parameter."
|
||||||
|
|
||||||
|
@app.route('/ticket/burn',methods=['GET'])
|
||||||
|
def burn():
|
||||||
|
burn_id = request.args.get('id')
|
||||||
|
return "<html><body><h2>" + burn_qr(burn_id) + "</h2></body></html>"
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(debug=False,host='127.0.0.1', port=8686)
|
||||||
|
|
||||||
|
|
||||||
|
# Functionalities for testing / alternatively: API
|
||||||
|
# random_string(16)
|
||||||
|
# gen_qr("test")
|
||||||
|
# generate_tickets(5)
|
||||||
|
# burn_qr("123456789")
|
||||||
|
# ticket_cleanup()
|
Loading…
Reference in New Issue