From 56cd151a043945acac086ac07abb1a9c55fae53d Mon Sep 17 00:00:00 2001 From: Ayushya Amitabh Date: Fri, 14 Aug 2020 10:57:38 -0400 Subject: [PATCH] v1.6.2/cleanup - remove api v2 - linting --- app/package-lock.json | 2 +- app/public/background.js | 86 ++++--- app/src/App.js | 97 +++----- app/src/CallManager.js | 42 ++-- app/src/Chat.js | 303 +++++++++--------------- app/src/Thread.css | 4 +- app/src/VideoListener.js | 310 +++++++++---------------- app/src/index.css | 5 +- functions/app.js | 52 ++--- functions/index.js | 2 - functions/modules/authenticator.js | 48 ++-- functions/modules/createRoom.js | 76 +++--- functions/modules/joinRoom.js | 63 +++-- functions/modules/sendMessage.js | 25 +- functions/modules/tokenValidator.js | 33 ++- functions/modules/updateAdminOnly.js | 17 +- functions/modules/updateVoxeet.js | 47 ++-- functions/modules2/authenticator.js | 42 ---- functions/modules2/cleanUpRoom.js | 32 --- functions/modules2/createRoom.js | 87 ------- functions/modules2/deleteRoom.js | 62 ----- functions/modules2/index.js | 29 --- functions/modules2/joinRoom.js | 154 ------------ functions/modules2/leaveRoom.js | 19 -- functions/modules2/scheduledCleanUp.js | 48 ---- functions/modules2/sendMessage.js | 46 ---- functions/modules2/timeDiff.js | 7 - functions/modules2/tokenRefresher.js | 20 -- functions/modules2/tokenValidator.js | 21 -- functions/modules2/updatePlayer.js | 85 ------- functions/modules2/updateVoxeet.js | 47 ---- functions/package-lock.json | 2 +- 32 files changed, 476 insertions(+), 1437 deletions(-) delete mode 100644 functions/modules2/authenticator.js delete mode 100644 functions/modules2/cleanUpRoom.js delete mode 100644 functions/modules2/createRoom.js delete mode 100644 functions/modules2/deleteRoom.js delete mode 100644 functions/modules2/index.js delete mode 100644 functions/modules2/joinRoom.js delete mode 100644 functions/modules2/leaveRoom.js delete mode 100644 functions/modules2/scheduledCleanUp.js delete mode 100644 functions/modules2/sendMessage.js delete mode 100644 functions/modules2/timeDiff.js delete mode 100644 functions/modules2/tokenRefresher.js delete mode 100644 functions/modules2/tokenValidator.js delete mode 100644 functions/modules2/updatePlayer.js delete mode 100644 functions/modules2/updateVoxeet.js diff --git a/app/package-lock.json b/app/package-lock.json index 9d3337e..6c2f81a 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,6 +1,6 @@ { "name": "watch-party-crx", - "version": "1.6.1", + "version": "1.6.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/app/public/background.js b/app/public/background.js index 230c22b..671bf69 100644 --- a/app/public/background.js +++ b/app/public/background.js @@ -12,18 +12,18 @@ COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION. /* global chrome */ /* global firebase */ -const APP_VERSION = "1.6.2"; -const APP_VERSION_STRING = APP_VERSION.replace(/\./g, ""); +const APP_VERSION = '1.6.2'; +const APP_VERSION_STRING = APP_VERSION.replace(/\./g, ''); const firebaseConfig = { - apiKey: "AIzaSyCJLuYpzXLDRmu2ttzFuSGmYcpFxqToWFU", - authDomain: "watch-party-crx.firebaseapp.com", - databaseURL: "https://watch-party-crx.firebaseio.com", - projectId: "watch-party-crx", - storageBucket: "watch-party-crx.appspot.com", - messagingSenderId: "712242707190", - appId: "1:712242707190:web:65fa7f772e30da364b0ad7", - measurementId: "G-EZS4PEVG4T", + apiKey: 'AIzaSyCJLuYpzXLDRmu2ttzFuSGmYcpFxqToWFU', + authDomain: 'watch-party-crx.firebaseapp.com', + databaseURL: 'https://watch-party-crx.firebaseio.com', + projectId: 'watch-party-crx', + storageBucket: 'watch-party-crx.appspot.com', + messagingSenderId: '712242707190', + appId: '1:712242707190:web:65fa7f772e30da364b0ad7', + measurementId: 'G-EZS4PEVG4T', }; firebase.initializeApp(firebaseConfig); @@ -44,7 +44,7 @@ const fetcher = async (request, sendResponse) => { method, headers: { Authorization: `Token ${idToken}:${firebase.auth().currentUser.uid}`, - "Access-Control-Allow-Origin": "*", + 'Access-Control-Allow-Origin': '*', }, ...request, }) @@ -72,37 +72,37 @@ const sendAuth = async (sendResponse) => { chrome.runtime.onInstalled.addListener((details) => { if (details.reason) { - if (details.reason === "install") { - if (window.localStorage.getItem("watchPartyVersion")) { - if (window.localStorage.getItem("watchPartyVersion") !== APP_VERSION) { + if (details.reason === 'install') { + if (window.localStorage.getItem('watchPartyVersion')) { + if (window.localStorage.getItem('watchPartyVersion') !== APP_VERSION) { chrome.tabs.create({ url: `http://www.chromewatchparty.com/changes/v${APP_VERSION}`, active: true, }); - window.localStorage.setItem("watchPartyVersion", APP_VERSION); + window.localStorage.setItem('watchPartyVersion', APP_VERSION); } } else { chrome.tabs.create({ - url: "https://www.chromewatchparty.com/welcome", + url: 'https://www.chromewatchparty.com/welcome', active: true, }); - window.localStorage.setItem("watchPartyVersion", APP_VERSION); + window.localStorage.setItem('watchPartyVersion', APP_VERSION); } - } else if (details.reason === "update") { - if (window.localStorage.getItem("watchPartyVersion")) { - if (window.localStorage.getItem("watchPartyVersion") !== APP_VERSION) { + } else if (details.reason === 'update') { + if (window.localStorage.getItem('watchPartyVersion')) { + if (window.localStorage.getItem('watchPartyVersion') !== APP_VERSION) { chrome.tabs.create({ url: `http://www.chromewatchparty.com/changes/v${APP_VERSION}`, active: true, }); - window.localStorage.setItem("watchPartyVersion", APP_VERSION); + window.localStorage.setItem('watchPartyVersion', APP_VERSION); } } else { chrome.tabs.create({ url: `http://www.chromewatchparty.com/changes/v${APP_VERSION}`, active: true, }); - window.localStorage.setItem("watchPartyVersion", APP_VERSION); + window.localStorage.setItem('watchPartyVersion', APP_VERSION); } } } @@ -111,24 +111,24 @@ chrome.runtime.onInstalled.addListener((details) => { chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { const { type } = request; switch (type) { - case "API_CALL": + case 'API_CALL': fetcher(request, sendResponse); break; - case "GET_AUTH": + case 'GET_AUTH': sendAuth(sendResponse); break; - case "GET_PARTIES": + case 'GET_PARTIES': sendResponse( - window.localStorage.getItem("parties") - ? JSON.parse(window.localStorage.getItem("parties")) + window.localStorage.getItem('parties') + ? JSON.parse(window.localStorage.getItem('parties')) : [] ); break; - case "EMPTY_PARTIES": - window.localStorage.removeItem("parties"); + case 'EMPTY_PARTIES': + window.localStorage.removeItem('parties'); break; default: - console.warn("Unknown message type: <", type, ">"); + console.warn('Unknown message type: <', type, '>'); break; } return true; @@ -142,10 +142,10 @@ chrome.runtime.onConnect.addListener((port) => { }); port.onMessage.addListener((request) => { const { type, roomId, roomPin } = request; - if (type === "INIT") { + if (type === 'INIT') { port.roomListener = firebase .firestore() - .collection("rooms") + .collection('rooms') .doc(roomId) .onSnapshot( (snap) => { @@ -159,16 +159,14 @@ chrome.runtime.onConnect.addListener((port) => { ); port.userListener = firebase .firestore() - .collection("rooms") + .collection('rooms') .doc(roomId) - .collection("users") + .collection('users') .onSnapshot( (snap) => { if (snap) { const isAdmin = snap.docs - .filter( - (user) => user.id === firebase.auth().currentUser.uid - )[0] + .filter((user) => user.id === firebase.auth().currentUser.uid)[0] .data().admin; const users = snap.docs.map((userSnap) => userSnap.data().name); port.postMessage({ admin: isAdmin, users }); @@ -180,10 +178,10 @@ chrome.runtime.onConnect.addListener((port) => { ); port.messageListener = firebase .firestore() - .collection("rooms") + .collection('rooms') .doc(roomId) - .collection("messages") - .orderBy("time") + .collection('messages') + .orderBy('time') .onSnapshot( (snap) => { if (snap) { @@ -197,18 +195,18 @@ chrome.runtime.onConnect.addListener((port) => { port.postMessage({ isError: true, ...err }); } ); - if (window.localStorage.getItem("parties")) { - var existing = JSON.parse(window.localStorage.getItem("parties")); + if (window.localStorage.getItem('parties')) { + var existing = JSON.parse(window.localStorage.getItem('parties')); if (!(existing.filter((i) => i.name === roomId).length > 0)) { existing.push({ name: roomId, pin: roomPin, }); - window.localStorage.setItem("parties", JSON.stringify(existing)); + window.localStorage.setItem('parties', JSON.stringify(existing)); } } else { window.localStorage.setItem( - "parties", + 'parties', JSON.stringify([ { name: roomId, diff --git a/app/src/App.js b/app/src/App.js index 4a02d4c..7df63ee 100644 --- a/app/src/App.js +++ b/app/src/App.js @@ -9,33 +9,27 @@ ALL CONTENT ON WATCH PARTY'S WEBSITE OR IN WATCH PARTY'S CHROME EXTENSION APP, U CITED ARE THE SOLE INTELECTUAL PROPERTY OF AYUSHYA AMITABH, AND MAY NOT BE COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION. ************************************************************************/ -import React, { useState, useEffect } from "react"; -import Router from "route-lite"; -import { - Fab, - createMuiTheme, - ThemeProvider, - Snackbar, - Tooltip, -} from "@material-ui/core"; -import Create from "./Create"; -import Loading from "./Loading"; -import firebase from "firebase/app"; -import "firebase/firestore"; -import Inactive from "./Inactive"; -import { getUserUid, getPlayerSource, PLAYER_SOURCE } from "./Api"; +import React, { useState, useEffect } from 'react'; +import Router from 'route-lite'; +import { Fab, createMuiTheme, ThemeProvider, Snackbar, Tooltip } from '@material-ui/core'; +import Create from './Create'; +import Loading from './Loading'; +import firebase from 'firebase/app'; +import 'firebase/firestore'; +import Inactive from './Inactive'; +import { getUserUid, getPlayerSource, PLAYER_SOURCE } from './Api'; -const APP_VERSION = "1.6.2"; -const APP_VERSION_STRING = APP_VERSION.replace(/\./g, ""); +const APP_VERSION = '1.6.2'; +const APP_VERSION_STRING = APP_VERSION.replace(/\./g, ''); const darkTheme = createMuiTheme({ palette: { - type: "dark", + type: 'dark', primary: { - main: "#FF0000", + main: '#FF0000', }, secondary: { - main: "#c0f300", + main: '#c0f300', }, }, }); @@ -48,41 +42,32 @@ const Routes = (props) => ( const resetResize = () => { const checkedX = 400; - document.documentElement.style.setProperty("--party-width", `${checkedX}px`); - document.documentElement.style.setProperty( - "--neg-party-width", - `-${checkedX}px` - ); + document.documentElement.style.setProperty('--party-width', `${checkedX}px`); + document.documentElement.style.setProperty('--neg-party-width', `-${checkedX}px`); }; const doResize = (ev) => { const checkedX = window.innerWidth - - Math.min( - window.innerWidth - 300, - Math.max(window.innerWidth * 0.5, ev.clientX) - ); - document.documentElement.style.setProperty("--party-width", `${checkedX}px`); - document.documentElement.style.setProperty( - "--neg-party-width", - `-${checkedX}px` - ); + Math.min(window.innerWidth - 300, Math.max(window.innerWidth * 0.5, ev.clientX)); + document.documentElement.style.setProperty('--party-width', `${checkedX}px`); + document.documentElement.style.setProperty('--neg-party-width', `-${checkedX}px`); }; const stopResize = (ev) => { - document.documentElement.removeEventListener("mousemove", doResize, false); - document.documentElement.removeEventListener("mouseup", stopResize, false); + document.documentElement.removeEventListener('mousemove', doResize, false); + document.documentElement.removeEventListener('mouseup', stopResize, false); }; const startResize = (ev) => { - document.documentElement.addEventListener("mousemove", doResize, false); - document.documentElement.addEventListener("mouseup", stopResize, false); + document.documentElement.addEventListener('mousemove', doResize, false); + document.documentElement.addEventListener('mouseup', stopResize, false); }; const App = () => { - const closedNotification = { open: false, message: "" }; + const closedNotification = { open: false, message: '' }; - const [status, setStatus] = useState({ active: false, message: "" }); + const [status, setStatus] = useState({ active: false, message: '' }); const [visible, setVisible] = useState(false); const [loading, setLoading] = useState(false); const [notification, setNotification] = useState(closedNotification); @@ -94,8 +79,8 @@ const App = () => { getUserUid(); firebase .firestore() - .collection("server") - .doc("status") + .collection('server') + .doc('status') .onSnapshot((statusSnap) => { setStatus(statusSnap.data()); setLoading(false); @@ -103,19 +88,18 @@ const App = () => { }, []); // HANDLE VISIBILITY STYLING - const PartyRoutesWrapper = document.getElementById("party-routes-wrapper"); + const PartyRoutesWrapper = document.getElementById('party-routes-wrapper'); if (visible) { - document.body.classList.add("visible"); - PartyRoutesWrapper && PartyRoutesWrapper.classList.add("visible"); + document.body.classList.add('visible'); + PartyRoutesWrapper && PartyRoutesWrapper.classList.add('visible'); if ( !hasAttached && - (getPlayerSource() === PLAYER_SOURCE.HBOMAX || - getPlayerSource() === PLAYER_SOURCE.HBONOW) + (getPlayerSource() === PLAYER_SOURCE.HBOMAX || getPlayerSource() === PLAYER_SOURCE.HBONOW) ) { document.addEventListener( - "mousedown", + 'mousedown', function (ev) { - if (document.body.querySelector("body.visible")) { + if (document.body.querySelector('body.visible')) { ev.preventDefault(); ev.stopPropagation(); ev.stopImmediatePropagation(); @@ -126,8 +110,8 @@ const App = () => { hasAttached = true; } } else { - document.body.classList.remove("visible"); - PartyRoutesWrapper && PartyRoutesWrapper.classList.remove("visible"); + document.body.classList.remove('visible'); + PartyRoutesWrapper && PartyRoutesWrapper.classList.remove('visible'); } // HANDLE FULLSCREEN EVENT @@ -139,7 +123,7 @@ const App = () => { setNotification(closedNotification)} message={notification.message} @@ -152,17 +136,12 @@ const App = () => { title="Resize Sidebar / Double Click To Reset" aria-label="Resize Sidebar / Double Click To Reset" > -
+
||
{loading && } - {status[APP_VERSION_STRING] && - status[APP_VERSION_STRING].active === true ? ( + {status[APP_VERSION_STRING] && status[APP_VERSION_STRING].active === true ? ( setNotification({ open: true, message })} diff --git a/app/src/CallManager.js b/app/src/CallManager.js index b9e0fcb..13d6827 100644 --- a/app/src/CallManager.js +++ b/app/src/CallManager.js @@ -9,14 +9,14 @@ ALL CONTENT ON WATCH PARTY'S WEBSITE OR IN WATCH PARTY'S CHROME EXTENSION APP, U CITED ARE THE SOLE INTELECTUAL PROPERTY OF AYUSHYA AMITABH, AND MAY NOT BE COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION. ************************************************************************/ -import VoxeetSDK from "@voxeet/voxeet-web-sdk"; +import VoxeetSDK from '@voxeet/voxeet-web-sdk'; import { GetVoxeetTokenApi, GetRefreshedVoxeetTokenApi, LocalData, UpdateVoxeetApi, updateLocalData, -} from "./Api"; +} from './Api'; export default class CallManager { constructor(listener, notify) { @@ -36,7 +36,7 @@ export default class CallManager { if (onCall === true) this.leaveCall(); else this.boot(conference); } catch (e) { - this.notify("Uh oh something went wrong, try rejoining the call."); + this.notify('Uh oh something went wrong, try rejoining the call.'); } } toggleMute(muted) { @@ -52,14 +52,14 @@ export default class CallManager { .fetch(conference._id) .then(this.joinCall) .catch((err) => { - console.error("Failed to fetch conference", err); + console.error('Failed to fetch conference', err); this.startCall(); }); } else if (opened && !conference) { this.startCall(); } else { this.listener({ onCall: false, muted: false, callActionPending: false }); - console.error("Unable to open Voxeet Session"); + console.error('Unable to open Voxeet Session'); } } async startCall() { @@ -89,7 +89,7 @@ export default class CallManager { muted: false, callActionPending: false, }); - console.error("Update Voxeet API Error", err); + console.error('Update Voxeet API Error', err); return false; } }); @@ -101,11 +101,11 @@ export default class CallManager { muted: false, callActionPending: false, }); - console.error("Failed to update party Voxeet"); + console.error('Failed to update party Voxeet'); } }); } else { - this.notify("Ask your party admin to start the call."); + this.notify('Ask your party admin to start the call.'); this.leaveCall(); } } @@ -119,8 +119,8 @@ export default class CallManager { muted: false, callActionPending: false, }); - this.notify("Unable to join call. Try again in a moment."); - console.error("Error joining call", e); + this.notify('Unable to join call. Try again in a moment.'); + console.error('Error joining call', e); return true; }); // Leave changes as comment for later @@ -143,9 +143,9 @@ export default class CallManager { }); return true; } catch (error) { - console.error("Error Opening Voxeet Session", error); + console.error('Error Opening Voxeet Session', error); } - console.error("Session not initialized"); + console.error('Session not initialized'); return false; } return true; @@ -158,14 +158,14 @@ export default class CallManager { this.listener({ usersOnCall }); } async initialize() { - VoxeetSDK.conference.on("participantAdded", () => this.usersListHandle()); - VoxeetSDK.conference.on("participantUpdated", () => this.usersListHandle()); + VoxeetSDK.conference.on('participantAdded', () => this.usersListHandle()); + VoxeetSDK.conference.on('participantUpdated', () => this.usersListHandle()); - VoxeetSDK.conference.on("joined", () => { + VoxeetSDK.conference.on('joined', () => { this.listener({ onCall: true, callActionPending: false }); }); - VoxeetSDK.conference.on("left", () => { + VoxeetSDK.conference.on('left', () => { this.listener({ onCall: false, callActionPending: false, @@ -173,11 +173,11 @@ export default class CallManager { }); }); - VoxeetSDK.conference.on("streamAdded", (participant, stream) => { + VoxeetSDK.conference.on('streamAdded', (participant, stream) => { this.listener({ callActionPending: false }); }); - VoxeetSDK.conference.on("streamRemoved", (participant, stream) => { + VoxeetSDK.conference.on('streamRemoved', (participant, stream) => { this.listener({ callActionPending: false }); }); @@ -195,11 +195,11 @@ export default class CallManager { this.updateTokens(access_token, refresh_token); VoxeetSDK.initializeToken(access_token, refresh_token); } else { - console.error("Get Voxeet Token API Result Error", tokenResult); + console.error('Get Voxeet Token API Result Error', tokenResult); } }) .catch((err) => { - console.error("Get Voxeet Token API error", err); + console.error('Get Voxeet Token API error', err); }); } else { VoxeetSDK.initializeToken(this.__accessToken, this.__refreshToken); @@ -215,7 +215,7 @@ export default class CallManager { resolve(access_token); }) .catch((err) => { - console.error("Get Voxeet Token API error", err); + console.error('Get Voxeet Token API error', err); reject(err); }); }); diff --git a/app/src/Chat.js b/app/src/Chat.js index 21b32be..c85c24d 100644 --- a/app/src/Chat.js +++ b/app/src/Chat.js @@ -10,7 +10,7 @@ CITED ARE THE SOLE INTELECTUAL PROPERTY OF AYUSHYA AMITABH, AND MAY NOT BE COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION. ************************************************************************/ /*global chrome */ -import React, { Component } from "react"; +import React, { Component } from 'react'; import { Typography, TextField, @@ -31,8 +31,8 @@ import { Paper, Grid, Slider, -} from "@material-ui/core"; -import Thread from "./Thread"; +} from '@material-ui/core'; +import Thread from './Thread'; import { SendMessageApi, LeaveRoomApi, @@ -46,7 +46,7 @@ import { UpdateAdminOnly, scrollThread, removeLocalData, -} from "./Api"; +} from './Api'; import { Send, ExitToApp as Exit, @@ -68,21 +68,21 @@ import { VolumeDown, VolumeUp, CancelRounded, -} from "@material-ui/icons"; -import Create from "./Create"; -import { goTo } from "route-lite"; -import CallManager from "./CallManager"; -import VideoListener from "./VideoListener"; -import ReactGiphySearchbox from "react-giphy-searchbox"; +} from '@material-ui/icons'; +import Create from './Create'; +import { goTo } from 'route-lite'; +import CallManager from './CallManager'; +import VideoListener from './VideoListener'; +import ReactGiphySearchbox from 'react-giphy-searchbox'; // const giphyFetch = new GiphyFetch('ojJbIMUN6XRMn4mHiFFav3rMCpXUg8sq'); export default class Chat extends Component { constructor(props) { super(props); this.state = { - name: "", + name: '', messages: [], - newMessage: "", + newMessage: '', admin: null, adminOnly: false, adminModeUpdate: false, @@ -94,14 +94,10 @@ export default class Chat extends Component { callActionPending: false, menuPopover: true, allowChatNotification: - LocalData().allowChatNotification !== undefined - ? LocalData().allowChatNotification - : true, + LocalData().allowChatNotification !== undefined ? LocalData().allowChatNotification : true, isFullscreen: document.fullscreen, allowAutoRejoin: - LocalData().allowAutoRejoin !== undefined - ? LocalData().allowAutoRejoin - : true, + LocalData().allowAutoRejoin !== undefined ? LocalData().allowAutoRejoin : true, replyTo: null, sendingMessages: [], volumes: {}, @@ -127,21 +123,15 @@ export default class Chat extends Component { props.nameSelectors ); this.updateAllowAutoRejoin = this.updateAllowAutoRejoin.bind(this); - this.updateAllowChatNotification = this.updateAllowChatNotification.bind( - this - ); - this.mCallManager = new CallManager( - this.callEventListener, - this.props.notify - ); + this.updateAllowChatNotification = this.updateAllowChatNotification.bind(this); + this.mCallManager = new CallManager(this.callEventListener, this.props.notify); } componentDidMount() { // EVENT CAPTURE FOR ENTER TO SEND window.onkeypress = (ev) => { - if (ev.code === "Enter") { - if (ev.target === document.getElementById("chat-message-box-input")) { - if (ev.shiftKey === false && this.state.gif === true) - ev.preventDefault(); + if (ev.code === 'Enter') { + if (ev.target === document.getElementById('chat-message-box-input')) { + if (ev.shiftKey === false && this.state.gif === true) ev.preventDefault(); if (ev.shiftKey === false && this.state.gif === false) { ev.preventDefault(); this.sendMessageInvoker(); @@ -151,15 +141,12 @@ export default class Chat extends Component { }; // FULLSCREEN LISTENER - document.addEventListener("fullscreenchange", (ev) => { + document.addEventListener('fullscreenchange', (ev) => { this.setState({ isFullscreen: document.fullscreen }); }); // ACTIVE TRACKER - if ( - LocalData().allowAutoRejoin === undefined || - LocalData().allowAutoRejoin === null - ) { + if (LocalData().allowAutoRejoin === undefined || LocalData().allowAutoRejoin === null) { updateLocalData({ allowAutoRejoin: this.state.allowAutoRejoin }); } if (this.state.allowAutoRejoin === true) { @@ -178,14 +165,14 @@ export default class Chat extends Component { this.port = chrome.runtime.connect({ name: LocalData().partyName }); // Initialize listener this.port.postMessage({ - type: "INIT", + type: 'INIT', roomId: LocalData().partyName, roomPin: LocalData().partyPin, }); // Listener this.port.onMessage.addListener((response) => { if (response.isError === true) { - this.props.notify("Uh oh. Got lost from the party."); + this.props.notify('Uh oh. Got lost from the party.'); goTo(Create, this.props); return; } @@ -195,21 +182,13 @@ export default class Chat extends Component { } // IF CHAT IS HIDDEN AND ALLOWS NOTIFICATION - if ( - !document.querySelector("body.visible") && - this.state.allowChatNotification === true - ) { - if ( - response.messages && - response.messages.length !== this.state.messages.length - ) { + if (!document.querySelector('body.visible') && this.state.allowChatNotification === true) { + if (response.messages && response.messages.length !== this.state.messages.length) { const lastMessage = response.messages[response.messages.length - 1]; - if (lastMessage.uid !== "") { + if (lastMessage.uid !== '') { this.props.notify( `${lastMessage.name}${ - lastMessage.type === "giphy" - ? " sent a gif." - : ": " + lastMessage.text + lastMessage.type === 'giphy' ? ' sent a gif.' : ': ' + lastMessage.text }` ); } @@ -225,7 +204,7 @@ export default class Chat extends Component { // GIPHY IPC const giphyInject = `var giphySearchInteraction=function(e){if(e.source===window){const{data}=e;if(data.watchPartyDirection==='TO_SCRIPT'){if(data.type==='WATCH_PARTY_SEARCH_GIF'){const giphyInput=document.querySelector('.giphy-search-form input');if(giphyInput){giphyInput.value=data.value;giphyInput.dispatchEvent(new Event('change',{bubbles:true}))}}}}};window.addEventListener("message",giphySearchInteraction);`; - const giphyInjectScript = document.createElement("script"); + const giphyInjectScript = document.createElement('script'); giphyInjectScript.text = giphyInject; document.head.appendChild(giphyInjectScript); @@ -277,14 +256,14 @@ export default class Chat extends Component { }).catch((err) => { this.props.updateLoading(false); this.props.notify(err.message || err.statusText); - console.error("Sync Party API error", err); + console.error('Sync Party API error', err); }); } else { this.mVideoListener.start(); } } endParty() { - this.props.notify("Ending party..."); + this.props.notify('Ending party...'); this.props.updateLoading(true); const data = { partyName: LocalData().partyName, @@ -298,20 +277,20 @@ export default class Chat extends Component { ); DeleteRoomApi(data) .then((res) => { - this.props.notify("Ended party"); - removeLocalData("partyPin"); - removeLocalData("partyName"); + this.props.notify('Ended party'); + removeLocalData('partyPin'); + removeLocalData('partyName'); goTo(Create, this.props); this.props.updateLoading(false); }) .catch((err) => { this.props.updateLoading(false); this.props.notify(err.message || err.statusText); - console.error("End Party API error", err); + console.error('End Party API error', err); }); } leaveParty() { - this.props.notify("Leaving party..."); + this.props.notify('Leaving party...'); this.props.updateLoading(true); const data = { partyName: LocalData().partyName, @@ -326,30 +305,28 @@ export default class Chat extends Component { ); LeaveRoomApi(data) .then((res) => { - this.props.notify("Left party"); - removeLocalData("partyPin"); - removeLocalData("partyName"); + this.props.notify('Left party'); + removeLocalData('partyPin'); + removeLocalData('partyName'); goTo(Create, this.props); this.props.updateLoading(false); }) .catch((err) => { this.props.updateLoading(false); this.props.notify(err.message || err.statusText); - console.error("End Party API error", err); + console.error('End Party API error', err); }); } shareParty() { - const el = document.createElement("textarea"); - el.value = `Join my party on Watch Party!\nParty Name: ${ - LocalData().partyName - }\nParty Pin: ${LocalData().partyPin}\n${ - window.location.href - }\n---\nGet Watch Party at https:\\\\get.chromewatchparty.com`; + const el = document.createElement('textarea'); + el.value = `Join my party on Watch Party!\nParty Name: ${LocalData().partyName}\nParty Pin: ${ + LocalData().partyPin + }\n${window.location.href}\n---\nGet Watch Party at https:\\\\get.chromewatchparty.com`; document.body.appendChild(el); el.select(); - document.execCommand("copy"); + document.execCommand('copy'); document.body.removeChild(el); - this.props.notify("Copied party invitation"); + this.props.notify('Copied party invitation'); } sendMessage(message) { const { sendingMessages } = this.state; @@ -360,9 +337,9 @@ export default class Chat extends Component { uid: LocalData().userUid, text: message, time: new Date(), - type: "", + type: '', }; - if (this.state.gif === true) data.type = "giphy"; + if (this.state.gif === true) data.type = 'giphy'; if (this.state.replyTo !== null) data.replyTo = this.state.replyTo.id; sendingMessages.push(data); this.setState({ @@ -383,7 +360,7 @@ export default class Chat extends Component { this.setState({ sendingMessages: sm }); scrollThread(); this.props.notify(err.message || err.statusText); - console.error("Send Message API error", err); + console.error('Send Message API error', err); }); this.setState({ replyTo: null }); scrollThread(); @@ -391,10 +368,10 @@ export default class Chat extends Component { sendMessageInvoker(overrideMessage) { if (overrideMessage) this.sendMessage(overrideMessage); else { - const trim = this.state.newMessage.replace(/^\s+|\s+$/g, ""); - if (trim !== "") this.sendMessage(trim); + const trim = this.state.newMessage.replace(/^\s+|\s+$/g, ''); + if (trim !== '') this.sendMessage(trim); } - this.setState({ newMessage: "" }); + this.setState({ newMessage: '' }); } gifClick(iGif) { this.sendMessageInvoker(iGif.images.original.url); @@ -403,29 +380,29 @@ export default class Chat extends Component { const { onCall, conference, admin, adminOnly } = this.state; if (window.navigator && onCall === false) { try { - const overlay = document.createElement("div"); + const overlay = document.createElement('div'); overlay.innerHTML = `

Grant Mic Permission

`; - overlay.id = "mic-permission-overlay"; + overlay.id = 'mic-permission-overlay'; document.body.appendChild(overlay); window.navigator .getUserMedia({ audio: true, }) .then(() => { - document.getElementById("mic-permission-overlay").remove(); + document.getElementById('mic-permission-overlay').remove(); this.mCallManager.toggleCall(onCall, conference, admin, adminOnly); }) .catch(() => { - document.getElementById("mic-permission-overlay").remove(); + document.getElementById('mic-permission-overlay').remove(); this.props.notify( - "Check your mic permission for this website. You can modify site permission by clicking on the lock icon in the top left." + 'Check your mic permission for this website. You can modify site permission by clicking on the lock icon in the top left.' ); }); } catch (err) { - console.error("Handle Phone Call Error", err); + console.error('Handle Phone Call Error', err); } } else this.mCallManager.toggleCall(onCall, conference, admin, adminOnly); } @@ -461,7 +438,7 @@ export default class Chat extends Component { adminOnly: !this.state.adminOnly, }).catch((err) => { this.props.notify(err.message || err.statusText); - console.error("Update Admin Only API error", err); + console.error('Update Admin Only API error', err); }); } setReplyTo(message) { @@ -473,7 +450,7 @@ export default class Chat extends Component { getReplyToContent() { const { replyTo } = this.state; if (replyTo) { - if (replyTo.type === "giphy") { + if (replyTo.type === 'giphy') { return gif; } return ( @@ -485,7 +462,7 @@ export default class Chat extends Component { return null; } setVideoVolume(v, id) { - const audioOuts = document.querySelectorAll("audio.vxt-audio"); + const audioOuts = document.querySelectorAll('audio.vxt-audio'); if (audioOuts.length > 0) { audioOuts.forEach((el) => { if (el.id === `audio-${id}`) { @@ -522,23 +499,20 @@ export default class Chat extends Component { const alerts = [ { condition: () => - getPlayerSource() === PLAYER_SOURCE.HBOMAX || - getPlayerSource() === PLAYER_SOURCE.HBONOW, - message: "Functionality may be buggy, HBO has a horrible design.", + getPlayerSource() === PLAYER_SOURCE.HBOMAX || getPlayerSource() === PLAYER_SOURCE.HBONOW, + message: 'Functionality may be buggy, HBO has a horrible design.', }, { condition: () => getPlayerSource() === PLAYER_SOURCE.GOOGLEPLAY, - message: - "Functionality may be buggy, support on this site is in testing.", + message: 'Functionality may be buggy, support on this site is in testing.', }, { condition: () => getPlayerSource() === PLAYER_SOURCE.CRUNCHYROLL, - message: - "Functionality may be buggy, support on this site is in testing.", + message: 'Functionality may be buggy, support on this site is in testing.', }, { condition: () => adminOnly, - message: "Party is currently in admin only mode.", + message: 'Party is currently in admin only mode.', }, ]; return ( @@ -565,12 +539,7 @@ export default class Chat extends Component { > WATCH PARTY - + {name}
@@ -579,9 +548,9 @@ export default class Chat extends Component { {admin && ( @@ -633,17 +596,15 @@ export default class Chat extends Component { checked={allowChatNotification} onChange={this.updateAllowChatNotification} name="allowChatNotification" - color={allowChatNotification ? "secondary" : "primary"} + color={allowChatNotification ? 'secondary' : 'primary'} /> } label={ Allow chat notification when side panel is closed
- - {allowChatNotification - ? "Notifications Enabled" - : "Notifications Disabled"} + + {allowChatNotification ? 'Notifications Enabled' : 'Notifications Disabled'} } @@ -656,17 +617,15 @@ export default class Chat extends Component { checked={allowAutoRejoin} onChange={this.updateAllowAutoRejoin} name="allowAutoRejoin" - color={allowAutoRejoin ? "secondary" : "primary"} + color={allowAutoRejoin ? 'secondary' : 'primary'} /> } label={ Allow Watch Party to auto rejoin (within 1 minute)
- - {allowAutoRejoin - ? "Auto Rejoin Enabled" - : "Auto Rejoin Disabled"} + + {allowAutoRejoin ? 'Auto Rejoin Enabled' : 'Auto Rejoin Disabled'} } @@ -680,7 +639,7 @@ export default class Chat extends Component { checked={adminOnly} onChange={this.updateAdminOnly} name="adminOnly" - color={adminOnly ? "secondary" : "primary"} + color={adminOnly ? 'secondary' : 'primary'} disabled={adminModeUpdate} /> } @@ -688,53 +647,38 @@ export default class Chat extends Component { Admin Only Mode
- + {adminOnly - ? "Only admin can update player and start calls right now" - : "All party members can update player and start calls right now"} + ? 'Only admin can update player and start calls right now' + : 'All party members can update player and start calls right now'} } labelPlacement="end" /> ) : null} - + PARTY MEMBERS
{users.map((user) => ( - + ))}
{Object.keys(usersOnCall).length > 0 ? ( - + MEMBERS IN CALL ) : null} {Object.keys(usersOnCall).length > 0 ? (
{Object.keys(usersOnCall).map((id) => { - return usersOnCall[id].status === "Connected" || - usersOnCall[id].status === "Connecting" ? ( + return usersOnCall[id].status === 'Connected' || + usersOnCall[id].status === 'Connecting' ? ( + @@ -745,9 +689,7 @@ export default class Chat extends Component { step={1} color="secondary" value={volumes[id] || 10} - onChangeCommitted={(e, v) => - this.setVideoVolume(v, id) - } + onChangeCommitted={(e, v) => this.setVideoVolume(v, id)} /> @@ -758,15 +700,14 @@ export default class Chat extends Component { > ) : null; @@ -777,8 +718,7 @@ export default class Chat extends Component { {player ? ( - {player.showName && - player.status !== PLAYER_STATUS.NOT_PLAYING ? ( + {player.showName && player.status !== PLAYER_STATUS.NOT_PLAYING ? ( {player.status === PLAYER_STATUS.PAUSED @@ -803,17 +743,13 @@ export default class Chat extends Component { ) : ( - Nothing playing right now, pause or play once after starting - a show to start sync. + Nothing playing right now, pause or play once after starting a show to start + sync. )} {player && player.showName && player.status ? ( - ) : null} @@ -844,9 +780,7 @@ export default class Chat extends Component {
@@ -860,15 +794,8 @@ export default class Chat extends Component {
{gif || newMessage ? null : ( - - + + {isFullscreen ? : } @@ -879,7 +806,7 @@ export default class Chat extends Component { {onCall ? ( @@ -921,14 +848,12 @@ export default class Chat extends Component { multiline rowsMax="3" size="small" - placeholder={ - this.state.gif ? "Search something..." : "Say something..." - } + placeholder={this.state.gif ? 'Search something...' : 'Say something...'} helperText={ this.state.newMessage && !this.state.gif - ? "Enter to send / Shift+Enter for new line" + ? 'Enter to send / Shift+Enter for new line' : this.state.gif - ? "Click on gif to send / Scroll to load more" + ? 'Click on gif to send / Scroll to load more' : null } variant="outlined" @@ -939,19 +864,19 @@ export default class Chat extends Component { scrollThread(); if (gif) { window.postMessage({ - watchPartyDirection: "TO_SCRIPT", - type: "WATCH_PARTY_SEARCH_GIF", + watchPartyDirection: 'TO_SCRIPT', + type: 'WATCH_PARTY_SEARCH_GIF', value: e.target.value, }); } }} InputProps={{ - id: "chat-message-box-input", + id: 'chat-message-box-input', endAdornment: ( this.sendMessageInvoker(newMessage)} @@ -964,15 +889,13 @@ export default class Chat extends Component { startAdornment: ( { this.setState({ gif: !gif }); if (!gif) { window.postMessage({ - watchPartyDirection: "TO_SCRIPT", - type: "WATCH_PARTY_SEARCH_GIF", + watchPartyDirection: 'TO_SCRIPT', + type: 'WATCH_PARTY_SEARCH_GIF', value: newMessage, }); scrollThread(); @@ -990,9 +913,9 @@ export default class Chat extends Component { console.log("MISSING VIDEO LISTENER"); +const templateListener = (video) => console.log('MISSING VIDEO LISTENER'); export default class VideoListener { constructor(listener = templateListener, selectors, nameSelectors) { this.video = { status: PLAYER_STATUS.NOT_PLAYING, time: 0, - showName: "", - source: "", + showName: '', + source: '', element: null, }; this.nameSelectors = nameSelectors; @@ -49,7 +44,7 @@ export default class VideoListener { this.video.element !== null && this.video.element !== undefined && this.video.status !== PLAYER_STATUS.NOT_PLAYING && - this.video.showName !== "" && + this.video.showName !== '' && this.video.showName !== null && (this.video.status !== this.server.status || Math.abs(this.video.element.currentTime - this.server.time) > 1.5) @@ -76,31 +71,24 @@ export default class VideoListener { // REMOVE LISTENER BEFORE SYNCING switch (this.video.source) { case PLAYER_SOURCE.CRUNCHYROLL: - window.removeEventListener("watchParty", this.crunchyRollListener); + window.removeEventListener('watchParty', this.crunchyRollListener); break; default: - this.video.element.removeEventListener("playing", this.onplay); - this.video.element.removeEventListener("pause", this.onpause); + this.video.element.removeEventListener('playing', this.onplay); + this.video.element.removeEventListener('pause', this.onpause); } await this.timeout(250); // SEEK - if ( - Math.abs(serverPlayer.time - this.video.element.currentTime) > 1.5 - ) { + if (Math.abs(serverPlayer.time - this.video.element.currentTime) > 1.5) { switch (serverPlayer.source) { case PLAYER_SOURCE.NETFLIX: - window.postMessage( - { type: "SEEK", time: serverPlayer.time * 1000 }, - "*" - ); + window.postMessage({ type: 'SEEK', time: serverPlayer.time * 1000 }, '*'); break; case PLAYER_SOURCE.AMAZON: if (this.video.status === PLAYER_STATUS.PAUSED) await this.video.element .play() - .catch((err) => - console.error("WatchParty erred when syncing time.") - ); + .catch((err) => console.error('WatchParty erred when syncing time.')); await this.timeout(250); this.video.element.currentTime = serverPlayer.time; await this.timeout(500); @@ -113,10 +101,7 @@ export default class VideoListener { this.video.element.currentTime = serverPlayer.time; break; case PLAYER_SOURCE.HULU: - window.postMessage( - { type: "SEEK", time: serverPlayer.time }, - "*" - ); + window.postMessage({ type: 'SEEK', time: serverPlayer.time }, '*'); break; case PLAYER_SOURCE.HBOMAX: case PLAYER_SOURCE.HBONOW: @@ -125,8 +110,8 @@ export default class VideoListener { case PLAYER_SOURCE.PEACOCK: window.postMessage( JSON.stringify({ - watchPartyDirection: "TO_SCRIPT", - type: "WATCH_PARTY_SEEK", + watchPartyDirection: 'TO_SCRIPT', + type: 'WATCH_PARTY_SEEK', status: serverPlayer.status, time: serverPlayer.time, }) @@ -138,8 +123,8 @@ export default class VideoListener { case PLAYER_SOURCE.CRUNCHYROLL: window.postMessage( JSON.stringify({ - watchPartyDirection: "TO_SCRIPT", - type: "WATCH_PARTY_SEEK", + watchPartyDirection: 'TO_SCRIPT', + type: 'WATCH_PARTY_SEEK', status: serverPlayer.status, time: serverPlayer.time, }) @@ -158,18 +143,15 @@ export default class VideoListener { PLAYER_SOURCE.HBOMAX === this.video.source || PLAYER_SOURCE.HBONOW === this.video.source ) { - window.postMessage( - { type: "PAUSE", time: serverPlayer.time }, - "*" - ); + window.postMessage({ type: 'PAUSE', time: serverPlayer.time }, '*'); } else if ( PLAYER_SOURCE.CRUNCHYROLL === this.video.source || PLAYER_SOURCE.PEACOCK === this.video.source ) { window.postMessage( JSON.stringify({ - watchPartyDirection: "TO_SCRIPT", - type: "WATCH_PARTY_STATUS", + watchPartyDirection: 'TO_SCRIPT', + type: 'WATCH_PARTY_STATUS', status: serverPlayer.status, time: serverPlayer.time, }) @@ -185,18 +167,15 @@ export default class VideoListener { PLAYER_SOURCE.HBOMAX === this.video.source || PLAYER_SOURCE.HBONOW === this.video.source ) { - window.postMessage( - { type: "PLAY", time: serverPlayer.time }, - "*" - ); + window.postMessage({ type: 'PLAY', time: serverPlayer.time }, '*'); } else if ( PLAYER_SOURCE.CRUNCHYROLL === this.video.source || PLAYER_SOURCE.PEACOCK === this.video.source ) { window.postMessage( JSON.stringify({ - watchPartyDirection: "TO_SCRIPT", - type: "WATCH_PARTY_STATUS", + watchPartyDirection: 'TO_SCRIPT', + type: 'WATCH_PARTY_STATUS', status: serverPlayer.status, time: serverPlayer.time, }) @@ -204,9 +183,7 @@ export default class VideoListener { } else { await this.video.element .play() - .catch((err) => - console.error("WatchParty erred when syncing play.") - ); + .catch((err) => console.error('WatchParty erred when syncing play.')); } break; default: @@ -216,10 +193,10 @@ export default class VideoListener { // RE-ADD LISTENERS FOR FUTURE SYNC switch (this.video.source) { case PLAYER_SOURCE.CRUNCHYROLL: - window.addEventListener("watchParty", this.crunchyRollListener); + window.addEventListener('watchParty', this.crunchyRollListener); default: - this.video.element.addEventListener("playing", this.onplay); - this.video.element.addEventListener("pause", this.onpause); + this.video.element.addEventListener('playing', this.onplay); + this.video.element.addEventListener('pause', this.onpause); } } this.isUpdating = false; @@ -235,72 +212,60 @@ export default class VideoListener { const nS = this.nameSelectors[this.video.source]; switch (this.video.source) { case PLAYER_SOURCE.NETFLIX: - var nshow = document.querySelector(nS.show).innerHTML || ""; - var nepisode = ""; + var nshow = document.querySelector(nS.show).innerHTML || ''; + var nepisode = ''; if (document.querySelectorAll(nS.episode)) { - document - .querySelectorAll(nS.episode) - .forEach((el) => (nepisode += el.innerHTML + " ")); + document.querySelectorAll(nS.episode).forEach((el) => (nepisode += el.innerHTML + ' ')); } - return nshow === "" && nepisode === "" ? null : nshow + "\n" + nepisode; + return nshow === '' && nepisode === '' ? null : nshow + '\n' + nepisode; case PLAYER_SOURCE.AMAZON: - const ashow = document.querySelector(nS.show).innerText || ""; - return ashow === "" ? null : ashow; + const ashow = document.querySelector(nS.show).innerText || ''; + return ashow === '' ? null : ashow; case PLAYER_SOURCE.HULU: const hshow = document.querySelector(nS.show).innerText; - const hepisode = document - .querySelector(nS.episode) - .innerText.replace(/\n/gi, " "); - return hshow === "" && hepisode === "" ? null : hshow + "\n" + hepisode; + const hepisode = document.querySelector(nS.episode).innerText.replace(/\n/gi, ' '); + return hshow === '' && hepisode === '' ? null : hshow + '\n' + hepisode; case PLAYER_SOURCE.DISNEY: this.video.element.parentElement.click(); await this.timeout(200); const dshow = document.querySelector(nS.show) ? document.querySelector(nS.show).innerHTML - : ""; + : ''; const depisode = document.querySelector(nS.episode) ? document.querySelector(nS.episode).innerHTML - : ""; - return dshow === "" && depisode === "" ? null : dshow + "\n" + depisode; + : ''; + return dshow === '' && depisode === '' ? null : dshow + '\n' + depisode; case PLAYER_SOURCE.YOUTUBE: - const yshow = document.querySelector(nS.show).innerText || ""; - const yepisode = document.querySelector(nS.episode).innerText || ""; - return yshow === "" && yepisode === "" ? null : yshow + "\n" + yepisode; + const yshow = document.querySelector(nS.show).innerText || ''; + const yepisode = document.querySelector(nS.episode).innerText || ''; + return yshow === '' && yepisode === '' ? null : yshow + '\n' + yepisode; case PLAYER_SOURCE.HBOMAX: case PLAYER_SOURCE.HBONOW: - const bottomHalf = this.video.element.parentNode.parentNode.parentNode - .parentNode.parentNode.children[1]; - bottomHalf.children[0].id = "hboUpperTitle"; - bottomHalf.children[1].id = "hboLowerTitle"; - const hboshow = document.querySelector("#hboUpperTitle").innerText; - const hboepisode = document.querySelector("#hboLowerTitle").innerText; - return hboshow === "" && hboepisode === "" - ? null - : hboshow + "\n" + hboepisode; + const bottomHalf = this.video.element.parentNode.parentNode.parentNode.parentNode.parentNode + .children[1]; + bottomHalf.children[0].id = 'hboUpperTitle'; + bottomHalf.children[1].id = 'hboLowerTitle'; + const hboshow = document.querySelector('#hboUpperTitle').innerText; + const hboepisode = document.querySelector('#hboLowerTitle').innerText; + return hboshow === '' && hboepisode === '' ? null : hboshow + '\n' + hboepisode; case PLAYER_SOURCE.PEACOCK: - const peacockshow = document.querySelector(nS.show).innerText || ""; - const peacockepisode = - document.querySelector(nS.episode).innerText || ""; - return peacockshow === "" && peacockepisode === "" + const peacockshow = document.querySelector(nS.show).innerText || ''; + const peacockepisode = document.querySelector(nS.episode).innerText || ''; + return peacockshow === '' && peacockepisode === '' ? null - : peacockshow + "\n" + peacockepisode; + : peacockshow + '\n' + peacockepisode; case PLAYER_SOURCE.GOOGLEPLAY: - const playerIframe = document.querySelector( - this.selectors[PLAYER_SOURCE.GOOGLEPLAY] - ); - var googleplayshow = ""; + const playerIframe = document.querySelector(this.selectors[PLAYER_SOURCE.GOOGLEPLAY]); + var googleplayshow = ''; if (playerIframe) { googleplayshow = - playerIframe.contentWindow.document.querySelector(nS.show) - .innerText || ""; + playerIframe.contentWindow.document.querySelector(nS.show).innerText || ''; } - return googleplayshow === "" ? null : googleplayshow; + return googleplayshow === '' ? null : googleplayshow; case PLAYER_SOURCE.CRUNCHYROLL: const crunchyrollTitle = document.querySelector(nS.show); - const crunchyrollshow = crunchyrollTitle - ? crunchyrollTitle.innerText - : ""; - return crunchyrollshow === "" ? null : crunchyrollshow; + const crunchyrollshow = crunchyrollTitle ? crunchyrollTitle.innerText : ''; + return crunchyrollshow === '' ? null : crunchyrollshow; default: break; } @@ -321,8 +286,8 @@ export default class VideoListener { } async crunchyRollListener(ev) { if ( - ev.detail.watchPartyDirection === "TO_APP" && - ev.detail.type === "WATCH_PARTY_PLAYER_UPDATE" + ev.detail.watchPartyDirection === 'TO_APP' && + ev.detail.type === 'WATCH_PARTY_PLAYER_UPDATE' ) { this.updateStatus({ status: ev.detail.status, @@ -342,15 +307,15 @@ export default class VideoListener { case PLAYER_SOURCE.CRUNCHYROLL: window.postMessage( JSON.stringify({ - watchPartyDirection: "TO_SCRIPT", - type: "WATCH_PARTY_ADD_LISTENERS", + watchPartyDirection: 'TO_SCRIPT', + type: 'WATCH_PARTY_ADD_LISTENERS', }) ); - window.addEventListener("watchParty", this.crunchyRollListener); + window.addEventListener('watchParty', this.crunchyRollListener); break; default: - videoElement.addEventListener("playing", this.onplay); - videoElement.addEventListener("pause", this.onpause); + videoElement.addEventListener('playing', this.onplay); + videoElement.addEventListener('pause', this.onpause); } } async start() { @@ -361,12 +326,10 @@ export default class VideoListener { switch (this.video.source) { case PLAYER_SOURCE.NETFLIX: const seekInject = `window.seekScriptLoaded=!0;var getVideoPlayer=function(){var e=window.netflix.appContext.state.playerApp.getAPI().videoPlayer,t=e.getAllPlayerSessionIds()[0];return e.getVideoPlayerBySessionId(t)},seekInteraction=function(e){if(e.source==window){if(e.data.type&&"SEEK"==e.data.type){getVideoPlayer().pause();getVideoPlayer().seek(e.data.time);}if(e.data.type&&e.data.type==="PAUSE"){getVideoPlayer().pause();}if(e.data.type&&e.data.type==="PLAY"){getVideoPlayer().play();}e.data.type&&"teardown"==e.data.type&&(window.removeEventListener("message",seekInteraction,!1),window.seekScriptLoaded=!1)}};window.addEventListener("message",seekInteraction,!1);`; - const seekInjectScript = document.createElement("script"); + const seekInjectScript = document.createElement('script'); seekInjectScript.text = seekInject; document.head.appendChild(seekInjectScript); - const videoElement = document.querySelector( - this.selectors[PLAYER_SOURCE.NETFLIX] - ); + const videoElement = document.querySelector(this.selectors[PLAYER_SOURCE.NETFLIX]); if (videoElement && !this.video.element) { this.firstTimeSync(videoElement); } else { @@ -374,13 +337,8 @@ export default class VideoListener { this.video.element ? null : () => { - var nve = document.querySelector( - this.selectors[PLAYER_SOURCE.NETFLIX] - ); - if ( - nve !== null && - (this.video.element !== nve || this.video.element === null) - ) { + var nve = document.querySelector(this.selectors[PLAYER_SOURCE.NETFLIX]); + if (nve !== null && (this.video.element !== nve || this.video.element === null)) { this.firstTimeSync(nve); } }, @@ -392,12 +350,10 @@ export default class VideoListener { const huluSeekInject = `window.seekScriptLoaded=!0;var getVideoPlayer=function(){var e=document.querySelector("${ this.selectors[PLAYER_SOURCE.HULU] }").__HuluDashPlayer__;return e;},seekInteraction=function(e){if(e.source==window){if(e.data.type&&"SEEK"==e.data.type){getVideoPlayer().seek(e.data.time,e.data.time);}if(e.data.type&&e.data.type==="PAUSE"){getVideoPlayer().pause();}if(e.data.type&&e.data.type==="PLAY"){getVideoPlayer().play();}e.data.type&&"teardown"==e.data.type&&(window.removeEventListener("message",seekInteraction,!1),window.seekScriptLoaded=!1)}};window.addEventListener("message",seekInteraction,!1);`; - const huluSeekInjectScript = document.createElement("script"); + const huluSeekInjectScript = document.createElement('script'); huluSeekInjectScript.text = huluSeekInject; document.head.appendChild(huluSeekInjectScript); - const huluVideoElement = document.querySelector( - this.selectors[PLAYER_SOURCE.HULU] - ); + const huluVideoElement = document.querySelector(this.selectors[PLAYER_SOURCE.HULU]); if (huluVideoElement) { this.firstTimeSync(huluVideoElement); } else { @@ -405,13 +361,8 @@ export default class VideoListener { this.video.element ? null : () => { - var hve = document.querySelector( - this.selectors[PLAYER_SOURCE.HULU] - ); - if ( - hve !== null && - (this.video.element !== hve || this.video.element === null) - ) { + var hve = document.querySelector(this.selectors[PLAYER_SOURCE.HULU]); + if (hve !== null && (this.video.element !== hve || this.video.element === null)) { this.firstTimeSync(hve); } }, @@ -420,9 +371,7 @@ export default class VideoListener { } break; case PLAYER_SOURCE.AMAZON: - const amazonVideoElement = document.querySelector( - this.selectors[PLAYER_SOURCE.AMAZON] - ); + const amazonVideoElement = document.querySelector(this.selectors[PLAYER_SOURCE.AMAZON]); if (amazonVideoElement) { this.firstTimeSync(amazonVideoElement); } else { @@ -430,13 +379,8 @@ export default class VideoListener { this.video.element ? null : () => { - var ave = document.querySelector( - this.selectors[PLAYER_SOURCE.AMAZON] - ); - if ( - ave !== null && - (this.video.element !== ave || this.video.element === null) - ) { + var ave = document.querySelector(this.selectors[PLAYER_SOURCE.AMAZON]); + if (ave !== null && (this.video.element !== ave || this.video.element === null)) { this.firstTimeSync(ave); } }, @@ -445,9 +389,7 @@ export default class VideoListener { } break; case PLAYER_SOURCE.DISNEY: - const disneyVideoElement = document.querySelector( - this.selectors[PLAYER_SOURCE.DISNEY] - ); + const disneyVideoElement = document.querySelector(this.selectors[PLAYER_SOURCE.DISNEY]); if (disneyVideoElement) { this.firstTimeSync(disneyVideoElement); } else { @@ -455,13 +397,8 @@ export default class VideoListener { this.video.element ? null : () => { - var dve = document.querySelector( - this.selectors[PLAYER_SOURCE.DISNEY] - ); - if ( - dve !== null && - (this.video.element !== dve || this.video.element === null) - ) { + var dve = document.querySelector(this.selectors[PLAYER_SOURCE.DISNEY]); + if (dve !== null && (this.video.element !== dve || this.video.element === null)) { this.firstTimeSync(dve); } }, @@ -470,22 +407,15 @@ export default class VideoListener { } break; case PLAYER_SOURCE.YOUTUBE: - const youtubeVideoElement = document.querySelector( - this.selectors[PLAYER_SOURCE.YOUTUBE] - ); + const youtubeVideoElement = document.querySelector(this.selectors[PLAYER_SOURCE.YOUTUBE]); if (youtubeVideoElement) this.firstTimeSync(youtubeVideoElement); else { setInterval( this.video.element ? null : () => { - var yve = document.querySelector( - this.selectors[PLAYER_SOURCE.YOUTUBE] - ); - if ( - yve !== null && - (this.video.element !== yve || this.video.element === null) - ) { + var yve = document.querySelector(this.selectors[PLAYER_SOURCE.YOUTUBE]); + if (yve !== null && (this.video.element !== yve || this.video.element === null)) { this.firstTimeSync(yve); } }, @@ -497,27 +427,22 @@ export default class VideoListener { const hboSeekInject = `window.seekScriptLoaded=!0;var getVideoPlayer=function(){var e=document.querySelector("${ this.selectors[PLAYER_SOURCE.HBOMAX] }")._dispNode;return e;},seekInteraction=function(e){if(e.source==window){if(e.data.type&&e.data.type==="PAUSE"){getVideoPlayer().pause();}if(e.data.type&&e.data.type==="PLAY"){getVideoPlayer().play();}e.data.type&&"teardown"==e.data.type&&(window.removeEventListener("message",seekInteraction,!1),window.seekScriptLoaded=!1)}};window.addEventListener("message",seekInteraction,!1);`; - const hboSeekInjectScript = document.createElement("script"); + const hboSeekInjectScript = document.createElement('script'); hboSeekInjectScript.text = hboSeekInject; document.head.appendChild(hboSeekInjectScript); - const hboVideoElement = document.querySelector( - this.selectors[PLAYER_SOURCE.HBOMAX] - ); + const hboVideoElement = document.querySelector(this.selectors[PLAYER_SOURCE.HBOMAX]); if (hboVideoElement) { const bottomHalf = - hboVideoElement.parentNode.parentNode.parentNode.parentNode - .parentNode.children[1]; - bottomHalf.children[0].id = "hboUpperTitle"; - bottomHalf.children[1].id = "hboLowerTitle"; + hboVideoElement.parentNode.parentNode.parentNode.parentNode.parentNode.children[1]; + bottomHalf.children[0].id = 'hboUpperTitle'; + bottomHalf.children[1].id = 'hboLowerTitle'; this.firstTimeSync(hboVideoElement); } else { setInterval( this.video.element ? null : () => { - var hve = document.querySelector( - this.selectors[PLAYER_SOURCE.HBOMAX] - ); + var hve = document.querySelector(this.selectors[PLAYER_SOURCE.HBOMAX]); if ( hve !== null && hve !== undefined && @@ -534,27 +459,22 @@ export default class VideoListener { const hboNowSeekInject = `window.seekScriptLoaded=!0;var getVideoPlayer=function(){var e=document.querySelector("${ this.selectors[PLAYER_SOURCE.HBONOW] }")._dispNode;return e;},seekInteraction=function(e){if(e.source==window){if(e.data.type&&e.data.type==="PAUSE"){getVideoPlayer().pause();}if(e.data.type&&e.data.type==="PLAY"){getVideoPlayer().play();}e.data.type&&"teardown"==e.data.type&&(window.removeEventListener("message",seekInteraction,!1),window.seekScriptLoaded=!1)}};window.addEventListener("message",seekInteraction,!1);`; - const hboNowSeekInjectScript = document.createElement("script"); + const hboNowSeekInjectScript = document.createElement('script'); hboNowSeekInjectScript.text = hboNowSeekInject; document.head.appendChild(hboNowSeekInjectScript); - const hboNowVideoElement = document.querySelector( - this.selectors[PLAYER_SOURCE.HBONOW] - ); + const hboNowVideoElement = document.querySelector(this.selectors[PLAYER_SOURCE.HBONOW]); if (hboNowVideoElement) { const bottomHalf = - hboNowVideoElement.parentNode.parentNode.parentNode.parentNode - .parentNode.children[1]; - bottomHalf.children[0].id = "hboUpperTitle"; - bottomHalf.children[1].id = "hboLowerTitle"; + hboNowVideoElement.parentNode.parentNode.parentNode.parentNode.parentNode.children[1]; + bottomHalf.children[0].id = 'hboUpperTitle'; + bottomHalf.children[1].id = 'hboLowerTitle'; this.firstTimeSync(hboNowVideoElement); } else { setInterval( this.video.element ? null : () => { - var hve = document.querySelector( - this.selectors[PLAYER_SOURCE.HBONOW] - ); + var hve = document.querySelector(this.selectors[PLAYER_SOURCE.HBONOW]); if ( hve !== null && hve !== undefined && @@ -571,12 +491,10 @@ export default class VideoListener { const peacockInject = `var watchPartyInteraction=function(e){if(e.source===window){const data=JSON.parse(e.data);const playerReactElement=document.querySelector("${ this.selectors[PLAYER_SOURCE.PEACOCK] }");if(data.watchPartyDirection==='TO_SCRIPT'){if(data.type==='WATCH_PARTY_SEEK'){if(playerReactElement&&playerReactElement.player){playerReactElement.player.seek(data.time)}}else if(data.type==='WATCH_PARTY_STATUS'){if(playerReactElement&&playerReactElement.player){if(data.status==='PAUSED')playerReactElement.player.pause();if(data.status==='PLAYING')playerReactElement.player.play()}}}}};window.addEventListener("message",watchPartyInteraction);`; - const peacockInjectScript = document.createElement("script"); + const peacockInjectScript = document.createElement('script'); peacockInjectScript.text = peacockInject; document.head.appendChild(peacockInjectScript); - const peacockVideoElement = document.querySelector( - this.selectors[PLAYER_SOURCE.PEACOCK] - ); + const peacockVideoElement = document.querySelector(this.selectors[PLAYER_SOURCE.PEACOCK]); if (peacockVideoElement) { this.firstTimeSync(peacockVideoElement); } else { @@ -584,9 +502,7 @@ export default class VideoListener { this.video.element ? null : () => { - var pve = document.querySelector( - this.selectors[PLAYER_SOURCE.PEACOCK] - ); + var pve = document.querySelector(this.selectors[PLAYER_SOURCE.PEACOCK]); if ( pve !== null && pve !== undefined && @@ -600,13 +516,9 @@ export default class VideoListener { } break; case PLAYER_SOURCE.GOOGLEPLAY: - const playerIframe = document.querySelector( - this.selectors[PLAYER_SOURCE.GOOGLEPLAY] - ); + const playerIframe = document.querySelector(this.selectors[PLAYER_SOURCE.GOOGLEPLAY]); if (playerIframe) { - const googlePlayVideoElement = playerIframe.contentWindow.document.querySelector( - "video" - ); + const googlePlayVideoElement = playerIframe.contentWindow.document.querySelector('video'); if (googlePlayVideoElement) { this.firstTimeSync(googlePlayVideoElement); } @@ -615,13 +527,9 @@ export default class VideoListener { this.video.element ? null : () => { - const pif = document.querySelector( - this.selectors[PLAYER_SOURCE.GOOGLEPLAY] - ); + const pif = document.querySelector(this.selectors[PLAYER_SOURCE.GOOGLEPLAY]); if (pif) { - const gpve = pif.contentWindow.document.querySelector( - "video" - ); + const gpve = pif.contentWindow.document.querySelector('video'); if (gpve) { this.firstTimeSync(gpve); } @@ -632,12 +540,10 @@ export default class VideoListener { } case PLAYER_SOURCE.CRUNCHYROLL: const crunchyRollInject = `var sendToWatchPartyApp = function(pS, pT) { var customWatchPartyEvent = new CustomEvent('watchParty', { detail: { watchPartyDirection: 'TO_APP', type: 'WATCH_PARTY_PLAYER_UPDATE', status: pS, time: pT } }); window.dispatchEvent(customWatchPartyEvent); }, watchPartyGetTimeAndSend = function(pS) { if (window.VILOS_PLAYERJS) { window.VILOS_PLAYERJS.getCurrentTime(function(pT) { sendToWatchPartyApp(pS, pT); }); } }, watchPartySendPlaying = function() { watchPartyGetTimeAndSend('PLAYING'); }, watchPartySendPaused = function() { watchPartyGetTimeAndSend('PAUSED'); }, watchPartyInteraction = function(e) { if (e.source === window) { const data = JSON.parse(e.data); if (data.watchPartyDirection === 'TO_SCRIPT') { if (data.type === 'WATCH_PARTY_ADD_LISTENERS') { if (window.VILOS_PLAYERJS) { window.VILOS_PLAYERJS.on('play', watchPartySendPlaying, 'player.js'); window.VILOS_PLAYERJS.on('pause', watchPartySendPaused, 'player.js'); } } else if (data.type === 'WATCH_PARTY_SEEK') { if (window.VILOS_PLAYERJS) { window.VILOS_PLAYERJS.setCurrentTime(data.time); } } else if (data.type === 'WATCH_PARTY_STATUS') { if (window.VILOS_PLAYERJS) { if (data.status === 'PAUSED') window.VILOS_PLAYERJS.pause(); if (data.status === 'PLAYING') window.VILOS_PLAYERJS.play(); } } } } }; window.addEventListener("message", watchPartyInteraction);`; - const crunchyRollInjectScript = document.createElement("script"); + const crunchyRollInjectScript = document.createElement('script'); crunchyRollInjectScript.text = crunchyRollInject; document.head.appendChild(crunchyRollInjectScript); - const crunchyrollIframe = document.querySelector( - this.selectors[PLAYER_SOURCE.CRUNCHYROLL] - ); + const crunchyrollIframe = document.querySelector(this.selectors[PLAYER_SOURCE.CRUNCHYROLL]); if (crunchyrollIframe) { this.firstTimeSync(crunchyrollIframe); } else { @@ -645,9 +551,7 @@ export default class VideoListener { this.video.element ? null : () => { - const cif = document.querySelector( - this.selectors[PLAYER_SOURCE.CRUNCHYROLL] - ); + const cif = document.querySelector(this.selectors[PLAYER_SOURCE.CRUNCHYROLL]); if (cif) { this.firstTimeSync(cif); } @@ -657,7 +561,7 @@ export default class VideoListener { } break; case PLAYER_SOURCE.LOCAL: - const localVideoElement = document.getElementsByTagName("video")[0]; + const localVideoElement = document.getElementsByTagName('video')[0]; if (localVideoElement) { this.firstTimeSync(localVideoElement); } @@ -669,12 +573,12 @@ export default class VideoListener { end() { switch (this.video.source) { case PLAYER_SOURCE.CRUNCHYROLL: - window.removeEventListener("watchParty", this.crunchyRollListener); + window.removeEventListener('watchParty', this.crunchyRollListener); break; default: if (this.video.element) { - this.video.element.removeEventListener("playing", this.onplay); - this.video.element.removeEventListener("pause", this.onpause); + this.video.element.removeEventListener('playing', this.onplay); + this.video.element.removeEventListener('pause', this.onpause); } } } diff --git a/app/src/index.css b/app/src/index.css index 601e0ad..d7b312c 100644 --- a/app/src/index.css +++ b/app/src/index.css @@ -110,8 +110,7 @@ body.youtube.visible .ytp-tooltip.ytp-bottom.ytp-preview { bottom: 100px !important; top: unset !important; } -body.youtube.visible - td-two-column-browse-results-renderer.grid:not(.grid-disabled) { +body.youtube.visible td-two-column-browse-results-renderer.grid:not(.grid-disabled) { max-width: calc(100% - 48px); } body.youtube.visible ytd-miniplayer { @@ -311,7 +310,7 @@ body.disney #party_wrapper * { border: 1px solid white; background-color: black !important; transition: all ease-in-out 0.3s !important; - background-image: url("chrome-extension://__MSG_@@extension_id__/android-icon-192x192.png"); + background-image: url('chrome-extension://__MSG_@@extension_id__/android-icon-192x192.png'); background-position: center; background-repeat: no-repeat; background-size: 75%; diff --git a/functions/app.js b/functions/app.js index c26f5da..38c590b 100644 --- a/functions/app.js +++ b/functions/app.js @@ -1,48 +1,32 @@ -const FunctionModules = require("./modules/index"); -const FunctionModules2 = require("./modules2/index"); -const Webhooks = require("./webhooks/index"); -const express = require("express"); -const cors = require("cors"); +const FunctionModules = require('./modules/index'); +const Webhooks = require('./webhooks/index'); +const express = require('express'); +const cors = require('cors'); // WEBHOOKS const webhooks = express(); webhooks.use(cors({ origin: true })); -webhooks.all("/conferenceEnded", Webhooks.conferenceEnd); -webhooks.all("/scheduledCleanup", Webhooks.scheduledCleanUp); -webhooks.all("/ask", Webhooks.ask); -webhooks.all("/userCleanUp", Webhooks.userCleanUp); +webhooks.all('/conferenceEnded', Webhooks.conferenceEnd); +webhooks.all('/scheduledCleanup', Webhooks.scheduledCleanUp); +webhooks.all('/ask', Webhooks.ask); +webhooks.all('/userCleanUp', Webhooks.userCleanUp); // VERSION 1 const app = express(); app.use(cors({ origin: true })); app.use(FunctionModules.authenticator); -app.get("/validator/:partyName", FunctionModules.tokenValidator); -app.get("/refresher/:token", FunctionModules.tokenRefresher); -app.post("/create", FunctionModules.createRoom); -app.post("/join", FunctionModules.joinRoom); -app.post("/message", FunctionModules.sendMessage); -app.post("/updatePlayer", FunctionModules.updatePlayer); -app.post("/updateVoxeet", FunctionModules.updateVoxeet); -app.delete("/leave/:rid/users/:uid", FunctionModules.leaveRoom); -app.delete("/delete/:rid", FunctionModules.deleteRoom); -app.put("/updateAdminOnly/:rid/:adminOnly", FunctionModules.updateAdminOnly); - -// VERSION 2 -const app2 = express(); -app2.use(cors({ origin: true })); -app2.use(FunctionModules2.authenticator); -app2.get("/validator", FunctionModules2.tokenValidator); -app2.get("/refresher/:token", FunctionModules2.tokenRefresher); -app2.post("/create", FunctionModules2.createRoom); -app2.post("/join", FunctionModules2.joinRoom); -app2.post("/message", FunctionModules2.sendMessage); -app2.post("/updatePlayer", FunctionModules2.updatePlayer); -app2.post("/updateVoxeet", FunctionModules2.updateVoxeet); -app2.delete("/leave/:rid/users/:uid", FunctionModules2.leaveRoom); -app2.delete("/delete/:rid", FunctionModules2.deleteRoom); +app.get('/validator/:partyName', FunctionModules.tokenValidator); +app.get('/refresher/:token', FunctionModules.tokenRefresher); +app.post('/create', FunctionModules.createRoom); +app.post('/join', FunctionModules.joinRoom); +app.post('/message', FunctionModules.sendMessage); +app.post('/updatePlayer', FunctionModules.updatePlayer); +app.post('/updateVoxeet', FunctionModules.updateVoxeet); +app.delete('/leave/:rid/users/:uid', FunctionModules.leaveRoom); +app.delete('/delete/:rid', FunctionModules.deleteRoom); +app.put('/updateAdminOnly/:rid/:adminOnly', FunctionModules.updateAdminOnly); module.exports = { v1: app, - v2: app2, webhooks, }; diff --git a/functions/index.js b/functions/index.js index 0fae717..d148368 100644 --- a/functions/index.js +++ b/functions/index.js @@ -12,7 +12,5 @@ admin.initializeApp(FIREBASE_OPTIONS); // VERSION 1 exports.widgets = functions.https.onRequest(REST.v1); -// VERSION 2 -exports.widgets2 = functions.https.onRequest(REST.v2); // WEBHOOKS exports.webhooks = functions.https.onRequest(REST.webhooks); diff --git a/functions/modules/authenticator.js b/functions/modules/authenticator.js index 493325e..29ad53e 100644 --- a/functions/modules/authenticator.js +++ b/functions/modules/authenticator.js @@ -1,62 +1,54 @@ -const admin = require("firebase-admin"); -const Logger = require("../Logger"); -const mLogger = new Logger("modules", "authenticator"); +const admin = require('firebase-admin'); +const Logger = require('../Logger'); +const mLogger = new Logger('modules', 'authenticator'); module.exports = (req, res, next) => { mLogger.start(); - res.set("Access-Control-Allow-Origin", ["*"]); - if (req.method === "OPTIONS") { - mLogger.success("OPTIONS CALL", { URL: req.url }); + res.set('Access-Control-Allow-Origin', ['*']); + if (req.method === 'OPTIONS') { + mLogger.success('OPTIONS CALL', { URL: req.url }); res.status(200).send(); return next(); } if (req.headers.authorization) { try { - const token = req.headers.authorization.split(" ")[1]; - const reqToken = token.split(":")[0]; - const reqUid = token.split(":")[1]; + const token = req.headers.authorization.split(' ')[1]; + const reqToken = token.split(':')[0]; + const reqUid = token.split(':')[1]; admin .auth() .verifyIdToken(reqToken) .then((user) => { if (user.uid === reqUid) { - if (req.method === "POST") { + if (req.method === 'POST') { const bodydata = JSON.parse(req.body); bodydata.uid = user.uid; req.body = JSON.stringify(bodydata); } - if ( - req.method === "GET" || - req.method === "DELETE" || - req.method === "PUT" - ) { + if (req.method === 'GET' || req.method === 'DELETE' || req.method === 'PUT') { req.body = JSON.stringify({ uid: user.uid }); } - mLogger.success("AUTHORIZED", { URL: req.url, UID: reqUid }); + mLogger.success('AUTHORIZED', { URL: req.url, UID: reqUid }); return next(); } else { - mLogger.success("NOT AUTHORIZED", { URL: req.url }); - return res.status(401).send({ message: "Unauthorized" }); + mLogger.success('NOT AUTHORIZED', { URL: req.url }); + return res.status(401).send({ message: 'Unauthorized' }); } }) .catch((err) => { - mLogger.error("AUTH VALIDATE FIREBASE ERROR", { + mLogger.error('AUTH VALIDATE FIREBASE ERROR', { URL: req.url, Error: err, }); - return res - .status(500) - .send({ message: "Unable to verify user token" }); + return res.status(500).send({ message: 'Unable to verify user token' }); }); } catch (err) { - mLogger.error("AUTH VALIDATE ERROR", { URL: req.url, Error: err }); - return res - .status(401) - .send({ message: "Something went wrong when authorizing" }); + mLogger.error('AUTH VALIDATE ERROR', { URL: req.url, Error: err }); + return res.status(401).send({ message: 'Something went wrong when authorizing' }); } } else { - mLogger.error("NO AUTH TOKEN", { URL: req.url }); - res.status(401).send({ message: "Got no user token" }); + mLogger.error('NO AUTH TOKEN', { URL: req.url }); + res.status(401).send({ message: 'Got no user token' }); } return 0; }; diff --git a/functions/modules/createRoom.js b/functions/modules/createRoom.js index 6184e79..4b0e90a 100644 --- a/functions/modules/createRoom.js +++ b/functions/modules/createRoom.js @@ -1,27 +1,21 @@ -const admin = require("firebase-admin"); +const admin = require('firebase-admin'); module.exports = async (req, res) => { const bodydata = JSON.parse(req.body); - console.log("Requested Create - UID - ", bodydata.uid); - if (!bodydata.userName) - res.status(400).send({ message: "Missing user name" }); - if (!bodydata.partyName) - res.status(400).send({ message: "Missing party name" }); - if (!bodydata.partyPin) - res.status(400).send({ message: "Missing party pin" }); + console.log('Requested Create - UID - ', bodydata.uid); + if (!bodydata.userName) res.status(400).send({ message: 'Missing user name' }); + if (!bodydata.partyName) res.status(400).send({ message: 'Missing party name' }); + if (!bodydata.partyPin) res.status(400).send({ message: 'Missing party pin' }); const roomNameTaken = await admin .firestore() - .collection("rooms") - .doc(bodydata.partyName.replace("/", "\\")) + .collection('rooms') + .doc(bodydata.partyName.replace('/', '\\')) .get() .then((docSnap) => docSnap.exists); - if (roomNameTaken) - return res - .status(409) - .send({ message: "That party name is already taken" }); + if (roomNameTaken) return res.status(409).send({ message: 'That party name is already taken' }); await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) .set({ name: bodydata.partyName, @@ -32,17 +26,17 @@ module.exports = async (req, res) => { adminOnly: bodydata.adminOnly, }) .catch((err) => { - res.status(500).send({ message: "Unable to start party." }); + res.status(500).send({ message: 'Unable to start party.' }); console.error(err); }); await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) - .collection("messages") + .collection('messages') .add({ - uid: "", - name: "", + uid: '', + name: '', text: `${bodydata.userName} started the party.`, time: new Date(), }) @@ -54,9 +48,9 @@ module.exports = async (req, res) => { }); await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) - .collection("users") + .collection('users') .doc(bodydata.uid) .set({ admin: true, @@ -68,47 +62,39 @@ module.exports = async (req, res) => { err ); }); - if (bodydata.player && bodydata.player.source === "amazon.") { + if (bodydata.player && bodydata.player.source === 'amazon.') { await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) - .collection("messages") + .collection('messages') .add({ - uid: "", - name: "Update to V1.6.1", - endpoint: "https://get.chromewatchparty.com", - type: "interactive/link", + uid: '', + name: 'Update to V1.6.1', + endpoint: 'https://get.chromewatchparty.com', + type: 'interactive/link', text: `If Watch Party doesn't work make sure you're on V1.6.1. Try removing and re-adding if an update option is not visible`, time: new Date(), }) .catch((err) => { - console.error( - `Failed to add amazon error message : \n\t Room: ${bodydata.partyName}`, - err - ); + console.error(`Failed to add amazon error message : \n\t Room: ${bodydata.partyName}`, err); }); } - if (bodydata.player && bodydata.player.source === "hulu.") { + if (bodydata.player && bodydata.player.source === 'hulu.') { await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) - .collection("messages") + .collection('messages') .add({ - uid: "", - name: "", + uid: '', + name: '', text: `Watch Party may not work temporarily. An update is coming to fix this.`, time: new Date(), }) .catch((err) => { - console.error( - `Failed to add amazon error message : \n\t Room: ${bodydata.partyName}`, - err - ); + console.error(`Failed to add amazon error message : \n\t Room: ${bodydata.partyName}`, err); }); } - res - .status(201) - .send({ roomId: bodydata.partyName, message: "Started a party!" }); + res.status(201).send({ roomId: bodydata.partyName, message: 'Started a party!' }); }; diff --git a/functions/modules/joinRoom.js b/functions/modules/joinRoom.js index 53add0f..7453fef 100644 --- a/functions/modules/joinRoom.js +++ b/functions/modules/joinRoom.js @@ -1,24 +1,19 @@ -const admin = require("firebase-admin"); +const admin = require('firebase-admin'); module.exports = async (req, res) => { const bodydata = JSON.parse(req.body); - console.log( - "Requested Join - UID - ", - bodydata.uid, - "\n\tRoom - ", - bodydata.partyName - ); + console.log('Requested Join - UID - ', bodydata.uid, '\n\tRoom - ', bodydata.partyName); // GET ROOM EXISTS, ROOM SOURCE, & ROOM PIN const [exists, roomSource, roomPin, adminUid] = await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) .get() .then((roomSnap) => [ roomSnap.exists, - roomSnap.exists ? roomSnap.data().player.source : "", - roomSnap.exists ? roomSnap.data().pin : "", - roomSnap.exists ? roomSnap.data().adminUid : "", + roomSnap.exists ? roomSnap.data().player.source : '', + roomSnap.exists ? roomSnap.data().pin : '', + roomSnap.exists ? roomSnap.data().adminUid : '', ]) .catch((err) => { console.error( @@ -27,13 +22,13 @@ module.exports = async (req, res) => { ); }); if (exists && roomPin !== bodydata.partyPin) - return res.status(401).send({ message: "Incorrect party pin" }); + return res.status(401).send({ message: 'Incorrect party pin' }); if (adminUid === bodydata.uid) { await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) - .collection("users") + .collection('users') .doc(bodydata.uid) .set({ admin: true, @@ -43,15 +38,15 @@ module.exports = async (req, res) => { // GET IF USER EXISTS AND IS ADMIN const [userExists, userAdmin, userName] = await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) - .collection("users") + .collection('users') .doc(bodydata.uid) .get() .then((userSnap) => [ userSnap.exists, userSnap.exists ? userSnap.data().admin : false, - userSnap.exists ? userSnap.data().name : "", + userSnap.exists ? userSnap.data().name : '', ]) .catch((err) => { console.error( @@ -65,15 +60,13 @@ module.exports = async (req, res) => { if (userName !== bodydata.userName) { await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) - .collection("users") + .collection('users') .doc(bodydata.uid) .update({ name: bodydata.userName }); } - res - .status(200) - .send({ partyName: bodydata.partyName, message: "Joined a party" }); + res.status(200).send({ partyName: bodydata.partyName, message: 'Joined a party' }); } // USER DOES NOT PRE-EXIST BUT SAME SOURCE AND RIGHT PIN else if ( @@ -86,12 +79,12 @@ module.exports = async (req, res) => { ) { await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) - .collection("messages") + .collection('messages') .add({ - uid: "", - name: "", + uid: '', + name: '', text: `${bodydata.userName} joined the party.`, time: new Date(), }) @@ -103,9 +96,9 @@ module.exports = async (req, res) => { }); await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) - .collection("users") + .collection('users') .doc(bodydata.uid) .set({ admin: false, @@ -117,9 +110,7 @@ module.exports = async (req, res) => { err ); }); - res - .status(200) - .send({ partyName: bodydata.partyName, message: "Joined a party" }); + res.status(200).send({ partyName: bodydata.partyName, message: 'Joined a party' }); } // ONLY WRONG SOURCE else if (exists && roomSource !== bodydata.source) { @@ -127,13 +118,13 @@ module.exports = async (req, res) => { if (userAdmin === true) { await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(bodydata.partyName) .update({ player: { showName: null, source: bodydata.source, - status: "NOT_PLAYING", + status: 'NOT_PLAYING', time: 0, updatedBy: bodydata.uid, }, @@ -142,11 +133,9 @@ module.exports = async (req, res) => { console.error( `Failed to update player source when admin joining party \n\t Room: ${partyName} \n\t User: ${bodydata.uid}` ); - res - .status(500) - .send({ message: "Unable to move party, please try again" }); + res.status(500).send({ message: 'Unable to move party, please try again' }); }); res.status(200).send({ message: `Moved party to ${roomSource}` }); } else res.status(417).send({ message: `This party is on ${roomSource}` }); - } else res.status(404).send({ message: "Party Not Found" }); + } else res.status(404).send({ message: 'Party Not Found' }); }; diff --git a/functions/modules/sendMessage.js b/functions/modules/sendMessage.js index 103468c..4b49093 100644 --- a/functions/modules/sendMessage.js +++ b/functions/modules/sendMessage.js @@ -1,39 +1,34 @@ -const admin = require("firebase-admin"); +const admin = require('firebase-admin'); module.exports = async (req, res) => { const { name, text, uid, roomId, type, replyTo } = JSON.parse(req.body); const roomExists = await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(roomId) .get() .then((roomSnap) => roomSnap.exists); if (roomExists) { await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(roomId) - .collection("messages") + .collection('messages') .add({ name, - text: text || "", + text: text || '', time: new Date(), uid, - type: type || "", + type: type || '', replyTo: replyTo || null, }) .catch((err) => { - console.error( - `Failed to send message to party : \n\t Room: ${roomId} \n\t ${uid}`, - err - ); - res - .status(500) - .send({ message: "Couldn't send your message", error: messageErr }); + console.error(`Failed to send message to party : \n\t Room: ${roomId} \n\t ${uid}`, err); + res.status(500).send({ message: "Couldn't send your message", error: messageErr }); }); - res.status(200).send({ message: "Sent a message" }); + res.status(200).send({ message: 'Sent a message' }); } else { - res.status(404).send({ message: "Looks like this party is over" }); + res.status(404).send({ message: 'Looks like this party is over' }); } }; diff --git a/functions/modules/tokenValidator.js b/functions/modules/tokenValidator.js index de9bdc5..7059f00 100644 --- a/functions/modules/tokenValidator.js +++ b/functions/modules/tokenValidator.js @@ -17,29 +17,26 @@ module.exports = async (req, res) => { body: JSON.stringify({ grant_type: 'client_credentials', }), - }).then((oauthResponse) => oauthResponse.json()) - .catch((err) => res.status(500).send({err, message: 'Unable to generate token for call'})); + }) + .then((oauthResponse) => oauthResponse.json()) + .catch((err) => res.status(500).send({ err, message: 'Unable to generate token for call' })); const [exists, conferencePending, conference, adminOnly, adminUid] = await admin - .firestore() - .collection('rooms') - .doc(req.params.partyName) - .get() - .then(snap => { - const data = snap.exists ? snap.data() : {}; - return [snap.exists, data.conferencePending, data.conference, data.adminOnly, data.adminUid]; - }); + .firestore() + .collection('rooms') + .doc(req.params.partyName) + .get() + .then((snap) => { + const data = snap.exists ? snap.data() : {}; + return [snap.exists, data.conferencePending, data.conference, data.adminOnly, data.adminUid]; + }); if (exists === true) { if (conference === undefined || conference === null) { if (conferencePending === undefined || conferencePending === null) { - if (!adminOnly || (adminOnly && (adminUid === bodyData.uid)) ) { - await admin - .firestore() - .collection('rooms') - .doc(req.params.partyName) - .update({ - conferencePending: bodyData.uid + if (!adminOnly || (adminOnly && adminUid === bodyData.uid)) { + await admin.firestore().collection('rooms').doc(req.params.partyName).update({ + conferencePending: bodyData.uid, }); await admin .firestore() @@ -51,7 +48,7 @@ module.exports = async (req, res) => { name: '', text: 'A call session is being created (will be available soon).', time: new Date(), - }); + }); } } } diff --git a/functions/modules/updateAdminOnly.js b/functions/modules/updateAdminOnly.js index 8525377..9a263d5 100644 --- a/functions/modules/updateAdminOnly.js +++ b/functions/modules/updateAdminOnly.js @@ -16,8 +16,8 @@ module.exports = async (req, res) => { return false; }) .catch((err) => { - console.err('Failed to get party to update adminOnly', err); - return res.status(404).send({ message: 'Failed to get party.' }); + console.err('Failed to get party to update adminOnly', err); + return res.status(404).send({ message: 'Failed to get party.' }); }); if (!isAdmin) { console.log('[UNAUTHORIZED] Requested Admin Mode Update - Room - ', req.params.rid); @@ -25,12 +25,17 @@ module.exports = async (req, res) => { return; } const adminOnly = req.params.adminOnly === 'true'; - await admin.firestore().collection('rooms').doc(req.params.rid).update({ - adminOnly - }).catch((err) => { + await admin + .firestore() + .collection('rooms') + .doc(req.params.rid) + .update({ + adminOnly, + }) + .catch((err) => { console.err('Failed to update adminOnly for party', err); res.status(409).send({ message: 'Failed to update party.' }); - }); + }); res.status(200).send({ message: 'Updated admin only mode for party' }); return; }; diff --git a/functions/modules/updateVoxeet.js b/functions/modules/updateVoxeet.js index dc7415b..334fc1f 100644 --- a/functions/modules/updateVoxeet.js +++ b/functions/modules/updateVoxeet.js @@ -1,23 +1,16 @@ -const admin = require("firebase-admin"); +const admin = require('firebase-admin'); module.exports = async (req, res) => { - const { conference, partyName, partyPin, userName, uid } = JSON.parse( - req.body - ); + const { conference, partyName, partyPin, userName, uid } = JSON.parse(req.body); // GET ROOM PIN const [exists, roomPin, conferencePending, partyConference] = await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(partyName) .get() .then((roomSnap) => { const data = roomSnap.exists ? roomSnap.data() : {}; - return [ - roomSnap.exists, - data.pin, - data.conferencePending, - data.conference, - ]; + return [roomSnap.exists, data.pin, data.conferencePending, data.conference]; }); // CHECK IF ROOM EXISTS if (exists === true) { @@ -29,61 +22,57 @@ module.exports = async (req, res) => { // UPDATE CONFERENCE DETAILS await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(partyName) .update({ conference }) .catch((err) => res.status(500).send({ - message: "Unable to update the call details", + message: 'Unable to update the call details', error: err, }) ); // REMOVE PENDING STATUS await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(partyName) .update({ conferencePending: admin.firestore.FieldValue.delete(), }) - .catch((err) => - console.error("Failed to remove pending status", err) - ); + .catch((err) => console.error('Failed to remove pending status', err)); // ADD SYSTEM MESSAGE await admin .firestore() - .collection("rooms") + .collection('rooms') .doc(partyName) - .collection("messages") + .collection('messages') .add({ - uid: "", - name: "", + uid: '', + name: '', text: `${userName} started the call, everyone can join now.`, time: new Date(), }) - .catch((err) => - console.error("Failed to add update conference message", err) - ); - res.status(200).send({ message: "Started the conference" }); + .catch((err) => console.error('Failed to add update conference message', err)); + res.status(200).send({ message: 'Started the conference' }); } else { res.status(409).send({ - message: "Looks like someone is already starting a call", + message: 'Looks like someone is already starting a call', }); } } else if (partyConference) { res.status(409).send({ - message: "Call already exists", + message: 'Call already exists', conference: partyConference, }); } } else { // WRONG ROOM PIN - res.status(401).send({ message: "Wrong party pin, try rejoining" }); + res.status(401).send({ message: 'Wrong party pin, try rejoining' }); } } } else { // ROOM DOESN'T EXIST - res.status(404).send({ message: "Party Not Found" }); + res.status(404).send({ message: 'Party Not Found' }); } return; }; diff --git a/functions/modules2/authenticator.js b/functions/modules2/authenticator.js deleted file mode 100644 index 878697c..0000000 --- a/functions/modules2/authenticator.js +++ /dev/null @@ -1,42 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = (req, res, next) => { - res.set('Access-Control-Allow-Origin', ['*']); - if (req.method === 'OPTIONS') { - res.status(200).send(); - return next(); - } - if (req.headers.authorization) { - try { - const token = req.headers.authorization.split(' ')[1]; - const reqToken = token.split(':')[0]; - const reqUid = token.split(':')[1]; - admin - .auth() - .verifyIdToken(reqToken) - .then((user) => { - if (user.uid === reqUid) { - console.info('Verified Token - UID - ', reqUid); - if (req.method === 'POST') { - const bodydata = JSON.parse(req.body); - bodydata.uid = user.uid; - req.body = JSON.stringify(bodydata); - } - if (req.method === 'GET' || req.method === 'DELETE') { - req.body = JSON.stringify({ uid: user.uid }); - } - return next(); - } else { - return res.status(401).send({ message: 'Unauthorized' }); - } - }) - .catch((err) => { - console.error('Failed Auth - ', req.headers.authorization, '\n', err); - return res.status(500).send({ message: 'Unable to verify user token' }); - }); - } catch (err) { - console.log(err); - return res.status(401).send({ message: 'Something went wrong when authorizing' }); - } - } else return res.status(401).send({ message: 'Got no user token' }); -}; diff --git a/functions/modules2/cleanUpRoom.js b/functions/modules2/cleanUpRoom.js deleted file mode 100644 index c268db2..0000000 --- a/functions/modules2/cleanUpRoom.js +++ /dev/null @@ -1,32 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (roomId) => { - admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('messages') - .listDocuments() - .then((messages) => messages.forEach((message) => message.delete())) - .catch((err) => { - console.error(`Failed to run auto clean up (delete room messages) @ ${roomId}`, err); - }); - admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('users') - .listDocuments() - .then((users) => users.forEach((user) => user.delete())) - .catch((err) => { - console.error(`Failed to run auto clean up (delete room users) @ ${roomId}`, err); - }); - admin - .firestore() - .collection('rooms') - .doc(roomId) - .delete() - .catch((err) => { - console.error(`Failed to run auto clean up (delete room) @ ${roomId}`, err); - }); -}; diff --git a/functions/modules2/createRoom.js b/functions/modules2/createRoom.js deleted file mode 100644 index 15e35b9..0000000 --- a/functions/modules2/createRoom.js +++ /dev/null @@ -1,87 +0,0 @@ -const admin = require("firebase-admin"); - -module.exports = async (req, res) => { - const bodydata = JSON.parse(req.body); - console.log("Requested Create - UID - ", bodydata.uid); - if (!bodydata.userName) - res.status(400).send({ message: "Missing user name" }); - if (!bodydata.partyName) - res.status(400).send({ message: "Missing party name" }); - if (!bodydata.partyPin) - res.status(400).send({ message: "Missing party pin" }); - const roomNameTaken = await admin - .firestore() - .collection("rooms") - .doc(bodydata.partyName.replace("/", "\\")) - .get() - .then((docSnap) => docSnap.exists); - if (roomNameTaken) - return res - .status(409) - .send({ message: "That party name is already taken" }); - await admin - .firestore() - .collection("rooms") - .doc(bodydata.partyName) - .set({ - name: bodydata.partyName, - pin: bodydata.partyPin, - player: bodydata.player, - createdAt: new Date(), - updatedAt: new Date(), - adminUid: bodydata.uid, - }) - .catch((err) => { - res.status(500).send({ message: "Unable to start party." }); - console.error(err); - }); - await admin - .firestore() - .collection("rooms") - .doc(bodydata.partyName) - .collection("messages") - .add({ - uid: "", - name: "", - text: `${bodydata.userName} started the party.`, - time: new Date(), - }) - .catch((err) => { - console.error( - `Failed to add system create party message : \n\t Room: ${bodydata.partyName}`, - err - ); - }); - await admin - .firestore() - .collection("rooms") - .doc(bodydata.partyName) - .collection("users") - .doc(bodydata.uid) - .set({ - admin: true, - name: bodydata.userName, - }) - .catch((err) => { - console.error( - `Failed to set admin when creating party : \n\t Room: ${bodydata.partyName} \n\t User: ${bodydata.uid}`, - err - ); - }); - - admin - .firestore() - .collection("rooms") - .doc(bodydata.partyName) - .collection("messages") - .add({ - uid: "", - name: "", - text: `Big update coming on Monday (Aug. 10). Watch Party will be unavailable during the afternoon as we upgrade our services. See what's new at whatsnew.chromewatchparty.com`, - time: new Date(), - }); - - res - .status(201) - .send({ roomId: bodydata.partyName, message: "Started a party!" }); -}; diff --git a/functions/modules2/deleteRoom.js b/functions/modules2/deleteRoom.js deleted file mode 100644 index e0b37fb..0000000 --- a/functions/modules2/deleteRoom.js +++ /dev/null @@ -1,62 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - console.log('Requested Delete - Room - ', req.params.rid); - console.log(req.body); - const isAdmin = await admin - .firestore() - .collection('rooms') - .doc(req.params.rid) - .collection('users') - .doc(JSON.parse(req.body).uid) - .get() - .then((v) => { - if (v.exists) { - return v.data().admin; - } - return false; - }); - if (!isAdmin) { - console.log('[UNAUTHORIZED] Requested Delete - Room - ', req.params.rid); - res.status(401).send({ message: 'Not authorized to end this party.' }); - return; - } - await admin - .firestore() - .collection('rooms') - .doc(req.params.rid) - .collection('messages') - .listDocuments() - .then((messages) => messages.forEach((message) => message.delete())) - .catch((err) => { - console.error( - `Failed to delete room messages : \n\t Room: ${req.params.rid} \n\t User: ${req.params.uid}`, - err - ); - }); - await admin - .firestore() - .collection('rooms') - .doc(req.params.rid) - .collection('users') - .listDocuments() - .then((users) => users.forEach((user) => user.delete())) - .catch((err) => { - console.error( - `Failed to delete room users : \n\t Room: ${req.params.rid} \n\t User: ${req.params.uid}`, - err - ); - }); - await admin - .firestore() - .collection('rooms') - .doc(req.params.rid) - .delete() - .catch((err) => { - console.error( - `Failed to delete room : \n\t Room: ${req.params.rid} \n\t User: ${req.params.uid}`, - err - ); - }); - res.status(200).send({ message: 'Ended the party' }); -}; diff --git a/functions/modules2/index.js b/functions/modules2/index.js deleted file mode 100644 index 19d7b75..0000000 --- a/functions/modules2/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const authenticator = require('./authenticator'); -const cleanUpRoom = require('./cleanUpRoom'); -const scheduledCleanUp = require('./scheduledCleanUp'); -const createRoom = require('./createRoom'); -const joinRoom = require('./joinRoom'); -const sendMessage = require('./sendMessage'); -const leaveRoom = require('./leaveRoom'); -const deleteRoom = require('./deleteRoom'); -const timeDiff = require('./timeDiff'); -const updatePlayer = require('./updatePlayer'); -const tokenValidator = require('./tokenValidator'); -const tokenRefresher = require('./tokenRefresher'); -const updateVoxeet = require('./updateVoxeet'); - -module.exports = { - authenticator, - createRoom, - joinRoom, - sendMessage, - updatePlayer, - leaveRoom, - deleteRoom, - scheduledCleanUp, - cleanUpRoom, - timeDiff, - tokenValidator, - tokenRefresher, - updateVoxeet, -}; diff --git a/functions/modules2/joinRoom.js b/functions/modules2/joinRoom.js deleted file mode 100644 index 0f4192d..0000000 --- a/functions/modules2/joinRoom.js +++ /dev/null @@ -1,154 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - const bodydata = JSON.parse(req.body); - console.log('Requested Join - UID - ', bodydata.uid, '\n\tRoom - ', bodydata.partyName); - // GET ROOM EXISTS, ROOM SOURCE, & ROOM PIN - const [exists, roomSource, roomPin, adminUid] = await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .get() - .then((roomSnap) => [ - roomSnap.exists, - roomSnap.exists ? roomSnap.data().player.source : '', - roomSnap.exists ? roomSnap.data().pin : '', - roomSnap.exists ? roomSnap.data().adminUid : '', - ]) - .catch((err) => { - console.error( - `Failed to get room when joining room : \n\t Room: ${bodydata.partyName} \n\t User: ${bodydata.uid}`, - err - ); - }); - if (exists && roomPin !== bodydata.partyPin) - return res.status(401).send({ message: 'Incorrect party pin' }); - if (adminUid === bodydata.uid) { - await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .collection('users') - .doc(bodydata.uid) - .set({ - admin: true, - name: bodydata.userName, - }); - } - // GET IF USER EXISTS AND IS ADMIN - const [userExists, userAdmin, userName] = await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .collection('users') - .doc(bodydata.uid) - .get() - .then((userSnap) => [ - userSnap.exists, - userSnap.exists ? userSnap.data().admin : false, - userSnap.exists ? userSnap.data().name : '', - ]) - .catch((err) => { - console.error( - `Failed to get user when joining room : \n\t Room: ${bodydata.partyName} \n\t User: ${bodydata.uid}`, - err - ); - }); - // IF USER PRE-EXISTS AND SAME SOURCE - JOIN - if (userExists && exists && roomSource === bodydata.source) { - // UPDATE NAME IF NEEDED - if (userName !== bodydata.userName) { - await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .collection('users') - .doc(bodydata.uid) - .update({ name: bodydata.userName }); - } - res.status(200).send({ partyName: bodydata.partyName, message: 'Joined a party' }); - } - // USER DOES NOT PRE-EXIST BUT SAME SOURCE AND RIGHT PIN - else if ( - !userExists && - exists && - bodydata.partyName && - bodydata.userName && - roomSource === bodydata.source && - roomPin === bodydata.partyPin - ) { - await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .collection('messages') - .add({ - uid: '', - name: '', - text: `${bodydata.userName} joined the party.`, - time: new Date(), - }) - .catch((err) => { - console.error( - `Failed to add system join party message : \n\t Room: ${partyName} \n\t ${bodydata.uid}`, - err - ); - }); - await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .collection('users') - .doc(bodydata.uid) - .set({ - admin: false, - name: bodydata.userName, - }) - .catch((err) => { - console.error( - `Failed to set admin when joining party : \n\t Room: ${partyName} \n\t User: ${bodydata.uid}`, - err - ); - }); - await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .update({ - updatedAt: new Date(), - }) - .catch((err) => { - console.error( - `Failed to set updated time when joining party : \n\t Room: ${partyName} \n\t User: ${bodydata.uid}`, - err - ); - }); - res.status(200).send({ partyName: bodydata.partyName, message: 'Joined a party' }); - } - // ONLY WRONG SOURCE - else if (exists && roomSource !== bodydata.source) { - // MOVE SOURCE IF ADMIN - if (userAdmin === true) { - await admin - .firestore() - .collection('rooms') - .doc(bodydata.partyName) - .update({ - player: { - showName: null, - source: bodydata.source, - status: 'NOT_PLAYING', - time: 0, - updatedBy: bodydata.uid, - }, - }) - .catch(() => { - console.error( - `Failed to update player source when admin joining party \n\t Room: ${partyName} \n\t User: ${bodydata.uid}` - ); - res.status(500).send({ message: 'Unable to move party, please try again' }); - }); - res.status(200).send({ message: `Moved party to ${roomSource}` }); - } else res.status(417).send({ message: `This party is on ${roomSource}` }); - } else res.status(404).send({ message: 'Party Not Found' }); -}; diff --git a/functions/modules2/leaveRoom.js b/functions/modules2/leaveRoom.js deleted file mode 100644 index fe0ba5b..0000000 --- a/functions/modules2/leaveRoom.js +++ /dev/null @@ -1,19 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - console.log('Requested Leave - UID - ', req.params.uid, '\n\tRoom - ', req.params.rid); - await admin - .firestore() - .collection('rooms') - .doc(req.params.rid) - .collection('users') - .doc(req.params.uid) - .delete() - .catch((err) => - console.error( - `Failed to remove user from party : \n\t Room: ${req.params.rid} \n\t User: ${req.params.uid}`, - err - ) - ); - res.status(200).send({ message: 'Left the party' }); -}; diff --git a/functions/modules2/scheduledCleanUp.js b/functions/modules2/scheduledCleanUp.js deleted file mode 100644 index 2fc91a5..0000000 --- a/functions/modules2/scheduledCleanUp.js +++ /dev/null @@ -1,48 +0,0 @@ -const admin = require('firebase-admin'); -const cleanUpRoom = require('./cleanUpRoom'); - -const timeDiff = (ds1, ds2) => { - const d1 = new Date(ds1); - const d2 = new Date(ds2); - var diff = (d2.getTime() - d1.getTime()) / 1000; - diff /= 60 * 60; - return Math.abs(Math.round(diff)); -}; - -module.exports = async () => { - const startedTime = new Date(); - const roomList = await admin - .firestore() - .collection('rooms') - .listDocuments() - .then((rL) => rL) - .catch((err) => { - console.error( - `Failed to run auto clean up (get room list) @ ${new Date().toLocaleTimeString()}`, - err - ); - }); - roomList.forEach((roomRef) => { - roomRef - .get() - .then(async (roomSnap) => { - if ( - // MORE THAN 24 HOURS AND NOT IN USE - (timeDiff(roomSnap.createTime.toDate(), startedTime) >= 24 && - timeDiff(roomSnap.updateTime.toDate(), startedTime) >= 12) || - // LESS THAN 24 HOURS BUT NOT IN USE - timeDiff(roomSnap.updateTime.toDate(), startedTime) >= 12 - ) { - await cleanUpRoom(roomSnap.id); - console.info(`Deleted room ${roomSnap.id} from auto cleanup`); - } - return; - }) - .catch((err) => { - console.error( - `Failed to run auto clean up (get room snap) @ ${new Date().toLocaleTimeString()}`, - err - ); - }); - }); -}; diff --git a/functions/modules2/sendMessage.js b/functions/modules2/sendMessage.js deleted file mode 100644 index d9b4581..0000000 --- a/functions/modules2/sendMessage.js +++ /dev/null @@ -1,46 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - const { name, text, uid, roomId, type } = JSON.parse(req.body); - - const roomExists = await admin - .firestore() - .collection('rooms') - .doc(roomId) - .get() - .then((roomSnap) => roomSnap.exists); - if (roomExists) { - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('messages') - .add({ - name, - text: text || '', - time: new Date(), - uid, - type: type || '', - }) - .catch((err) => { - console.error(`Failed to send message to party : \n\t Room: ${roomId} \n\t ${uid}`, err); - res.status(500).send({ message: "Couldn't send your message", error: messageErr }); - }); - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .update({ - updatedAt: new Date(), - }) - .catch((err) => { - console.error( - `Failed to set updated time when sending messasge to party : \n\t Room: ${roomId} \n\t User: ${uid}`, - err - ); - }); - res.status(200).send({ message: 'Sent a message' }); - } else { - res.status(404).send({ message: 'Looks like this party is over' }); - } -}; diff --git a/functions/modules2/timeDiff.js b/functions/modules2/timeDiff.js deleted file mode 100644 index 7c16ead..0000000 --- a/functions/modules2/timeDiff.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = function (ds1, ds2) { - const d1 = new Date(ds1); - const d2 = new Date(ds2); - var diff = (d2.getTime() - d1.getTime()) / 1000; - diff /= 60 * 60; - return Math.abs(Math.round(diff)); -}; diff --git a/functions/modules2/tokenRefresher.js b/functions/modules2/tokenRefresher.js deleted file mode 100644 index 8981197..0000000 --- a/functions/modules2/tokenRefresher.js +++ /dev/null @@ -1,20 +0,0 @@ -const VoxeetSecret = require('../VoxeetSecret.json'); -module.exports = async (req, res) => { - const { key, secret } = VoxeetSecret; - const credentials = btoa(encodeURI(key) + ':' + encodeURI(secret)); - const headers = { - 'Content-Type': 'application/json', - 'Cache-Control': 'no-cache', - Authorization: 'Basic ' + credentials, - }; - const oauth = await fetch(VoxeetSecret.refreshURL, { - method: 'POST', - headers, - body: JSON.stringify({ - refresh_token: req.params.token, - }), - }) - .then((oauthResponse) => oauthResponse.json()) - .catch((err) => res.status(500).send(err)); - if (oauth) res.status(200).send(oauth); -}; diff --git a/functions/modules2/tokenValidator.js b/functions/modules2/tokenValidator.js deleted file mode 100644 index dc28d91..0000000 --- a/functions/modules2/tokenValidator.js +++ /dev/null @@ -1,21 +0,0 @@ -const VoxeetSecret = require('../VoxeetSecret.json'); -const fetch = require('node-fetch'); -module.exports = async (req, res) => { - const { key, secret } = VoxeetSecret; - const credentials = Buffer.from(encodeURI(key) + ':' + encodeURI(secret)).toString('base64'); - const headers = { - 'Content-Type': 'application/json', - 'Cache-Control': 'no-cache', - Authorization: 'Basic ' + credentials, - }; - const oauth = await fetch(VoxeetSecret.validateURL, { - method: 'POST', - headers, - body: JSON.stringify({ - grant_type: 'client_credentials', - }), - }) - .then((oauthResponse) => oauthResponse.json()) - .catch((err) => res.status(500).send(err)); - if (oauth) res.status(200).send(oauth); -}; diff --git a/functions/modules2/updatePlayer.js b/functions/modules2/updatePlayer.js deleted file mode 100644 index 1a66ad7..0000000 --- a/functions/modules2/updatePlayer.js +++ /dev/null @@ -1,85 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - const { player, roomId, uid, showChanged, userName } = JSON.parse(req.body); - // const statusString = - // player.status === 'PLAYING' - // ? 'started playing from' - // : player.status === 'PAUSED' - // ? 'paused at' - // : player.status === 'NOT_PLAYING' - // ? 'stopped at' - // : 'is at'; - // const timeString = - // player.time > 3600 - // ? new Date(player.time * 1000).toISOString().substr(11, 8) - // : new Date(player.time * 1000).toISOString().substr(14, 5); - if (!roomId) return res.status(204).send({ message: 'Party name not sent.' }); - const [roomExists, roomData] = await admin - .firestore() - .collection('rooms') - .doc(roomId) - .get() - .then((docSnap) => [docSnap.exists, docSnap.data()]); - if (!roomExists) return res.status(404).send({ message: 'Party not found.' }); - const userExists = await admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('users') - .doc(uid) - .get() - .then((userSnap) => userSnap.exists); - if (userExists) { - if (showChanged === true && player.showName) { - if (player.showName !== roomData.player.showName) { - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .collection('messages') - .add({ - uid: '', - name: '', - text: `${userName} changed \n${player.showName ? 'to ' + player.showName : ''}`, - time: new Date(), - }); - } - } - if (roomData.status !== player.status) { - await admin - .firestore() - .collection('rooms') - .doc(roomId) - .update({ - player, - }) - .catch((err) => { - console.error(`Failed to update player : \n\t Room: ${roomId} \n\t ${uid}`, err); - res.status(500).send({ message: "Uh oh party could't be synced", err }); - }); - // await admin - // .firestore() - // .collection('rooms') - // .doc(roomId) - // .collection('messages') - // .add({ - // uid: '', - // name: '', - // text: `${userName} ${statusString} ${timeString}`, - // time: new Date(), - // }) - // .catch((err) => { - // console.error( - // `Failed to add system update player message : \n\t Room: ${roomId} \n\t ${uid}`, - // err - // ); - // }); - return res.status(200).send({ message: 'Synced party player' }); - } else { - return res.status(208).send({ message: 'Player already up to date' }); - } - } else { - return res.status(401).send({ message: 'Not in room to sync' }); - } -}; diff --git a/functions/modules2/updateVoxeet.js b/functions/modules2/updateVoxeet.js deleted file mode 100644 index 73ae0c0..0000000 --- a/functions/modules2/updateVoxeet.js +++ /dev/null @@ -1,47 +0,0 @@ -const admin = require('firebase-admin'); - -module.exports = async (req, res) => { - const { conference, partyName, partyPin, userName } = JSON.parse(req.body); - // GET ROOM PIN - const roomPin = await admin - .firestore() - .collection('rooms') - .doc(partyName) - .get() - .then((roomSnap) => (roomSnap.exists ? roomSnap.data().pin : null)); - // CHECK IF ROOM EXISTS - if (roomPin) { - // CHECK FOR CORRECT PIN - if (roomPin === partyPin) { - // UPDATE CONFERENCE DETAILS - await admin - .firestore() - .collection('rooms') - .doc(partyName) - .update({ conference }) - .catch((err) => - res.status(500).send({ message: 'Unable to update the call details', error: err }) - ); - // ADD SYSTEM MESSAGE - await admin - .firestore() - .collection('rooms') - .doc(partyName) - .collection('messages') - .add({ - uid: '', - name: '', - text: `${userName} started the call.`, - time: new Date(), - }) - .catch((err) => console.error('Failed to add update conference message', err)); - res.status(200).send({ message: 'Started the conference' }); - } else { - // WRONG ROOM PIN - return res.status(401).send({ message: 'Wrong party pin, try rejoining' }); - } - } else { - // ROOM DOESN'T EXIST - return res.status(404).send({ message: 'Party Not Found' }); - } -}; diff --git a/functions/package-lock.json b/functions/package-lock.json index fbaec9a..2f4e9e8 100644 --- a/functions/package-lock.json +++ b/functions/package-lock.json @@ -1,6 +1,6 @@ { "name": "watch-party-api", - "version": "1.6.1", + "version": "1.6.2", "lockfileVersion": 1, "requires": true, "dependencies": {