add discord login

This commit is contained in:
Alberto Xamin 2023-01-03 13:50:41 +00:00
parent e97c0d4bda
commit 4d48a4bd69
7 changed files with 126 additions and 10 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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