add discord login
This commit is contained in:
		
							parent
							
								
									e97c0d4bda
								
							
						
					
					
						commit
						4d48a4bd69
					
				| @ -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()] | ||||
|  | ||||
| @ -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') | ||||
|  | ||||
| @ -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)) | ||||
|  | ||||
| @ -1,7 +1,8 @@ | ||||
| <template> | ||||
| 	<div :class="{ card: true, equipment: card.is_equipment, character:card.is_character, back:card.is_back, 'usable-next-turn':card.usable_next_turn, 'must-be-used':card.must_be_used, 'gold-rush': card.expansion === 'gold_rush', 'brown':card.kind === 0, 'black':card.kind === 1,}"> | ||||
| 	<div :class="{ card: true, avatarred:card.avatar, equipment: card.is_equipment, character:card.is_character, back:card.is_back, 'usable-next-turn':card.usable_next_turn, 'must-be-used':card.must_be_used, 'gold-rush': card.expansion === 'gold_rush', 'brown':card.kind === 0, 'black':card.kind === 1,}"> | ||||
| 		<h4>{{cardName}}</h4> | ||||
| 		<div class="emoji">{{emoji}}</div> | ||||
| 		<div v-if="card.avatar" class="avatar" :style="`background-image: url(${card.avatar});`"></div> | ||||
| 		<div :class="{emoji:true, bottomed:card.avatar}">{{emoji}}</div> | ||||
| 		<div class="alt_text">{{card.alt_text}}</div> | ||||
| 		<div class="suit">{{number}}<span :style="`${(card.suit !== undefined && card.suit%2 === 0)? 'color:red':''}`">{{suit}}</span></div> | ||||
| 		<div class="expansion" v-if="card.expansion_icon">{{card.expansion_icon}}</div> | ||||
| @ -72,6 +73,12 @@ export default { | ||||
| 	word-wrap: normal; | ||||
| 	/* word-wrap: break-word; */ | ||||
| } | ||||
| .avatarred { | ||||
| 	display: flex; | ||||
| 	align-items: center; | ||||
| 	justify-content: center; | ||||
| 	flex-wrap: wrap; | ||||
| } | ||||
| .card.back{ | ||||
| 	color:white; | ||||
| 	background: repeating-linear-gradient( | ||||
| @ -117,6 +124,17 @@ export default { | ||||
| 	); | ||||
| 	border: 2pt solid rgb(50 122 172); | ||||
| } | ||||
| .avatar { | ||||
| 	position: absolute; | ||||
| 	width: 36pt; | ||||
| 	margin: auto; | ||||
| 	top: 25%; | ||||
| 	background-position: center; | ||||
| 	background-size: contain; | ||||
| 	background-repeat: no-repeat; | ||||
| 	border-radius: 36pt; | ||||
| 	height: 36pt; | ||||
| } | ||||
| .card.brown.gold-rush { | ||||
| 	box-shadow: 0 0 0pt 4pt var(--bg-color), 0 0 5pt 4pt #aaa; | ||||
| 	border: 2pt dotted #9C7340; | ||||
| @ -142,6 +160,10 @@ export default { | ||||
| 	font-size:26pt; | ||||
| 	top: 35%; | ||||
| }  | ||||
| .emoji.bottomed { | ||||
| 	top: 45%; | ||||
| 	left: 8pt; | ||||
| } | ||||
| .card.must-be-used { | ||||
| 	filter: drop-shadow(0 0 5px red); | ||||
| } | ||||
|  | ||||
| @ -156,6 +156,7 @@ export default { | ||||
| 					name: x.name, | ||||
| 					ready: x.ready, | ||||
| 					is_bot: x.is_bot, | ||||
| 					avatar: x.avatar, | ||||
| 					ncards: 0, | ||||
| 				} | ||||
| 			}) | ||||
| @ -296,6 +297,7 @@ export default { | ||||
| 				number: ((this.username == player.name) ? this.$t('you') : (this.players[0].name == player.name) ? this.$t('owner') :'') + (player.dist ? `${player.dist}⛰` : ''), | ||||
| 				icon: icon, | ||||
| 				is_character: true, | ||||
| 				avatar: player.avatar, | ||||
| 			} | ||||
| 		}, | ||||
| 		startGame() { | ||||
| @ -345,7 +347,7 @@ export default { | ||||
| 			if (name.trim().length > 0){ | ||||
| 				localStorage.setItem('username', name) | ||||
| 				this.hasToSetUsername = false | ||||
| 				this.$socket.emit('set_username', name) | ||||
| 				this.$socket.emit('set_username', {name:name}) | ||||
| 			} | ||||
| 		}, | ||||
| 	}, | ||||
| @ -371,7 +373,7 @@ export default { | ||||
| 			console.log('mounted lobby') | ||||
| 		if (!this.$route.query.code) | ||||
| 			return this.$router.push('/') | ||||
| 		this.$socket.emit('get_me', {name:this.$route.query.code, password:this.$route.query.pwd, username: localStorage.getItem('username')}) | ||||
| 		this.$socket.emit('get_me', {name:this.$route.query.code, password:this.$route.query.pwd, username: localStorage.getItem('username'), discord_token: localStorage.getItem('discord_token')}) | ||||
| 	}, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| @ -18,6 +18,7 @@ | ||||
| 					<input id="username" v-model="username" /> | ||||
| 					<input type="submit" class="btn" :value="$t('submit')"/> | ||||
| 				</form> | ||||
| 				<a class="btn" :href="redirectUrl">Login with Discord</a> | ||||
| 				<p v-if="onlinePlayers > 0">{{$t("online_players")}}{{onlinePlayers}}</p> | ||||
| 			</div> | ||||
| 			<div v-else> | ||||
| @ -71,8 +72,12 @@ export default { | ||||
| 		isInLobby: false, | ||||
| 		onlinePlayers: 0, | ||||
| 		randomTip: '', | ||||
| 		discordPic: '', | ||||
| 	}), | ||||
| 	computed: { | ||||
| 		redirectUrl() { | ||||
| 			return 'https://discordapp.com/api/oauth2/authorize?client_id=1059452581027532880&response_type=code&scope=identify&redirect_uri=' + window.location.origin; | ||||
| 		}, | ||||
| 		noLobbyAvailable() { | ||||
| 			return this.openLobbies && this.openLobbies.length == 0 | ||||
| 		}, | ||||
| @ -85,6 +90,7 @@ export default { | ||||
| 				number: this.$t('you'), | ||||
| 				icon: '🤠', | ||||
| 				is_character: true, | ||||
| 				avatar: this.discordPic, | ||||
| 			} | ||||
| 		}, | ||||
| 		version() { | ||||
| @ -105,14 +111,20 @@ export default { | ||||
| 		players(num) { | ||||
| 			this.onlinePlayers = num; | ||||
| 			// console.log('PLAYERS:' + num) | ||||
| 		} | ||||
| 		}, | ||||
| 		discord_auth_succ(data) { | ||||
| 			if (data.access_token) { | ||||
| 				localStorage.setItem('discord_token', data.access_token) | ||||
| 				this.$$router.push({path:'/'}) | ||||
| 			} | ||||
| 		}, | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		setUsername(e){ | ||||
| 			if (this.username.trim().length > 0){ | ||||
| 				this.didSetUsername = true | ||||
| 				localStorage.setItem('username', this.username) | ||||
| 				this.$socket.emit('set_username', this.username) | ||||
| 				this.$socket.emit('set_username', {name:this.username}) | ||||
| 				e.preventDefault(); | ||||
| 			} | ||||
| 		}, | ||||
| @ -147,6 +159,28 @@ export default { | ||||
| 		}, | ||||
| 	}, | ||||
| 	mounted() { | ||||
| 		if (this.$route.query.code) { | ||||
| 			this.$socket.emit('discord_auth', {code:this.$route.query.code, origin:window.location.origin}) | ||||
| 		} | ||||
| 		else if (localStorage.getItem('discord_token')) { | ||||
| 			//get username from discord | ||||
| 			fetch('https://discordapp.com/api/users/@me', { | ||||
| 				headers: { | ||||
| 					'Authorization': 'Bearer ' + localStorage.getItem('discord_token') | ||||
| 				} | ||||
| 			}) | ||||
| 			.then(response => response.json()) | ||||
| 			.then(data => { | ||||
| 				console.log(data) | ||||
| 				this.username = data.username | ||||
| 				this.didSetUsername = true | ||||
| 				this.discordPic = `https://cdn.discordapp.com/avatars/${data.id}/${data.avatar}.png` | ||||
| 				this.$socket.emit('set_username', {name: this.username, discord_token: localStorage.getItem('discord_token')}) | ||||
| 			}).catch(err => { | ||||
| 				console.error(err) | ||||
| 				localStorage.removeItem('discord_token') | ||||
| 			}) | ||||
| 		} | ||||
| 		this.randomTip = `tip_${1+Math.floor(Math.random() * 8)}` | ||||
| 		if (localStorage.getItem('username')) | ||||
| 			this.username = localStorage.getItem('username') | ||||
|  | ||||
| @ -234,6 +234,7 @@ export default { | ||||
| 					name: player.name, | ||||
| 					number: player.dist !== undefined ? `${player.dist}⛰` : '', | ||||
| 					icon: this.noStar ? player.icon : player.is_sheriff ? '⭐' : '🤠', | ||||
| 					avatar: player.avatar, | ||||
| 					is_character: true, | ||||
| 				}}) | ||||
| 			return vis | ||||
| @ -255,6 +256,7 @@ export default { | ||||
| 					number: player.dist !== undefined ? `${player.dist}⛰` : '', | ||||
| 					icon: this.noStar ? player.icon : player.is_sheriff ? '⭐' : '🤠', | ||||
| 					alt_text: Array(player.lives+1).join('❤️')+Array(player.max_lives-player.lives+1).join('💀'), | ||||
| 					avatar: player.avatar, | ||||
| 					is_character: true, | ||||
| 				}}) | ||||
| 			if (this.card_against && this.card_against.can_target_self) { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Alberto Xamin
						Alberto Xamin