1
0

Audio is working

Signed-off-by: James Ketrenos <james_eikona@ketrenos.com>
This commit is contained in:
James Ketrenos 2022-03-11 14:26:42 -08:00
parent 211d03548d
commit 689b498f6b
8 changed files with 53 additions and 69 deletions

View File

@ -1,6 +1,5 @@
body { body {
font-family: 'Droid Sans', 'Arial Narrow', Arial, sans-serif; font-family: 'Droid Sans', 'Arial Narrow', Arial, sans-serif;
background-color: black;
} }
#root { #root {

View File

@ -13,10 +13,10 @@ import history from "./history.js";
import { GlobalContext } from "./GlobalContext.js"; import { GlobalContext } from "./GlobalContext.js";
import { PingPong } from "./PingPong.js"; import { PingPong } from "./PingPong.js";
import { PlayerList } from "./PlayerList.js"; import { PlayerList } from "./PlayerList.js";
import { PlayerName } from "./PlayerName.js";
import { Chat } from "./Chat.js"; import { Chat } from "./Chat.js";
import { MediaAgent } from "./MediaControl.js"; import { MediaAgent } from "./MediaControl.js";
import { Board } from "./Board.js"; import { Board } from "./Board.js";
import { Actions } from "./Actions.js";
import "./App.css"; import "./App.css";
@ -193,18 +193,19 @@ const Table = () => {
console.log(`Loaded: ${loaded}`); console.log(`Loaded: ${loaded}`);
return <GlobalContext.Provider value={{ ws, name, gameId, peers, setPeers }}> return <GlobalContext.Provider value={{
ws, name, gameId, peers, setPeers }}>
<MediaAgent/> <MediaAgent/>
<PingPong/> <PingPong/>
<div className="Table"> <div className="Table">
<div className="Game"> <div className="Game">
<Board/> <Board/>
<div className="Pieces"/> <div className="Hand">todo: player's hand</div>
</div> </div>
<div className="Sidebar"> <div className="Sidebar">
{ loaded && name === "" && <PlayerName/> }
{ name !== "" && <PlayerList/> } { name !== "" && <PlayerList/> }
{ name !== "" && <Chat/> } { name !== "" && <Chat/> }
{ loaded && <Actions/> }
</div> </div>
</div> </div>
</GlobalContext.Provider>; </GlobalContext.Provider>;

View File

@ -5,6 +5,7 @@
padding: 0.5em; padding: 0.5em;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
margin: 0.25rem 0.25rem 0.25rem 0;
} }
.ChatList { .ChatList {

View File

@ -304,7 +304,7 @@ const MediaAgent = () => {
}, [peers, name, setPeers, stream]); }, [peers, name, setPeers, stream]);
useEffect(() => { useEffect(() => {
if (!ws) { if (!ws || !name) {
return; return;
} }
@ -338,7 +338,7 @@ const MediaAgent = () => {
console.error(error); console.error(error);
console.log("Access denied for audio/video"); console.log("Access denied for audio/video");
}); });
}, [ws, setStream]); }, [ws, setStream, name]);
if (!ws) { if (!ws) {
return <></>; return <></>;

View File

@ -4,6 +4,7 @@
padding: 0.5em; padding: 0.5em;
user-select: none; user-select: none;
flex-direction: column; flex-direction: column;
margin: 0.25rem 0.25rem 0.25rem 0;
} }
.PlayerList .Name { .PlayerList .Name {
@ -33,6 +34,11 @@
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
margin: 0.25rem; margin: 0.25rem;
padding: 0.25rem;
}
.PlayerList .Unselected .Self {
background-color: rgba(255, 255, 0, 0.5);
} }
.PlayerList .PlayerSelector .PlayerColor { .PlayerList .PlayerSelector .PlayerColor {

View File

@ -18,10 +18,10 @@ const PlayerList = () => {
const data = JSON.parse(event.data); const data = JSON.parse(event.data);
switch (data.type) { switch (data.type) {
case 'game-update': case 'game-update':
if (data.update.unselected) { if ('unselected' in data.update) {
setUneslected(data.update.unselected); setUneslected(data.update.unselected);
} }
if (data.update.players) { if ('players' in data.update) {
let found = false; let found = false;
for (let key in data.update.players) { for (let key in data.update.players) {
if (data.update.players[key].name === name) { if (data.update.players[key].name === name) {
@ -35,7 +35,7 @@ const PlayerList = () => {
} }
setPlayers(data.update.players); setPlayers(data.update.players);
} }
if (data.update.state) { if ('state' in data.update && data.update.state !== state) {
setState(data.update.state); setState(data.update.state);
} }
break; break;
@ -100,7 +100,7 @@ const PlayerList = () => {
} }
const waiting = unselected.map((player) => { const waiting = unselected.map((player) => {
return <div key={player}> return <div className={player === name ? 'Self' : ''} key={player}>
<div>{ player }</div> <div>{ player }</div>
<MediaControl peer={player} isSelf={name === player}/> <MediaControl peer={player} isSelf={name === player}/>
</div> </div>

View File

@ -1,61 +1,19 @@
import React, { useState, useEffect, useContext, useRef } from "react"; import React, { useState, useEffect, useContext, useRef } from "react";
import "./PlayerName.css"; import "./PlayerName.css";
import Paper from '@material-ui/core/Paper';
import TextField from '@material-ui/core/TextField'; import TextField from '@material-ui/core/TextField';
import Button from '@material-ui/core/Button'; import Button from '@material-ui/core/Button';
import { GlobalContext } from "./GlobalContext.js"; const PlayerName = ({ name, setName }) => {
const [edit, setEdit] = useState(name);
const PlayerName = () => {
const global = useContext(GlobalContext);
const [name, setName] = useState(global.name ? global.name : "");
const [error, setError] = useState("");
const onWsMessage = (event) => {
const data = JSON.parse(event.data);
switch (data.type) {
case 'game-update':
if ('name' in data.update && data.update.name !== name) {
setName(data.update.name);
}
break;
case 'player-name':
if ('error' in data) {
setError(data.error);
}
break;
default:
break;
}
};
const refWsMessage = useRef(onWsMessage);
useEffect(() => { refWsMessage.current = onWsMessage; });
useEffect(() => {
if (!global.ws) {
return;
}
const cbMessage = e => refWsMessage.current(e);
global.ws.addEventListener('message', cbMessage);
return () => {
global.ws.removeEventListener('message', cbMessage);
}
}, [global.ws, refWsMessage]);
const sendName = () => { const sendName = () => {
if (name !== global.name && name !== "") { if (edit !== name) {
if (error) { setName(edit);
setError("");
}
global.ws.send(JSON.stringify({ type: 'player-name', name }));
} }
} }
const nameChange = (event) => { const nameChange = (event) => {
setName(event.target.value); setEdit(event.target.value);
} }
const nameKeyPress = (event) => { const nameKeyPress = (event) => {
@ -65,17 +23,16 @@ const PlayerName = () => {
} }
return ( return (
<Paper className="PlayerName"> <div className="PlayerName">
{ error !== "" && <div>Error: {error}</div> }
<TextField className="nameInput" <TextField className="nameInput"
onChange={nameChange} onChange={nameChange}
onKeyPress={nameKeyPress} onKeyPress={nameKeyPress}
label="Enter your name" label="Enter your name"
variant="outlined" variant="outlined"
value={name} value={edit}
/> />
<Button onClick={() => sendName()}>Set</Button> <Button onClick={sendName}>Set</Button>
</Paper> </div>
); );
}; };

View File

@ -483,7 +483,8 @@ const getSession = (game, reqSession) => {
name: undefined, name: undefined,
color: undefined, color: undefined,
player: undefined, player: undefined,
lastActive: Date.now() lastActive: Date.now(),
live: true
}; };
} }
@ -508,7 +509,9 @@ const getSession = (game, reqSession) => {
} }
session.lastActive = Date.now(); session.lastActive = Date.now();
session.live = true;
if (session.player) { if (session.player) {
session.player.live = true;
session.player.lastActive = session.lastActive; session.player.lastActive = session.lastActive;
} }
@ -847,7 +850,7 @@ const setPlayerName = (game, session, name) => {
} }
} }
let message; let message, hasAudio = false;
if (!session.name) { if (!session.name) {
message = `A new player has entered the lobby as ${name}.`; message = `A new player has entered the lobby as ${name}.`;
@ -860,7 +863,8 @@ const setPlayerName = (game, session, name) => {
message = `${name} has rejoined the lobby.`; message = `${name} has rejoined the lobby.`;
} }
session.name = name; session.name = name;
if (session.ws && id in audio) { if (session.ws && (id in audio) && session.name in audio[id]) {
hasAudio = true;
part(audio[id], session, game.id); part(audio[id], session, game.id);
} }
} else { } else {
@ -874,14 +878,27 @@ const setPlayerName = (game, session, name) => {
if (!session.color) { if (!session.color) {
console.log(`Adding ${session.name} to the unselected`); console.log(`Adding ${session.name} to the unselected`);
game.unselected.push(session);
} }
if (session.ws) { if (session.ws && hasAudio) {
join(audio[id], session, game.id); join(audio[id], session, game.id);
} }
console.log(message); console.log(message);
addChatMessage(game, null, message); addChatMessage(game, null, message);
session.live = true;
if (session.player) {
session.player.live = true;
}
/* Rebuild the unselected list */
game.unselected = [];
for (let id in game.sessions) {
if (!game.sessions[id].color && game.sessions[id].name) {
game.unselected.push(game.sessions[id]);
}
}
return undefined; return undefined;
} }
@ -957,6 +974,8 @@ const setPlayerColor = (game, session, color) => {
session.player.status = `Active`; session.player.status = `Active`;
session.player.lastActive = Date.now(); session.player.lastActive = Date.now();
session.color = color; session.color = color;
session.live = true;
session.player.live = true;
game.players[color].name = session.name; game.players[color].name = session.name;
/* Rebuild the unselected list */ /* Rebuild the unselected list */
@ -2896,7 +2915,7 @@ const departLobby = (game, session, color) => {
update.unselected = getFilteredUnselected(game); update.unselected = getFilteredUnselected(game);
if (session.player) { if (session.player) {
session.player.live = true; session.player.live = false;
update.players = game.players; update.players = game.players;
} }
@ -3524,6 +3543,7 @@ const filterGameForPlayer = (game, session) => {
reducedGame.unselected = getFilteredUnselected(game); reducedGame.unselected = getFilteredUnselected(game);
return Object.assign(reducedGame, { return Object.assign(reducedGame, {
live: true,
timestamp: Date.now(), timestamp: Date.now(),
status: session.error ? session.error : "success", status: session.error ? session.error : "success",
name: session.name, name: session.name,