-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.py
More file actions
159 lines (133 loc) · 5.93 KB
/
Copy pathserver.py
File metadata and controls
159 lines (133 loc) · 5.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
from flask import Flask, request, render_template, url_for
from random import randint
import requests
import database
import base64
import schedule
import time
import config
app = Flask(__name__)
TTL = 50
jackpot = 10.0
inityo = 0
inityoleft = 10
def decodeURL (base):
h = base64.urlsafe_b64decode(base).decode('ascii')
yleft,r,prize,name,top = h.split('+')
top = top.split(';')
return (yleft,r,prize,name,top)
def encodeURL (yleft,r,jp,top,name):
s = str(yleft) + '+'
s += str(r) + '+'
s += str(jp) + '+'
s += str(name) + '+'
s += ';'.join(top)
return base64.urlsafe_b64encode(s.encode('ascii'))
def existsUser(user):
result = database.query_db('SELECT * FROM users WHERE name = "%s"' % user)
return len(result) != 0
def existsLocation(latitud, longitud):
result = database.query_db('SELECT * FROM locations WHERE latitud = %f AND longitud = %f' % (latitud, longitud))
return len(result) != 0
def insertLocation(latitud, longitud):
database.query_db('INSERT INTO locations VALUES (%f, %f, %d, %f)' % (latitud, longitud, TTL, jackpot))
def existsYoBoard(user, latitud, longitud):
result = database.query_db('SELECT * FROM yoboard WHERE name = "%s" AND latitud = %f AND longitud = %f' % (user, latitud, longitud))
return len(result) != 0
def insertYoBoard(user, latitud, longitud):
database.query_db('INSERT INTO yoboard VALUES ("%s", %f, %f, %d)' % (user, latitud, longitud, inityo))
def updateTTLs(user, latitud, longitud):
result = database.query_db('UPDATE users SET TTL = %d, latitud = %f, longitud = %f WHERE name = "%s"' % (TTL, latitud, longitud, user))
database.query_db('UPDATE locations SET TTL = %d WHERE latitud = %f AND longitud = %f' % (TTL, latitud, longitud))
def yoLeft(user, latitud, longitud):
left = database.query_db('SELECT yoleft FROM users WHERE name = "%s"' % (user))[0][0]
if left > 0:
database.query_db('UPDATE users SET yoleft = (yoleft - 1) WHERE name = "%s"' % user)
database.query_db('UPDATE yoboard SET yo = (yo+1) WHERE name = "%s" AND latitud = %f AND longitud = %f' % (user, latitud, longitud))
left -= 1
return left
def top5(latitud, longitud):
result = database.query_db('SELECT name FROM yoboard WHERE latitud = %f AND longitud = %f ORDER BY "yo" DESC LIMIT 5' % (latitud, longitud))
ret = []
i = 1
for elem in result:
ret.append("%d. %s" % (i,elem[0]))
i += 1
return ret
def rankNum(user, latitud, longitud):
yos = database.query_db('SELECT yo FROM yoboard WHERE name ="%s"' % user)[0][0]
return database.query_db('SELECT COUNT (*) FROM yoboard WHERE yo > %d AND longitud = %f AND latitud = %f' % (yos, latitud, longitud))[0][0] + 1
def getJackpot(latitud, longitud):
return database.query_db('SELECT jackpot FROM locations WHERE latitud = %f AND longitud = %f' % (latitud, longitud))[0][0]
def addUser(user, latitud, longitud):
database.query_db('INSERT INTO users VALUES ("%s", %d, %d, %f, %f)' % (user, TTL, inityoleft, latitud, longitud))
def getWinner1(latitud, longitud):
return database.query_db('SELECT name FROM yoboard WHERE latitud = %f AND longitud = %f ORDER BY yo DESC LIMIT 1' % (latitud, longitud))[0][0]
def getWinner2(mat, suma):
rand = randint(0,suma-1)
for elem in mat:
rand -= elem[1]
if rand < 0:
return elem[0]
def announcePrize():
loc = database.query_db('SELECT latitud, longitud FROM locations')
for elem in loc:
mat = database.query_db('SELECT name, yo FROM yoboard WHERE latitud = %f AND longitud = %f' % (elem[0], elem[1]))
suma = database.query_db('SELECT SUM(yo) FROM yoboard WHERE latitud = %f AND longitud = %f' % (elem[0], elem[1]))[0][0]
win1 = getWinner1(elem[0], elem[1])
win2 = getWinner2(mat, suma)
jack = getJackpot(elem[0], elem[1])
url = MAIN_URL + "/winner/" + str(jack/2) + "_" + str(win1) + "_" + str(win2)
for person in mat:
requests.post("http://api.justyo.co/yo/", data={'api_token': api_token, 'username': person[0], 'link': url})
#database.query_db('UPDATE yoboard SET yo = %d' % inityo)
def giveFreePoints():
database.query_db('UPDATE users SET yoleft = %d' % inityoleft)
schedule.every().day.at("00:00").do(giveFreePoints)
schedule.every().monday.do(announcePrize)
@app.route("/payment/", methods=['POST'])
def payment():
yolos = request.POST["yolos"]
username = request.POST["username"]
database.query_db('UPDATE yoboard SET yoleft = yoleft + %d WHERE name = "%s"' %(yolos,username))
css = url_for('static',filename='css/bootstrap.css')
return render_template('purchase.html', s=css, name=username)
@app.route("/", methods=['GET'])
def yo_reciption():
username = request.args.get('username')
location = request.args.get('location')
if type(location) == str:
splitted = location.split(';')
longitud = float("%.2f" % float(splitted[0]))
latitud = float("%.2f" % float(splitted[1]))
if existsUser(username):
if not existsLocation(latitud, longitud):
insertLocation(latitud, longitud)
if not existsYoBoard(username, latitud, longitud):
insertYoBoard(username, latitud, longitud)
updateTTLs(username, latitud, longitud)
left = yoLeft(username, latitud, longitud)
rank = rankNum(username, latitud, longitud)
top = top5(latitud, longitud)
j = getJackpot(latitud, longitud)
encoded = encodeURL(left, rank, j, top, username)
encoded = MAIN_URL + url_for('rank', value=encoded)
requests.post("http://api.justyo.co/yo/", data={'api_token': api_token, 'username': username, 'link': encoded})
else:
addUser(username, latitud, longitud)
return 'OK'
@app.route('/rank/')
@app.route('/rank/<value>')
def rank(value=None):
#value == None?
yoleft,rank,prize,name,top = decodeURL(value)
css = url_for('static',filename='css/bootstrap.css')
return render_template('rank.html', yoleft=yoleft, rank=rank, prize=prize, top=top, name=name, s = css)
@app.route('/winner/<wolo>')
def winPage(wolo=None):
aux = wolo.split('_')
css = url_for('static',filename='css/bootstrap.css')
print ("Winners are", aux[1:])
return render_template('winner.html', winners=aux[1:], prize=aux[0], s = css)
if __name__ == "__main__":
app.run(debug=True)