-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
246 lines (220 loc) · 7.83 KB
/
app.py
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
from flask import Flask, render_template, request, make_response
from spell import spell_to_dict, filter_spells
from scrape_data import scrape_class, scrape_spell
import uuid
import pickle
def scrape_new_data():
classes = ["Paladin", "Sorcerer", "Bard", "Wizard"]
scraped_data = {}
print("Scraping data...")
for class_name in classes:
scraped_data[class_name] = {}
spell_list = [scrape_spell(spell_url) for spell_url in scrape_class(class_name)]
for spell in spell_list:
scraped_data[class_name][spell.name] = spell
with open('data/scraped_data.pkl', 'wb') as f:
pickle.dump(scraped_data, f)
# Uncomment this to scrape new data (bs4 required)
# scrape_new_data()
# load scraped data from file
with open('data/scraped_data.pkl', 'rb') as f:
scraped_data = pickle.load(f)
scraped_data["Custom"] = {}
added_spells = {}
print("Starting app")
print("Spell data loaded")
print("Connect to http://localhost:2000 or an address listed below")
print()
def reset_config(config, user_id):
if user_id not in config:
config[user_id] = {}
config[user_id]["query"] = None
config[user_id]["name only"] = True
config[user_id]["class"] = None
config[user_id]["show"] = 0
config[user_id]["levels"] = []
config[user_id]["school"] = None
config[user_id]["casting_time"] = None
config[user_id]["range"] = None
config[user_id]["duration"] = None
config[user_id]["concentration"] = None
config[user_id]["components"] = None
config[user_id]["source"] = {
"phb": True,
"xge": True,
"tce": True,
"ua": False,
"other": True
}
config = {}
def lighten(hex_color):
hex_color = hex_color.lstrip('#')
rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
new_rgb = tuple([int((255 - rgb[i]) / 2 + rgb[i]) for i in range(3)])
return '#%02x%02x%02x' % new_rgb
def updateTable(config, scraped_data):
# get added spells from cookie
user_spells = added_spells[request.cookies["user_id"]]
user_class = config[request.cookies["user_id"]]["class"]
if user_class is not None:
if user_class == "Custom":
spells = user_spells
else:
spells = scraped_data[config[request.cookies["user_id"]]["class"]]
spells = filter_spells(config[request.cookies["user_id"]], spells)
spells_data = [spell_to_dict(spell) for spell in spells]
return render_template('spell_table.html', spells=spells_data, show=config[request.cookies["user_id"]]["show"])
else:
return render_template('spell_table.html', spells=[], show=0, header_color = "#ffffff")
app = Flask(__name__)
@app.route('/')
def index():
# set cookie to track user
resp = make_response(render_template("blocks.html"))
if "user_id" not in request.cookies:
user_id = str(uuid.uuid1())
resp.set_cookie("user_id", user_id)
print("New user: " + user_id)
added_spells[user_id] = {}
reset_config(config, user_id)
return resp
else:
if request.cookies["user_id"] not in added_spells:
added_spells[request.cookies["user_id"]] = {}
user_id = request.cookies["user_id"]
reset_config(config, user_id)
return resp
@app.route('/updateTable', methods=['POST'])
def update():
return updateTable(config, scraped_data)
@app.route('/spell/<spell_name>', methods=['GET'])
def spell(spell_name):
spell_name = spell_name.replace("--slash--", "/")
try:
content = scraped_data[config[request.cookies["user_id"]]["class"]][spell_name].description[0]
except:
content = added_spells[request.cookies["user_id"]][spell_name].description[0]
return content
@app.route('/class/<class_name>', methods=['GET'])
def class_search(class_name):
if class_name == "Select Class":
config[request.cookies["user_id"]]["class"] = None
return "", 200
config[request.cookies["user_id"]]["class"] = class_name
if class_name in ["Paladin", "Ranger"]:
config[request.cookies["user_id"]]["show"] = 1
else:
config[request.cookies["user_id"]]["show"] = 2
return updateTable(config, scraped_data)
@app.route('/search', methods=['POST'])
def search():
config[request.cookies["user_id"]]["query"] = request.form["query"]
return updateTable(config, scraped_data)
@app.route('/nameOnly', methods=['POST'])
def nameOnly():
config[request.cookies["user_id"]]["name only"] = request.form["name-only"] == "true"
return updateTable(config, scraped_data)
@app.route('/levelSearch', methods=['POST'])
def levelSearch():
levels = request.form
config[request.cookies["user_id"]]["levels"] = []
for level in levels:
if levels[level] == "true":
level_num = level[5:]
config[request.cookies["user_id"]]["levels"].append(int(level_num))
return updateTable(config, scraped_data)
@app.route('/schoolSearch', methods=['POST'])
def schoolSearch():
if request.form["school"] != "School":
config[request.cookies["user_id"]]["school"] = request.form["school"]
else:
config[request.cookies["user_id"]]["school"] = None
return updateTable(config, scraped_data)
@app.route('/castingTimeSearch', methods=['POST'])
def castingTimeSearch():
if request.form["castingTime"] != "Casting Time":
config[request.cookies["user_id"]]["casting_time"] = request.form["castingTime"]
else:
config[request.cookies["user_id"]]["casting_time"] = None
return updateTable(config, scraped_data)
@app.route('/rangeSearch', methods=['POST'])
def rangeSearch():
if request.form["range"] != "Range":
config[request.cookies["user_id"]]["range"] = request.form["range"]
else:
config[request.cookies["user_id"]]["range"] = None
return updateTable(config, scraped_data)
@app.route('/durationSearch', methods=['POST'])
def durationSearch():
if request.form["duration"] != "Duration":
config[request.cookies["user_id"]]["duration"] = request.form["duration"]
else:
config[request.cookies["user_id"]]["duration"] = None
return updateTable(config, scraped_data)
@app.route('/componentsSearch', methods=['POST'])
def componentsSearch():
if request.form["components"] != "Components":
config[request.cookies["user_id"]]["components"] = request.form["components"]
else:
config[request.cookies["user_id"]]["components"] = None
return updateTable(config, scraped_data)
@app.route('/concentrationSearch', methods=['POST'])
def concentrationSearch():
if request.form["concentration"] != "Concentration":
config[request.cookies["user_id"]]["concentration"] = request.form["concentration"]
else:
config[request.cookies["user_id"]]["concentration"] = None
return updateTable(config, scraped_data)
@app.route('/sourceSearch', methods=['POST'])
def sourceSearch():
sources = request.form
for source in sources:
config[request.cookies["user_id"]]["source"][source] = sources[source] == "true"
return updateTable(config, scraped_data)
@app.route('/tryAddSpell', methods=['POST'])
def tryAddSpell():
spell_link = request.form["spellLink"]
# see if valid link
try:
spell = scrape_spell(spell_link)
added_spells[request.cookies["user_id"]][spell.name] = spell
return "Spell added", 200
except:
return "Invalid link", 200
@app.route('/resetAddedSpells', methods=['POST'])
def resetAllSpells():
added_spells[request.cookies["user_id"]].clear()
return "All added spells removed", 200
@app.route('/uploadSpells', methods=['POST'])
def uploadSpells():
# read in form data
file = request.files['file']
# every line is a spell link
any_added = False
any_failed = False
for line in file:
spell_link = line.decode("utf-8").strip()
# remove everything after #
if "#" in spell_link:
spell_link = spell_link[:spell_link.index("#")].strip()
# or if empty line, skip
if spell_link == "":
continue
# see if valid link
try:
spell = scrape_spell(spell_link)
added_spells[request.cookies["user_id"]][spell.name] = spell
any_added = True
except:
any_failed = True
print("Invalid link: " + spell_link)
if any_failed and not any_added:
return "All spells failed to add", 200
elif any_failed:
return "Some spells failed to add", 200
elif any_added and not any_failed:
return "All spells added", 200
else:
return "No spells in file", 200
if __name__ == '__main__':
app.run(port = 2000)