66
77app = Flask (__name__ )
88auth = HTTPBasicAuth ()
9+ auth_GOD = HTTPBasicAuth ()
10+ preshared_key = ""
911id = 0
1012nPlayers = 0
1113roles = []
1214ip2role_index_name = {}
15+ nComments = 0
16+ comments_ordered = []
1317
1418@auth .verify_password
1519def verify_password (username , password ):
@@ -27,13 +31,16 @@ def index():
2731 ip = str (request .remote_addr )
2832
2933 if ip in ip2role_index_name .keys ():
30- role = ip2role_index_name [ip ][0 ]
31- image_name = ip2role_index_name [ip ][0 ] + "_" + str (ip2role_index_name [ip ][1 ])
34+ return render_template ("Player.html" , player = ip2role_index_name [ip ])
3235 else :
3336 if id > nPlayers :
34- return "Numbers of players out of range!" #TODO:well defined Error Page
37+ return render_template ( "404.html" , is_farsi = True )
3538 role = roles [id ]
36- ip2role_index_name [ip ] = (role , str (randrange (1 , nRoles [role ] + 1 )), username )
39+ ip2role_index_name [ip ] = [role ,
40+ str (randrange (1 , nRoles [role ] + 1 )),
41+ username ,
42+ "alive" ,
43+ False ]
3744 image_name = role + "_" + str (ip2role_index_name [ip ][1 ])
3845 print ("*" * 20 , "New Player" ,"*" * 20 )
3946 toGod = ip + " : " + str (id ) + " : " + username + " --> " + role
@@ -47,6 +54,56 @@ def index():
4754 is_farsi = True )
4855
4956
57+ @auth_GOD .verify_password
58+ def verify_password_god (username , password ):
59+ if password == preshared_key :
60+ return username
61+
62+
63+ @app .route ('/GOD' )
64+ @auth_GOD .login_required
65+ def GOD_PAGE ():
66+ global ip2role_index_name , nComments , comments_ordered
67+ msg = ""
68+ if request .args .get ("Kill" ) is not None :
69+ ip = request .args .get ("Kill" )
70+ if ip in ip2role_index_name .keys ():
71+ if ip2role_index_name [ip ][3 ] == "alive" :
72+ ip2role_index_name [ip ][3 ] = "dead"
73+ else :
74+ ip2role_index_name [ip ][3 ] = "alive"
75+ else :
76+ return render_template ("404.html" , is_farsi = True )
77+ if request .args .get ("Ban" ) is not None :
78+ ip = request .args .get ("Ban" )
79+ if ip in ip2role_index_name .keys ():
80+ if ip2role_index_name [ip ][3 ] == "alive" :
81+ ip2role_index_name [ip ][3 ] = "banned"
82+ elif ip2role_index_name [ip ][3 ] == "banned" :
83+ ip2role_index_name [ip ][3 ] = "alive"
84+ else :
85+ return render_template ("404.html" , is_farsi = True )
86+ if request .args .get ("Comment" ) is not None :
87+ ip = request .args .get ("Comment" )
88+ if ip in ip2role_index_name .keys ():
89+ if ip2role_index_name [ip ][4 ] == False :
90+ if nComments <= nPlayers // 3 :
91+ ip2role_index_name [ip ][4 ] = True
92+ nComments += 1
93+ comments_ordered .append (ip )
94+ else :
95+ msg = "Error: Out of Comments."
96+ else :
97+ ip2role_index_name [ip ][4 ] = False
98+ nComments -= 1
99+ comments_ordered .remove (ip )
100+ else :
101+ return render_template ("404.html" , is_farsi = True )
102+ return render_template ("GOD.html" , ip2role_index_name = ip2role_index_name ,
103+ prompt_message = msg , roles = {role :roles .count (role ) for role in set (roles )},
104+ comments = comments_ordered , role2team = role2team )
105+
106+
50107@app .errorhandler (404 )
51108def invalid_route (e ):
52109 return render_template ("404.html" , is_farsi = True )
@@ -65,15 +122,45 @@ def help_me():
65122 exit ()
66123
67124
125+ def give_me_roles (ordered_roles ):
126+ n = len (ordered_roles )
127+ if n >= 14 :
128+ ordered_roles [12 ] = 'Groom'
129+ ordered_roles [13 ] = 'Bride'
130+ if n % 3 == 0 :
131+ ordered_roles [14 ] = 'Serial Killer'
132+ if n % 3 != 0 :
133+ try :
134+ i = ordered_roles .index ('Mafia' )
135+ ordered_roles [i ] = 'Made Man'
136+ ordered_roles [2 ] = 'Reporter'
137+ except ValueError :
138+ pass
139+ if n % 3 == 2 :
140+ try :
141+ i = ordered_roles .index ('Mafia' )
142+ ordered_roles [i ] = 'Kind Wife'
143+ except ValueError :
144+ pass
145+ return ordered_roles
146+
147+
68148if __name__ == "__main__" :
69149 if len (argv ) < 2 or argv [1 ] in ['--help' , 'help' , '-h' ]:
70150 help_me ()
71151 nPlayers = int (argv [1 ])
72152 if nPlayers > len (ordered_roles ):
73153 print ("Too many players, mafia doesn't support a game with" , nPlayers , "player." )
74154 help_me ()
75- roles = ordered_roles [:nPlayers ]
155+ roles = give_me_roles ( ordered_roles [:nPlayers ])
76156 shuffle (roles )
77- app .run (host = "0.0.0.0" , \
78- port = 5000 , \
79- debug = True )
157+ chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789!@#$%^&*()"
158+ for i in range (4 ):
159+ preshared_key += chars [randrange (0 , len (chars ))]
160+ print ("_" * 20 + "GOD's password" + "_" * 20 )
161+ print (preshared_key )
162+ print ("_" * 54 )
163+ app .run (host = "0.0.0.0" ,
164+ port = 5000 ,
165+ debug = True ,
166+ use_reloader = False )
0 commit comments