From 7779066e9b51c1a5498a5cd8b46ce08ab3afbeea Mon Sep 17 00:00:00 2001 From: Alberto Xamin Date: Thu, 2 Sep 2021 22:39:26 +0300 Subject: [PATCH] replay on hastebin and discord --- backend/__init__.py | 94 +++++++++++++++++++++++++--------------- backend/bang/game.py | 3 +- backend/requirements.txt | 4 +- 3 files changed, 65 insertions(+), 36 deletions(-) diff --git a/backend/__init__.py b/backend/__init__.py index 19b1c5a..8771f72 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -1,6 +1,7 @@ import os import json import random +from tests.dummy_socket import DummySocket from typing import List import eventlet import socketio @@ -8,6 +9,9 @@ import socketio from bang.game import Game from bang.players import Player, PendingAction +import requests +from discord_webhook import DiscordWebhook + import sys sys.setrecursionlimit(10**6) # this should prevents bots from stopping @@ -236,7 +240,6 @@ Sockets for the game @sio.event def start_game(sid): ses: Player = sio.get_session(sid) - ses.game.rpc_log.append(f'{ses.name};start_game') ses.game.start_game() advertise_lobbies() @@ -312,8 +315,8 @@ def buy_gold_rush_card(sid, data:int): ses.buy_gold_rush_card(data) @sio.event -def chat_message(sid, msg): - ses: Player = sio.get_session(sid) +def chat_message(sid, msg, pl=None): + ses: Player = sio.get_session(sid) if pl is None else pl ses.game.rpc_log.append(f'{ses.name};chat_message;{msg}') if len(msg) > 0: if msg[0] == '/': @@ -331,38 +334,61 @@ def chat_message(sid, msg): ses.game.add_player(bot) bot.bot_spin() return + if '/report' in msg and not ses.game.is_replay: + data = "\n".join(ses.game.rpc_log).strip() + response = requests.post("http://hastebin.com/documents", data) + key = json.loads(response.text).get('key') + webhook = DiscordWebhook(url=os.environ['DISCORD_WEBHOOK'], content=f'New bug report, replay at https://hastebin.com/{key}') + response = webhook.execute() + return if '/replay' in msg: - for i in range(len(ses.game.rpc_log)): - print('replay:', i, 'of', len(ses.game.rpc_log)) - cmd = ses.game.rpc_log[i].split(';') - player = [p for p in ses.game.players if p.name == cmd[0]][0] - if cmd[1] == 'start_game': - ses.game.start_game(ses.game.SEED) - if cmd[1] == 'set_character': - set_character(player.sid, cmd[2]) - if cmd[1] == 'draw': - draw(player.sid, cmd[2]) - if cmd[1] == 'pick': - pick(player.sid) - if cmd[1] == 'end_turn': - end_turn(player.sid) - if cmd[1] == 'play_card': - play_card(player.sid, json.loads(cmd[2])) - if cmd[1] == 'respond': - respond(player.sid, int(cmd[2])) - if cmd[1] == 'choose': - choose(player.sid, int(cmd[2])) - if cmd[1] == 'scrap': - scrap(player.sid, int(cmd[2])) - if cmd[1] == 'special': - special(player.sid, json.loads(cmd[2])) - if cmd[1] == 'gold_rush_discard': - gold_rush_discard(player.sid) - if cmd[1] == 'buy_gold_rush_card': - buy_gold_rush_card(player.sid, int(cmd[2])) - if cmd[1] == 'chat_message': - chat_message(player.sid, cmd[2]) - eventlet.sleep(1) + _cmd = msg.split() + if len(_cmd) == 2: + replay_id = _cmd[1] + response = requests.get(f"http://hastebin.com/raw/{replay_id}") + log = response.text.splitlines() + ses.game.spectators.append(ses) + ses.game.players = [] + ses.game.is_replay = True + for i in range(len(log)): + print('replay:', i, 'of', len(log)) + cmd = log[i].split(';') + if cmd[1] == 'players': + ses.game.expansions = json.loads(cmd[4].replace("'",'"')) + pnames = json.loads(cmd[3].replace("'",'"')) + for p in pnames: + ses.game.add_player(Player(p, p, DummySocket(), bot=False)) + continue + if cmd[1] == 'start_game': + ses.game.start_game(int(cmd[2])) + continue + player = [p for p in ses.game.players if p.name == cmd[0]][0] + if cmd[1] == 'set_character': + player.set_character(cmd[2]) + if cmd[1] == 'draw': + player.draw(cmd[2]) + if cmd[1] == 'pick': + player.pick() + if cmd[1] == 'end_turn': + player.end_turn() + if cmd[1] == 'play_card': + data = json.loads(cmd[2]) + player.play_card(data['index'], data['against'], data['with']) + if cmd[1] == 'respond': + player.respond(int(cmd[2])) + if cmd[1] == 'choose': + player.choose(int(cmd[2])) + if cmd[1] == 'scrap': + player.scrap(int(cmd[2])) + if cmd[1] == 'special': + player.special(json.loads(cmd[2])) + if cmd[1] == 'gold_rush_discard': + player.gold_rush_discard() + if cmd[1] == 'buy_gold_rush_card': + player.buy_gold_rush_card(int(cmd[2])) + if cmd[1] == 'chat_message': + chat_message(None, cmd[2], player) + eventlet.sleep(1) if '/startwithseed' in msg and not ses.game.started: if len(msg.split()) > 1: ses.game.start_game(int(msg.split()[1])) diff --git a/backend/bang/game.py b/backend/bang/game.py index bf9e5de..bebba85 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -49,6 +49,7 @@ class Game: self.is_hidden = False self.rng = random.Random() self.rpc_log = [] + self.is_replay = False def reset(self): print(f'{self.name}: resetting lobby') @@ -192,8 +193,8 @@ class Game: SEED = int(time.time()) print(f'{self.name}: SEED IS {SEED}') self.SEED = SEED + self.rpc_log = [f';players;{len(self.players)};{[p.name for p in self.players]};{self.expansions}', f';start_game;{SEED}'] self.rng = random.Random(SEED) - self.players_map = {c.name: i for i, c in enumerate(self.players)} self.sio.emit('chat_message', room=self.name, data=f'_starting') self.sio.emit('start', room=self.name) diff --git a/backend/requirements.txt b/backend/requirements.txt index 1bd7097..f9a5914 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -5,4 +5,6 @@ greenlet==1.1.1 python-engineio==3.14.2 python-socketio==4.6.1 six==1.16.0 -pytest==6.2.4 \ No newline at end of file +pytest==6.2.4 +requests==2.26.0 +discord-webhook==0.14.0 \ No newline at end of file