v1.6.2/cleanup
- remove api v2 - linting
This commit is contained in:
Generated
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "watch-party-crx",
|
||||
"version": "1.6.1",
|
||||
"version": "1.6.2",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
||||
+42
-44
@@ -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,
|
||||
|
||||
+38
-59
@@ -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 = () => {
|
||||
<ThemeProvider theme={darkTheme}>
|
||||
<Snackbar
|
||||
className="party-notification-container"
|
||||
anchorOrigin={{ vertical: "bottom", horizontal: "right" }}
|
||||
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
|
||||
open={notification.open}
|
||||
onClose={() => 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"
|
||||
>
|
||||
<div
|
||||
onDoubleClick={resetResize}
|
||||
onMouseDown={startResize}
|
||||
id="party-width-dragger"
|
||||
>
|
||||
<div onDoubleClick={resetResize} onMouseDown={startResize} id="party-width-dragger">
|
||||
||
|
||||
</div>
|
||||
</Tooltip>
|
||||
{loading && <Loading />}
|
||||
{status[APP_VERSION_STRING] &&
|
||||
status[APP_VERSION_STRING].active === true ? (
|
||||
{status[APP_VERSION_STRING] && status[APP_VERSION_STRING].active === true ? (
|
||||
<Routes
|
||||
updateLoading={setLoading}
|
||||
notify={(message) => setNotification({ open: true, message })}
|
||||
|
||||
+21
-21
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
+113
-190
@@ -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 !== "<system>") {
|
||||
if (lastMessage.uid !== '<system>') {
|
||||
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 = `
|
||||
<div id="mic-highlight"></div>
|
||||
<h4 id="mic-text">Grant Mic Permission</h4>
|
||||
`;
|
||||
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 <img alt="gif" src={replyTo.text} />;
|
||||
}
|
||||
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
|
||||
</Typography>
|
||||
<Typography
|
||||
color="textPrimary"
|
||||
className="room-title"
|
||||
variant="h4"
|
||||
gutterBottom
|
||||
>
|
||||
<Typography color="textPrimary" className="room-title" variant="h4" gutterBottom>
|
||||
{name}
|
||||
</Typography>
|
||||
</div>
|
||||
@@ -579,9 +548,9 @@ export default class Chat extends Component {
|
||||
<TextField
|
||||
className="share-textbox"
|
||||
label="Party Details"
|
||||
value={`Party Name: ${LocalData().partyName}\nParty Pin: ${
|
||||
LocalData().partyPin
|
||||
}\n${window.location.href}`}
|
||||
value={`Party Name: ${LocalData().partyName}\nParty Pin: ${LocalData().partyPin}\n${
|
||||
window.location.href
|
||||
}`}
|
||||
multiline
|
||||
rowsMax={2}
|
||||
variant="outlined"
|
||||
@@ -608,19 +577,13 @@ export default class Chat extends Component {
|
||||
color="secondary"
|
||||
>
|
||||
<Button onClick={this.leaveParty} startIcon={<Exit />}>
|
||||
<Typography
|
||||
variant="caption"
|
||||
className="party-control-button-text"
|
||||
>
|
||||
<Typography variant="caption" className="party-control-button-text">
|
||||
Leave
|
||||
</Typography>
|
||||
</Button>
|
||||
{admin && (
|
||||
<Button onClick={this.endParty} startIcon={<Delete />}>
|
||||
<Typography
|
||||
variant="caption"
|
||||
className="party-control-button-text"
|
||||
>
|
||||
<Typography variant="caption" className="party-control-button-text">
|
||||
End
|
||||
</Typography>
|
||||
</Button>
|
||||
@@ -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={
|
||||
<span>
|
||||
Allow chat notification when side panel is closed
|
||||
<br />
|
||||
<span style={{ color: "#8a8a8a" }}>
|
||||
{allowChatNotification
|
||||
? "Notifications Enabled"
|
||||
: "Notifications Disabled"}
|
||||
<span style={{ color: '#8a8a8a' }}>
|
||||
{allowChatNotification ? 'Notifications Enabled' : 'Notifications Disabled'}
|
||||
</span>
|
||||
</span>
|
||||
}
|
||||
@@ -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={
|
||||
<span>
|
||||
Allow Watch Party to auto rejoin (within 1 minute)
|
||||
<br />
|
||||
<span style={{ color: "#8a8a8a" }}>
|
||||
{allowAutoRejoin
|
||||
? "Auto Rejoin Enabled"
|
||||
: "Auto Rejoin Disabled"}
|
||||
<span style={{ color: '#8a8a8a' }}>
|
||||
{allowAutoRejoin ? 'Auto Rejoin Enabled' : 'Auto Rejoin Disabled'}
|
||||
</span>
|
||||
</span>
|
||||
}
|
||||
@@ -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 {
|
||||
<span>
|
||||
Admin Only Mode
|
||||
<br />
|
||||
<span style={{ color: "#8a8a8a" }}>
|
||||
<span style={{ color: '#8a8a8a' }}>
|
||||
{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'}
|
||||
</span>
|
||||
</span>
|
||||
}
|
||||
labelPlacement="end"
|
||||
/>
|
||||
) : null}
|
||||
<Typography
|
||||
className="party-controls-users-title"
|
||||
variant="overline"
|
||||
>
|
||||
<Typography className="party-controls-users-title" variant="overline">
|
||||
PARTY MEMBERS
|
||||
</Typography>
|
||||
<div className="party-controls-users-container">
|
||||
{users.map((user) => (
|
||||
<Chip
|
||||
className="party-controls-users-chip"
|
||||
clickable
|
||||
size="small"
|
||||
label={user}
|
||||
/>
|
||||
<Chip className="party-controls-users-chip" clickable size="small" label={user} />
|
||||
))}
|
||||
</div>
|
||||
{Object.keys(usersOnCall).length > 0 ? (
|
||||
<Typography
|
||||
className="party-controls-users-title"
|
||||
variant="overline"
|
||||
>
|
||||
<Typography className="party-controls-users-title" variant="overline">
|
||||
MEMBERS IN CALL
|
||||
</Typography>
|
||||
) : null}
|
||||
{Object.keys(usersOnCall).length > 0 ? (
|
||||
<div className="party-controls-users-container">
|
||||
{Object.keys(usersOnCall).map((id) => {
|
||||
return usersOnCall[id].status === "Connected" ||
|
||||
usersOnCall[id].status === "Connecting" ? (
|
||||
return usersOnCall[id].status === 'Connected' ||
|
||||
usersOnCall[id].status === 'Connecting' ? (
|
||||
<Tooltip
|
||||
interactive
|
||||
title={
|
||||
<Grid
|
||||
className="party-controls-users-volume"
|
||||
container
|
||||
spacing={2}
|
||||
>
|
||||
<Grid className="party-controls-users-volume" container spacing={2}>
|
||||
<Grid item>
|
||||
<VolumeDown />
|
||||
</Grid>
|
||||
@@ -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)}
|
||||
/>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
@@ -758,15 +700,14 @@ export default class Chat extends Component {
|
||||
>
|
||||
<Chip
|
||||
color={
|
||||
usersOnCall[id].info.externalId ===
|
||||
LocalData().userUid
|
||||
? "secondary"
|
||||
: "default"
|
||||
usersOnCall[id].info.externalId === LocalData().userUid
|
||||
? 'secondary'
|
||||
: 'default'
|
||||
}
|
||||
className="party-controls-users-chip"
|
||||
clickable
|
||||
size="small"
|
||||
label={usersOnCall[id].info.name || " "}
|
||||
label={usersOnCall[id].info.name || ' '}
|
||||
/>
|
||||
</Tooltip>
|
||||
) : null;
|
||||
@@ -777,8 +718,7 @@ export default class Chat extends Component {
|
||||
</ExpansionPanel>
|
||||
{player ? (
|
||||
<Card elevation={0} className="media-info-card">
|
||||
{player.showName &&
|
||||
player.status !== PLAYER_STATUS.NOT_PLAYING ? (
|
||||
{player.showName && player.status !== PLAYER_STATUS.NOT_PLAYING ? (
|
||||
<CardContent>
|
||||
<Typography className="media-info-at" variant="overline">
|
||||
{player.status === PLAYER_STATUS.PAUSED
|
||||
@@ -803,17 +743,13 @@ export default class Chat extends Component {
|
||||
) : (
|
||||
<CardContent>
|
||||
<Typography className="media-info-at" variant="caption">
|
||||
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.
|
||||
</Typography>
|
||||
</CardContent>
|
||||
)}
|
||||
{player && player.showName && player.status ? (
|
||||
<Button
|
||||
className="media-info-link"
|
||||
href={player.url}
|
||||
startIcon={<LinkOutlined />}
|
||||
>
|
||||
<Button className="media-info-link" href={player.url} startIcon={<LinkOutlined />}>
|
||||
Link to currently playing
|
||||
</Button>
|
||||
) : null}
|
||||
@@ -844,9 +780,7 @@ export default class Chat extends Component {
|
||||
<Paper
|
||||
square
|
||||
variant="outlined"
|
||||
className={`replying-to-card ${
|
||||
replyTo !== null ? "replying-to-card-up" : ""
|
||||
}`}
|
||||
className={`replying-to-card ${replyTo !== null ? 'replying-to-card-up' : ''}`}
|
||||
>
|
||||
<div className="replying-to-content">
|
||||
<Typography variant="overline" display="block" gutterBottom>
|
||||
@@ -860,15 +794,8 @@ export default class Chat extends Component {
|
||||
</Paper>
|
||||
<div className="text-phone-panel">
|
||||
{gif || newMessage ? null : (
|
||||
<Tooltip
|
||||
title="Fullscreen with Watch Party"
|
||||
aria-label="Fullscreen"
|
||||
>
|
||||
<IconButton
|
||||
className="icon-button"
|
||||
color="secondary"
|
||||
onClick={this.toggleFullscreen}
|
||||
>
|
||||
<Tooltip title="Fullscreen with Watch Party" aria-label="Fullscreen">
|
||||
<IconButton className="icon-button" color="secondary" onClick={this.toggleFullscreen}>
|
||||
{isFullscreen ? <FullscreenExit /> : <Fullscreen />}
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
@@ -879,7 +806,7 @@ export default class Chat extends Component {
|
||||
<IconButton
|
||||
disabled={callActionPending}
|
||||
onClick={this.handlePhoneCall}
|
||||
color={!onCall ? "secondary" : "primary"}
|
||||
color={!onCall ? 'secondary' : 'primary'}
|
||||
className="icon-button"
|
||||
>
|
||||
{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: (
|
||||
<InputAdornment position="end">
|
||||
<IconButton
|
||||
className={`${this.state.gif ? "gif-active" : ""} ${
|
||||
this.state.newMessage ? "message-active" : ""
|
||||
className={`${this.state.gif ? 'gif-active' : ''} ${
|
||||
this.state.newMessage ? 'message-active' : ''
|
||||
} message-send`}
|
||||
size="small"
|
||||
onClick={() => this.sendMessageInvoker(newMessage)}
|
||||
@@ -964,15 +889,13 @@ export default class Chat extends Component {
|
||||
startAdornment: (
|
||||
<InputAdornment position="start">
|
||||
<IconButton
|
||||
className={`gif-button ${
|
||||
this.state.gif ? "gif-close" : ""
|
||||
}`}
|
||||
className={`gif-button ${this.state.gif ? 'gif-close' : ''}`}
|
||||
onClick={() => {
|
||||
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 {
|
||||
<ReactGiphySearchbox
|
||||
apiKey="ojJbIMUN6XRMn4mHiFFav3rMCpXUg8sq"
|
||||
onSelect={this.gifClick}
|
||||
masonryConfig={[{ columns: 2, imageWidth: "50%", gutter: 5 }]}
|
||||
masonryConfig={[{ columns: 2, imageWidth: '50%', gutter: 5 }]}
|
||||
searchFormClassName="giphy-search-form"
|
||||
wrapperClassName={`giphy-wrapper ${gif ? "" : "giphy-wrapper-down"}`}
|
||||
wrapperClassName={`giphy-wrapper ${gif ? '' : 'giphy-wrapper-down'}`}
|
||||
listWrapperClassName="giphy-list-wrapper"
|
||||
listItemClassName="giphy-list-item"
|
||||
poweredByGiphy
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION.
|
||||
.thread-container * {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: "Roboto", sans-serif !important;
|
||||
font-family: 'Roboto', sans-serif !important;
|
||||
letter-spacing: 1.15px;
|
||||
word-break: break-word !important;
|
||||
}
|
||||
@@ -100,7 +100,7 @@ COPIED, EDITED, OR REPRODUCED WITHOUT PERMISSION.
|
||||
line-height: 16px;
|
||||
font-size: 13px;
|
||||
font-weight: 100;
|
||||
font-family: "Roboto";
|
||||
font-family: 'Roboto';
|
||||
letter-spacing: 1.5px;
|
||||
white-space: break-spaces;
|
||||
word-break: break-all;
|
||||
|
||||
+107
-203
@@ -9,22 +9,17 @@ 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 {
|
||||
PLAYER_STATUS,
|
||||
getPlayerSource,
|
||||
PLAYER_SOURCE,
|
||||
LocalData,
|
||||
} from "./Api";
|
||||
import { PLAYER_STATUS, getPlayerSource, PLAYER_SOURCE, LocalData } from './Api';
|
||||
|
||||
const templateListener = (video) => 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-3
@@ -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%;
|
||||
|
||||
+18
-34
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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: "<system>",
|
||||
name: "",
|
||||
uid: '<system>',
|
||||
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: "<system>",
|
||||
name: "Update to V1.6.1",
|
||||
endpoint: "https://get.chromewatchparty.com",
|
||||
type: "interactive/link",
|
||||
uid: '<system>',
|
||||
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: "<system>",
|
||||
name: "",
|
||||
uid: '<system>',
|
||||
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!' });
|
||||
};
|
||||
|
||||
@@ -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: "<system>",
|
||||
name: "",
|
||||
uid: '<system>',
|
||||
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' });
|
||||
};
|
||||
|
||||
@@ -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' });
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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(),
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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: "<system>",
|
||||
name: "",
|
||||
uid: '<system>',
|
||||
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;
|
||||
};
|
||||
|
||||
@@ -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' });
|
||||
};
|
||||
@@ -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);
|
||||
});
|
||||
};
|
||||
@@ -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: "<system>",
|
||||
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: "<system>",
|
||||
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!" });
|
||||
};
|
||||
@@ -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' });
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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: '<system>',
|
||||
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' });
|
||||
};
|
||||
@@ -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' });
|
||||
};
|
||||
@@ -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
|
||||
);
|
||||
});
|
||||
});
|
||||
};
|
||||
@@ -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' });
|
||||
}
|
||||
};
|
||||
@@ -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));
|
||||
};
|
||||
@@ -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);
|
||||
};
|
||||
@@ -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);
|
||||
};
|
||||
@@ -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: '<system>',
|
||||
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: '<system>',
|
||||
// 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' });
|
||||
}
|
||||
};
|
||||
@@ -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: '<system>',
|
||||
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' });
|
||||
}
|
||||
};
|
||||
Generated
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "watch-party-api",
|
||||
"version": "1.6.1",
|
||||
"version": "1.6.2",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
||||
Reference in New Issue
Block a user