write errors in the chat during debug

This commit is contained in:
Alberto Xamin 2023-01-09 10:14:27 +01:00
parent 1ea91af237
commit 60ef42f98a
No known key found for this signature in database
GPG Key ID: 4F026F48309500A2

View File

@ -13,11 +13,16 @@ import requests
from discord_webhook import DiscordWebhook from discord_webhook import DiscordWebhook
from metrics import Metrics from metrics import Metrics
Metrics.init()
import sys import sys
import traceback
sys.setrecursionlimit(10**6) # this should prevents bots from stopping sys.setrecursionlimit(10**6) # this should prevents bots from stopping
import logging
logger = logging.basicConfig(filename='out.log', level='ERROR')
from functools import wraps
Metrics.init()
sio = socketio.Server(cors_allowed_origins="*") sio = socketio.Server(cors_allowed_origins="*")
static_files={ static_files={
@ -44,6 +49,22 @@ games: List[Game] = []
online_players = 0 online_players = 0
blacklist: List[str] = [] blacklist: List[str] = []
def send_to_debug(error):
for g in games:
if g.debug or any((p.is_admin() for p in g.players)):
sio.emit('chat_message', room=g.name, data={'color': f'red','text':json.dumps({'ERROR':error}), 'type':'json'})
def bang_handler(func):
@wraps(func)
def wrapper_func(*args, **kwargs):
try:
func(*args, **kwargs)
except Exception as e:
logging.exception(e)
print(traceback.format_exc())
send_to_debug(traceback.format_exc())
return wrapper_func
def advertise_lobbies(): def advertise_lobbies():
sio.emit('lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players), 'locked': g.password != ''} for g in games if not g.started and len(g.players) < 10 and not g.is_hidden]) sio.emit('lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players), 'locked': g.password != ''} for g in games if not g.started and len(g.players) < 10 and not g.is_hidden])
sio.emit('spectate_lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players), 'locked': g.password != ''} for g in games if g.started and not g.is_hidden]) sio.emit('spectate_lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players), 'locked': g.password != ''} for g in games if g.started and not g.is_hidden])
@ -51,6 +72,7 @@ def advertise_lobbies():
Metrics.send_metric('online_players', points=[online_players]) Metrics.send_metric('online_players', points=[online_players])
@sio.event @sio.event
@bang_handler
def connect(sid, environ): def connect(sid, environ):
global online_players global online_players
online_players += 1 online_players += 1
@ -60,11 +82,13 @@ def connect(sid, environ):
Metrics.send_metric('online_players', points=[online_players]) Metrics.send_metric('online_players', points=[online_players])
@sio.event @sio.event
@bang_handler
def get_online_players(sid): def get_online_players(sid):
global online_players global online_players
sio.emit('players', room='lobby', data=online_players) sio.emit('players', room='lobby', data=online_players)
@sio.event @sio.event
@bang_handler
def report(sid, text): def report(sid, text):
print(f'New report from {sid}: {text}') print(f'New report from {sid}: {text}')
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
@ -85,6 +109,7 @@ def report(sid, text):
print(f'New bug report, replay at https://bang.xamin.it/game?replay={key}') print(f'New bug report, replay at https://bang.xamin.it/game?replay={key}')
@sio.event @sio.event
@bang_handler
def set_username(sid, username): def set_username(sid, username):
ses = sio.get_session(sid) ses = sio.get_session(sid)
if not isinstance(ses, Player): if not isinstance(ses, Player):
@ -105,6 +130,7 @@ def set_username(sid, username):
ses.game.notify_room() ses.game.notify_room()
@sio.event @sio.event
@bang_handler
def get_me(sid, room): def get_me(sid, room):
if isinstance(sio.get_session(sid), Player): if isinstance(sio.get_session(sid), Player):
sio.emit('me', data=sio.get_session(sid).name, room=sid) sio.emit('me', data=sio.get_session(sid).name, room=sid)
@ -174,6 +200,7 @@ def get_me(sid, room):
sio.get_session(sid).game.notify_room() sio.get_session(sid).game.notify_room()
@sio.event @sio.event
@bang_handler
def disconnect(sid): def disconnect(sid):
global online_players global online_players
online_players -= 1 online_players -= 1
@ -187,6 +214,7 @@ def disconnect(sid):
Metrics.send_metric('online_players', points=[online_players]) Metrics.send_metric('online_players', points=[online_players])
@sio.event @sio.event
@bang_handler
def create_room(sid, room_name): def create_room(sid, room_name):
if sio.get_session(sid).game == None: if sio.get_session(sid).game == None:
while len([g for g in games if g.name == room_name]): while len([g for g in games if g.name == room_name]):
@ -202,25 +230,30 @@ def create_room(sid, room_name):
advertise_lobbies() advertise_lobbies()
@sio.event @sio.event
@bang_handler
def private(sid): def private(sid):
g = sio.get_session(sid).game g = sio.get_session(sid).game
g.set_private() g.set_private()
advertise_lobbies() advertise_lobbies()
@sio.event @sio.event
@bang_handler
def toggle_expansion(sid, expansion_name): def toggle_expansion(sid, expansion_name):
g = sio.get_session(sid).game g = sio.get_session(sid).game
g.toggle_expansion(expansion_name) g.toggle_expansion(expansion_name)
@sio.event @sio.event
@bang_handler
def toggle_comp(sid): def toggle_comp(sid):
sio.get_session(sid).game.toggle_competitive() sio.get_session(sid).game.toggle_competitive()
@sio.event @sio.event
@bang_handler
def toggle_replace_with_bot(sid): def toggle_replace_with_bot(sid):
sio.get_session(sid).game.toggle_disconnect_bot() sio.get_session(sid).game.toggle_disconnect_bot()
@sio.event @sio.event
@bang_handler
def join_room(sid, room): def join_room(sid, room):
room_name = room['name'] room_name = room['name']
i = [g.name for g in games].index(room_name) i = [g.name for g in games].index(room_name)
@ -250,6 +283,7 @@ Sockets for the status page
""" """
@sio.event @sio.event
@bang_handler
def get_all_rooms(sid, deploy_key): def get_all_rooms(sid, deploy_key):
if ('DEPLOY_KEY' in os.environ and deploy_key == os.environ['DEPLOY_KEY']) or sio.get_session(sid).is_admin(): if ('DEPLOY_KEY' in os.environ and deploy_key == os.environ['DEPLOY_KEY']) or sio.get_session(sid).is_admin():
sio.emit('all_rooms', room=sid, data=[{ sio.emit('all_rooms', room=sid, data=[{
@ -266,11 +300,13 @@ def get_all_rooms(sid, deploy_key):
} for g in games]) } for g in games])
@sio.event @sio.event
@bang_handler
def kick(sid, data): def kick(sid, data):
if ('DEPLOY_KEY' in os.environ and data['key'] == os.environ['DEPLOY_KEY']) or sio.get_session(sid).is_admin(): if ('DEPLOY_KEY' in os.environ and data['key'] == os.environ['DEPLOY_KEY']) or sio.get_session(sid).is_admin():
sio.emit('kicked', room=data['sid']) sio.emit('kicked', room=data['sid'])
@sio.event @sio.event
@bang_handler
def hide_toogle(sid, data): def hide_toogle(sid, data):
if ('DEPLOY_KEY' in os.environ and data['key'] == os.environ['DEPLOY_KEY']) or sio.get_session(sid).is_admin(): if ('DEPLOY_KEY' in os.environ and data['key'] == os.environ['DEPLOY_KEY']) or sio.get_session(sid).is_admin():
game = [g for g in games if g.name==data['room']] game = [g for g in games if g.name==data['room']]
@ -288,12 +324,14 @@ Sockets for the game
""" """
@sio.event @sio.event
@bang_handler
def start_game(sid): def start_game(sid):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.start_game() ses.game.start_game()
advertise_lobbies() advertise_lobbies()
@sio.event @sio.event
@bang_handler
def set_character(sid, name): def set_character(sid, name):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.rpc_log.append(f'{ses.name};set_character;{name}') ses.game.rpc_log.append(f'{ses.name};set_character;{name}')
@ -302,47 +340,55 @@ def set_character(sid, name):
ses.set_character(name) ses.set_character(name)
@sio.event @sio.event
@bang_handler
def refresh(sid): def refresh(sid):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.notify_self() ses.notify_self()
@sio.event @sio.event
@bang_handler
def draw(sid, pile): def draw(sid, pile):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.rpc_log.append(f'{ses.name};draw;{pile}') ses.game.rpc_log.append(f'{ses.name};draw;{pile}')
ses.draw(pile) ses.draw(pile)
@sio.event @sio.event
@bang_handler
def pick(sid): def pick(sid):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.rpc_log.append(f'{ses.name};pick') ses.game.rpc_log.append(f'{ses.name};pick')
ses.pick() ses.pick()
@sio.event @sio.event
@bang_handler
def end_turn(sid): def end_turn(sid):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.rpc_log.append(f'{ses.name};end_turn') ses.game.rpc_log.append(f'{ses.name};end_turn')
ses.end_turn() ses.end_turn()
@sio.event @sio.event
@bang_handler
def play_card(sid, data): def play_card(sid, data):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.rpc_log.append(f'{ses.name};play_card;{json.dumps(data)}') ses.game.rpc_log.append(f'{ses.name};play_card;{json.dumps(data)}')
ses.play_card(data['index'], data['against'], data['with']) ses.play_card(data['index'], data['against'], data['with'])
@sio.event @sio.event
@bang_handler
def respond(sid, card_index): def respond(sid, card_index):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.rpc_log.append(f'{ses.name};respond;{card_index}') ses.game.rpc_log.append(f'{ses.name};respond;{card_index}')
ses.respond(card_index) ses.respond(card_index)
@sio.event @sio.event
@bang_handler
def choose(sid, card_index): def choose(sid, card_index):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.rpc_log.append(f'{ses.name};choose;{card_index}') ses.game.rpc_log.append(f'{ses.name};choose;{card_index}')
ses.choose(card_index) ses.choose(card_index)
@sio.event @sio.event
@bang_handler
def scrap(sid, card_index): def scrap(sid, card_index):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.rpc_log.append(f'{ses.name};scrap;{card_index}') ses.game.rpc_log.append(f'{ses.name};scrap;{card_index}')
@ -355,18 +401,21 @@ def special(sid, data):
ses.special(data) ses.special(data)
@sio.event @sio.event
@bang_handler
def gold_rush_discard(sid): def gold_rush_discard(sid):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.rpc_log.append(f'{ses.name};gold_rush_discard;') ses.game.rpc_log.append(f'{ses.name};gold_rush_discard;')
ses.gold_rush_discard() ses.gold_rush_discard()
@sio.event @sio.event
@bang_handler
def buy_gold_rush_card(sid, data:int): def buy_gold_rush_card(sid, data:int):
ses: Player = sio.get_session(sid) ses: Player = sio.get_session(sid)
ses.game.rpc_log.append(f'{ses.name};buy_gold_rush_card;{data}') ses.game.rpc_log.append(f'{ses.name};buy_gold_rush_card;{data}')
ses.buy_gold_rush_card(data) ses.buy_gold_rush_card(data)
@sio.event @sio.event
@bang_handler
def chat_message(sid, msg, pl=None): def chat_message(sid, msg, pl=None):
ses: Player = sio.get_session(sid) if pl is None else pl ses: Player = sio.get_session(sid) if pl is None else pl
ses.game.rpc_log.append(f'{ses.name};chat_message;{msg}') ses.game.rpc_log.append(f'{ses.name};chat_message;{msg}')
@ -611,6 +660,7 @@ Sockets for the help screen
""" """
@sio.event @sio.event
@bang_handler
def get_cards(sid): def get_cards(sid):
import bang.cards as c import bang.cards as c
cards = c.get_starting_deck(['dodge_city']) cards = c.get_starting_deck(['dodge_city'])
@ -623,12 +673,14 @@ def get_cards(sid):
Metrics.send_metric('help_screen_viewed', points=[1]) Metrics.send_metric('help_screen_viewed', points=[1])
@sio.event @sio.event
@bang_handler
def get_characters(sid): def get_characters(sid):
import bang.characters as ch import bang.characters as ch
cards = ch.all_characters(['dodge_city', 'gold_rush']) cards = ch.all_characters(['dodge_city', 'gold_rush'])
sio.emit('characters_info', room=sid, data=json.dumps(cards, default=lambda o: o.__dict__)) sio.emit('characters_info', room=sid, data=json.dumps(cards, default=lambda o: o.__dict__))
@sio.event @sio.event
@bang_handler
def get_highnooncards(sid): def get_highnooncards(sid):
import bang.expansions.high_noon.card_events as ceh import bang.expansions.high_noon.card_events as ceh
chs = [] chs = []
@ -637,6 +689,7 @@ def get_highnooncards(sid):
sio.emit('highnooncards_info', room=sid, data=json.dumps(chs, default=lambda o: o.__dict__)) sio.emit('highnooncards_info', room=sid, data=json.dumps(chs, default=lambda o: o.__dict__))
@sio.event @sio.event
@bang_handler
def get_foccards(sid): def get_foccards(sid):
import bang.expansions.fistful_of_cards.card_events as ce import bang.expansions.fistful_of_cards.card_events as ce
chs = [] chs = []
@ -645,6 +698,7 @@ def get_foccards(sid):
sio.emit('foccards_info', room=sid, data=json.dumps(chs, default=lambda o: o.__dict__)) sio.emit('foccards_info', room=sid, data=json.dumps(chs, default=lambda o: o.__dict__))
@sio.event @sio.event
@bang_handler
def get_goldrushcards(sid): def get_goldrushcards(sid):
import bang.expansions.gold_rush.shop_cards as grc import bang.expansions.gold_rush.shop_cards as grc
cards = grc.get_cards() cards = grc.get_cards()
@ -656,6 +710,7 @@ def get_goldrushcards(sid):
sio.emit('goldrushcards_info', room=sid, data=json.dumps(cards, default=lambda o: o.__dict__)) sio.emit('goldrushcards_info', room=sid, data=json.dumps(cards, default=lambda o: o.__dict__))
@sio.event @sio.event
@bang_handler
def get_valleyofshadowscards(sid): def get_valleyofshadowscards(sid):
import bang.expansions.the_valley_of_shadows.cards as tvos import bang.expansions.the_valley_of_shadows.cards as tvos
cards = tvos.get_starting_deck() cards = tvos.get_starting_deck()
@ -667,6 +722,7 @@ def get_valleyofshadowscards(sid):
sio.emit('valleyofshadows_info', room=sid, data=json.dumps(cards, default=lambda o: o.__dict__)) sio.emit('valleyofshadows_info', room=sid, data=json.dumps(cards, default=lambda o: o.__dict__))
@sio.event @sio.event
@bang_handler
def discord_auth(sid, data): def discord_auth(sid, data):
res = requests.post('https://discord.com/api/oauth2/token', data={ res = requests.post('https://discord.com/api/oauth2/token', data={
'client_id': '1059452581027532880', 'client_id': '1059452581027532880',