-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
189 lines (161 loc) · 6.15 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
from flask import Flask, url_for, g, session, Blueprint, request, redirect, render_template, flash
import requests
import os
import functools
import json
import rps
'''
App factory
Exception handling
Module off WSClient
Module off game
'''
app = Flask(__name__, instance_relative_config=True, template_folder='web/templates', static_folder='web/static')
app.config.from_mapping(
SECRET_KEY='dev',
SERVICE='service1',
SERVICE_HOST='34.42.125.145:8080'
)
bp = Blueprint('/', __name__, url_prefix='/')
with app.app_context():
'''
WSC client
'''
@bp.before_app_request
def load_logged_in_user():
'''Takes none. Gives none.'''
token = session.get('session')
if token is None:
g.token = None
else:
g.token = session
app.register_blueprint(bp)
def login_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
'''Takes view. Returns view or res dict.'''
if g.token is None:
error = "Login is required"
res = {
"code": -1,
"body" : error
}
return redirect(f"http://{app.config['SERVICE_HOST']}", code=302)
return view(**kwargs)
return wrapped_view
@app.route('/login', methods=['POST'])
def login():
# logout()
username = request.form['username']
password = request.form['password']
if request.form['login'] == 'login':
response = requests.post(f'http://{app.config["SERVICE_HOST"]}/api/login', json={
"service": app.config['SERVICE'],
"username": username,
"password": password
})
if response.json()['code'] == 0:
session.update(response.cookies)
session['username'] = response.json()['body']['username']
elif response.json()['code'] == -1:
flash(f"Failed: {response.json()['body']}")
print(response.json)
elif request.form['login'] == 'reg':
response = requests.post(f'http://{app.config["SERVICE_HOST"]}/api/register', json={
"service": app.config['SERVICE'],
"username": username,
"password": password
})
data = response.json()
if data['code'] == 0:
flash('Registered')
elif data['code'] == -1:
flash(f'Failed {data["body"]}')
elif request.form['login'] == 'logout':
return redirect(url_for('logout'))
return redirect(url_for('index'))
@app.route('/update', methods=['POST'])
def update():
input1 = request.form['input1']
input2 = request.form['input2']
if request.form['update'] == 'name':
response = requests.post(f'http://{app.config["SERVICE_HOST"]}/api/update/username', json={
})
@app.route('/logout')
@login_required
def logout():
# response = requests.get(f"http://{app.config['SERVICE_HOST']}/api/logout", cookies=g.token)
session.clear()
return redirect(url_for('index'))
'''
App routes
'''
@app.route('/')
def index():
game = session.get('game')
if session.get('username') and game is None:
session['game'] = {
"character": None,
"hp": None,
"dmg": None,
"dragon_hp": rps.dragon_hp,
"dragon_dmg": rps.dragon_dmg,
"turn": "dragon"
}
else:
session['game'] = game
print(g.token)
print(type(g.token))
# response = requests.get(f"http://{app.config['SERVICE_HOST']}/api/home", cookies=g.token)
data = session
game = session['game']
return render_template('base.html', data=data)
@app.route('/char_select', methods=['POST'])
@login_required
def char_select():
char = request.form['char']
print(char)
if char == "wizard":
session['game']['character'] = rps.wizard
session['game']['hp'] = rps.wizard_hp
session['game']['dmg'] = rps.wizard_dmg
elif char == "human":
session['game']['character'] = rps.human
session['game']['hp'] = rps.human_hp
session['game']['dmg'] = rps.human_dmg
elif char == "elf":
session['game']['character'] = rps.elf
session['game']['hp'] = rps.elf_hp
session['game']['dmg'] = rps.elf_dmg
elif char == "orc":
session['game']['character'] = rps.orc
session['game']['hp'] = rps.orc_hp
session['game']['dmg'] = rps.orc_dmg
session.modified = True
return redirect(url_for('index'))
@app.route('/play', methods=['POST'])
@login_required
def play():
turn = session['game']['turn']
result = rps.play(request.form['hand'])
if turn == 'dragon' and result == 'win':
flash("You remain unscathed!")
session['game']['turn'] = "player"
elif turn == 'dragon' and result == 'lose':
session['game']['hp'] = session['game']['hp'] - session['game']['dragon_dmg']
flash("The dragon damaged you!")
session['game']['turn'] = "player"
elif turn == 'dragon' and result == 'draw':
flash(f"You are unscathed, but the {turn} attacks again")
if turn == 'player' and result == 'win':
session['game']['dragon_hp'] = session['game']['dragon_hp'] - session['game']['dmg']
flash("You have damaged the dragon!")
session['game']['turn'] = "dragon"
if turn == 'player' and result == 'lose':
flash("The dragon evaded your attack")
session['game']['turn'] = "dragon"
if turn == 'player' and result == 'draw':
flash("You missed, but attack again!")
return redirect(url_for('index'))
if __name__ == "__main__":
app.run(port=(os.environ.get("PORT", 5000)), host='0.0.0.0', debug=True)