replay on hastebin and discord

This commit is contained in:
Alberto Xamin 2021-09-02 22:39:26 +03:00
parent 1fe7f05680
commit 7779066e9b
No known key found for this signature in database
GPG Key ID: 4F026F48309500A2
3 changed files with 65 additions and 36 deletions

View File

@ -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]))

View File

@ -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)

View File

@ -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
pytest==6.2.4
requests==2.26.0
discord-webhook==0.14.0