diff --git a/backend/bang/game.py b/backend/bang/game.py index 3548454..828ecf3 100644 --- a/backend/bang/game.py +++ b/backend/bang/game.py @@ -149,7 +149,7 @@ class Game: self.sio.emit('room', room=self.name if not sid else sid, data={ 'name': self.name, 'started': self.started, - 'players': [{'name':p.name, 'ready': p.character != None, 'is_bot': p.is_bot} for p in self.players], + 'players': [{'name':p.name, 'ready': p.character != None, 'is_bot': p.is_bot, 'avatar': p.avatar} for p in self.players], 'password': self.password, 'is_competitive': self.is_competitive, 'disconnect_bot': self.disconnect_bot, @@ -763,6 +763,7 @@ class Game: 'is_ghost': pls[j].is_ghost, 'is_bot': pls[j].is_bot, 'icon': pls[j].role.icon if (pls[j].role is not None) else '🤠', + 'avatar': pls[j].avatar, 'role': pls[j].role, } for j in range(len(pls)) if i != j] @@ -788,6 +789,7 @@ class Game: 'character': p.character.__dict__ if p.character else None, 'real_character': p.real_character.__dict__ if p.real_character else None, 'icon': p.role.icon if self.initial_players == 3 and p.role else '🤠', + 'avatar': p.avatar, 'is_ghost': p.is_ghost, 'is_bot': p.is_bot, } for p in self.get_alive_players()] diff --git a/backend/bang/players.py b/backend/bang/players.py index 336cf68..67cd0f8 100644 --- a/backend/bang/players.py +++ b/backend/bang/players.py @@ -16,6 +16,18 @@ import eventlet from typing import List from metrics import Metrics +robot_pictures = [ + 'https://i.imgur.com/40rAFIb.jpg', + 'https://i.imgur.com/gG77VRR.jpg', + 'https://i.imgur.com/l2DTQeH.jpg', + 'https://i.imgur.com/aPM2gix.jpg', + 'https://i.imgur.com/ep5EB8c.jpg', + 'https://i.imgur.com/qsOWIsf.jpg', + 'https://emojipedia-us.s3.dualstack.us-west-1.amazonaws.com/thumbs/240/apple/325/robot_1f916.png', + 'https://emojipedia-us.s3.dualstack.us-west-1.amazonaws.com/thumbs/240/openmoji/338/robot_1f916.png', + 'https://emojipedia-us.s3.dualstack.us-west-1.amazonaws.com/thumbs/240/microsoft/319/robot_1f916.png', +] + class PendingAction(IntEnum): PICK = 0 DRAW = 1 @@ -26,13 +38,37 @@ class PendingAction(IntEnum): class Player: - def __init__(self, name, sid, sio, bot=False): + def get_avatar(self): + import requests + headers = { + 'Authorization': 'Bearer ' + self.discord_token, + } + r = requests.get('https://discordapp.com/api/users/@me', headers=headers) + if r.status_code == 200: + res = r.json() + self.avatar = f'https://cdn.discordapp.com/avatars/{res["id"]}/{res["avatar"]}.png' + self.sio.emit('chat_message', room=self.game.name, data=f'_change_username|{self.name}|{res["username"]}') + self.name = res['username'] + if self.game: + self.game.notify_room() + self.sio.emit('me', data=self.name, room=self.sid) + else: + print('error getting avatar', r.status_code, r.text) + print(r) + + def __init__(self, name, sid, sio, bot=False, discord_token=None): import bang.game as g super().__init__() self.name = name self.sid = sid self.sio = sio self.is_bot = bot + self.discord_token = discord_token + self.avatar = '' + if self.is_bot: + self.avatar = robot_pictures[randrange(len(robot_pictures))] + if self.discord_token: + sio.start_background_task(self.get_avatar) self.game: g = None self.reset() @@ -207,6 +243,7 @@ class Player: ser.pop('sio') ser.pop('sid') ser.pop('on_pick_cb') + ser.pop('discord_token') ser.pop('on_failed_response_cb') ser.pop('attacker') ser.pop('rissa_targets') diff --git a/backend/server.py b/backend/server.py index b1e14d6..5fa497c 100644 --- a/backend/server.py +++ b/backend/server.py @@ -88,10 +88,11 @@ def report(sid, text): def set_username(sid, username): ses = sio.get_session(sid) if not isinstance(ses, Player): - sio.save_session(sid, Player(username, sid, sio)) + sio.save_session(sid, Player(username["name"], sid, sio, discord_token=username["discord_token"])) print(f'{sid} is now {username}') advertise_lobbies() elif ses.game == None or not ses.game.started: + username = username["name"] print(f'{sid} changed username to {username}') prev = ses.name if len([p for p in ses.game.players if p.name == username]) > 0: @@ -109,7 +110,7 @@ def get_me(sid, room): if sio.get_session(sid).game: sio.get_session(sid).game.notify_room() else: - sio.save_session(sid, Player('player', sid, sio)) + sio.save_session(sid, Player('player', sid, sio, discord_token=room['discord_token'])) de_games = [g for g in games if g.name == room['name']] if len(de_games) == 1 and not de_games[0].started: join_room(sid, room) @@ -612,6 +613,18 @@ def get_goldrushcards(sid): cards = [cards_dict[i] for i in cards_dict] sio.emit('goldrushcards_info', room=sid, data=json.dumps(cards, default=lambda o: o.__dict__)) +@sio.event +def discord_auth(sid, data): + res = requests.post('https://discord.com/api/oauth2/token', data={ + 'client_id': '1059452581027532880', + 'client_secret': 'Mc8ZlMQhayzi1eOqWFtGHs3L0iXCzaEu', + 'grant_type': 'authorization_code', + 'redirect_uri': data['origin'], + 'code': data['code'], + }) + if res.status_code == 200: + sio.emit('discord_auth_succ', room=sid, data=res.json()) + def pool_metrics(): sio.sleep(60) Metrics.send_metric('lobbies', points=[len([g for g in games if not g.is_replay])]) @@ -636,6 +649,10 @@ class CustomProxyFix(object): return [''] return self.app(environ, start_response) + +discord_ci = '1059452581027532880' +discord_cs = 'Mc8ZlMQhayzi1eOqWFtGHs3L0iXCzaEu' + if __name__ == '__main__': sio.start_background_task(pool_metrics) eventlet.wsgi.server(eventlet.listen(('', 5001)), CustomProxyFix(app)) diff --git a/frontend/src/components/Card.vue b/frontend/src/components/Card.vue index d1dd002..f1ef573 100644 --- a/frontend/src/components/Card.vue +++ b/frontend/src/components/Card.vue @@ -1,7 +1,8 @@