Send and play audio message

This commit is contained in:
Gregoire Parant 2020-09-20 17:12:27 +02:00
parent 4c7e458e52
commit 45ad4bbb36
7 changed files with 117 additions and 24 deletions

View file

@ -0,0 +1,40 @@
import {Application, Request, Response} from "express";
import {OK} from "http-status-codes";
import {URL_ROOM_STARTED} from "_Enum/EnvironmentVariable";
import {uuid} from "uuidv4";
export class FileController {
App : Application;
constructor(App : Application) {
this.App = App;
this.uploadAudioMessage();
this.downloadAudioMessage();
}
uploadAudioMessage(){
this.App.post("/upload-audio-message", (req: Request, res: Response) => {
//TODO check user connected and admin role
//TODO upload audio message
const audioMessageId = uuid();
return res.status(OK).send({
id: audioMessageId,
audioMessageUrl: `/audi-message/${audioMessageId}`,
});
});
}
downloadAudioMessage(){
this.App.post("/download-audio-message/:id", (req: Request, res: Response) => {
//TODO check user connected and admin role
//TODO upload audio message
let audiMessageId = req.params.id;
let fs = require('fs');
let path = `/dist/files/${audiMessageId}`;
let file = fs.createReadStream(path);
res.writeHead(200);
file.pipe(res);
});
}
}

View file

@ -427,24 +427,21 @@ body {
.message-container div, .message-container div,
.main-console div{ .main-console div{
position: absolute; position: absolute;
background: none repeat scroll 0% 0% #ccc0;
border-color: #000000cf #ffffff00 #ffffff00 #ffffff00;
border-style: solid;
border-width: 20px 7px;
height: auto;
width: 10%;
color: white; color: white;
z-index: 200; z-index: 200;
left: 45%;
transition: all 0.1s ease-out; transition: all 0.1s ease-out;
top: 100%; top: 100%;
width: 100px;
height: 40px;
background-color: black;
left: calc(50% - 50px);
border-radius: 0 0 10px 10px;
text-align: center;
} }
.message-container div span, .message-container div p,
.main-console div span{ .main-console div p{
position: absolute; margin-top: 6px;
top: -20px;
left: 30%;
} }
.message-container div:hover, .message-container div:hover,

View file

@ -1,4 +1,4 @@
import {HtmlUtils} from "./HtmlUtils"; import {HtmlUtils} from "../WebRtc/HtmlUtils";
import {Connection, GlobalMessageInterface} from "../Connection"; import {Connection, GlobalMessageInterface} from "../Connection";
export const CLASS_CONSOLE_MESSAGE = 'main-console'; export const CLASS_CONSOLE_MESSAGE = 'main-console';
@ -25,7 +25,7 @@ export class ConsoleGlobalMessageManager {
} }
initialise() { initialise() {
const buttonText = document.createElement('span'); const buttonText = document.createElement('p');
buttonText.innerText = 'Console'; buttonText.innerText = 'Console';
this.buttonMainConsole.appendChild(buttonText); this.buttonMainConsole.appendChild(buttonText);
@ -67,20 +67,41 @@ export class ConsoleGlobalMessageManager {
} }
sendMessage(){ sendMessage(){
const inputText = HtmlUtils.getElementByIdOrFail<HTMLTextAreaElement>(INPUT_CONSOLE_MESSAGE);
const inputType = HtmlUtils.getElementByIdOrFail<HTMLInputElement>(INPUT_TYPE_CONSOLE); const inputType = HtmlUtils.getElementByIdOrFail<HTMLInputElement>(INPUT_TYPE_CONSOLE);
if(AUDIO_TYPE !== inputType.value && MESSAGE_TYPE !== inputType.value){ if(AUDIO_TYPE !== inputType.value && MESSAGE_TYPE !== inputType.value){
throw "Error event type"; throw "Error event type";
} }
if(AUDIO_TYPE !== inputType.value){
return this.sendAudioMessage();
}
return this.sendTextMessage();
}
private sendTextMessage(){
const inputText = HtmlUtils.getElementByIdOrFail<HTMLTextAreaElement>(INPUT_CONSOLE_MESSAGE);
let GlobalMessage : GlobalMessageInterface = { let GlobalMessage : GlobalMessageInterface = {
id: 1, id: 1,
message: inputText.value, message: inputText.value,
type: inputType.value type: MESSAGE_TYPE
}; };
inputText.value = ''; inputText.value = '';
this.Connection.emitGlobalMessage(GlobalMessage); this.Connection.emitGlobalMessage(GlobalMessage);
} }
private async sendAudioMessage(){
const inputAudio = HtmlUtils.getElementByIdOrFail<HTMLTextAreaElement>(UPLOAD_CONSOLE_MESSAGE);
let res = await this.Connection.uploadAudio(inputAudio.value);
let GlobalMessage : GlobalMessageInterface = {
id: res.id,
message: res.audioMessageUrl,
type: MESSAGE_TYPE
};
inputAudio.value = '';
this.Connection.emitGlobalMessage(GlobalMessage);
}
active(){ active(){
this.activeConsole = true; this.activeConsole = true;
this.divMainConsole.style.top = '0'; this.divMainConsole.style.top = '0';

View file

@ -1,5 +1,6 @@
import {HtmlUtils} from "./HtmlUtils"; import {HtmlUtils} from "./../WebRtc/HtmlUtils";
import {Connection, GlobalMessageInterface} from "../Connection"; import {Connection, GlobalMessageInterface} from "../Connection";
import {AUDIO_TYPE, MESSAGE_TYPE} from "./ConsoleGlobalMessageManager";
export class GlobalMessageManager { export class GlobalMessageManager {
@ -13,7 +14,7 @@ export class GlobalMessageManager {
initialise(){ initialise(){
//receive signal to show message //receive signal to show message
this.Connection.receivePlayGlobalMessage((message: GlobalMessageInterface) => { this.Connection.receivePlayGlobalMessage((message: GlobalMessageInterface) => {
this.playMessage(message.id, message.message); this.playMessage(message);
}); });
//receive signal to close message //receive signal to close message
@ -22,14 +23,40 @@ export class GlobalMessageManager {
}); });
} }
private playMessage(messageId : number, htmlMessage: string){ private playMessage(message : GlobalMessageInterface){
let previousMessage = document.getElementById(this.getHtmlMessageId(messageId)); let previousMessage = document.getElementById(this.getHtmlMessageId(message.id));
if(previousMessage){ if(previousMessage){
previousMessage.remove(); previousMessage.remove();
} }
if(AUDIO_TYPE === message.type){
this.playAudioMessage(message.id, message.message);
}
if(MESSAGE_TYPE === message.type){
this.playTextMessage(message.id, message.message);
}
}
private playAudioMessage(messageId : number, urlMessage: string){
const messageVideo : HTMLAudioElement = document.createElement('audio');
messageVideo.id = this.getHtmlMessageId(messageId);
messageVideo.src = urlMessage;
messageVideo.onended = () => {
messageVideo.remove();
}
messageVideo.onloadeddata = () => {
messageVideo.play();
};
const mainSectionDiv = HtmlUtils.getElementByIdOrFail<HTMLDivElement>('main-container');
mainSectionDiv.appendChild(messageVideo);
//TODO add element when audio message is played
}
private playTextMessage(messageId : number, htmlMessage: string){
//add button to clear message //add button to clear message
const buttonText = document.createElement('span'); const buttonText = document.createElement('p');
buttonText.id = 'button-clear-message' buttonText.id = 'button-clear-message'
buttonText.innerText = 'Clear'; buttonText.innerText = 'Clear';

View file

@ -199,6 +199,15 @@ export class Connection implements Connection {
}); });
} }
public uploadAudio(file : any){
return Axios.post(`${API_URL}/upload-audio-message`, {file}).then((res: any) => {
return res.data;
}).catch((err) => {
console.error(err);
throw err;
});
}
public closeConnection(): void { public closeConnection(): void {
this.socket?.close(); this.socket?.close();
} }

View file

@ -40,8 +40,8 @@ import {FourOFourSceneName} from "../Reconnecting/FourOFourScene";
import {ItemFactoryInterface} from "../Items/ItemFactoryInterface"; import {ItemFactoryInterface} from "../Items/ItemFactoryInterface";
import {ActionableItem} from "../Items/ActionableItem"; import {ActionableItem} from "../Items/ActionableItem";
import {UserInputManager} from "../UserInput/UserInputManager"; import {UserInputManager} from "../UserInput/UserInputManager";
import {GlobalMessageManager} from "../../WebRtc/GlobalMessageManager"; import {GlobalMessageManager} from "../../Administration/GlobalMessageManager";
import {ConsoleGlobalMessageManager} from "../../WebRtc/ConsoleGlobalMessageManager"; import {ConsoleGlobalMessageManager} from "../../Administration/ConsoleGlobalMessageManager";
export enum Textures { export enum Textures {

View file

@ -10,7 +10,6 @@ import {FourOFourScene} from "./Phaser/Reconnecting/FourOFourScene";
import WebGLRenderer = Phaser.Renderer.WebGL.WebGLRenderer; import WebGLRenderer = Phaser.Renderer.WebGL.WebGLRenderer;
import {OutlinePipeline} from "./Phaser/Shaders/OutlinePipeline"; import {OutlinePipeline} from "./Phaser/Shaders/OutlinePipeline";
import {CustomizeScene} from "./Phaser/Login/CustomizeScene"; import {CustomizeScene} from "./Phaser/Login/CustomizeScene";
import {HtmlUtils} from "./WebRtc/HtmlUtils";
import {CoWebsiteManager} from "./WebRtc/CoWebsiteManager"; import {CoWebsiteManager} from "./WebRtc/CoWebsiteManager";
//CoWebsiteManager.loadCoWebsite('https://thecodingmachine.com'); //CoWebsiteManager.loadCoWebsite('https://thecodingmachine.com');