mirror of
https://github.com/PreMiD/PreMiD.git
synced 2026-04-06 04:41:58 +02:00
Stuffs....
This commit is contained in:
@@ -1,137 +0,0 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<link rel="stylesheet" href="../../css/reset.css">
|
||||
<link rel="stylesheet" href="../../css/inputs.css">
|
||||
<link rel="stylesheet" href="../../css/options.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="header">
|
||||
<h1 class="Ppreferences"></h1>
|
||||
</div>
|
||||
<div id="content">
|
||||
<h1 class="Pgeneral"></h1>
|
||||
<table>
|
||||
<thead>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr id="tPresence">
|
||||
<td class="Penabled"></td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="togglePresence" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="PmediaControls"></td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="toggleMediaControls" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="PcheckForUpdates"></td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="toggleCheckUpdates" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="PsystemStartup"></td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="toggleSystemStartup" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h1 class="Ppresences"></h1>
|
||||
<table>
|
||||
<thead>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>YouTube</td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="toggleYouTube" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>YouTube Music</td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="toggleYouTubeMusic" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Twitch</td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="toggleTwitch" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SoundCloud</td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="toggleSoundCloud" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Netflix</td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="toggleNetflix" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>KissAnime</td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="toggleKissAnime" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>JKAnime</td>
|
||||
<td class="right">
|
||||
<label class="switch">
|
||||
<input class="toggleJKAnime" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<script src="../../js/util/jquery-3.3.1.min.js"></script>
|
||||
<script src="../../js/util/socket.io-2.1.1.min.js"></script>
|
||||
<script src="../../js/options.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -16,6 +16,7 @@
|
||||
/>
|
||||
|
||||
<script src="../../js/util/jquery-3.3.1.min.js"></script>
|
||||
<script src="../../js/util/custom-i18n.js"></script>
|
||||
<script src="../../js/options.js"></script>
|
||||
<script src="../../js/popup.js"></script>
|
||||
</head>
|
||||
|
||||
@@ -19,7 +19,7 @@ setInterval(() => {
|
||||
//* Create config if not already
|
||||
if(!result.options) chrome.storage.sync.set({options: {enabled: true, youtube: true, youtubeMusic: true, twitch: true, soundcloud: true, netflix: true, kissanime: true, jkanime: true, titleMenubar: true, mediaControls: true, checkForUpdates: true, systemStartup: true}})
|
||||
|
||||
allowedURL = ["www.youtube.com", "music.youtube.com", "twitch.tv", "soundcloud.com", "netflix.com", "kissanime.ac", "kissanime.ru", "jkanime.net", "fimfiction.net", "crunchyroll.com", "hentaihaven.org", "rabb.it"]
|
||||
allowedURL = ["www.youtube.com", "music.youtube.com", "twitch.tv", "soundcloud.com", "www.netflix.com", "kissanime.ac", "kissanime.ru", "jkanime.net", "fimfiction.net", "crunchyroll.com", "hentaihaven.org", "rabb.it"]
|
||||
var options = result.options
|
||||
if(!options.enabled) allowedURL = []
|
||||
if(!options.youtube) allowedURL.remove("www.youtube.com")
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
$(document).ready(function() {
|
||||
$('.Poptions').html(chrome.i18n.getMessage('options'))
|
||||
$('.Pcredits').html(chrome.i18n.getMessage('credits'))
|
||||
$(document).ready(async function() {
|
||||
$('.Poptions').html(await getString("popup.tabs.options"))
|
||||
$('.Pcredits').html(await getString("popup.tabs.credits"))
|
||||
|
||||
$('.Pgeneral').html(chrome.i18n.getMessage('general'))
|
||||
$('.Pgeneral').html(await getString("popup.options.headings.general"))
|
||||
|
||||
$('.Penabled').html(chrome.i18n.getMessage('enabled'))
|
||||
$('.PtitleMenubar').html(chrome.i18n.getMessage('titleMenubar'))
|
||||
$('.PmediaControls').html(chrome.i18n.getMessage('mediaControls'))
|
||||
$('.PcheckForUpdates').html(chrome.i18n.getMessage('checkForUpdates'))
|
||||
$('.PsystemStartup').html(chrome.i18n.getMessage('systemStartup'))
|
||||
$('.Pdarktheme').html(chrome.i18n.getMessage('darkTheme'))
|
||||
$('.Penabled').html(await getString("popup.options.enabled"))
|
||||
$('.PtitleMenubar').html(await getString("popup.options.titleMenubar"))
|
||||
$('.PmediaControls').html(await getString("popup.options.mediaControls"))
|
||||
$('.PcheckForUpdates').html(await getString("popup.options.checkForUpdates"))
|
||||
$('.PsystemStartup').html(await getString("popup.options.systemStartup"))
|
||||
$('.Pdarktheme').html(await getString("popup.options.darkTheme"))
|
||||
|
||||
$('.Ppresences').html(chrome.i18n.getMessage('presences'))
|
||||
$('.Ppresences').html(await getString("popup.options.headings.presences"))
|
||||
|
||||
$('#content #panel').each(function() {
|
||||
this.addEventListener('click', updateItem)
|
||||
|
||||
@@ -77,7 +77,7 @@ function updateData(playbackChange = false) {
|
||||
var playbackBoolean = !$('.vjs-tech').get(0).paused
|
||||
|
||||
var smallImageKey = playbackBoolean ? 'play' : 'pause',
|
||||
smallImageText = playbackBoolean ? chrome.i18n.getMessage('playbackPlaying') : chrome.i18n.getMessage('playbackPaused')
|
||||
smallImageText = playbackBoolean ? getString("presence.playback.playing") : getString("presence.playback.paused")
|
||||
|
||||
if(playbackBoolean) {
|
||||
var data = {
|
||||
|
||||
@@ -52,6 +52,7 @@ function handleMediaKeys(data) {
|
||||
* @param {String} playbackChange Playback if changed
|
||||
*/
|
||||
function updateData(playbackChange = false) {
|
||||
console.log($('.server-box iframe:first').contents())
|
||||
var eventType
|
||||
videoRunning = $('.video-header h1').html() != "" && $('.server-box iframe:first').contents().find('video:first')[0] != undefined && !isNaN($('.server-box iframe:first').contents().find('video:first')[0].duration) ? true : false
|
||||
if(videoRunning) {
|
||||
@@ -67,7 +68,7 @@ function updateData(playbackChange = false) {
|
||||
var playbackBoolean = !$('.server-box iframe:first').contents().find('video:first')[0].paused
|
||||
|
||||
var smallImageKey = playbackBoolean ? 'play' : 'pause',
|
||||
smallImageText = playbackBoolean ? chrome.i18n.getMessage('playbackPlaying') : chrome.i18n.getMessage('playbackPaused')
|
||||
smallImageText = playbackBoolean ? getString("presence.playback.playing") : getString("presence.playback.paused")
|
||||
|
||||
if(playbackBoolean) {
|
||||
var data = {
|
||||
|
||||
@@ -67,7 +67,7 @@ function updateData(playbackChange = false) {
|
||||
var playbackBoolean = !(($('#player_html5_html5_api')[0] || $('#my_video_1_html5_api')[0])).paused
|
||||
|
||||
var smallImageKey = playbackBoolean ? 'play' : 'pause',
|
||||
smallImageText = playbackBoolean ? chrome.i18n.getMessage('playbackPlaying') : chrome.i18n.getMessage('playbackPaused')
|
||||
smallImageText = playbackBoolean ? getString("presence.playback.playing") : getString("presence.playback.paused")
|
||||
|
||||
if(playbackBoolean) {
|
||||
var data = {
|
||||
|
||||
@@ -64,7 +64,7 @@ function checkPlayChange() {
|
||||
}
|
||||
|
||||
//* Start interval
|
||||
window.onload = function () {
|
||||
$(document).ready(function () {
|
||||
//* Tab Priority
|
||||
setInterval(() => {
|
||||
if(tabActive == 5) {
|
||||
@@ -77,7 +77,7 @@ window.onload = function () {
|
||||
}
|
||||
if(tabActive > 0) tabActive--
|
||||
}, 500)
|
||||
}
|
||||
})
|
||||
|
||||
chrome.runtime.onMessage.addListener(((message, sender) => {
|
||||
if(tabActive <= 9) tabActive += 2
|
||||
@@ -85,11 +85,12 @@ chrome.runtime.onMessage.addListener(((message, sender) => {
|
||||
}))
|
||||
|
||||
//* Create needed variables
|
||||
let urlForVideo,
|
||||
var urlForVideo,
|
||||
songTime,
|
||||
calcDifference = []
|
||||
|
||||
function updateData(playbackChange = false) {
|
||||
console.log($('.video-title span'))
|
||||
if (document.location.pathname.includes("/watch")) musicRunning = true; else musicRunning = false;
|
||||
urlForVideo = document.location.href
|
||||
if ($(".time-remaining__time").html() != "") {
|
||||
@@ -111,43 +112,77 @@ function updateData(playbackChange = false) {
|
||||
var playbackBoolean = !$('.VideoContainer div video')[0].paused
|
||||
|
||||
var smallImageKey = playbackBoolean ? "play" : "pause"
|
||||
smallImageText = playbackBoolean ? chrome.i18n.getMessage('playbackPlaying') : chrome.i18n.getMessage('playbackPaused')
|
||||
smallImageText = playbackBoolean ? getString("presence.playback.playing") : getString("presence.playback.paused")
|
||||
|
||||
if(playbackBoolean) {
|
||||
data = {
|
||||
clientID: '499981204045430784',
|
||||
presenceData: {
|
||||
details: $('.ellipsize-text').children().html(),
|
||||
state: $($('.ellipsize-text').children().get(1)).html(),
|
||||
largeImageKey: 'nflix_lg',
|
||||
largeImageText: chrome.runtime.getManifest().name + ' V' + chrome.runtime.getManifest().version,
|
||||
smallImageKey: smallImageKey,
|
||||
smallImageText: smallImageText,
|
||||
startTimestamp: startTime,
|
||||
endTimestamp: endTime
|
||||
},
|
||||
currentSeconds: Math.floor($('.VideoContainer div video')[0].currentTime),
|
||||
durationSeconds: Math.floor($('.VideoContainer div video')[0].duration),
|
||||
trayTitle: $('.ellipsize-text').children().html(),
|
||||
playback: playbackBoolean,
|
||||
service: 'Netflix'
|
||||
if($('.video-title span').length == 0) {
|
||||
data = {
|
||||
clientID: '499981204045430784',
|
||||
presenceData: {
|
||||
details: $('.video-title h4').text(),
|
||||
largeImageKey: 'nflix_lg',
|
||||
largeImageText: chrome.runtime.getManifest().name + ' V' + chrome.runtime.getManifest().version,
|
||||
smallImageKey: smallImageKey,
|
||||
smallImageText: smallImageText,
|
||||
startTimestamp: startTime,
|
||||
endTimestamp: endTime
|
||||
},
|
||||
currentSeconds: Math.floor($('.VideoContainer div video')[0].currentTime),
|
||||
durationSeconds: Math.floor($('.VideoContainer div video')[0].duration),
|
||||
trayTitle: $('.video-title h4').text(),
|
||||
playback: playbackBoolean,
|
||||
service: 'Netflix'
|
||||
}
|
||||
} else {
|
||||
data = {
|
||||
clientID: '499981204045430784',
|
||||
presenceData: {
|
||||
details: $('.video-title h4').text(),
|
||||
state: $('.video-title span').get(0).innerText + " " + $('.video-title span').get(1).innerText,
|
||||
largeImageKey: 'nflix_lg',
|
||||
largeImageText: chrome.runtime.getManifest().name + ' V' + chrome.runtime.getManifest().version,
|
||||
smallImageKey: smallImageKey,
|
||||
smallImageText: smallImageText,
|
||||
startTimestamp: startTime,
|
||||
endTimestamp: endTime
|
||||
},
|
||||
currentSeconds: Math.floor($('.VideoContainer div video')[0].currentTime),
|
||||
durationSeconds: Math.floor($('.VideoContainer div video')[0].duration),
|
||||
trayTitle: $('.video-title h4').text(),
|
||||
playback: playbackBoolean,
|
||||
service: 'Netflix'
|
||||
}
|
||||
}
|
||||
} else {
|
||||
data = {
|
||||
clientID: '499981204045430784',
|
||||
presenceData: {
|
||||
details: $('.ellipsize-text').children().html(),
|
||||
state: $($('.ellipsize-text').children().get(1)).html(),
|
||||
largeImageKey: 'nflix_lg',
|
||||
largeImageText: chrome.runtime.getManifest().name + ' V' + chrome.runtime.getManifest().version,
|
||||
smallImageKey: smallImageKey,
|
||||
smallImageText: smallImageText
|
||||
},
|
||||
currentSeconds: Math.floor($('.VideoContainer div video')[0].currentTime),
|
||||
durationSeconds: Math.floor($('.VideoContainer div video')[0].duration),
|
||||
trayTitle: $('.ellipsize-text').children().html(),
|
||||
playback: playbackBoolean,
|
||||
service: 'Netflix'
|
||||
if($('.video-title span').length == 0) {
|
||||
data = {
|
||||
clientID: '499981204045430784',
|
||||
presenceData: {
|
||||
details: $('.video-title h4').text(),
|
||||
largeImageKey: 'nflix_lg',
|
||||
largeImageText: chrome.runtime.getManifest().name + ' V' + chrome.runtime.getManifest().version,
|
||||
smallImageKey: smallImageKey,
|
||||
smallImageText: smallImageText,
|
||||
},
|
||||
trayTitle: $('.video-title h4').text(),
|
||||
playback: playbackBoolean,
|
||||
service: 'Netflix'
|
||||
}
|
||||
} else {
|
||||
data = {
|
||||
clientID: '499981204045430784',
|
||||
presenceData: {
|
||||
details: $('.video-title h4').text(),
|
||||
state: $('.video-title span').get(0).innerText + " " + $('.video-title span').get(1).innerText,
|
||||
largeImageKey: 'nflix_lg',
|
||||
largeImageText: chrome.runtime.getManifest().name + ' V' + chrome.runtime.getManifest().version,
|
||||
smallImageKey: smallImageKey,
|
||||
smallImageText: smallImageText,
|
||||
},
|
||||
trayTitle: $('.video-title h4').text(),
|
||||
playback: playbackBoolean,
|
||||
service: 'Netflix'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@ function updateData(playbackChange = false) {
|
||||
var playbackBoolean = $('.playControl').hasClass('playing')
|
||||
|
||||
var smallImageKey = playbackBoolean ? 'play' : 'pause',
|
||||
smallImageText = playbackBoolean ? chrome.i18n.getMessage('playbackPlaying') : chrome.i18n.getMessage('playbackPaused')
|
||||
smallImageText = playbackBoolean ? getString("presence.playback.playing") : getString("presence.playback.paused")
|
||||
|
||||
|
||||
var songTitle = $('.playbackSoundBadge__titleLink').children().get(1).innerHTML,
|
||||
|
||||
@@ -89,7 +89,7 @@ function updateData(playbackChange = false) {
|
||||
var playbackBoolean = !$('.video-stream')[0].paused
|
||||
|
||||
var smallImageKey = playbackBoolean ? 'play' : 'pause',
|
||||
smallImageText = playbackBoolean ? chrome.i18n.getMessage('playbackPlaying') : chrome.i18n.getMessage('playbackPaused')
|
||||
smallImageText = playbackBoolean ? getString("presence.playback.playing") : getString("presence.playback.paused")
|
||||
|
||||
if(playbackBoolean) {
|
||||
var data = {
|
||||
|
||||
@@ -130,7 +130,7 @@ function updateData(playbackChange = false) {
|
||||
var playbackBoolean = !$('.VideoContainer div video')[0].paused
|
||||
|
||||
var smallImageKey = playbackBoolean ? "play" : "pause"
|
||||
smallImageText = playbackBoolean ? chrome.i18n.getMessage('playbackPlaying') : chrome.i18n.getMessage('playbackPaused')
|
||||
smallImageText = playbackBoolean ? getString("presence.playback.playing") : getString("presence.playback.paused")
|
||||
|
||||
if(playbackBoolean) {
|
||||
data = {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
var currentLanguageFile = null,
|
||||
defaultLanguageFile = null;
|
||||
var detectLanguage = chrome.i18n.getUILanguage()
|
||||
console.log(detectLanguage)
|
||||
|
||||
document.onload = init()
|
||||
|
||||
@@ -12,8 +11,6 @@ async function init() {
|
||||
} else {
|
||||
currentLanguageFile = await loadLanguageFile("en")
|
||||
}
|
||||
|
||||
console.log(getString("app.description"))
|
||||
}
|
||||
|
||||
async function loadLanguageFile(languageCode) {
|
||||
@@ -29,8 +26,6 @@ async function loadLanguageFile(languageCode) {
|
||||
})
|
||||
}
|
||||
|
||||
//getString("app.name")
|
||||
|
||||
function getString(term) {
|
||||
if(currentLanguageFile.find(str => str.term == term) == null) {
|
||||
if(defaultLanguageFile.find(str => str.term == term) == null) {
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
var allowedURL = ["www.youtube.com", "music.youtube.com", "twitch.tv", "soundcloud.com", "netflix.com", "kissanime.ac", "kissanime.ru", "jkanime.net", "fimfiction.net", "www.crunchyroll.com"]
|
||||
var allowedURL = ["www.youtube.com", "music.youtube.com", "twitch.tv", "soundcloud.com", "www.netflix.com", "kissanime.ac", "kissanime.ru", "jkanime.net", "fimfiction.net", "www.crunchyroll.com"]
|
||||
|
||||
//* Create socket connection to application
|
||||
if(allowedURL.includes(document.location.host)) {
|
||||
if(allowedURL.includes(document.location.host)) {
|
||||
//* Create socket connection to application
|
||||
var socket = io.connect('http://localhost:3020/');
|
||||
|
||||
//* Log when connected
|
||||
socket.on('connect', socketConnect)
|
||||
socket.on('disconnect', socketDisconnect)
|
||||
}
|
||||
|
||||
function socketConnect() {
|
||||
console.log(chrome.runtime.getManifest().name + ': %c' + chrome.i18n.getMessage('connected'), "color: green; font-weight: 700")
|
||||
async function socketConnect() {
|
||||
if(sessionStorage['premidConnected'] == null || sessionStorage['premidConnected'] == 'false') {
|
||||
sessionStorage['premidConnected'] = 'true'
|
||||
insertConnectionInfo(chrome.i18n.getMessage("connected"))
|
||||
$(document).ready(async function() {
|
||||
insertConnectionInfo(await getString("connectionInfo.connected"))
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function socketDisconnect() {
|
||||
console.log(chrome.runtime.getManifest().name + ': %c' + chrome.i18n.getMessage('disconnected'), "color: red; font-weight: 700")
|
||||
async function socketDisconnect() {
|
||||
sessionStorage['premidConnected'] = 'false'
|
||||
insertConnectionInfo(chrome.i18n.getMessage("disconnected"))
|
||||
insertConnectionInfo(await getString("connectionInfo.disconnected"))
|
||||
}
|
||||
|
||||
function insertConnectionInfo(message) {
|
||||
@@ -48,7 +48,7 @@ function getService() {
|
||||
case "soundcloud.com":
|
||||
return "SoundCloud"
|
||||
break
|
||||
case "netflix.com":
|
||||
case "www.netflix.com":
|
||||
return "Netflix"
|
||||
break
|
||||
case "kissanime.ac" || "kissanime.ru":
|
||||
|
||||
@@ -2,9 +2,7 @@
|
||||
"name": "PreMiD",
|
||||
"author": "Timeraa & Fruxh",
|
||||
"version": "1.2.45",
|
||||
"description": "__MSG_appDesc__",
|
||||
"manifest_version": 2,
|
||||
"default_locale": "en",
|
||||
"web_accessible_resources": ["icon.png", "languages/*.json"],
|
||||
"icons": {
|
||||
"2024": "icon.png"
|
||||
@@ -13,8 +11,7 @@
|
||||
"scripts": [
|
||||
"js/util/socket.io-2.1.1.min.js",
|
||||
"js/util/presence.js",
|
||||
"js/background.js",
|
||||
"js/util/custom-i18n.js"
|
||||
"js/background.js"
|
||||
],
|
||||
"presistent": false
|
||||
},
|
||||
@@ -29,7 +26,8 @@
|
||||
"js": [
|
||||
"js/util/jquery-3.3.1.min.js",
|
||||
"js/util/socket.io-2.1.1.min.js",
|
||||
"js/util/socketConnector.js"
|
||||
"js/util/socketConnector.js",
|
||||
"js/util/custom-i18n.js"
|
||||
],
|
||||
"css": ["css/connect.css"],
|
||||
"matches": ["<all_urls>"]
|
||||
|
||||
2122
src/package-lock.json
generated
2122
src/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -14,8 +14,8 @@
|
||||
"auto-launch": "^5.0.5",
|
||||
"chalk": "^2.4.1",
|
||||
"discord-rpc": "^3.0.1",
|
||||
"electron-store": "^2.0.0",
|
||||
"electron-squirrel-startup": "^1.0.0",
|
||||
"electron-store": "^2.0.0",
|
||||
"express": "^4.16.4",
|
||||
"request": "^2.88.0",
|
||||
"socket.io": "^2.1.1"
|
||||
|
||||
Reference in New Issue
Block a user