Distributed and decentralized pi calculation
1from flask import request, Flask # requires flask! please download before running :)
2from flask import render_template
3from dotenv import load_dotenv
4import os
5global pilen
6global pilength
7app = Flask(__name__)
8load_dotenv()
9name = os.getenv("NAME")
10email = os.getenv("EMAIL")
11multi = int(os.getenv("MULTI"))
12atEmail = email.replace("@", " at ")
13safeEmail = atEmail.replace(".", " dot ")
14@app.route('/api/getpi')
15def getpi():
16 if request.method == 'GET':
17 try:
18 f = open("picalc/pi.txt", "r")
19 return f.read()
20 except:
21 return "picalc/pi.txt wasn't found! Contact " + name + " at " + email + " if this persists."
22 else:
23 return "Invaild method! /getpi is designed for GET requests, not " + request.method
24
25@app.route('/api/postpi', methods=['POST', 'GET'])
26def postpi():
27 f = open("picalc/pi.txt", "r")
28 checkCorrectly = 3.14 * multi
29 if request.form['pi']:
30 if f.read() == "No clients have connected yet. Become one of the first!":
31 if request.form['pi'].startswith(str(checkCorrectly)) == True:
32 with open("picalc/pi.txt", "w") as f:
33 f.write(request.form['pi'])
34 else:
35 return "Invalid string!"
36 else:
37 if request.form['pi'].startswith(f.read()) == True:
38 with open("picalc/pi.txt", "w") as f:
39 f.write(request.form['pi'])
40 else:
41 return "Invalid string!"
42 else:
43 return "Request not found!"
44
45@app.route('/')
46def lander():
47 try:
48 f = open("picalc/pi.txt", "r")
49 piresult = f.read()
50 if piresult == "No clients have connected yet. Become one of the first!":
51 piresult = "No clients have connected. Become one of the first!"
52 else:
53 try:
54 pilength = len(str(piresult))
55 print(pilength)
56 pilen = "Current Pi length is " + str(pilength) + " digits!"
57 except:
58 pilen = "Current Pi length couldn't be calculated!"
59 piresult = "Current Pi count is " + piresult
60 except:
61 piresult = "picalc/pi.txt wasn't found on this server! It will be created now to fix this issue."
62 try:
63 with open("picalc/pi.txt", "w") as f:
64 f.write("No clients have connected yet. Become one of the first!")
65 except:
66 piresult = f"Couldn't create pi.txt! Please contact {name} at {safeEmail} to fix this!"
67 if request.method == 'GET':
68 ver = open("ver.txt", "r")
69 version = ver.read()
70 return render_template('index.html', pi=piresult, name=name, email=safeEmail, version=version, pilen="Current Pi length is " + str(pilength), multi=str(multi))
71 else:
72 return "Please use GET to access this page."
73
74@app.route('/api/getlen')
75def getlen():
76 f = open("picalc/pi.txt", "r")
77 piresult = f.read()
78 if not piresult == "No clients have connected yet. Become one of the first!":
79 pilength = len(str(piresult))
80 return str(pilength)
81 else:
82 return "Length cannot be calculated due to Pi not being calculated yet."
83
84@app.route('/api/getver')
85def getver():
86 try:
87 f = open("ver.txt", "r")
88 version = f.read()
89 return version
90 except:
91 return "ver.txt not found on server"
92
93@app.route('/api/getname')
94def getname():
95 return name
96
97@app.route('/api/getemail')
98def getemail():
99 return safeEmail
100
101@app.route('/api/getmultiplier')
102def getMultiply():
103 return str(multi)
104
105@app.errorhandler(404)
106def page_not_found(error):
107 return render_template('404.html'), 404