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