diff --git a/README.md b/README.md index 4a9f57e..e6ad101 100644 --- a/README.md +++ b/README.md @@ -19,4 +19,24 @@
Pour le CLP đź’–
- \ No newline at end of file + + + +# Changelog + +## Subsonics - Web - 2.0.0 + - **Adds :** *Rework Style, Soundboard Editor, OOBE* + ### Details +**Rework Style** +> - Style principal, (Cf StylePlans) +> - Création d'éléments modèles (Classe commune) +> - Permettre l'ajout de playlist youtube en favoris + +**Soundboard Editor** +> - Faire l'HTML & CSS +> - Faire le lien entre l'API Discord et Subsonics +> - Demander les permissions à IcePlayer + +**OOBE** +> - Faire l'HTML & CSS +> - Faire la vérification de la lecture de l'OOBE diff --git a/data/betas.json b/data/betas.json deleted file mode 100644 index f75b76e..0000000 --- a/data/betas.json +++ /dev/null @@ -1 +0,0 @@ -["486943594893017119","442290526545510421"] \ No newline at end of file diff --git a/data/metrics.json b/data/metrics.json index 220db73..6def4a2 100644 --- a/data/metrics.json +++ b/data/metrics.json @@ -2,6 +2,31 @@ { "name": "visitorCounted", "description": "Nombre de visiteurs", + "value": 1023 + }, + { + "name": "numberOfCommands", + "description": "Nombre de commandes éxécutées", + "value": 3 + }, + { + "name": "userCommand_raphixscrap", + "description": "Nombre de commandes éxécutées par l'utilisateur : raphixscrap", + "value": 2 + }, + { + "name": "songPlayed", + "description": "Nombre de musiques jouées", + "value": 25 + }, + { + "name": "songDuration", + "description": "Durée totale des musiques jouées en secondes", + "value": 5641 + }, + { + "name": "userMusicPlayed_raphixscrap", + "description": "Nombre de musiques jouées par l'utilisateur : raphixscrap", "value": 17 } ] \ No newline at end of file diff --git a/data/pictures/158369928104116224.png b/data/pictures/158369928104116224.png new file mode 100644 index 0000000..3e403b1 Binary files /dev/null and b/data/pictures/158369928104116224.png differ diff --git a/data/pictures/168086507486314496.png b/data/pictures/168086507486314496.png new file mode 100644 index 0000000..d90a5f6 Binary files /dev/null and b/data/pictures/168086507486314496.png differ diff --git a/data/pictures/172437570905571328.png b/data/pictures/172437570905571328.png new file mode 100644 index 0000000..9ff3d86 Binary files /dev/null and b/data/pictures/172437570905571328.png differ diff --git a/data/pictures/226744358567804928.png b/data/pictures/226744358567804928.png new file mode 100644 index 0000000..88a9d90 Binary files /dev/null and b/data/pictures/226744358567804928.png differ diff --git a/data/pictures/249494159629484033.png b/data/pictures/249494159629484033.png new file mode 100644 index 0000000..302fa3d Binary files /dev/null and b/data/pictures/249494159629484033.png differ diff --git a/data/pictures/253494094179991552.png b/data/pictures/253494094179991552.png new file mode 100644 index 0000000..2ba9c1a Binary files /dev/null and b/data/pictures/253494094179991552.png differ diff --git a/data/pictures/362983050054991872.png b/data/pictures/362983050054991872.png new file mode 100644 index 0000000..f5f1ee4 Binary files /dev/null and b/data/pictures/362983050054991872.png differ diff --git a/data/pictures/428869747594231808.png b/data/pictures/428869747594231808.png new file mode 100644 index 0000000..d946aa0 Binary files /dev/null and b/data/pictures/428869747594231808.png differ diff --git a/data/pictures/435462012974268426.png b/data/pictures/435462012974268426.png new file mode 100644 index 0000000..4e753fb Binary files /dev/null and b/data/pictures/435462012974268426.png differ diff --git a/data/pictures/442290526545510421.png b/data/pictures/442290526545510421.png new file mode 100644 index 0000000..e69de29 diff --git a/data/pictures/454603829556805632.png b/data/pictures/454603829556805632.png new file mode 100644 index 0000000..2827fe7 Binary files /dev/null and b/data/pictures/454603829556805632.png differ diff --git a/data/pictures/486943594893017119.png b/data/pictures/486943594893017119.png new file mode 100644 index 0000000..45a0d3f Binary files /dev/null and b/data/pictures/486943594893017119.png differ diff --git a/data/playlist.json b/data/playlist.json index 8debaa1..6b9b9f5 100644 --- a/data/playlist.json +++ b/data/playlist.json @@ -382,6 +382,391 @@ "uri": "https://www.youtube.com/watch?v=jfKfPfyJRdk", "thumbnail": "https://img.youtube.com/vi/jfKfPfyJRdk/default.jpg" } + ], + "Liste de lecture Immu": [ + { + "track": "QAAAhAIAIFRoYW5jcmVkIFdhdGVyczogVGhlIE1hbiAtIEZGWElWAApGbHVmZlN0dWZmAAAAAAAENiAAC3dGV1pMLTFJWG5jAAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9d0ZXWkwtMUlYbmMAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "Thancred Waters: The Man - FFXIV", + "identifier": "wFWZL-1IXnc", + "author": "FluffStuff", + "duration": 276000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=wFWZL-1IXnc", + "thumbnail": "https://img.youtube.com/vi/wFWZL-1IXnc/default.jpg" + }, + { + "track": "QAAAvwIAYkZveGVzIHBlcmZvcm1zICdEb24ndCBTdG9wIE1lIE5vdycgb24gYm9hcmQgdGhlIE9yaWVudCBFeHByZXNzIC0gRG9jdG9yIFdobzogU2VyaWVzIDggKDIwMTQpIC0gQkJDAANCQkMAAAAAAAMVEAALaC1PVFlUMDJXN0UAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1oLU9UWVQwMlc3RQAHeW91dHViZQAAAAAAAAAA", + "title": "Foxes performs 'Don't Stop Me Now' on board the Orient Express - Doctor Who: Series 8 (2014) - BBC", + "identifier": "h-OTYT02W7E", + "author": "BBC", + "duration": 202000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=h-OTYT02W7E", + "thumbnail": "https://img.youtube.com/vi/h-OTYT02W7E/default.jpg" + }, + { + "track": "QAAAjAIAKkRvY3RvciBXaG8gKDEtMTEpIHZpZDogR29uZSBpbiB0aGUgTW9ybmluZwAIc2hheWVyYTkAAAAAAAIqsAALazNWclpETVhIbUUAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1rM1ZyWkRNWEhtRQAHeW91dHViZQAAAAAAAAAA", + "title": "Doctor Who (1-11) vid: Gone in the Morning", + "identifier": "k3VrZDMXHmE", + "author": "shayera9", + "duration": 142000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=k3VrZDMXHmE", + "thumbnail": "https://img.youtube.com/vi/k3VrZDMXHmE/default.jpg" + }, + { + "track": "QAAAhwIAJjMgRG9vcnMgRG93biAtIEtyeXB0b25pdGUgKFNtYWxsVmlsbGUpAAdXRUlMSU5OAAAAAAADikAAC0VPTzRWTjFHM0dZAAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9RU9PNFZOMUczR1kAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "3 Doors Down - Kryptonite (SmallVille)", + "identifier": "EOO4VN1G3GY", + "author": "WEILINN", + "duration": 232000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=EOO4VN1G3GY", + "thumbnail": "https://img.youtube.com/vi/EOO4VN1G3GY/default.jpg" + } + ] + }, + "226744358567804928": { + "Mes musiques": [ + { + "track": "QAAAlQIAJElGU0NMIFRSQUlMRVIgTVVTSUMgLSBORVcgQ0hBTExFTkdFUwAXQ2luw6ltb3JwaGlxdWUgT2ZmaWNpZWwAAAAAAAGaKAALazZkWDZSQ2NLQXMAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1rNmRYNlJDY0tBcwAHeW91dHViZQAAAAAAAAAA", + "title": "IFSCL TRAILER MUSIC - NEW CHALLENGES", + "identifier": "k6dX6RCcKAs", + "author": "Cinémorphique Officiel", + "duration": 105000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=k6dX6RCcKAs", + "thumbnail": "https://img.youtube.com/vi/k6dX6RCcKAs/default.jpg" + }, + { + "track": "QAAAiwIAIk15bGVuZSBGYXJtZXIgICBhcHBlbGxlIG1vbiBudW1lcm8AD0ZhbGxpbmdPdXRPZkNhcgAAAAAABQz4AAtVSkpxUnNGZXpZUQABACtodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVVKSnFSc0ZlellRAAd5b3V0dWJlAAAAAAAAAAA=", + "title": "Mylene Farmer appelle mon numero", + "identifier": "UJJqRsFezYQ", + "author": "FallingOutOfCar", + "duration": 331000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=UJJqRsFezYQ", + "thumbnail": "https://img.youtube.com/vi/UJJqRsFezYQ/default.jpg" + }, + { + "track": "QAAAdgIAElBva8OpcmFwIEdTIEZyZW5jaAAKTWVudGFsaWkxMQAAAAAAA9CQAAttbUFTZkVUblBqWQABACtodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PW1tQVNmRVRuUGpZAAd5b3V0dWJlAAAAAAAAAAA=", + "title": "Pokérap GS French", + "identifier": "mmASfETnPjY", + "author": "Mentalii11", + "duration": 250000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=mmASfETnPjY", + "thumbnail": "https://img.youtube.com/vi/mmASfETnPjY/default.jpg" + }, + { + "track": "QAAAgwIAHU15bGVuZSBGYXJtZXIgLSBQZXV0LUV0cmUgVG9pAAxNdXNpY2Jlc3QxMTEAAAAAAASIKAALOE0zRndOYjZnTFkAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj04TTNGd05iNmdMWQAHeW91dHViZQAAAAAAAAAA", + "title": "Mylene Farmer - Peut-Etre Toi", + "identifier": "8M3FwNb6gLY", + "author": "Musicbest111", + "duration": 297000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=8M3FwNb6gLY", + "thumbnail": "https://img.youtube.com/vi/8M3FwNb6gLY/default.jpg" + }, + { + "track": "QAAAfgIAG1ZheWEgY29uIGRpb3MgLSBOYWggbmVoIG5haAAJRGFuaWtsZWluAAAAAAACo8gACzdMVW0tRTRHUFU4AAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9N0xVbS1FNEdQVTgAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "Vaya con dios - Nah neh nah", + "identifier": "7LUm-E4GPU8", + "author": "Daniklein", + "duration": 173000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=7LUm-E4GPU8", + "thumbnail": "https://img.youtube.com/vi/7LUm-E4GPU8/default.jpg" + }, + { + "track": "QAAAigIAJ0lGU0NMIDQuNS5YIFRyYWlsZXIgWyBDb2RlIEx5b2tvIEdhbWUgXQAJSW1tdWRlbGtpAAAAAAABtYAAC1cyVXI1NkNFQXdvAAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9VzJVcjU2Q0VBd28AB3lvdXR1YmUAAAAAAAAAAA==", + "title": "IFSCL 4.5.X Trailer [ Code Lyoko Game ]", + "identifier": "W2Ur56CEAwo", + "author": "Immudelki", + "duration": 112000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=W2Ur56CEAwo", + "thumbnail": "https://img.youtube.com/vi/W2Ur56CEAwo/default.jpg" + }, + { + "track": "QAAAwwIASVRIUklMTEVSICAgMzV0aCBBbm5pdmVyc2FyeSBTV0cgUmVtYXN0ZXJlZCBFeHRlbmRlZCBNaXggICBNSUNIQUVMIEpBQ0tTT04AIEV4cHJlY2lvbiBNdXNpY2FsIEFsdGVybmF0aXZhIEZNAAAAAAAIZHAAC1UtUnlXSzJERlM4AAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9VS1SeVdLMkRGUzgAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "THRILLER 35th Anniversary SWG Remastered Extended Mix MICHAEL JACKSON", + "identifier": "U-RyWK2DFS8", + "author": "Exprecion Musical Alternativa FM", + "duration": 550000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=U-RyWK2DFS8", + "thumbnail": "https://img.youtube.com/vi/U-RyWK2DFS8/default.jpg" + }, + { + "track": "QAAAnAIAOUlGU0NMIDEzdGggVWx0aW1hdGUgQW5uaXZlcnNhcnkgVHJhaWxlciB8IENvZGUgTHlva28gR2FtZQAJSW1tdWRlbGtpAAAAAAABrbAAC2tZTTV4WUxzMUJBAAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9a1lNNXhZTHMxQkEAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "IFSCL 13th Ultimate Anniversary Trailer | Code Lyoko Game", + "identifier": "kYM5xYLs1BA", + "author": "Immudelki", + "duration": 110000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=kYM5xYLs1BA", + "thumbnail": "https://img.youtube.com/vi/kYM5xYLs1BA/default.jpg" + }, + { + "track": "QAAAfQIAH0fDqW7DqXJpcXVlIFBva8OpbW9uIENocm9uaWNsZXMABHRvdG8AAAAAAACUcAALSzRzRm5RTFV1ZXcAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1LNHNGblFMVXVldwAHeW91dHViZQAAAAAAAAAA", + "title": "Générique Pokémon Chronicles", + "identifier": "K4sFnQLUuew", + "author": "toto", + "duration": 38000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=K4sFnQLUuew", + "thumbnail": "https://img.youtube.com/vi/K4sFnQLUuew/default.jpg" + }, + { + "track": "QAABEAIALVJlcGxpY2F0aW9uIG9mIENpbmVtb3JwaGlxdWUgLSBOZXcgQ2hhbGxlbmdlcwAGUmFwaGl4AAAAAAABqJgAck86aHR0cHM6Ly9hcGktdjIuc291bmRjbG91ZC5jb20vbWVkaWEvc291bmRjbG91ZDp0cmFja3M6MTYwNDMwNjc4NC81YmUxOWNiZS03NTkyLTQ0ODktYjMzMC0yN2RlZGMyYTFjZjIvc3RyZWFtL2hscwABAERodHRwczovL3NvdW5kY2xvdWQuY29tL3JhcGhpeC0zNTkzMDEwNjkvY2luZW1vcnBoaXF1ZS1uZXctY2hhbGxlbmdlcwAKc291bmRjbG91ZAAAAAAAAAAA", + "title": "Replication of Cinemorphique - New Challenges", + "identifier": "O:https://api-v2.soundcloud.com/media/soundcloud:tracks:1604306784/5be19cbe-7592-4489-b330-27dedc2a1cf2/stream/hls", + "author": "Raphix", + "duration": 108696, + "isSeekable": true, + "isStream": false, + "uri": "https://soundcloud.com/raphix-359301069/cinemorphique-new-challenges", + "thumbnail": null + }, + { + "track": "QAAAqwIANE11cnJheSBIZWFkIC0gT25lIE5pZ2h0IEluIEJhbmdrb2sgKExvbmcgSW50cm8gMTo0NykAHUpvc8OpIE9zdmFsZG8gT3J0aWdvemEg7aC87b6tAAAAAAAEp2gAC1l2RGdNZEdDUmEwAAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WXZEZ01kR0NSYTAAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "Murray Head - One Night In Bangkok (Long Intro 1:47)", + "identifier": "YvDgMdGCRa0", + "author": "José Osvaldo Ortigoza 🎭", + "duration": 305000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=YvDgMdGCRa0", + "thumbnail": "https://img.youtube.com/vi/YvDgMdGCRa0/default.jpg" + }, + { + "track": "QAAAkAIALkJvbiBKb3ZpIC0gSXQncyBNeSBMaWZlIChPZmZpY2lhbCBNdXNpYyBWaWRlbykACEJvbiBKb3ZpAAAAAAAEEvgAC3Z4MnU1dVV1M0RFAAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9dngydTV1VXUzREUAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "Bon Jovi - It's My Life (Official Music Video)", + "identifier": "vx2u5uUu3DE", + "author": "Bon Jovi", + "duration": 267000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=vx2u5uUu3DE", + "thumbnail": "https://img.youtube.com/vi/vx2u5uUu3DE/default.jpg" + }, + { + "track": "QAAAlwIAMllvdXNzb3UgTidEb3VyIC0gNyBTZWNvbmRzIChSYWRpbyBFZGl0KSBbQXVkaW8gSFFdAAtHb2xkZW5NdXNpYwAAAAAAA9hgAAtDaGlyZU5pcXhUbwABACtodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUNoaXJlTmlxeFRvAAd5b3V0dWJlAAAAAAAAAAA=", + "title": "Youssou N'Dour - 7 Seconds (Radio Edit) [Audio HQ]", + "identifier": "ChireNiqxTo", + "author": "GoldenMusic", + "duration": 252000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=ChireNiqxTo", + "thumbnail": "https://img.youtube.com/vi/ChireNiqxTo/default.jpg" + }, + { + "track": "QAAAkQIALE1JQ0hBRUwgSkFDS1NPTiAtIEJBRCBbQUpBWMK0UyBFWFRFTkRFRCBNSVhdAAtBamF4U3RyaWtlcgAAAAAACDGoAAszRWE3XzZRdTJ4bwABACtodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTNFYTdfNlF1MnhvAAd5b3V0dWJlAAAAAAAAAAA=", + "title": "MICHAEL JACKSON - BAD [AJAX´S EXTENDED MIX]", + "identifier": "3Ea7_6Qu2xo", + "author": "AjaxStriker", + "duration": 537000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=3Ea7_6Qu2xo", + "thumbnail": "https://img.youtube.com/vi/3Ea7_6Qu2xo/default.jpg" + }, + { + "track": "QAAAlgIAM2xvZmkgaGlwIGhvcCByYWRpbyDtoL3ts5ogLSBiZWF0cyB0byByZWxheC9zdHVkeSB0bwAJTG9maSBHaXJsf/////////8AC2pmS2ZQZnlKUmRrAQEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9amZLZlBmeUpSZGsAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "lofi hip hop radio 📚 - beats to relax/study to", + "identifier": "jfKfPfyJRdk", + "author": "Lofi Girl", + "duration": 9223372036854776000, + "isSeekable": false, + "isStream": true, + "uri": "https://www.youtube.com/watch?v=jfKfPfyJRdk", + "thumbnail": "https://img.youtube.com/vi/jfKfPfyJRdk/default.jpg" + } + ] + }, + "442290526545510421": {}, + "158369928104116224": { + "Mes musiques": [ + { + "track": "QAAAlQIAJElGU0NMIFRSQUlMRVIgTVVTSUMgLSBORVcgQ0hBTExFTkdFUwAXQ2luw6ltb3JwaGlxdWUgT2ZmaWNpZWwAAAAAAAGaKAALazZkWDZSQ2NLQXMAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1rNmRYNlJDY0tBcwAHeW91dHViZQAAAAAAAAAA", + "title": "IFSCL TRAILER MUSIC - NEW CHALLENGES", + "identifier": "k6dX6RCcKAs", + "author": "Cinémorphique Officiel", + "duration": 105000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=k6dX6RCcKAs", + "thumbnail": "https://img.youtube.com/vi/k6dX6RCcKAs/default.jpg" + }, + { + "track": "QAAAiwIAIk15bGVuZSBGYXJtZXIgICBhcHBlbGxlIG1vbiBudW1lcm8AD0ZhbGxpbmdPdXRPZkNhcgAAAAAABQz4AAtVSkpxUnNGZXpZUQABACtodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVVKSnFSc0ZlellRAAd5b3V0dWJlAAAAAAAAAAA=", + "title": "Mylene Farmer appelle mon numero", + "identifier": "UJJqRsFezYQ", + "author": "FallingOutOfCar", + "duration": 331000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=UJJqRsFezYQ", + "thumbnail": "https://img.youtube.com/vi/UJJqRsFezYQ/default.jpg" + }, + { + "track": "QAAAdgIAElBva8OpcmFwIEdTIEZyZW5jaAAKTWVudGFsaWkxMQAAAAAAA9CQAAttbUFTZkVUblBqWQABACtodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PW1tQVNmRVRuUGpZAAd5b3V0dWJlAAAAAAAAAAA=", + "title": "Pokérap GS French", + "identifier": "mmASfETnPjY", + "author": "Mentalii11", + "duration": 250000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=mmASfETnPjY", + "thumbnail": "https://img.youtube.com/vi/mmASfETnPjY/default.jpg" + }, + { + "track": "QAAAgwIAHU15bGVuZSBGYXJtZXIgLSBQZXV0LUV0cmUgVG9pAAxNdXNpY2Jlc3QxMTEAAAAAAASIKAALOE0zRndOYjZnTFkAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj04TTNGd05iNmdMWQAHeW91dHViZQAAAAAAAAAA", + "title": "Mylene Farmer - Peut-Etre Toi", + "identifier": "8M3FwNb6gLY", + "author": "Musicbest111", + "duration": 297000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=8M3FwNb6gLY", + "thumbnail": "https://img.youtube.com/vi/8M3FwNb6gLY/default.jpg" + }, + { + "track": "QAAAfgIAG1ZheWEgY29uIGRpb3MgLSBOYWggbmVoIG5haAAJRGFuaWtsZWluAAAAAAACo8gACzdMVW0tRTRHUFU4AAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9N0xVbS1FNEdQVTgAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "Vaya con dios - Nah neh nah", + "identifier": "7LUm-E4GPU8", + "author": "Daniklein", + "duration": 173000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=7LUm-E4GPU8", + "thumbnail": "https://img.youtube.com/vi/7LUm-E4GPU8/default.jpg" + }, + { + "track": "QAAAigIAJ0lGU0NMIDQuNS5YIFRyYWlsZXIgWyBDb2RlIEx5b2tvIEdhbWUgXQAJSW1tdWRlbGtpAAAAAAABtYAAC1cyVXI1NkNFQXdvAAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9VzJVcjU2Q0VBd28AB3lvdXR1YmUAAAAAAAAAAA==", + "title": "IFSCL 4.5.X Trailer [ Code Lyoko Game ]", + "identifier": "W2Ur56CEAwo", + "author": "Immudelki", + "duration": 112000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=W2Ur56CEAwo", + "thumbnail": "https://img.youtube.com/vi/W2Ur56CEAwo/default.jpg" + }, + { + "track": "QAAAwwIASVRIUklMTEVSICAgMzV0aCBBbm5pdmVyc2FyeSBTV0cgUmVtYXN0ZXJlZCBFeHRlbmRlZCBNaXggICBNSUNIQUVMIEpBQ0tTT04AIEV4cHJlY2lvbiBNdXNpY2FsIEFsdGVybmF0aXZhIEZNAAAAAAAIZHAAC1UtUnlXSzJERlM4AAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9VS1SeVdLMkRGUzgAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "THRILLER 35th Anniversary SWG Remastered Extended Mix MICHAEL JACKSON", + "identifier": "U-RyWK2DFS8", + "author": "Exprecion Musical Alternativa FM", + "duration": 550000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=U-RyWK2DFS8", + "thumbnail": "https://img.youtube.com/vi/U-RyWK2DFS8/default.jpg" + }, + { + "track": "QAAAnAIAOUlGU0NMIDEzdGggVWx0aW1hdGUgQW5uaXZlcnNhcnkgVHJhaWxlciB8IENvZGUgTHlva28gR2FtZQAJSW1tdWRlbGtpAAAAAAABrbAAC2tZTTV4WUxzMUJBAAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9a1lNNXhZTHMxQkEAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "IFSCL 13th Ultimate Anniversary Trailer | Code Lyoko Game", + "identifier": "kYM5xYLs1BA", + "author": "Immudelki", + "duration": 110000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=kYM5xYLs1BA", + "thumbnail": "https://img.youtube.com/vi/kYM5xYLs1BA/default.jpg" + }, + { + "track": "QAAAfQIAH0fDqW7DqXJpcXVlIFBva8OpbW9uIENocm9uaWNsZXMABHRvdG8AAAAAAACUcAALSzRzRm5RTFV1ZXcAAQAraHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1LNHNGblFMVXVldwAHeW91dHViZQAAAAAAAAAA", + "title": "Générique Pokémon Chronicles", + "identifier": "K4sFnQLUuew", + "author": "toto", + "duration": 38000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=K4sFnQLUuew", + "thumbnail": "https://img.youtube.com/vi/K4sFnQLUuew/default.jpg" + }, + { + "track": "QAABEAIALVJlcGxpY2F0aW9uIG9mIENpbmVtb3JwaGlxdWUgLSBOZXcgQ2hhbGxlbmdlcwAGUmFwaGl4AAAAAAABqJgAck86aHR0cHM6Ly9hcGktdjIuc291bmRjbG91ZC5jb20vbWVkaWEvc291bmRjbG91ZDp0cmFja3M6MTYwNDMwNjc4NC81YmUxOWNiZS03NTkyLTQ0ODktYjMzMC0yN2RlZGMyYTFjZjIvc3RyZWFtL2hscwABAERodHRwczovL3NvdW5kY2xvdWQuY29tL3JhcGhpeC0zNTkzMDEwNjkvY2luZW1vcnBoaXF1ZS1uZXctY2hhbGxlbmdlcwAKc291bmRjbG91ZAAAAAAAAAAA", + "title": "Replication of Cinemorphique - New Challenges", + "identifier": "O:https://api-v2.soundcloud.com/media/soundcloud:tracks:1604306784/5be19cbe-7592-4489-b330-27dedc2a1cf2/stream/hls", + "author": "Raphix", + "duration": 108696, + "isSeekable": true, + "isStream": false, + "uri": "https://soundcloud.com/raphix-359301069/cinemorphique-new-challenges", + "thumbnail": null + }, + { + "track": "QAAAqwIANE11cnJheSBIZWFkIC0gT25lIE5pZ2h0IEluIEJhbmdrb2sgKExvbmcgSW50cm8gMTo0NykAHUpvc8OpIE9zdmFsZG8gT3J0aWdvemEg7aC87b6tAAAAAAAEp2gAC1l2RGdNZEdDUmEwAAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WXZEZ01kR0NSYTAAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "Murray Head - One Night In Bangkok (Long Intro 1:47)", + "identifier": "YvDgMdGCRa0", + "author": "José Osvaldo Ortigoza 🎭", + "duration": 305000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=YvDgMdGCRa0", + "thumbnail": "https://img.youtube.com/vi/YvDgMdGCRa0/default.jpg" + }, + { + "track": "QAAAkAIALkJvbiBKb3ZpIC0gSXQncyBNeSBMaWZlIChPZmZpY2lhbCBNdXNpYyBWaWRlbykACEJvbiBKb3ZpAAAAAAAEEvgAC3Z4MnU1dVV1M0RFAAEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9dngydTV1VXUzREUAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "Bon Jovi - It's My Life (Official Music Video)", + "identifier": "vx2u5uUu3DE", + "author": "Bon Jovi", + "duration": 267000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=vx2u5uUu3DE", + "thumbnail": "https://img.youtube.com/vi/vx2u5uUu3DE/default.jpg" + }, + { + "track": "QAAAlwIAMllvdXNzb3UgTidEb3VyIC0gNyBTZWNvbmRzIChSYWRpbyBFZGl0KSBbQXVkaW8gSFFdAAtHb2xkZW5NdXNpYwAAAAAAA9hgAAtDaGlyZU5pcXhUbwABACtodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUNoaXJlTmlxeFRvAAd5b3V0dWJlAAAAAAAAAAA=", + "title": "Youssou N'Dour - 7 Seconds (Radio Edit) [Audio HQ]", + "identifier": "ChireNiqxTo", + "author": "GoldenMusic", + "duration": 252000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=ChireNiqxTo", + "thumbnail": "https://img.youtube.com/vi/ChireNiqxTo/default.jpg" + }, + { + "track": "QAAAkQIALE1JQ0hBRUwgSkFDS1NPTiAtIEJBRCBbQUpBWMK0UyBFWFRFTkRFRCBNSVhdAAtBamF4U3RyaWtlcgAAAAAACDGoAAszRWE3XzZRdTJ4bwABACtodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTNFYTdfNlF1MnhvAAd5b3V0dWJlAAAAAAAAAAA=", + "title": "MICHAEL JACKSON - BAD [AJAX´S EXTENDED MIX]", + "identifier": "3Ea7_6Qu2xo", + "author": "AjaxStriker", + "duration": 537000, + "isSeekable": true, + "isStream": false, + "uri": "https://www.youtube.com/watch?v=3Ea7_6Qu2xo", + "thumbnail": "https://img.youtube.com/vi/3Ea7_6Qu2xo/default.jpg" + }, + { + "track": "QAAAlgIAM2xvZmkgaGlwIGhvcCByYWRpbyDtoL3ts5ogLSBiZWF0cyB0byByZWxheC9zdHVkeSB0bwAJTG9maSBHaXJsf/////////8AC2pmS2ZQZnlKUmRrAQEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9amZLZlBmeUpSZGsAB3lvdXR1YmUAAAAAAAAAAA==", + "title": "lofi hip hop radio 📚 - beats to relax/study to", + "identifier": "jfKfPfyJRdk", + "author": "Lofi Girl", + "duration": 9223372036854776000, + "isSeekable": false, + "isStream": true, + "uri": "https://www.youtube.com/watch?v=jfKfPfyJRdk", + "thumbnail": "https://img.youtube.com/vi/jfKfPfyJRdk/default.jpg" + } ] } } \ No newline at end of file diff --git a/data/users.json b/data/users.json index 75c1a7c..751b0ff 100644 --- a/data/users.json +++ b/data/users.json @@ -1,42 +1,4 @@ [ - { - "auth": { - "token_type": "Bearer", - "access_token": "gHgMkIRcjnOTRTJNPfRHWLEiIkYIw4", - "expires_in": 604800, - "refresh_token": "qkgDIogFGXM4A8PlO2zZmsCrdpQrvv", - "scope": "identify guilds guilds.members.read" - }, - "avatar": null, - "communication_disabled_until": null, - "flags": 0, - "joined_at": "2019-11-30T19:59:21.532000+00:00", - "nick": null, - "pending": false, - "premium_since": null, - "roles": [ - "397725552968204288" - ], - "user": { - "id": "442290526545510421", - "username": "mido_lol27", - "avatar": "715cd4626ba7f734affdb2623bc4fb24", - "discriminator": "0", - "public_flags": 64, - "flags": 64, - "banner": null, - "accent_color": null, - "global_name": "Mido", - "avatar_decoration_data": null, - "banner_color": null - }, - "mute": false, - "deaf": false, - "bio": "", - "banner": null, - "token": "bd442487-c73e-451f-9e3b-9f902170f7d8", - "admin": false - }, { "auth": { "token_type": "Bearer", @@ -72,20 +34,104 @@ "deaf": false, "bio": "", "banner": null, - "token": "b4f1b8cd-2711-48b7-b301-0290f9d9f69b", - "admin": false + "token": "bd1edc6d-351f-443f-87ed-d52d2794758b", + "admin": false, + "picture": "/userspictures/226744358567804928.png" }, { "auth": { "token_type": "Bearer", - "access_token": "9mddRrtxla0BS69BVagf6fu2BHIHxa", + "access_token": "A1XKJTzNC3TmCV6XJuy8uROva6e8Dc", "expires_in": 604800, - "refresh_token": "9Rio7R8v8jbLTeJASem1zXKtz9YH8W", + "refresh_token": "un7NRYkhCsWCLJhWoTlU0L6mFZV7D1", "scope": "identify guilds.members.read guilds" }, "avatar": null, "communication_disabled_until": null, "flags": 0, + "joined_at": "2020-03-30T21:34:43.763000+00:00", + "nick": null, + "pending": false, + "premium_since": null, + "roles": [ + "397725552968204288" + ], + "unusual_dm_activity_until": null, + "user": { + "id": "362983050054991872", + "username": "roman_cinemorphique", + "avatar": "d103a76a2f5a3a61e46d9b975ac0d23f", + "discriminator": "0", + "public_flags": 0, + "flags": 0, + "banner": null, + "accent_color": null, + "global_name": "Roman", + "avatar_decoration_data": null, + "banner_color": null + }, + "mute": false, + "deaf": false, + "bio": "", + "banner": null, + "token": "7782668f-b8ef-4ebc-8722-70206ceffe47", + "admin": false, + "picture": "/userspictures/362983050054991872.png" + }, + { + "auth": { + "token_type": "Bearer", + "access_token": "Kr8S9MviRsO68aBii2TBXLPhhRHivK", + "expires_in": 604800, + "refresh_token": "3lmSmZeHDi169D7Vzisvu1qSAbOgZK", + "scope": "guilds identify guilds.members.read" + }, + "avatar": null, + "communication_disabled_until": null, + "flags": 0, + "joined_at": "2019-01-13T22:43:08.924000+00:00", + "nick": "Néo", + "pending": false, + "premium_since": "2021-05-09T22:00:03.632000+00:00", + "roles": [ + "397726163180716032", + "630169940640399370" + ], + "unusual_dm_activity_until": null, + "user": { + "id": "428869747594231808", + "username": "neonightfr", + "avatar": "6c55374fd43613fe8f4a4d2f4b46750c", + "discriminator": "0", + "public_flags": 0, + "flags": 0, + "banner": "7421deb5e7ff351828e77f79265246aa", + "accent_color": null, + "global_name": "Néo Night FR", + "avatar_decoration_data": { + "asset": "a_fed43ab12698df65902ba06727e20c0e", + "sku_id": "1144058844004233369" + }, + "banner_color": null + }, + "mute": false, + "deaf": false, + "bio": "", + "banner": null, + "token": "f931f59c-ec29-43cc-a5fc-7f05a8d3361e", + "picture": "/userspictures/428869747594231808.png" + }, + { + "auth": { + "token_type": "Bearer", + "access_token": "QMEQsujfQeJFRpx2gl61UvrmhK9k4g", + "expires_in": 604800, + "refresh_token": "iDKDGlLsCdCZkNVlMuozhPR00uKA1J", + "scope": "guilds identify guilds.members.read" + }, + "avatar": null, + "communication_disabled_until": null, + "flags": 0, "joined_at": "2020-04-14T08:47:38.484000+00:00", "nick": null, "pending": false, @@ -94,14 +140,16 @@ "397725552968204288", "630169940640399370" ], + "unusual_dm_activity_until": null, "user": { "id": "435462012974268426", "username": "gabouille", - "avatar": "5424e9938b46c0cd48b4145136dd88dd", + "avatar": "78790482ad52bad210a6e979847420d9", "discriminator": "0", "public_flags": 256, + "premium_type": 2, "flags": 256, - "banner": "336d92bc07973449e1347736839d06e6", + "banner": "7c3d04b3afb1f624a7266b5dc42dbb29", "accent_color": 16775056, "global_name": "Gabouille", "avatar_decoration_data": null, @@ -111,16 +159,96 @@ "deaf": false, "bio": "", "banner": null, - "token": "baedf970-fec2-4d8b-ac06-a1652480a653", - "admin": false + "token": "4c8833ba-d02c-4661-93e8-94aa87626b36", + "picture": "/userspictures/435462012974268426.png" }, { "auth": { "token_type": "Bearer", - "access_token": "xa9w0vGStc3NMnSM7JadWJXdlE8vjw", + "access_token": "sVto3Z4OtZi2d1gufLjdMVSu0AqoVM", "expires_in": 604800, - "refresh_token": "yIPoVpUVq59oI5Nin2i4YbKI6G2Wxb", - "scope": "identify guilds guilds.members.read" + "refresh_token": "hlL3RjDyXtcNWUkiBtTzT4caoc0jFY", + "scope": "guilds.members.read identify guilds" + }, + "avatar": null, + "communication_disabled_until": null, + "flags": 0, + "joined_at": "2021-10-04T21:39:15.519000+00:00", + "nick": null, + "pending": false, + "premium_since": null, + "roles": [ + "397725552968204288" + ], + "unusual_dm_activity_until": null, + "user": { + "id": "454603829556805632", + "username": ".mophie", + "avatar": "0cfb7c8d85b1b8c245b2545e3e1b75da", + "discriminator": "0", + "public_flags": 0, + "premium_type": 0, + "flags": 0, + "banner": null, + "accent_color": 3553599, + "global_name": "Mophie", + "avatar_decoration_data": null, + "banner_color": "#36393f" + }, + "mute": false, + "deaf": false, + "bio": "", + "banner": null, + "token": "188204a0-123c-42b5-b92e-8cbbed3c975f", + "picture": "/userspictures/454603829556805632.png" + }, + { + "auth": { + "token_type": "Bearer", + "access_token": "aaNl0ZbjqF80r38Uhh6dGj0UStCyF9", + "expires_in": 604800, + "refresh_token": "OBDdGUO1ws4ZtZf4ZOs9xJ6eeu8BoM", + "scope": "identify guilds.members.read guilds" + }, + "avatar": null, + "communication_disabled_until": null, + "flags": 0, + "joined_at": "2020-03-06T18:17:58.037000+00:00", + "nick": null, + "pending": false, + "premium_since": null, + "roles": [ + "397725552968204288" + ], + "unusual_dm_activity_until": null, + "user": { + "id": "249494159629484033", + "username": "immudelki", + "avatar": "10376ec122172dd172d70876e3b532aa", + "discriminator": "0", + "public_flags": 0, + "premium_type": 0, + "flags": 0, + "banner": null, + "accent_color": 1123662, + "global_name": "Immudelki", + "avatar_decoration_data": null, + "banner_color": "#11254e" + }, + "mute": false, + "deaf": false, + "bio": "", + "banner": null, + "token": "e635ee17-ba13-47f7-8330-7679cb724936", + "picture": "/userspictures/249494159629484033.png" + }, + { + "auth": { + "token_type": "Bearer", + "access_token": "9oiQMo6zqVFkDnD7iA3theiy5YjMT5", + "expires_in": 604800, + "refresh_token": "F8Cc1cftPfcajzHHthhgVFDYKRTk0p", + "scope": "guilds identify guilds.members.read" }, "avatar": null, "communication_disabled_until": null, @@ -132,12 +260,14 @@ "roles": [ "397725552968204288" ], + "unusual_dm_activity_until": null, "user": { "id": "158369928104116224", "username": "pierreber", - "avatar": "8ecb7b32c67be13eadb2f6e3a372c205", + "avatar": "b32d53187e2a0c4e419a5c038c6de1a8", "discriminator": "0", "public_flags": 0, + "premium_type": 0, "flags": 0, "banner": null, "accent_color": 921132, @@ -149,34 +279,201 @@ "deaf": false, "bio": "", "banner": null, - "token": "58e43544-b4f7-4f32-bb7d-d00d71577629", + "token": "a6dfef7b-0a16-4fff-864e-1b5a165cba97", + "picture": "/userspictures/158369928104116224.png" + }, + { + "auth": { + "token_type": "Bearer", + "access_token": "h7RD4cRiX2mo9lHXWjNBCWoLNdXsLU", + "expires_in": 604800, + "refresh_token": "6OhGjmNHMlj2ip4VD7vtmaQiHrzQqc", + "scope": "identify guilds.members.read guilds" + }, + "avatar": null, + "communication_disabled_until": null, + "flags": 0, + "joined_at": "2019-11-30T19:59:21.532000+00:00", + "nick": null, + "pending": false, + "premium_since": null, + "roles": [ + "397725552968204288" + ], + "unusual_dm_activity_until": null, + "user": { + "id": "442290526545510421", + "username": "mido_lol27", + "avatar": "097bd2ba3fee996828eef0d0558bb830", + "discriminator": "0", + "public_flags": 64, + "premium_type": 0, + "flags": 64, + "banner": null, + "accent_color": null, + "global_name": "Mido", + "avatar_decoration_data": null, + "banner_color": null + }, + "mute": false, + "deaf": false, + "bio": "", + "banner": null, + "token": "3d977bde-c5ec-4740-902c-4def1e45fb03", + "picture": "/userspictures/442290526545510421.png" + }, + { + "auth": { + "token_type": "Bearer", + "access_token": "gOP2InJLgtHkxDQVXhX81cDnTYa97m", + "expires_in": 604800, + "refresh_token": "3vBdERIVShrs6jZsYZBvQ0PPFUeGiE", + "scope": "guilds identify guilds.members.read" + }, + "avatar": null, + "communication_disabled_until": null, + "flags": 0, + "joined_at": "2019-06-28T21:40:53.652000+00:00", + "nick": null, + "pending": false, + "premium_since": null, + "roles": [ + "397725956598530050", + "840278326210985994" + ], + "unusual_dm_activity_until": null, + "user": { + "id": "172437570905571328", + "username": "iceplayer", + "avatar": "255f537528548d5def12fcf93d5ca439", + "discriminator": "0", + "public_flags": 0, + "premium_type": 1, + "flags": 0, + "banner": null, + "accent_color": null, + "global_name": "IcePlayer", + "avatar_decoration_data": null, + "banner_color": null + }, + "mute": false, + "deaf": false, + "bio": "", + "banner": null, + "token": "0adeb1bf-c4a9-4d39-b40c-bc844cd50f2d", + "picture": "/userspictures/172437570905571328.png" + }, + { + "auth": { + "token_type": "Bearer", + "access_token": "zR2x55rWjbMeKXNlGWnUXBmaATBZRO", + "expires_in": 604800, + "refresh_token": "gFu5XPe3yD5zUkSw69rOGlehRwD8B4", + "scope": "guilds guilds.members.read identify" + }, + "avatar": null, + "communication_disabled_until": null, + "flags": 0, + "joined_at": "2018-05-17T09:35:10.139000+00:00", + "nick": null, + "pending": false, + "premium_since": null, + "roles": [ + "397726163180716032", + "840278326210985994" + ], + "unusual_dm_activity_until": null, + "user": { + "id": "168086507486314496", + "username": "entreenatcho", + "avatar": "27b13203cd91c88ff80ab350a21cd49c", + "discriminator": "0", + "public_flags": 0, + "premium_type": 0, + "flags": 0, + "banner": null, + "accent_color": null, + "global_name": "EntreeNATCHO", + "avatar_decoration_data": null, + "banner_color": null + }, + "mute": false, + "deaf": false, + "bio": "", + "banner": null, + "token": "2dbb9339-d54d-4a22-85c3-c24dc22c2251", + "picture": "/userspictures/168086507486314496.png", "admin": false }, { "auth": { "token_type": "Bearer", - "access_token": "jY17lCWaOpTdPQCnz50kfNm7ABpsGz", + "access_token": "4kUniqI5SwtuZXFowjasl5WA9Qe6Xa", "expires_in": 604800, - "refresh_token": "3TronknZ7j5kVSDBjI3OechmCYF8ck", - "scope": "guilds identify guilds.members.read" + "refresh_token": "9fm6lraCAXgHbEBesgRSQGEdunj4QT", + "scope": "guilds.members.read identify guilds" + }, + "avatar": null, + "communication_disabled_until": null, + "flags": 0, + "joined_at": "2017-08-28T19:23:58.611000+00:00", + "nick": null, + "pending": false, + "premium_since": null, + "roles": [ + "397725552968204288", + "840278326210985994" + ], + "unusual_dm_activity_until": null, + "user": { + "id": "253494094179991552", + "username": "darkguillaume", + "avatar": "a_395293ae3b4fc6c67f9ef1af5a17196f", + "discriminator": "0", + "public_flags": 128, + "premium_type": 2, + "flags": 128, + "banner": "a_256ce480b73b88f5c80d2e096ae4e9e8", + "accent_color": null, + "global_name": "DarkGuillaume", + "avatar_decoration_data": null, + "banner_color": null + }, + "mute": false, + "deaf": false, + "bio": "", + "banner": null, + "token": "de730e3b-a000-4376-8f95-e1052c441636", + "picture": "/userspictures/253494094179991552.png", + "admin": false + }, + { + "auth": { + "token_type": "Bearer", + "access_token": "fATWAIB6UrA8FnN9xKofUyLdGXXoKk", + "expires_in": 604800, + "refresh_token": "pWF4LL5uFbbQmwwNmGWftiBMi2Rrip", + "scope": "guilds.members.read identify guilds" }, "admin": true, "avatar": null, "communication_disabled_until": null, "flags": 0, - "joined_at": "2023-03-06T18:20:23.413000+00:00", + "joined_at": "2023-09-24T18:54:49.914000+00:00", "nick": "Raphix", "pending": false, "premium_since": null, "roles": [ "397725552968204288" ], + "unusual_dm_activity_until": null, "user": { "id": "486943594893017119", "username": "raphixscrap", - "avatar": "7129e80c23aa3ba3d2d45814dd352a29", + "avatar": "f3fa652cc177da053b27985a56d61f80", "discriminator": "0", "public_flags": 4194368, + "premium_type": 0, "flags": 4194368, "banner": null, "accent_color": 10712214, @@ -188,6 +485,12 @@ "deaf": false, "bio": "", "banner": null, - "token": "adf077e6-1fac-4c0c-9468-6ebe698c550a" + "token": [ + "2cb1bbb1-08de-4d42-b62a-346113dfe06c", + "4a271f57-8433-4761-961f-da584651fd8c", + "c1d699c8-615d-42bc-a1e1-8967475d816a", + "e04a58b9-76fa-4bee-836c-6ec4f83b92c3" + ], + "picture": "/userspictures/486943594893017119.png" } ] \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4f1bc6f..819aaf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "subsonics-web", - "version": "1.0.3", + "version": "2.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "subsonics-web", - "version": "1.0.3", + "version": "2.0.0", "dependencies": { "cookie": "^0.5.0", "cookie-parser": "^1.4.6", @@ -15,12 +15,14 @@ "erela.js": "^2.4.0", "express": "^4.18.2", "express-favicon": "^2.0.4", + "loguix": "^1.4.2", "markdown-it": "^13.0.1", "nodemon": "^2.0.22", "pm2": "^5.3.0", + "request": "^2.88.2", "socket.io": "^4.6.1", "uuid": "^9.0.0", - "webmetrik": "^0.1.3", + "webmetrik": "^0.1.4", "ytfps": "^1.1.0" } }, @@ -582,6 +584,21 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/amp": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", @@ -647,6 +664,22 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", @@ -675,6 +708,24 @@ "node": "<=0.11.8 || >0.11.10" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, "node_modules/axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -704,6 +755,14 @@ "node": ">=10.0.0" } }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -807,6 +866,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -930,6 +994,17 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", @@ -1001,6 +1076,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -1023,6 +1103,17 @@ "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==" }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/data-uri-to-buffer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", @@ -1057,6 +1148,14 @@ "node": ">= 14" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1103,6 +1202,15 @@ "node": ">=16.9.0" } }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1377,6 +1485,19 @@ "node": ">=4" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1387,6 +1508,11 @@ "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, "node_modules/fclone": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", @@ -1482,6 +1608,27 @@ } } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1583,6 +1730,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/git-node-fs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", @@ -1628,6 +1783,27 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1717,6 +1893,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, "node_modules/https-proxy-agent": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", @@ -1866,6 +2056,16 @@ "node": ">=0.12.0" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -1894,11 +2094,25 @@ "pako": "^0.2.5" } }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "optional": true + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/jsonfile": { "version": "4.0.0", @@ -1908,6 +2122,20 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/lazy": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", @@ -1942,6 +2170,11 @@ "node": ">=0.8.6" } }, + "node_modules/loguix": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loguix/-/loguix-1.4.2.tgz", + "integrity": "sha512-fWp699F5Dqszpnriwotr3XvsaPXYAjmV3X2L4tmqUXgwHggvx1Fak1z3Ac7CeuVdIdYY5l85UQrEYPmhAb+IUw==" + }, "node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -2187,6 +2420,14 @@ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==" }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2317,6 +2558,11 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2663,11 +2909,24 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -2754,6 +3013,54 @@ "node": ">=8.10.0" } }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/require-in-the-middle": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", @@ -3131,6 +3438,30 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -3265,6 +3596,18 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/ts-mixer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", @@ -3275,6 +3618,17 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/tv4": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", @@ -3283,6 +3637,11 @@ "node": ">= 0.8.0" } }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, "node_modules/tx2": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz", @@ -3341,6 +3700,14 @@ "node": ">= 0.8" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3370,6 +3737,19 @@ "node": ">= 0.8" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "node_modules/vizion": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", @@ -3393,9 +3773,9 @@ } }, "node_modules/webmetrik": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/webmetrik/-/webmetrik-0.1.3.tgz", - "integrity": "sha512-UhCK1qTwAuhw17by2/lS5fL9o9uLyKBZ9+WvIY+VFSmuTcYr6zAVD4E0ns0M69NodHznH+L4a5mOyIfsq0o8cw==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/webmetrik/-/webmetrik-0.1.4.tgz", + "integrity": "sha512-Si3qMLvpXBd3N0KfSqF6pAwLDS+C4QLyXCgzjo6UpRWE1wXgkzRbUtTZSqh7n2p4uFzm9MRlz/biK+q//uTidw==" }, "node_modules/wrappy": { "version": "1.0.2", @@ -3870,6 +4250,17 @@ } } }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "amp": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", @@ -3925,6 +4316,19 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + }, "ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", @@ -3947,6 +4351,21 @@ "shimmer": "^1.1.0" } }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, "axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -3970,6 +4389,14 @@ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==" }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "requires": { + "tweetnacl": "^0.14.3" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -4048,6 +4475,11 @@ "get-intrinsic": "^1.0.2" } }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4137,6 +4569,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", @@ -4195,6 +4635,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -4214,6 +4659,14 @@ "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==" }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "requires": { + "assert-plus": "^1.0.0" + } + }, "data-uri-to-buffer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", @@ -4242,6 +4695,11 @@ "esprima": "^4.0.1" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4278,6 +4736,15 @@ "ws": "^8.13.0" } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4465,6 +4932,16 @@ "resolved": "https://registry.npmjs.org/express-favicon/-/express-favicon-2.0.4.tgz", "integrity": "sha512-JDGzumJdwF+WcJf+qwyhdpF1yzducuMCxZa+G6hxR3hor7ae/1CqpAPj8FXCGaGtqBA6ExDMfeszjuYRw5GUuQ==" }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4475,6 +4952,11 @@ "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, "fclone": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", @@ -4543,6 +5025,21 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -4616,6 +5113,14 @@ } } }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "requires": { + "assert-plus": "^1.0.0" + } + }, "git-node-fs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", @@ -4652,6 +5157,20 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4711,6 +5230,16 @@ } } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "https-proxy-agent": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", @@ -4816,6 +5345,16 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, "jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -4838,11 +5377,25 @@ "pako": "^0.2.5" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "optional": true + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "jsonfile": { "version": "4.0.0", @@ -4852,6 +5405,17 @@ "graceful-fs": "^4.1.6" } }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, "lazy": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", @@ -4880,6 +5444,11 @@ "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" }, + "loguix": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loguix/-/loguix-1.4.2.tgz", + "integrity": "sha512-fWp699F5Dqszpnriwotr3XvsaPXYAjmV3X2L4tmqUXgwHggvx1Fak1z3Ac7CeuVdIdYY5l85UQrEYPmhAb+IUw==" + }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -5066,6 +5635,11 @@ } } }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5162,6 +5736,11 @@ "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==" }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -5422,11 +6001,21 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, "pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, "qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -5485,6 +6074,45 @@ "picomatch": "^2.2.1" } }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, "require-in-the-middle": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", @@ -5757,6 +6385,22 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" }, + "sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -5833,6 +6477,15 @@ "nopt": "~1.0.10" } }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, "ts-mixer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", @@ -5843,11 +6496,24 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "tv4": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==" }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, "tx2": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz", @@ -5894,6 +6560,14 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5914,6 +6588,16 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "vizion": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", @@ -5936,9 +6620,9 @@ } }, "webmetrik": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/webmetrik/-/webmetrik-0.1.3.tgz", - "integrity": "sha512-UhCK1qTwAuhw17by2/lS5fL9o9uLyKBZ9+WvIY+VFSmuTcYr6zAVD4E0ns0M69NodHznH+L4a5mOyIfsq0o8cw==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/webmetrik/-/webmetrik-0.1.4.tgz", + "integrity": "sha512-Si3qMLvpXBd3N0KfSqF6pAwLDS+C4QLyXCgzjo6UpRWE1wXgkzRbUtTZSqh7n2p4uFzm9MRlz/biK+q//uTidw==" }, "wrappy": { "version": "1.0.2", diff --git a/package.json b/package.json index 177d290..e348073 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "subsonics-web", "author": "Raphix", - "version": "1.0.3", + "version": "1.1.0", "nodemonConfig": { "ext": "js, html", "ignore": [ @@ -19,9 +19,11 @@ "erela.js": "^2.4.0", "express": "^4.18.2", "express-favicon": "^2.0.4", + "loguix": "^1.4.2", "markdown-it": "^13.0.1", "nodemon": "^2.0.22", "pm2": "^5.3.0", + "request": "^2.88.2", "socket.io": "^4.6.1", "uuid": "^9.0.0", "webmetrik": "^0.1.4", @@ -30,8 +32,8 @@ "scripts": { "start": "nodemon src/main.js", "dev": "set DEV=true& nodemon src/main.js", - "stop": "ssh raphix@raphix.fr sudo -S -u gitlab-ci pm2 stop 'SubSonics - Bot Discord'", - "restart": "ssh raphix@raphix.fr sudo -S -u gitlab-ci pm2 start 'SubSonics - Bot Discord'" + "stop": "ssh raphix@raphix.fr sudo -S -u gitlab-ci pm2 stop 'Subsonics'", + "restart": "ssh raphix@raphix.fr sudo -S -u gitlab-ci pm2 start 'Subsonics'" }, "beta_on": false } diff --git a/src/commands/_template.txt b/src/commands/_template.txt index 57ba174..1542485 100644 --- a/src/commands/_template.txt +++ b/src/commands/_template.txt @@ -1,6 +1,6 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const { __glob } = require("../modules/global-variables"); -const { LogType } = require("../modules/sub-log"); +const { LogType } = require("loguix"); const { List } = require("../modules/sub-list"); const subplayer = require(__glob.SUBPLAYER); const packageJson = require(__glob.PACKAGE); diff --git a/src/commands/pause.js b/src/commands/pause.js index c390280..680fd70 100644 --- a/src/commands/pause.js +++ b/src/commands/pause.js @@ -1,7 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const { __glob } = require("../modules/global-variables"); -const { LogType } = require("../modules/sub-log"); -const { List } = require("../modules/sub-list"); const subplayer = require(__glob.SUBPLAYER); const packageJson = require(__glob.PACKAGE); diff --git a/src/commands/previous.js b/src/commands/previous.js index 6453c75..8e3f501 100644 --- a/src/commands/previous.js +++ b/src/commands/previous.js @@ -1,7 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const { __glob } = require("../modules/global-variables"); -const { LogType } = require("../modules/sub-log"); -const { List } = require("../modules/sub-list"); const subplayer = require(__glob.SUBPLAYER); const packageJson = require(__glob.PACKAGE); diff --git a/src/commands/report.js b/src/commands/report.js index 02ce9c0..749d32d 100644 --- a/src/commands/report.js +++ b/src/commands/report.js @@ -1,7 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder, Client } = require("discord.js"); const { __glob } = require("../modules/global-variables"); -const { LogType } = require("../modules/sub-log"); -const { List } = require("../modules/sub-list"); const subplayer = require(__glob.SUBPLAYER); diff --git a/src/commands/skip.js b/src/commands/skip.js index d66e6b9..6dbde7f 100644 --- a/src/commands/skip.js +++ b/src/commands/skip.js @@ -1,7 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const { __glob } = require("../modules/global-variables"); -const { LogType } = require("../modules/sub-log"); -const { List } = require("../modules/sub-list"); const subplayer = require(__glob.SUBPLAYER); const packageJson = require(__glob.PACKAGE); diff --git a/src/commands/state.js b/src/commands/state.js index fcb5220..d857fe5 100644 --- a/src/commands/state.js +++ b/src/commands/state.js @@ -1,7 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const { __glob } = require("../modules/global-variables"); -const { LogType } = require("../modules/sub-log"); -const { List } = require("../modules/sub-list"); const subplayer = require(__glob.SUBPLAYER); const packageJson = require(__glob.PACKAGE); diff --git a/src/main.js b/src/main.js index e611bb3..cab8849 100644 --- a/src/main.js +++ b/src/main.js @@ -1,9 +1,15 @@ const fs = require("node:fs") const path = require("path") -const { LogType } = require("./modules/sub-log") +const { LogType } = require("loguix") +const log = require("loguix") const { __glob } = require("./modules/global-variables") +log.setup(__glob.LOGS, __glob.PACKAGE) const { DiscordBot } = require("./modules/discord-bot") const { WebServer } = require("./modules/sub-web") +const metric = require("webmetrik") +metric.setMetricFile(__glob.METRIC_FILE) +metric.publishMetrics("8001", "raphraph") + setup() @@ -13,6 +19,7 @@ function setup() { //Log - INIT PHASE const dlog = new LogType("Discord") + // Discord Bot - INIT PHASE diff --git a/src/modules/discord-bot.js b/src/modules/discord-bot.js index d64f85a..65e85cd 100644 --- a/src/modules/discord-bot.js +++ b/src/modules/discord-bot.js @@ -3,10 +3,12 @@ const fs = require("node:fs") const path = require("path") const { Manager } = require("erela.js") const { __glob } = require("./global-variables") -const { LogType } = require("../modules/sub-log") +const { LogType } = require("loguix") const { List } = require("./sub-list") const nodeFinder = require("./nodes-finder") const subplayer = require("./sub-player") +const nodemon = require("nodemon") +const metric = require("webmetrik") const client = new Client({ intents:[GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildMembers], @@ -121,10 +123,16 @@ function init(dlog, config) { if(!interaction.isCommand()) return; + var numberOfCommands = new metric.Metric("numberOfCommands", "Nombre de commandes éxécutées") + numberOfCommands.setValue(numberOfCommands.getValue() + 1) + const command = client.commands.get(interaction.commandName) try { - + + // Create a metric to count the number of commands executed by each user + const userCommand = new metric.Metric("userCommand_" + interaction.member.user.username, "Nombre de commandes éxécutées par l'utilisateur : " + interaction.member.user.username) + userCommand.setValue(userCommand.getValue() + 1) dlog.log(interaction.member.user.username + "-> /" + interaction.commandName) command.execute(client, interaction) } catch(error) { @@ -224,8 +232,19 @@ function startErelaManager(dlog, config) { client.manager.on("trackStart", async (player) => { + // Create a metric to count the number of songs played + const songPlayed = new metric.Metric("songPlayed", "Nombre de musiques jouées") + songPlayed.setValue(songPlayed.getValue() + 1) + if(player) { plog.log("Lecture de '" + player.queue.current.title + "' de '" + player.queue.current.author + "'") + // Create a metric to count the number of minutes played by the bot using player.queue.current.duration which is in ms (milliseconds) and verify if it's not a livestream + + if(player.queue.current.duration && player.queue.current.duration != 9223372036854776000) { + const songDuration = new metric.Metric("songDuration", "Durée totale des musiques jouées en secondes") + songDuration.setValue(songDuration.getValue() + (player.queue.current.duration / 1000)) + } + await list.setCurrent(player) await player.seek(0) process.emit("MUSIC_UPDATE_STATE") @@ -240,6 +259,7 @@ function startErelaManager(dlog, config) { await list.addCurrentToPrevious() if(await list.haveSongs()) { + await player.play(list.next()) } @@ -275,3 +295,17 @@ function startErelaManager(dlog, config) { client.on("raw", d => client.manager.updateVoiceState(d)); } +async function closeClient() { + console.log("Fermeture du client Discord") + if(client) { + let player = await client.manager.players.get("137291455336022018") + if(player) { + await player.destroy() + } + client.destroy() + } + +} + + + diff --git a/src/modules/global-variables.js b/src/modules/global-variables.js index 0e426cf..2f1198f 100644 --- a/src/modules/global-variables.js +++ b/src/modules/global-variables.js @@ -5,7 +5,6 @@ const root = path.resolve(__dirname, '../../') const __glob = { CONFIG: root + path.sep + "data" + path.sep + "config.json", USERS: root + path.sep + "data" + path.sep + "users.json", - BETA_USERS: root + path.sep + "data" + path.sep + "betas.json", ROOT: root, WEB_DIR: root + path.sep + "src" + path.sep + "web", COMMANDS: root + path.sep + "src" + path.sep + "commands", @@ -21,6 +20,7 @@ const __glob = { RADIO: root + path.sep + "data" + path.sep + "radios.json", LOGS: root + path.sep + "src" + path.sep + "modules" + path.sep + "logs", METRIC_FILE: root + path.sep + "data" + path.sep + "metrics.json", + PICTURE_DIR: root + path.sep + "data" + path.sep + "pictures", }; const webroot = __glob.WEB_DIR + path.sep diff --git a/src/modules/nodes-finder.js b/src/modules/nodes-finder.js index 120fd61..ba0e0f0 100644 --- a/src/modules/nodes-finder.js +++ b/src/modules/nodes-finder.js @@ -1,5 +1,5 @@ const { __glob } = require("./global-variables") -const { LogType } = require("../modules/sub-log") +const { LogType } = require("loguix") const fs = require("fs") const discord = require("./discord-bot") @@ -7,242 +7,127 @@ const nlog = new LogType("Node-Finder") const nodesState = new Map() -module.exports.getNodes = function () { - nlog.step.init("find_nodes", "Récupération des nodes de la base de donnée") - - if(fs.existsSync(__glob.NODES)) { - try { - - var nodes_data = JSON.parse(fs.readFileSync(__glob.NODES)) - const nodes_array = new Array() - - for(var node of nodes_data) { - nodes_array.push(node) - nodesState.set(node.host, false) - } - - nlog.log("Récupération de " + nodes_array.length + " nodes dans la base de donnée !") - nlog.step.end("find_nodes") - return nodes_array - } catch(error) { - nlog.step.error("find_nodes", error) - - } - } else { - - nlog.warn("Fichier de configuration introuvable !") - - try { - var nodes = {} - - - fs.writeFileSync(__glob.NODES, JSON.stringify(nodes, null, 2)) - nlog.log("Création d'un fichier de base de donnée de nodes ! Redémarrage de l'application nécéssaire !") - nlog.step.error("find_nodes", "Redémarrage requis pour lire la nouvelle base de donnée des nodes !") - process.exit(0) - } catch(error) { - nlog.step.error("find_nodes", "Tentative de création du fichier de base de donnée nodes échoué !" + error) - - } - } - -} - -module.exports.getNodesData = function () { - nlog.step.init("findu_nodes", "Récupération des nodes pour envoi d'informations!") - - if(fs.existsSync(__glob.NODES)) { - try { - - var nodes_data = JSON.parse(fs.readFileSync(__glob.NODES)) - const nodes_array = new Array() - - for(var node of nodes_data) { - node.state = nodesState.get(node.host) - nodes_array.push(node) - - } - - nlog.log("Récupération de " + nodes_array.length + " nodes pour envoi d'informations!") - nlog.step.end("findu_nodes") - return nodes_array - } catch(error) { - nlog.step.error("findu_nodes", error) - - } - } else { - - nlog.warn("Fichier de configuration introuvable !") - +function checkAndCreate() { + if (!fs.existsSync(__glob.NODES)) { try { var nodes = {} - - - fs.writeFileSync(__glob.NODES, JSON.stringify(nodes, null, 2)) + saveNodesFile(nodes) nlog.log("Création d'un fichier de base de donnée de nodes ! Redémarrage de l'application nécéssaire !") nlog.step.error("find_nodes", "Redémarrage requis pour lire la nouvelle base de donnée des nodes !") process.exit(0) - } catch(error) { - nlog.step.error("find_nodes", "Tentative de création du fichier de base de donnée nodes échoué !" + error) - - } - } - -} - -module.exports.addNodes = function (data) { - - nlog.step.init("add_nodes", "Ajout d'un nouveau noeud dans la base de donnée de nodes : " + data.host) - - if(fs.existsSync(__glob.NODES)) { - try { - - var nodes_data = JSON.parse(fs.readFileSync(__glob.NODES)) - - nodes_data.push(data) - fs.writeFileSync(__glob.NODES, JSON.stringify(nodes_data, null, 2)) - - nlog.step.end("add_nodes") - - const client = discord.getClient() - - if(client.manager) { - const nodesPresent = client.manager.nodes - - if(!nodesPresent.get(data.host)) { - - client.manager.createNode(data) - } - - client.manager.nodes.get(data.host).connect() - - } - - - } catch(error) { - nlog.step.error("add_nodes", error) - - } - } else { - - nlog.warn("Fichier de configuration introuvable !") - - try { - var nodes = [] - - - fs.writeFileSync(__glob.NODES, JSON.stringify(nodes, null, 2)) - nlog.log("Création d'un fichier de base de donnée de nodes ! Redémarrage de l'application nécéssaire !") - nlog.step.error("add_nodes", "Redémarrage requis pour lire la nouvelle base de donnée des nodes !") - process.exit(0) - } catch(error) { - nlog.step.error("add_nodes", "Tentative de création du fichier de nodes échoué !" + error) - + } catch (error) { + nlog.step.error("find_nodes", "Tentative de création du fichier de base de donnée nodes échoué !" + error) } } } -module.exports.deleteNode = function (data) { +function readNodesFile() { + checkAndCreate() + return JSON.parse(fs.readFileSync(__glob.NODES)) +} - nlog.step.init("deleteNodes", "Supression d'un noeud dans la base de donnée de nodes : " + data.host) - - if(fs.existsSync(__glob.NODES)) { - try { - - var nodes_data = JSON.parse(fs.readFileSync(__glob.NODES)) - - var nodeIndex = -1 - - for(var node of nodes_data) { - - if(node.host == data.host) { - - nodeIndex = nodes_data.indexOf(node) - - } - - } - - - nodes_data.splice(nodeIndex, 1) - - const client = discord.getClient() - - if(client.manager) { - const nodesPresent = client.manager.nodes - - if(nodesPresent.get(data.host)) { - - client.manager.destroyNode(data.host) - } - - } - - fs.writeFileSync(__glob.NODES, JSON.stringify(nodes_data, null, 2)) - - nlog.step.end("deleteNodes") - - - } catch(error) { - nlog.step.error("deleteNodes", error) - - } - } else { - - nlog.warn("Fichier de configuration introuvable !") - - try { - var nodes = [] - - - fs.writeFileSync(__glob.NODES, JSON.stringify(nodes, null, 2)) - nlog.log("Création d'un fichier de base de donnée de nodes ! Redémarrage de l'application nécéssaire !") - nlog.step.error("deleteNodes", "Redémarrage requis pour lire la nouvelle base de donnée des nodes !") - process.exit(0) - } catch(error) { - nlog.step.error("deleteNodes", "Tentative de création du fichier de nodes échoué !" + error) - - } - } +function saveNodesFile(data) { + fs.writeFileSync(__glob.NODES, JSON.stringify(data, null, 2)) } module.exports.reloadNode = function (data) { - const client = discord.getClient() - - if(client.manager) { + if (client.manager) { const nodesPresent = client.manager.nodes - - if(nodesPresent.get(data.host)) { - + if (nodesPresent.get(data.host)) { client.manager.destroyNode(data.host) } nlog.log("Redémarrage de la node : " + data.host) - client.manager.createNode(data) client.manager.nodes.get(data.host).connect() - } - } - - - -/** - * Ajout de l'état des nodes - * @param {string} node - * @param {boolean} state - */ - -module.exports.setNodeState = function(node, state) { - +module.exports.setNodeState = function (node, state) { nodesState.set(node, state) process.emit("UPDATE_NODES") } -module.exports.getNodesStates = function() { - +module.exports.getNodesStates = function () { return nodesState } +module.exports.getNodes = function () { + + nlog.step.init("find_nodes", "Récupération des nodes de la base de donnée") + try { + var nodes_data = readNodesFile() + const nodes_array = new Array() + for (var node of nodes_data) { + nodes_array.push(node) + nodesState.set(node.host, false) + } + nlog.log("Récupération de " + nodes_array.length + " nodes dans la base de donnée !") + nlog.step.end("find_nodes") + return nodes_array + } catch (error) { + nlog.step.error("find_nodes", error) + } +} + +module.exports.getNodesData = function () { + nlog.step.init("findu_nodes", "Récupération des nodes pour envoi d'informations!") + try { + var nodes_data = readNodesFile() + const nodes_array = new Array() + for (var node of nodes_data) { + node.state = nodesState.get(node.host) + nodes_array.push(node) + } + nlog.log("Récupération de " + nodes_array.length + " nodes pour envoi d'informations!") + nlog.step.end("findu_nodes") + return nodes_array + } catch (error) { + nlog.step.error("findu_nodes", error) + } +} + +module.exports.addNodes = function (data) { + nlog.step.init("add_nodes", "Ajout d'un nouveau noeud dans la base de donnée de nodes : " + data.host) + try { + var nodes_data = readNodesFile() + nodes_data.push(data) + saveNodesFile(nodes_data) + nlog.step.end("add_nodes") + const client = discord.getClient() + if (client.manager) { + const nodesPresent = client.manager.nodes + if (!nodesPresent.get(data.host)) { + client.manager.createNode(data) + } + client.manager.nodes.get(data.host).connect() + } + } catch (error) { + nlog.step.error("add_nodes", error) + } +} + +module.exports.deleteNode = function (data) { + nlog.step.init("deleteNodes", "Supression d'un noeud dans la base de donnée de nodes : " + data.host) + try { + var nodes_data = readNodesFile() + var nodeIndex = -1 + for (var node of nodes_data) { + if (node.host == data.host) { + nodeIndex = nodes_data.indexOf(node) + } + } + nodes_data.splice(nodeIndex, 1) + const client = discord.getClient() + if (client.manager) { + const nodesPresent = client.manager.nodes + if (nodesPresent.get(data.host)) { + client.manager.destroyNode(data.host) + } + } + saveNodesFile(nodes_data) + nlog.step.end("deleteNodes") + } catch (error) { + nlog.step.error("deleteNodes", error) + } +} diff --git a/src/modules/sub-auth.js b/src/modules/sub-auth.js index 59785c1..9a19f4e 100644 --- a/src/modules/sub-auth.js +++ b/src/modules/sub-auth.js @@ -1,30 +1,94 @@ -const { resolve } = require("path"); -const { __glob, __web } = require("../modules/global-variables"); -const { LogType } = require('./sub-log'); -const fs = require("fs") +const { __glob, __web } = require("./global-variables"); +const { LogType } = require('loguix'); +const fs = require("fs"); const alog = new LogType("Authentification") var users = new Map() var sessions = new Array() -var betausers = new Array() + var packageJson = JSON.parse(fs.readFileSync(__glob.PACKAGE)) -updateUsers() - -module.exports.checkUser = function (token) { +if(!fs.existsSync(__glob.PICTURE_DIR)){ - if(users.has(token)) { - - return true - } else { - - return false - } - + fs.mkdirSync(__glob.PICTURE_DIR); } + +updateUsers() +checkAllPictures() + +module.exports.getDiscordUser = function (code, session) { + + return new Promise((resolve, reject) => { + + alog.log("Récupération de l'autorisation de récupération des informations de l'utilisateur associé à la session : " + session + " [ETAPE 2]") + + var link = "https://subsonics.raphix.fr" + + if(process.env.DEV == "true") { + link = "http://localhost:4000" + } + + const params = new URLSearchParams(); + params.append('client_id', "1094727789682380922"); + params.append('client_secret', "uwtyPOPKCgw6ciBs20qiJ7LJrW9Ziclo"); + params.append('grant_type', 'authorization_code'); + params.append('code', code); + params.append('redirect_uri', link + "/internal/redirect"); + params.append('scope', 'identify guilds'); + + fetch('https://discord.com/api/oauth2/token', { + method: "POST", + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, body : params + }).then(resp1 => resp1.json()).then(authorizationKey => { + + alog.log("Récupération des informations de l'utilisateur associé à l'autorisation : '" + authorizationKey.access_token + "' et associé à la session : " + session + " [ETAPE 3]") + + fetch('https://discord.com/api/users/@me/guilds/137291455336022018/member', { + headers: { + authorization: `${authorizationKey.token_type} ${authorizationKey.access_token}`, + }, + }).then(resp2 => resp2.json()).then(userInfo => { + + var user = {} + + if(typeof userInfo.joined_at == "undefined") { + reject("NOT_IN_CLP") + } else if(typeof userInfo.user == "undefined") { + reject("MIGRATE_ACCOUNT_ONLY") + } else { + + // Replace existing user from the DB file if exist + const userDB = readUsersFile(__glob.USERS) + for (const user of userDB) { + if(user.user.id == userInfo.user.id) { + userInfo.token = user.token + } + } + + user.auth = authorizationKey; + + if(userInfo.user.id == "486943594893017119") { + user.admin = true; + } + + Object.assign(user, userInfo); + resolve(user); + } + + }).catch(error => reject(error)) + + }).catch(error => reject(error)) + }) +} + + +/*Session*/ + module.exports.getSession = function (session) { @@ -39,105 +103,6 @@ module.exports.getSession = function (session) { } -module.exports.getDiscordUser = function (code, session) { - - return new Promise((resolve, reject) => { - - alog.log("Récupération de l'autorisation de récupération des informations de l'utilisateur associé à la session : " + session + " [ETAPE 2]") - - - var link = "https://subsonics.raphix.fr" - - if(process.env.DEV == "true") { - link = "http://localhost:4000" - } - - const params = new URLSearchParams(); - params.append('client_id', "1094727789682380922"); - params.append('client_secret', "uwtyPOPKCgw6ciBs20qiJ7LJrW9Ziclo"); - params.append('grant_type', 'authorization_code'); - params.append('code', code); - params.append('redirect_uri', link + "/internal/redirect"); - params.append('scope', 'identify guilds'); - - fetch('https://discord.com/api/oauth2/token', { - method: "POST", - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, body : params - }).then(resp1 => resp1.json()).then(authorizationKey => { - - alog.log("Récupération des informations de l'utilisateur associé à l'autorisation : '" + authorizationKey.access_token + "' et associé à la session : " + session + " [ETAPE 3]") - - fetch('https://discord.com/api/users/@me/guilds/137291455336022018/member', { - headers: { - authorization: `${authorizationKey.token_type} ${authorizationKey.access_token}`, - }, - }).then(resp2 => resp2.json()).then(userInfo => { - - var user = {} - - if(typeof userInfo.joined_at == "undefined") { - - reject("NOT_IN_CLP") - - } else if(typeof userInfo.user == "undefined") { - reject("MIGRATE_ACCOUNT_ONLY") - - } else { - - if(packageJson.beta_on == false) { - user.auth = authorizationKey - if(userInfo.user.id == "486943594893017119") { - - user.admin = true - } - - Object.assign(user, userInfo) - - - resolve(user) - - } else { - - if(betausers.includes(userInfo.user.id)) { - user.auth = authorizationKey - if(userInfo.user.id == "486943594893017119") { - - user.admin = true - } - user.beta = true - Object.assign(user, userInfo) - - - resolve(user) - - } else { - - reject("NOT_IN_BETA") - } - - } - - - } - - - - - }).catch(error => reject(error)) - - - }).catch(error => reject(error)) - - - - - - }) - -} - module.exports.saveSession = function (session) { sessions.push(session) @@ -153,23 +118,52 @@ module.exports.removeSession = function (session) { } +/*Users*/ + +module.exports.checkUser = function (token) { + + for(var user of users) { + + if(user[1].token.includes(token)) { + + return true + } + } + + return false +} + + +module.exports.getUser = function (token) { + + for(var user of users) { + + if(user[1].token.includes(token)) { + + return user[1] + } + } + + return null +} + module.exports.getUsers = function () { - const userDB = JSON.parse(fs.readFileSync(__glob.USERS)) + const userDB = readUsersFile(__glob.USERS) return userDB } -module.exports.getUsersList = function () { +module.exports.getSimpleUsers = function () { var userList = new Array() - const userDB = JSON.parse(fs.readFileSync(__glob.USERS)) + const userDB = readUsersFile(__glob.USERS) for(var user of userDB) { - userList.push({"username": user.user.username, "global_name":user.user.global_name, "avatar": user.user.avatar, "id": user.user.id, "admin": user.admin}) + userList.push({"username": user.user.username, "global_name":user.user.global_name, "avatar": user.user.avatar, "id": user.user.id, "admin": user.admin, "picture": user.picture}) } @@ -180,32 +174,20 @@ module.exports.getUsersList = function () { module.exports.getSimpleUser = function (token) { - var user = users.get(token) + const user = this.getUser(token) if(!user) { return null } - return ({"username": user.user.username, "global_name":user.user.global_name, "avatar": user.user.avatar, "id": user.user.id, "admin": user.admin}) -} - - -module.exports.getUser = function (token) { - return users.get(token) + return ({"username": user.user.username, "global_name":user.user.global_name, "avatar": user.user.avatar, "id": user.user.id, "admin": user.admin, "picture": user.picture}) } module.exports.addUser = function (user) { - - if(!fs.existsSync(__glob.USERS)){ - - fs.writeFileSync(__glob.USERS, '[]') - } - - - const userDB = JSON.parse(fs.readFileSync(__glob.USERS)) + const userDB = readUsersFile(__glob.USERS) var selectedUser = null @@ -229,21 +211,63 @@ module.exports.addUser = function (user) { userDB.push(user) } - fs.writeFileSync(__glob.USERS, JSON.stringify(userDB, null, 2)) - + saveUsersFile( userDB) + var OPdest = __glob.PICTURE_DIR + "/" + user.user.id + ".png" + if (fs.existsSync(OPdest)) { + fs.rmSync(OPdest); + } + checkAllPictures() updateUsers() alog.log("Ajout de " + user.user.username + " en tant qu'utilisateur avec le token : " + user.token) } +module.exports.removeUser = function (token) { + + const userDB = readUsersFile(__glob.USERS) + var selectedUser = null + for (const user of userDB) { + if(user.token == token) { + + selectedUser = user + } + } + const index = userDB.indexOf(selectedUser) + alog.log("Supression de " + selectedUser.user.username + " en tant qu'utilisateur avec le token : " + selectedUser.token) + + userDB.splice(index, 1) + saveUsersFile(userDB) + + updateUsers() + +} + +module.exports.removeToken = function (token) { + + const userDB = readUsersFile(__glob.USERS) + var selectedUser = null + for (const user of userDB) { + var usersTokens = user.token + if(usersTokens.includes(token)) { + + selectedUser = user + } + } + const index = userDB.indexOf(selectedUser) + alog.log("Supression du token de " + selectedUser.user.username + " en tant qu'utilisateur avec le token : " + selectedUser.token) + + const tokens = selectedUser.token + tokens.splice(tokens.indexOf(token), 1) + + saveUsersFile(userDB) + + updateUsers() + +} + module.exports.setAdmin = function (user) { - if(!fs.existsSync(__glob.USERS)){ - - fs.writeFileSync(__glob.USERS, '[]') - } - - const userDB = JSON.parse(fs.readFileSync(__glob.USERS)) + const userDB = readUsersFile(__glob.USERS) var selectedUser = null @@ -268,7 +292,7 @@ module.exports.setAdmin = function (user) { } - fs.writeFileSync(__glob.USERS, JSON.stringify(userDB, null, 2)) + saveUsersFile(userDB) updateUsers() alog.log("Ajout de " + user.user.username + " en tant qu'administrateur avec le token : " + user.token) @@ -277,40 +301,8 @@ module.exports.setAdmin = function (user) { -module.exports.removeUser = function (token) { - - if(!fs.existsSync(__glob.USERS)){ - - fs.writeFileSync(__glob.USERS, '[]') - } - - - - const userDB = JSON.parse(fs.readFileSync(__glob.USERS)) - var selectedUser = null - for (const user of userDB) { - if(user.token == token) { - - selectedUser = user - } - } - const index = userDB.indexOf(selectedUser) - alog.log("Supression de " + selectedUser.user.username + " en tant qu'utilisateur avec le token : " + selectedUser.token) - - userDB.splice(index, 1) - fs.writeFileSync(__glob.USERS, JSON.stringify(userDB, null, 2)) - - updateUsers() - -} - function updateUsers() { - - if(!fs.existsSync(__glob.BETA_USERS)){ - - fs.writeFileSync(__glob.BETA_USERS, '[]') - } if(!fs.existsSync(__glob.USERS)){ @@ -318,19 +310,75 @@ function updateUsers() { } - const userDB = JSON.parse(fs.readFileSync(__glob.USERS)) - const betausersDB = JSON.parse(fs.readFileSync(__glob.BETA_USERS)) + + const userDB = readUsersFile(__glob.USERS) + for (const user of userDB) { users.set(user.token, user) + } - for (const id of betausersDB) { - - betausers.push(id) - } + alog.log("Actualisation de " + userDB.length + " utilisateurs depuis : " + __glob.USERS) - alog.log("Actualisation de " + betausersDB.length + " utilisateurs bêtas depuis : " + __glob.BETA_USERS) + +} + +function readUsersFile(file) { + + return JSON.parse(fs.readFileSync(file, 'utf8')) + +} + +function saveUsersFile(data) { + + fs.writeFileSync(__glob.USERS, JSON.stringify(data, null, 2)) +} + +function checkAllPictures() { + + const userDB = readUsersFile(__glob.USERS) + + for (const user of userDB) { + + if(!fs.existsSync(__glob.PICTURE_DIR + "/" + user.user.id + ".png")) { + + userDB[userDB.indexOf(user)].picture = "/userspictures/" + user.user.id + ".png" + + downloadPicture(`https://cdn.discordapp.com/avatars/${user.user.id}/${user.user.avatar}`, __glob.PICTURE_DIR + "/" + user.user.id + ".png") + + } + + } + + saveUsersFile(userDB) + +} + +const ilog = new LogType("ImageDownloader") + +function downloadPicture(url, dest) { + const fs = require('fs'); + const request = require('request'); + //Check if path exist and delete it + if (fs.existsSync(dest)) { + fs.rmSync(dest); + } + + const download = (url, path, callback) => { + request.head(url, (err, res, body) => { + request(url) + .pipe(fs.createWriteStream(path)) + .on('close', callback) + }) + } + + download(url, dest, () => { + // Say for each user that the picture is downloaded + ilog.log("Picture downloaded for " + dest) + + process.emit("UPDATE_SELF") + }) } \ No newline at end of file diff --git a/src/modules/sub-list.js b/src/modules/sub-list.js index 247f7fe..87ac4b5 100644 --- a/src/modules/sub-list.js +++ b/src/modules/sub-list.js @@ -1,6 +1,6 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const { __glob } = require("../modules/global-variables"); -const { LogType } = require('./sub-log'); +const { LogType } = require('loguix'); const discord = require("./discord-bot") const dlog = new LogType("Queue-List") @@ -12,10 +12,6 @@ var shuffle = false module.exports.List = class { - constructor() { - - } - getList() { return next @@ -48,8 +44,6 @@ module.exports.List = class { return song } else { - - const randomIndex = Math.floor(Math.random() * next.length); const song = next[randomIndex] next.splice(randomIndex, 1) @@ -194,32 +188,12 @@ module.exports.List = class { } - async fpPlaylistAdd(playlist, client) { - - let player = client.manager.players.get("137291455336022018") - - for(var song of playlist.videos) { - - const song_finded = await client.manager.search(song.url) - next.push(song_finded.tracks[0]) - - } - - if(!player.playing) { - - player.play(next[0]) - this.remove(next[0]) - - } - - process.emit("MUSIC_UPDATE_STATE") - } - async playlistAdd(playlist, interaction, userId, ) { - if(interaction) { + var client = discord.getClient() + let player = client.manager.players.get("137291455336022018") - const client = interaction.client + if(interaction) { var author = "Artiste inconnu !" @@ -240,35 +214,22 @@ module.exports.List = class { .setTimestamp(); interaction.reply({embeds: [embed]}) + player = client.manager.players.get(interaction.guild.id) - let player = client.manager.players.get(interaction.guild.id) + userId = interaction.member.user.id + + + } for(var song of playlist.videos) { - + if(song.uri) { + song.url = song.uri + } const song_finded = await client.manager.search(song.url) next.push(song_finded.tracks[0]) - + process.emit("MUSIC_UPDATE_STATE") } - if(!player.playing) { - - player.play(next[0]) - this.remove(next[0]) - - } - - - - } else { - var client = null - - if(!client) { - - client = discord.getClient() - } - - let player = client.manager.players.get("137291455336022018") - if(!player) { var channelId = discord.getMemberVoices().get(userId) @@ -288,21 +249,18 @@ module.exports.List = class { player.connect(); } - - for(var song of playlist) { - - const song_finded = await client.manager.search(song.uri) - next.push(song_finded.tracks[0]) - process.emit("MUSIC_UPDATE_STATE") - } + if(!player.playing) { - player.play(next[0]) - this.remove(next[0]) - + player.play(next[0]) + this.remove(next[0]) + } - } + + + + } diff --git a/src/modules/sub-log.js b/src/modules/sub-log.js deleted file mode 100644 index 877d8f2..0000000 --- a/src/modules/sub-log.js +++ /dev/null @@ -1,217 +0,0 @@ -const fs = require("fs") -const path = require("path") - -var logStream = null -var logInstance = new Map() - -setup() - -function getDate(formated) { - - var date = new Date() - - // [Date Format] - Format de la date - - var gmonth = date.getMonth() - var gday = date.getDate() - var gHour = date.getHours() - var gMinute = date.getMinutes() - var gSecondes = date.getSeconds() - - - if(date.getMonth() + 1 <= 10) { - gmonth = "0" + (date.getMonth() + 1) - } - - if(date.getDate() + 1 <= 10) { - gday = "0" + date.getDate() - } - - if(date.getHours() + 1 <= 10) { - gHour = "0" + date.getHours() - } - - if(date.getMinutes() + 1 <= 10) { - gMinute = "0" + date.getMinutes() - } - - if(date.getSeconds() + 1 <= 10) { - gSecondes = "0" + date.getSeconds() - } - - if(!formated) { - return gday + "/" + gmonth + " - " + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s" - } else { - return date.getFullYear() + "-" + gmonth + "-" + gday + "-" + gHour + "h" + "-" + gMinute + "m" + "-" + gSecondes + "s" - - } - - -} - - - -function setup() { - - if(!fs.existsSync(__dirname + path.sep + "logs" + path.sep)) { - fs.mkdir(__dirname + path.sep + "logs", (err) => { - if(!err) { - - - console.log("[Logs] - Dossier de logs crée ! !") - - } else { - - console.log("[Logs] -Erreur d'écriture par manque de permission ") - console.log(err) - } - - }) - - } - - logStream = fs.createWriteStream(__dirname + path.sep + "logs" + path.sep + getDate(true) + ".log", { - flags: 'a' - }); - - - logStream.write("[" + require("../../package.json").name + "@"+ require("../../package.json").version + "] - [" + getDate(true) + "]" + "\n") - logStream.write("Subsonics-Web by Raphix" + "\n") - logStream.write("----------------------------------------------------------------" + "\n") - - process.on('uncaughtException', (err) => { - console.error("["+ "FATAL" + "] - The application has encountered an error ! Please Restart ! #E = " + err + "\n") - console.error(err) - logStream.write("[" + getDate() + "] - ["+ "FATAL" + "] - The application has encountered an error ! Please Restart ! #E = " + err + "\n") - logStream.end( "["+ "UNCAUGHT_EXCEPTION" + "]" + " - [END OF LOGS] - [" + getDate() + ']') - logStream.close() - - }); - - - process.on('beforeExit', (err) => { - logStream.end( "["+ "BEFORE_EXIT" + "]" + " - [END OF LOGS] - [" + getDate(true) + ']') - logStream.close() - - }); - - - -} - -module.exports.getInstance = function (name) { - - if(logInstance.has(name)) { - - return logInstance.get(name) - - } else { - - var logtext = "[Logs] - [ERROR] - '" + name + "' n'est pas enregistré en tant qu'instance de log !" - logStream.write("[" + getDate() + "] - " + logtext + "\n") - console.log(logtext) - - return null - } - -} - -module.exports.LogType = class { - - constructor(typeName) { - this.type = typeName; - this.steps = new Map() - this.step = this.initializeStep() - logInstance.set(typeName, this) - } - - log(txt) { - - - - var logtext = "[" + this.type + "] - [INFO] - " + txt - logStream.write("[" + getDate() + "] - " + logtext + "\n") - console.log(logtext) - - - } - - warn(txt) { - - var logtext = "[" + this.type + "] - [WARN] - " + txt - logStream.write("[" + getDate() + "] - " + logtext + "\n") - console.log(logtext) - - } - - error(txt) { - - - var logtext = "[" + this.type + "] - [ERROR] - " + txt - logStream.write("[" + getDate() + "] - " + logtext + "\n") - console.log(logtext) - - - - } - - - - - initializeStep() { - const parent = this; - return { - init: function(id, desc) { - parent.steps.set(id, desc) - var logtext = "[" + parent.type + "] - [INFO] - [STEP] - " + desc + " - En cours ..." - logStream.write("[" + getDate() + "] - " + logtext + "\n") - console.log(logtext) - - }, - end: function(id) { - - if(parent.steps.has(id)) { - - var logtext = "[" + parent.type + "] - [INFO] - [STEP] - " + parent.steps.get(id) + " - Terminé !" - logStream.write("[" + getDate() + "] - " + logtext + "\n") - console.log(logtext) - parent.steps.delete(id) - } else { - - var logtext = "[" + parent.type + "] - [WARN] - [STEP] - '" + id + "' n'est pas enregistré en tant qu'étape !" - logStream.write("[" + getDate() + "] - " + logtext + "\n") - console.log(logtext) - - } - - }, - error: function(id, errorDesc) { - - if(parent.steps.has(id)) { - - var logtext = "[" + parent.type + "] - [ERROR] - [STEP] - " + parent.steps.get(id) + " - Une erreur a été rencontré dans l'étape ! : #E = " + errorDesc - logStream.write("[" + getDate() + "] - " + logtext + "\n") - console.log(logtext) - parent.steps.delete(id) - } else { - - var logtext = "[" + parent.type + "] - [WARN] - [STEP] - '" + id + "' n'est pas enregistré en tant qu'étape !" - logStream.write("[" + getDate() + "] - " + logtext + "\n") - console.log(logtext) - - } - - } - } - - } - -} - - - - - - - - diff --git a/src/modules/sub-player.js b/src/modules/sub-player.js index f057c4f..a237c70 100644 --- a/src/modules/sub-player.js +++ b/src/modules/sub-player.js @@ -1,11 +1,11 @@ const { SlashCommandBuilder, EmbedBuilder, DefaultWebSocketManagerOptions, discordSort } = require("discord.js"); const { __glob } = require("../modules/global-variables"); -const { LogType } = require("./sub-log"); +const { LogType } = require("loguix"); var { List } = require("./sub-list") const discord = require("./discord-bot") var ytfps = require("ytfps"); const packageJson = require(__glob.PACKAGE); - +const { Metric } = require("webmetrik"); const list = new List() @@ -61,8 +61,8 @@ module.exports.play = async function (client, interaction) { .setColor(0x15e6ed) .setTitle('**Lecture de : **' + songs.tracks[0].title) .setDescription('**Demandé par **' + interaction.member.user.username) - .addFields({name: "Auteur", value: son.tracks[0].author}, - {name: "URL", value:songs.tragscks[0].uri}) + .addFields({name: "Auteur", value: songs.tracks[0].author}, + {name: "URL", value: songs.tracks[0].uri}) .setThumbnail(songs.tracks[0].thumbnail) .setTimestamp(); @@ -79,14 +79,11 @@ module.exports.play = async function (client, interaction) { } - - - } else { - - // [A FINIR POUR WEB] - } + playStats(interaction.member.user.username) + } + process.emit("MUSIC_UPDATE_STATE") } @@ -193,72 +190,20 @@ module.exports.getState = function(client, interaction) { module.exports.playPlaylist = function (id, data) { - - list.playlistAdd(data, null, id) - - - -} - -module.exports.SPECIAL_MJ = async function (client, userId) { - - if(!client) { - - client = discord.getClient() - } - - let player = client.manager.players.get("137291455336022018") - - var memberVoices = discord.getMemberVoices() - var channelId = memberVoices.get(userId) - - - if(!channelId) { - - channelId = "664355808250953739" - } - - if(!player) { - - player = client.manager.create({ - guild: "137291455336022018", - voiceChannel: channelId, - textChannel: "664355637685256203", - }); - - - player.connect(); - } - - - const songs = await client.manager.search("Earth MJ") - const songs2 = await client.manager.search("https://www.youtube.com/watch?v=_mwsc6xqb3w") - const songs3 = await client.manager.search("https://www.youtube.com/watch?v=IdjgmRa3k-g") - - if(!player.playing) { - player.play(songs.tracks[0]) - - } else { - - list.add(songs.tracks[0]) - - } - - - - list.add(songs2.tracks[0]) - list.add(songs3.tracks[0]) + const playlist = {} + playlist.videos = data + list.playlistAdd(playlist, null, id) } -module.exports.addSong = async function (data, client, userId, quick, playlist) { - if(!client) { +module.exports.addSong = async function (data, userId, quick, playlist) { - client = discord.getClient() - } + + var client = discord.getClient() + let player = client.manager.players.get("137291455336022018") var memberVoices = discord.getMemberVoices() @@ -315,41 +260,15 @@ module.exports.addSong = async function (data, client, userId, quick, playlist) } -module.exports.addSongsFromPlaylist = async function (data, client, userId, quick, playlist) { +module.exports.addSongsFromPlaylist = async function (data, userId) { - if(!client) { - - client = discord.getClient() - } - - let player = client.manager.players.get("137291455336022018") - - var memberVoices = discord.getMemberVoices() - var channelId = memberVoices.get(userId) - - if(!channelId) { - - channelId = "664355808250953739" - } - - if(!player) { - - player = client.manager.create({ - guild: "137291455336022018", - voiceChannel: channelId, - textChannel: "664355637685256203", - }); - - - player.connect(); - } + var playlist = await checkPlaylist(data) - if(playlist) { - list.fpPlaylistAdd(playlist, client) + list.playlistAdd(playlist, null, userId) } @@ -834,3 +753,9 @@ async function checkPlaylist (song_name) { } + +function playStats(username) { + var userMusicPlayed = new Metric("userMusicPlayed_" + username, "Nombre de musiques jouées par l'utilisateur : " + username) + userMusicPlayed.setValue(userMusicPlayed.getValue() + 1) + +} \ No newline at end of file diff --git a/src/modules/sub-playlist.js b/src/modules/sub-playlist.js index b2d91da..9f48f31 100644 --- a/src/modules/sub-playlist.js +++ b/src/modules/sub-playlist.js @@ -1,11 +1,8 @@ const { SlashCommandBuilder, EmbedBuilder, DefaultWebSocketManagerOptions, discordSort } = require("discord.js"); const { __glob } = require("../modules/global-variables"); -const { LogType } = require("./sub-log"); -var { List } = require("./sub-list") -const discord = require("./discord-bot") +const { LogType } = require("loguix"); const subplayer = require("./sub-player") const fs = require("fs"); -const { type } = require("os"); var playlists = {} const plog = new LogType("Playlist-Manager") diff --git a/src/modules/sub-radio.js b/src/modules/sub-radio.js index db96e5d..46cd78e 100644 --- a/src/modules/sub-radio.js +++ b/src/modules/sub-radio.js @@ -1,5 +1,5 @@ const { __glob } = require("../modules/global-variables"); -const { LogType } = require("./sub-log"); +const { LogType } = require("loguix"); var { List } = require("./sub-list") const discord = require("./discord-bot") const subplayer = require("./sub-player") @@ -8,19 +8,19 @@ const { type } = require("os"); var radios = [] const plog = new LogType("Radio-Manager") -check() +checkRadioFile() module.exports.get = function () { - check() + checkRadioFile() return radios } module.exports.add = function (data) { - var radios_data = JSON.parse(fs.readFileSync(__glob.RADIO)) + var radios_data = readRadioFile() radios_data.push(data) fs.writeFileSync(__glob.RADIO, JSON.stringify(radios_data, null, 2)) @@ -31,7 +31,7 @@ module.exports.add = function (data) { module.exports.remove = function(data) { - var radios_data = JSON.parse(fs.readFileSync(__glob.RADIO)) + var radios_data = readRadioFile() var radIndex = -1 @@ -48,11 +48,26 @@ module.exports.remove = function(data) { radios_data.splice(radIndex, 1) - fs.writeFileSync(__glob.RADIO, JSON.stringify(radios_data, null, 2)) + saveRadioFile(radios_data) + } -function check() { +function saveRadioFile(data) { + + fs.writeFileSync(__glob.RADIO, JSON.stringify(data, null, 2)) +} + +function readRadioFile() { + + if(fs.existsSync(__glob.RADIO)) { + + return JSON.parse(fs.readFileSync(__glob.RADIO)) + } +} + + +function checkRadioFile() { if(fs.existsSync(__glob.RADIO)) { diff --git a/src/modules/sub-web.js b/src/modules/sub-web.js index 4d71337..6f96393 100644 --- a/src/modules/sub-web.js +++ b/src/modules/sub-web.js @@ -1,7 +1,6 @@ -const internal = require("stream"); const { __glob, __web } = require("./global-variables"); -const { LogType } = require("./sub-log"); -const log = require("./sub-log"); +const { LogType } = require("loguix"); +const log = require("loguix"); const auth = require("./sub-auth"); const cook = require("cookie") const wlog = new LogType("Web") @@ -10,8 +9,10 @@ const subradio = require("./sub-radio.js") const { List } = require("./sub-list") const subplaylist = require("./sub-playlist") const nodesfinder = require("./nodes-finder") +const { Server } = require("socket.io") var fs = require("fs") var path = require("path") +const { Metric } = require("webmetrik"); module.exports.WebServer = class { @@ -27,9 +28,7 @@ module.exports.WebServer = class { function init() { const createError = require('http-errors'); const express = require('express'); - const path = require('path'); const cookieParser = require('cookie-parser'); - const http = require("http"); const favicon = require('express-favicon'); const app = express(); @@ -39,6 +38,7 @@ function init() { const server = require('http').createServer(app); const io = require('socket.io')(server) + const indexRouter = require(__web.ROUTER + "index.js"); const loginRouter = require(__web.ROUTER + "login.js"); @@ -57,6 +57,7 @@ function init() { app.use('/', indexRouter); app.use('/login', loginRouter); app.use("/internal", internalRouter) + app.use("/userspictures", express.static(__glob.PICTURE_DIR)) app.use(favicon(__web.ICON)); app.use(function (req, res, next) { @@ -137,25 +138,36 @@ function normalizePort(val) { } - +/** + * + * @param {Server} io + */ function IOConnection(io) { - + /** + * @type {LogType} + */ const alog = log.getInstance("Authentification") const usersOnline = new Array() + process.on("UPDATE_SELF", () => { + + if(io) { + + AlwaysRequest("UPDATE_SELF") + AlwaysRequest("ALL_CONNECTED_USER", usersOnline) + } + + }) process.on("UPDATE_NODES", () => { if(io) { const data = nodesfinder.getNodesData() - - io.sockets.emit("ALWAYS/NODES", data) + AdminRequest("NODES", data) } - - }) process.on("UPDATE_RADIO", () => { @@ -163,363 +175,287 @@ function IOConnection(io) { if(io) { const radioList = subradio.get() - io.sockets.emit("ALWAYS/ALL_RADIO", radioList) + AlwaysRequest("ALL_RADIO", radioList) } }) process.on("MUSIC_UPDATE_STATE", () => { - - const data = subplayer.updateMusicState() - - io.sockets.emit("/ALWAYS/MUSIC_STATE", data) - + if(io) { + const data = subplayer.updateMusicState() + AlwaysRequest("MUSIC_STATE", data) + } }) io.on("connection", (socket) => { - - var ucookies = socket.handshake.headers.cookie - ucookies = cook.parse(ucookies) - if(ucookies.token) { + var token = cook.parse(socket.handshake.headers.cookie).token + var user = auth.getUser(token) + if(user) { + + if(user.admin == true) { + socket.join("admin") - var utoken = ucookies.token - const online_users_data = auth.getSimpleUser(utoken) - - if(online_users_data) { - usersOnline.push(online_users_data) - alog.log(online_users_data.username + " - Connexion du serveur") - } - - } - io.sockets.emit("ALWAYS/ALL_CONNECTED_USER", usersOnline) - - + const online_users_data = auth.getSimpleUser(token) + + if(online_users_data) { + usersOnline.push(online_users_data) + alog.log(online_users_data.username + " - Connexion du serveur avec le socket : " + socket.id + " - " + socket.handshake.address + " - " + socket.handshake.headers["user-agent"]) + } - wlog.log("[SOCKET] - Nouvelle session : " + socket.id) + AlwaysRequest("ALL_CONNECTED_USER", usersOnline) + + socket.on("disconnect", () => { + alog.log(user.user.username + " - Déconnexion du serveur - Socket : " + socket.id) + socket.leave("admin") + var index = usersOnline.indexOf(online_users_data) + if(index > -1) { + usersOnline.splice(index, 1) + } + AlwaysRequest("ALL_CONNECTED_USER", usersOnline) + }) - + GetRequest("USER_INFO", () => { - socket.on("disconnect", () => { - - wlog.log("[SOCKET] - Fin de session : " + socket.id) - if(ucookies.token) { + GetAnswer("USER_INFO", user) + alog.log("Envoi des informations Discord de '" + user.user.username + "' à '" + socket.id + "'" ) + }) - var utoken = ucookies.token - const online_users_data = auth.getSimpleUser(utoken) + GetRequest("USER_LIST", () => { + + GetAnswer("USER_LIST", auth.getSimpleUsers()) + + }) - if(online_users_data) { + GetRequest('MUSIC_STATE', () => { + + const data = subplayer.updateMusicState() + + GetAnswer("MUSIC_STATE", "Bienvenue " + user.user.username + " ! " ) + AlwaysRequest("MUSIC_STATE", data) + }) - var userIndex = -1 + GetRequest("PLAYLIST", () => { + + const playlistResult = subplaylist.getUser(user.user.id) + GetAnswer("PLAYLIST", playlistResult) + }) - for(var user of usersOnline) { - if(user.username == online_users_data.username) { - - userIndex = usersOnline.indexOf(user) - } - + GetRequest("PAUSE", () => { + subplayer.pause() + GetAnswer("PAUSE", "OK") + }) + + GetRequest("BACKWARD", () => { + subplayer.previous() + GetAnswer("BACKWARD", "OK") + }) + + GetRequest("FORWARD", () => { + subplayer.skip() + GetAnswer("FORWARD", "OK") + }) + + GetRequest("LOOP", () => { + subplayer.loop() + GetAnswer("LOOP", "OK") + }) + + GetRequest("SHUFFLE", () => { + subplayer.changeShuffle() + GetAnswer("SHUFFLE", "OK") + }) + + GetRequest("DISCONNECT", () => { + subplayer.leave() + GetAnswer("DISCONNECT", "OK") + sendUserNotification("à déconnecté le Bot de son salon vocal !") + }) + + GetRequest("RESTART", () => { + const pm2 = require('pm2'); + pm2.restart('SubSonics - Bot Discord') + sendUserNotification("à redémarré le Bot !") + GetAnswer("RESTART", "OK") + + }) + + GetRequest("NODES", () => { + process.emit("UPDATE_NODES") + GetAnswer("NODES", "OK") + }) + + GetRequest("ALL_CONNECTED_USER", () => { + GetAnswer("ALL_CONNECTED_USER", "OK") + AlwaysRequest("ALL_CONNECTED_USER", usersOnline) + }) + + GetRequest("ALL_RADIO", async () => { + GetAnswer("ALL_RADIO", "OK") + AlwaysRequest("ALL_RADIO", await subradio.get()) + }) + + + PostRequest("SEEK", (data) => { + subplayer.seek(data) + PostAnswer("SEEK", "OK") + }) + + PostRequest("VOLUME", (data) => { + subplayer.setVol(data) + PostAnswer("VOLUME", "OK") + }) + + PostRequest("DELETE_QUEUE", (data) => { + var sublist = new List() + sublist.removeByIndex(data) + + PostAnswer("DELETE_QUEUE", "OK") + sendUserNotification("à supprimé un titre de la file d'attente !") + }) + + PostRequest("MOVE_QUEUE", (data) => { + var sublist = new List() + sublist.moveUp(data) + + PostAnswer("MOVE_QUEUE", "OK") + sendUserNotification("à déplacé un titre de la file d'attente !") + }) + + PostRequest("MOVE_QUEUE_BY_ENTIRE", (data) => { + var sublist = new List() + sublist.replaceList(data) + + PostAnswer("MOVE_QUEUE_BY_ENTIRE", "OK") + sendUserNotification("à déplacé un titre tout au début de la file d'attente : " + data.title + " !") + }) + + PostRequest("REPORT", (data) => { + + data.username = user + subplayer.report(null, null, data) + PostAnswer("REPORT", "OK") + sendUserNotification("à signalé un bug et a été envoyé !") + }) + + PostRequest("SEARCH", async (data) => { + const results = await subplayer.search(data) + PostAnswer("SEARCH", results) + }) + + PostRequest("ADD_SONG", async (data) => { + subplayer.addSong(data, user.user.id) + PostAnswer("ADD_SONG", "OK") + sendUserNotification("à ajouté un titre à la file d'attente : " + data.title + " !") + playStats(user.user.username) + }) + + PostRequest("ADD_SONG_NOW", async (data) => { + subplayer.addSong(data, user.user.id, true) + PostAnswer("ADD_SONG_NOW", "OK") + sendUserNotification("à lancé un titre : " + data.title + " !") + playStats(user.user.username) + }) + + PostRequest("FP_ADD_SONG", async (data) => { + subplayer.addSong(data, user.user.id, false, true) + PostAnswer("FP_ADD_SONG", "OK") + sendUserNotification("à ajouté un titre à la file d'attente : " + data.title + " !") + playStats(user.user.username) + }) + + PostRequest("FP_ADD_SONG_NOW", async (data) => { + subplayer.addSong(data, user.user.id, true, true) + PostAnswer("FP_ADD_SONG_NOW", "OK") + sendUserNotification("à lancé une titre : " + data.title + " !") + playStats(user.user.username) + }) + + PostRequest("PLAY_PLAYLIST", async (data) => { + subplaylist.playPlaylist(user.user.id, data) + PostAnswer("PLAY_PLAYLIST", "OK") + sendUserNotification("à ajouté une playlist à la file d'attente !") + playStats(user.user.username) + }) + + PostRequest("CREATE_PLAYLIST", async (data) => { + subplaylist.addPlaylist(user.user.id, data) + socket.emit("DO_UPDATE_PLAYLIST") + PostAnswer("CREATE_PLAYLIST", "OK") + + }) + + PostRequest("DELETE_PLAYLIST", async (data) => { + subplaylist.removePlaylist(user.user.id, data) + socket.emit("DO_UPDATE_PLAYLIST") + PostAnswer("DELETE_PLAYLIST", "OK") + }) + + PostRequest("FP_PLAY_PLAYLIST", async (data) => { + subplayer.addSongsFromPlaylist(data, user.user.id) + PostAnswer("FP_PLAY_PLAYLIST", "OK") + sendUserNotification("à ajouté une playlist à la file d'attente !") + }) + + PostRequest("SEND_PLAYLIST", async (data) => { + subplaylist.copyPlaylist(user.user.id, data.key, data.dest) + socket.emit("DO_UPDATE_PLAYLIST") + PostAnswer("SEND_PLAYLIST", "OK") + }) + + PostRequest("ADD_SONG_TO_PLAYLIST", async (data) => { + subplaylist.addSong(user.user.id, data.data, data.song) + socket.emit("DO_UPDATE_PLAYLIST") + PostAnswer("ADD_SONG_TO_PLAYLIST", "OK") + }) + + PostRequest("DELETE_SONG_TO_PLAYLIST", async (data) => { + subplaylist.removeSong(user.user.id, data.data, data.song) + socket.emit("DO_UPDATE_PLAYLIST") + PostAnswer("DELETE_SONG_TO_PLAYLIST", "OK") + }) + + + if(user.admin == true) { + GetRequest("LOGS", () => { + const logs_data = new Array() + const logs_folder = fs.readdirSync(__glob.LOGS) + + for(var log of logs_folder) { + + logs_data.push({"name":log, "value": fs.readFileSync(__glob.LOGS + path.sep + log).toString()}) } - - alog.log(online_users_data.username + " - Deconnexion du serveur") - - usersOnline.splice(userIndex, 1) - } - - } - io.sockets.emit("ALWAYS/ALL_CONNECTED_USER", usersOnline) - - }) + GetAnswer("LOGS", logs_data) + }) + GetRequest("USERS", () => { + const users_data = auth.getUsers() + AdminRequest("USERS", users_data) + }) - // SPECIAL - - socket.on("GET/DISCORD_LOGIN_LINK", () => { - - - var discordlink = null - - if(process.env.DEV == "true") { - - alog.log("Mode Developpeur Actif : Redirige vers LOCALHOST") - discordlink = "https://discord.com/api/oauth2/authorize?client_id=1094727789682380922&redirect_uri=http%3A%2F%2Flocalhost%3A4000%2Finternal%2Fredirect&response_type=code&scope=identify%20guilds%20guilds.members.read" //DEV - } else { - discordlink = "https://discord.com/api/oauth2/authorize?client_id=1094727789682380922&redirect_uri=https%3A%2F%2Fsubsonics.raphix.fr%2Finternal%2Fredirect&response_type=code&scope=identify%20guilds%20guilds.members.read" //OFFICIEL - } - - alog.log("Redirection de '" + socket.id + "' vers le service d'Authentification de Discord [ETAPE 1]") - io.emit("ANSWER/GET/DISCORD_LOGIN_LINK", discordlink ) - }) - - GetRequest(io, socket, "USER_INFO", () => { - var cookies = socket.handshake.headers.cookie - cookies = cook.parse(cookies) - var token = cookies.token - - - const user = auth.getUser(token) - alog.log("Envoi des informations Discord de '" + user.user.username + "' à '" + socket.id + "'" ) - socket.emit("ANSWER/GET/USER_INFO",user) - }) - - GetRequest(io, socket, "MUSIC_STATE", () => { - var cookies = socket.handshake.headers.cookie - cookies = cook.parse(cookies) - var token = cookies.token - - - const data = subplayer.updateMusicState() - const user = auth.getUser(token) - socket.emit("ANSWER/GET/MUSIC_STATE", "Bienvenue " + user.user.username + " ! ") - io.sockets.emit("/ALWAYS/MUSIC_STATE", data) - }) - - GetRequest(io, socket, "PLAYLIST", () => { - var cookies = socket.handshake.headers.cookie - cookies = cook.parse(cookies) - var token = cookies.token - - - - const user = auth.getUser(token) - const playlistResult = subplaylist.getUser(user.user.id) - socket.emit("ANSWER/GET/PLAYLIST", playlistResult) - - }) - - - GetRequest(io, socket, "LOGS", () => { - var cookies = socket.handshake.headers.cookie - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - const logs_data = new Array() - - if(user.admin == true) { - - const logs_folder = fs.readdirSync(__glob.LOGS) - - for(var log of logs_folder) { - - logs_data.push({"name":log, "value": fs.readFileSync(__glob.LOGS + path.sep + log).toString()}) - } - - socket.emit("ANSWER/GET/LOGS", logs_data) - - } - - - - }) - - - GetRequest(io, socket, "USERS", () => { - var cookies = socket.handshake.headers.cookie - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - - - if(user.admin == true) { - - const users_data = auth.getUsers() - - socket.emit("ALWAYS/USERS", users_data) - - } - - - - }) - - GetRequest(io, socket, "USER_LIST", () => { - var cookies = socket.handshake.headers.cookie - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - - - if(user.admin == true) { - - const users_data = auth.getUsersList() - - socket.emit("ANSWER/GET/USER_LIST", users_data) - - } - - - - }) - - - - - - GetRequest(io, socket, "PAUSE", () => { - - subplayer.pause() - io.emit("ANSWER/GET/PAUSE", "OK") - - }) - - - GetRequest(io, socket, "BACKWARD", () => { - - subplayer.previous() - io.emit("ANSWER/GET/BACKWARD", "OK") - - }) - - GetRequest(io, socket, "FORWARD", () => { - - subplayer.skip() - io.emit("ANSWER/GET/FORWARD", "OK") - - }) - - GetRequest(io, socket, "LOOP", () => { - - subplayer.loop() - io.emit("ANSWER/GET/LOOP", "OK") - - }) - - GetRequest(io, socket, "SHUFFLE", () => { - - subplayer.changeShuffle() - io.emit("ANSWER/GET/SHUFFLE", "OK") - - }) - - - GetRequest(io, socket, "DISCONNECT", () => { - - subplayer.leave() - io.emit("ANSWER/GET/DISCONNECT", "OK") - - var cookies = socket.handshake.headers.cookie - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - - io.sockets.emit("NOTIFICATION", {"image_src": "https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar, "text": user.user.global_name + " (" + user.user.username + ") a déconnecté le Bot"}) - - }) - - GetRequest(io, socket, "RESTART", () => { - - - - var cookies = socket.handshake.headers.cookie - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - - io.sockets.emit("NOTIFICATION", {"image_src": "https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar, "text": user.user.global_name + " (" + user.user.username + ") a redémarré le Bot"}) - - - const pm2 = require('pm2'); - - pm2.restart('SubSonics - Bot Discord') - }) - - GetRequest(io, socket, "NODES", () => { - - process.emit("UPDATE_NODES") - - - }) - - - - - - GetRequest(io, socket, "SPECIAL/MJ", () => { - - var cookiesA = socket.handshake.headers.cookie - cookiesA = cook.parse(cookiesA) - var tokenA = cookiesA.token - - var userA = auth.getUser(tokenA) - var userId = userA.user.id - - - subplayer.SPECIAL_MJ(null, userId) - io.emit("ANSWER/GET/SPECIAL/MJ", "OK") - - }) - - GetRequest(io, socket, "ALL_CONNECTED_USER", () => { - - - io.sockets.emit("ALWAYS/ALL_CONNECTED_USER", usersOnline) - - }) - - GetRequest(io, socket, "ALL_RADIO", () => { - - const radioList = subradio.get() - io.sockets.emit("ALWAYS/ALL_RADIO", radioList) - - }) - - - - - // SEND REQUEST - - socket.on("SEND/NODES/ADD", (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - - - if(user.admin == true) { - + PostRequest("NODES/ADD", (data) => { nodesfinder.addNodes(data) - - socket.emit("ANSWER/SEND/NODES/ADD", "OK") + PostAnswer("NODES/ADD", "OK") process.emit("UPDATE_NODES") - } + }) - } else { - io.emit("ANSWER/SEND/NODES/ADD", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/RADIO/ADD", async (data) => { + PostRequest("NODES/DELETE", (data) => { + nodesfinder.deleteNode(data) + PostAnswer("NODES/DELETE", "OK") + process.emit("UPDATE_NODES") + }) + + PostRequest("NODES/RELOAD", (data) => { + nodesfinder.reloadNode(data) + PostAnswer("NODES/RELOAD", "OK") + process.emit("UPDATE_NODES") + }) - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - - - if(user.admin == true) { - + PostRequest("RADIO/ADD", async (data) => { const music_data = await (await subplayer.search(data)).results.tracks[0] var radioContains = null @@ -545,792 +481,96 @@ function IOConnection(io) { } - - socket.emit("ANSWER/SEND/RADIO/ADD", "OK") + PostAnswer("RADIO/ADD", "OK") process.emit("UPDATE_RADIO") - } - } else { - io.emit("ANSWER/SEND/RADIO/ADD", {"error":"TOKEN_NOT_FINDED"}) + }) - } - - - - }) - - socket.on("SEND/NODES/DELETE", (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - - - if(user.admin == true) { - - nodesfinder.deleteNode(data) - - socket.emit("ANSWER/SEND/NODES/DELETE", "OK") - process.emit("UPDATE_NODES") - } - - } else { - io.emit("ANSWER/SEND/USERS/ADMIN", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/NODES/RELOAD", (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - - - if(user.admin == true) { - - nodesfinder.reloadNode(data) - - socket.emit("ANSWER/SEND/NODES/RELOAD", "OK") - process.emit("UPDATE_NODES") - } - - } else { - io.emit("ANSWER/SEND/NODES/RELOAD", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/USERS/ADMIN", (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - - - if(user.admin == true) { - + PostRequest("USERS/ADMIN", (data) => { auth.setAdmin(data) - - socket.emit("ANSWER/GET/USERS/ADMIN", "OK") - + PostAnswer("USERS/ADMIN", "OK") const users_data = auth.getUsers() + AdminRequest("USERS", users_data) + }) - io.sockets.emit("ALWAYS/USERS", users_data) - } - - } else { - io.emit("ANSWER/SEND/USERS/ADMIN", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/USERS/DELETE", (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - const user = auth.getUser(token) - - - if(user.admin == true) { - + PostRequest("USERS/DELETE", (data) => { auth.removeUser(data.token) - - socket.emit("ANSWER/GET/USERS/ADMIN", "OK") - + PostAnswer("USERS/DELETE", "OK") const users_data = auth.getUsers() + AdminRequest("USERS", users_data) + }) - io.sockets.emit("ALWAYS/USERS", users_data) - } - } else { - io.emit("ANSWER/SEND/USERS/ADMIN", {"error":"TOKEN_NOT_FINDED"}) } - - + + } - }) - - socket.on("SEND/SEEK", (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - subplayer.seek(data) - - } else { - - io.emit("ANSWER/SEND/SEEK", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/SEEK", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/VOLUME", (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - subplayer.setVol(data) - - } else { - - io.emit("ANSWER/SEND/VOLUME", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/VOLUME", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/DELETE_QUEUE", (data, title) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - var sublist = new List() - sublist.removeByIndex(data) - - - const user = auth.getUser(token) - io.sockets.emit("NOTIFICATION", {"image_src": "https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar, "text": user.user.global_name + " (" + user.user.username + ") a supprimé un titre dans la liste de lecture : " + title + "" }) - - } else { - - io.emit("ANSWER/SEND/DELETE_QUEUE", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/DELETE_QUEUE", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/MOVE_QUEUE", (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - var sublist = new List() - sublist.moveUp(data) - - } else { - - io.emit("ANSWER/SEND/MOVE_QUEUE", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/MOVE_QUEUE", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/MOVE_QUEUE_BY_ENTIRE", (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - var sublist = new List() - sublist.replaceList(data) - - } else { - - io.emit("ANSWER/SEND/MOVE_QUEUE_BY_ENTIRE", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/MOVE_QUEUE_BY_ENTIRE", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/REPORT", (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - data.username = auth.getUser(token) - subplayer.report(null, null, data) - - const user = auth.getUser(token) - socket.emit("NOTIFICATION", {"image_src": "https://static.vecteezy.com/system/resources/previews/019/521/981/non_2x/green-check-mark-icon-with-circle-checkmark-illustration-free-vector.jpg", "text": "Votre rapport de bug a été correctement envoyé !" }) - - } else { - - io.emit("ANSWER/SEND/REPORT", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/REPORT", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) + function GetRequest(GQname, GQcallback) { + socket.on("GET/" + GQname, () => { + + wlog.log(user.user.username + " - Socket : " + socket.id + " - GET/" + GQname + " - [RECIEVED]") + GQcallback() + }) - socket.on("SEND/SEARCH", async (data) => { + } + + function GetAnswer(GRname, GRvalue) { + + wlog.log(user.user.username + " - Socket : " + socket.id + " - GET/" + GRname + " - [ANSWERED]") + socket.emit("ANSWER/GET/" + GRname, GRvalue) + + } + + function PostRequest(GQname, GQcallback) { + socket.on("POST/" + GQname, (value) => { + wlog.log(user.user.username + " - Socket : " + socket.id + " - POST/" + GQname + " - [RECIEVED]") + GQcallback(value) + }) + + } + + function PostAnswer(GRname, GRvalue) { + + wlog.log(user.user.username + " - Socket : " + socket.id + " - POST/" + GRname + " - [ANSWERED]") + socket.emit("ANSWER/POST/" + GRname, GRvalue) + + } + + function sendUserNotification(text) { + + io.sockets.emit("NOTIFICATION", {"image_src": "https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar, "text": user.user.global_name + " (" + user.user.username + ") " + text}) + } - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - const results = await subplayer.search(data) - - - io.emit("ANSWER/SEND/SEARCH", results) - - } else { - - io.emit("ANSWER/SEND/SEARCH", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/SEARCH", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/ADD_SONG", async (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - - var user = auth.getUser(token) - var userId = user.user.id - - - subplayer.addSong(data, null, userId) - - io.sockets.emit("NOTIFICATION", {"image_src": "https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar, "text": user.user.global_name + " (" + user.user.username + ") a ajouté un nouveau titre : " + data.title + "" }) - io.emit("ANSWER/SEND/ADD_SONG/OK") - - } else { - - io.emit("ANSWER/SEND/ADD_SONG", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/ADD_SONG", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/ADD_SONG_NOW", async (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - - var user = auth.getUser(token) - var userId = user.user.id - - - subplayer.addSong(data, null, userId, true) - - io.sockets.emit("NOTIFICATION", {"image_src": "https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar, "text": user.user.global_name + " (" + user.user.username + ") a fait jouer maintenant un nouveau titre : " + data.title + "" }) - io.emit("ANSWER/SEND/ADD_SONG_NOW/OK") - - } else { - - io.emit("ANSWER/SEND/ADD_SONG_NOW", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/ADD_SONG_NOW", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/FP_ADD_SONG", async (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - - var user = auth.getUser(token) - var userId = user.user.id - - - subplayer.addSong(data, null, userId, false, true) - - io.sockets.emit("NOTIFICATION", {"image_src": "https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar, "text": user.user.global_name + " (" + user.user.username + ") a ajouté un nouveau titre : " + data.title + "" }) - io.emit("ANSWER/SEND/FP_ADD_SONG/OK") - - - } else { - - io.emit("ANSWER/SEND/FP_ADD_SONG", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/FP_ADD_SONG", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - socket.on("SEND/FP_ADD_SONG_NOW", async (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - var user = auth.getUser(token) - var userId = user.user.id - - - subplayer.addSong(data, null, userId, true, true) - - io.sockets.emit("NOTIFICATION", {"image_src": "https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar, "text": user.user.global_name + " (" + user.user.username + ") a fait jouer maintenant un nouveau titre : " + data.title + "" }) - io.emit("ANSWER/SEND/FP_ADD_SONG_NOW/OK") - - } else { - - io.emit("ANSWER/SEND/FP_ADD_SONG_NOW", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/FP_ADD_SONG_NOW", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - socket.on("SEND/FP_PLAY_PLAYLIST", async (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - - var user = auth.getUser(token) - var userId = user.user.id - - - subplayer.addSongsFromPlaylist(data, null, userId, true) - - io.sockets.emit("NOTIFICATION", {"image_src": "https://cdn.discordapp.com/avatars/" + user.user.id + "/" + user.user.avatar, "text": user.user.global_name + " (" + user.user.username + ") a ajouté une playlist à la liste de lecture !" }) - io.emit("ANSWER/SEND/FP_PLAY_PLAYLIST/OK") - - } else { - - io.emit("ANSWER/SEND/FP_PLAY_PLAYLIST", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/FP_PLAY_PLAYLIST", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/CREATE_PLAYLIST", async (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - - var user = auth.getUser(token) - var userId = user.user.id - - - subplaylist.addPlaylist(userId, data) - - io.emit("DO_UPDATE_PLAYLIST") - io.emit("ANSWER/SEND/CREATE_PLAYLIST/OK") - - } else { - - io.emit("ANSWER/SEND/CREATE_PLAYLIST", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/CREATE_PLAYLIST", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/DELETE_PLAYLIST", async (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - - var user = auth.getUser(token) - var userId = user.user.id - - - subplaylist.removePlaylist(userId, data) - - io.emit("DO_UPDATE_PLAYLIST") - io.emit("ANSWER/SEND/DELETE_PLAYLIST/OK") - - } else { - - io.emit("ANSWER/SEND/DELETE_PLAYLIST", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/DELETE_PLAYLIST", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/PLAY_PLAYLIST", async (data) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - - var user = auth.getUser(token) - var userId = user.user.id - - - subplaylist.playPlaylist(userId, data) - - io.emit("DO_UPDATE_PLAYLIST") - io.emit("ANSWER/SEND/PLAY_PLAYLIST/OK") - - } else { - - io.emit("ANSWER/SEND/PLAY_PLAYLIST", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/PLAY_PLAYLIST", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - socket.on("SEND/SEND_PLAYLIST", async (key, dest) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - - var user = auth.getUser(token) - var userId = user.user.id - - - subplaylist.copyPlaylist(userId, key, dest) - - io.sockets.emit("DO_UPDATE_PLAYLIST") - socket.emit("NOTIFICATION", {"image_src": "https://static.vecteezy.com/system/resources/previews/019/521/981/non_2x/green-check-mark-icon-with-circle-checkmark-illustration-free-vector.jpg", "text": "La playlist a été correctement envoyé ! (Si le destinataire a déjà une playlist avec le même nom, l'opération est annulé" }) - io.emit("ANSWER/SEND/SEND_PLAYLIST/OK") - - } else { - - io.emit("ANSWER/SEND/SEND_PLAYLIST", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/SEND_PLAYLIST", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - - - socket.on("SEND/ADD_SONG_TO_PLAYLIST", async (data, song) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - - var user = auth.getUser(token) - var userId = user.user.id - - subplaylist.addSong(userId, data, song) - - io.emit("DO_UPDATE_PLAYLIST") - io.emit("ANSWER/SEND/ADD_SONG_TO_PLAYLIST/OK") - - } else { - - io.emit("ANSWER/SEND/ADD_SONG_TO_PLAYLIST", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/ADD_SONG_TO_PLAYLIST", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - - - socket.on("SEND/DELETE_SONG_TO_PLAYLIST", async (data, song) => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - - - var user = auth.getUser(token) - var userId = user.user.id - - subplaylist.removeSong(userId, data, song) - - io.emit("DO_UPDATE_PLAYLIST") - io.emit("ANSWER/SEND/DELETE_SONG_TO_PLAYLIST/OK") - - } else { - - io.emit("ANSWER/SEND/DELETE_SONG_TO_PLAYLIST", {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/SEND/DELETE_SONG_TO_PLAYLIST", {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) - - - - - }) + - -} -function GetRequest (io, socket, name, func) { + function AlwaysRequest(GRname, GRvalue) { - - socket.on("GET/" + name, () => { - - - var cookies = socket.handshake.headers.cookie - - if(cookies) { - - cookies = cook.parse(cookies) - var token = cookies.token - - if(auth.checkUser(token)) { - - const user = auth.getUser(token) - wlog.log("Requête de " + user.user.username + " avec l'information \"" + name + "\"") - func() - - } else { - - io.emit("ANSWER/GET/" + name, {"error":"USER_DONT_EXIST"}) - } - } else { - io.emit("ANSWER/GET/" + name, {"error":"TOKEN_NOT_FINDED"}) - - } - - - - }) + io.sockets.emit("ALWAYS/" + GRname, GRvalue) + + } + function AdminRequest(GRname, GRvalue) { + + io.to("admin").emit("ALWAYS/" + GRname, GRvalue) + + } + + function sendNotification(image_src, text) { + io.sockets.emit("NOTIFICATION", {"image_src": image_src, "text": text}) + } + + + function playStats(username) { + var userMusicPlayed = new Metric("userMusicPlayed_" + username, "Nombre de musiques jouées par l'utilisateur : " + username) + userMusicPlayed.setValue(userMusicPlayed.getValue() + 1) + + } + } - - diff --git a/src/web/public/javascript/IO.js b/src/web/public/javascript/IO.js index b2fa4d4..e459c49 100644 --- a/src/web/public/javascript/IO.js +++ b/src/web/public/javascript/IO.js @@ -11,6 +11,10 @@ socket.on("connect", () => { get("MUSIC_STATE") }); +socket.on("disconnect", () => { + window.location.href = "/" +}); + function get(request) { return new Promise((resolve, reject) => { @@ -20,7 +24,7 @@ function get(request) { socket.once("ANSWER/GET/" + request, (answer) => { - console.log("Réponse pour la requête : " + request) + console.log("Réponse pour la requête GET : " + request) resolve(answer) @@ -30,16 +34,16 @@ function get(request) { } -function send(request, data, secondata, thirddata) { +function post(request, data, secondata, thirddata) { return new Promise((resolve, reject) => { - socket.emit("SEND/" + request, data, secondata, thirddata) - console.log("Envoi de la requête SEND : " + request) + socket.emit("POST/" + request, data, secondata, thirddata) + console.log("Envoi de la requête POST : " + request) - socket.once("ANSWER/SEND/" + request, (answer) => { + socket.once("ANSWER/POST/" + request, (answer) => { - console.log("Réponse pour la requête : " + request) + console.log("Réponse pour la requête POST : " + request) resolve(answer) @@ -49,6 +53,15 @@ function send(request, data, secondata, thirddata) { } +function AlwaysRequest(GQname, GQcallback) { + socket.on("ALWAYS/" + GQname, (data) => { + + console.log("Récéption pour la requête ALWAYS : " + GQname) + GQcallback(data) + }) + +} + function getSocket() { return socket diff --git a/src/web/public/javascript/__index_script.js b/src/web/public/javascript/__index_script.js deleted file mode 100644 index 1cdc2b1..0000000 --- a/src/web/public/javascript/__index_script.js +++ /dev/null @@ -1,1556 +0,0 @@ -const userInfoDiv = document.getElementById("userInfo") -const userInfoPopup = document.getElementById("userPopup") -const userInfoglobal = document.getElementById("userInfoglobal") - -const musicTitle = document.getElementById("music_title") -const musicURL = document.getElementById("music_img") - -const durationBar = document.getElementById("duration") -const durationTextAct = document.getElementById("durationTextAct") -const durationTextTotal = document.getElementById("durationTextTotal") - -const backward = document.getElementById("backward") -const play = document.getElementById("play") -const forward = document.getElementById("forward") - - -const settingsBtn = document.getElementById("settings_btn") - - - -const loop = document.getElementById("loop") -const vol = document.getElementById("volbtn") -const shuffle = document.getElementById("shuffle") -const list = document.getElementById("list_btn") -const takeCurrent = document.getElementById("takeCurrent") - -const volBox = document.getElementById("volumeBox") -const volTxt = document.getElementById("volumeTxt") -const volDiv = document.getElementById("volDiv") -const volRange = document.getElementById("volumeInput") - -const listBox = document.getElementById("listBox") -const listNumber = document.getElementById("listNumber") - -const disconnect = document.getElementById("disconnect") - -const userInfo = get("USER_INFO") - -const report_dialog = document.getElementById("report_dialog") -const report_close = document.getElementById("report_close") -const reportBtn = document.getElementById("reportBtn") -const report_level = document.getElementById("report_level") -const report_desc = document.getElementById("report_desc") -const report_send = document.getElementById("report_send") - -const searchBtn = document.getElementById("search_btn") -const homeBtn = document.getElementById("home_btn") -const mainView = document.getElementById("mainView") - -const restartBtn = document.getElementById("restartBtn") -const WelcomeContent = mainView.firstElementChild.outerHTML -const playlistContent = document.getElementById("playlist-content") - - -var wasOnPlaylist = false -var wasOnHome = false - -var playlistSelected = null -var playlistValue = null -var deleteJustBefore = null -var currentSong = null - -var isAdmin = false -var playlistAvailable = null - - - - - - - - -restartBtn.addEventListener("click", () => { - - get("RESTART") -}) - - - -homeBtn.style.color = "white" - -var xMousePos = 0; -var yMousePos = 0; - -const tooltip = document.getElementById("tooltip") - -tooltip.style.visibility = 'hidden' -tooltip.style.display = 'none' -const alreadyDeclare = new Array() - -document.onmousemove = function(e) -{ - xMousePos = e.clientX + window.scrollX; - yMousePos = e.clientY + window.scrollY; - - showToolTip("radio_add", "Ajouter par l'URL", e) - showToolTip("sendplaylist", "Envoyer la playlist", e) - showToolTip("playlistplay", "Jouer la playlist", e) - showToolTip("playlistdelete", "Effacer la playlist", e) - showToolTip("an_create", "Ajouter un serveur", e) - showToolTip("pplay", "Jouer maintenant", e) - showToolTip("delete", "Supprimer", e) - showToolTip("add", "Ajouter à la liste de lecture", e) - showToolTip("backward", "Précédent", e) - showToolTip("forward", "Suivant", e) - showToolTip("lmore", "Plus d'options", e) - showToolTip("loop", "Répéter le titre", e) - showToolTip("shuffle", "Mélanger la liste de lecture", e) - showToolTip("list_btn", "Liste de lecture", e) - showToolTip("disconnect", "Déconnecter le bot", e) - showToolTip("reload", "Relancer le serveur", e) - showToolTip("admin", "Donner les permissions", e) - showToolTip("takeCurrent", "Ajouter le titre à une playlist", e) - showToolTip("volbtn", "Volume", e) - -}; - - - -function showToolTip(id, text, e) { - - if(e.target) { - - if(e.target.id.includes(id)) { - - if(!alreadyDeclare.includes(e.target.id)) { - alreadyDeclare.push(e.target.id) - const elementAssociate = document.getElementById(e.target.id) - - elementAssociate.addEventListener("mousemove", () => { - tooltip.style.visibility = 'visible' - tooltip.style.display = 'unset' - tooltip.style.top = ( yMousePos - ( tooltip.offsetHeight + 20)) + "px" - tooltip.style.width = "150px" - tooltip.style.left =(xMousePos - 75 )+ "px" - tooltip.innerHTML = text - - }) - - elementAssociate.addEventListener("mouseleave", () => { - - - alreadyDeclare.splice(alreadyDeclare.indexOf(e.target.id), 1) - - tooltip.style.visibility = 'hidden' - tooltip.style.display = 'none' - - }) - - } - - - } - - } - - - - -} - -homeBtn.addEventListener("click", () => { - - wasOnHome = true - loadHome() - -}) - - - - -function loadHome() { - - wasOnHome = true - - mainView.innerHTML = WelcomeContent - wasOnPlaylist = false - - - get("ALL_CONNECTED_USER") - - - get("ALL_RADIO") - - - -} - -socket.on("ALWAYS/ALL_CONNECTED_USER", (resp) => { - - if(wasOnHome) { - - const website_list = document.getElementById("website_list") - const userToPush = new Array() - - userToPush.push("

Personnes en ligne

") - - for(var user of resp ) { - - var textshadow = "" - - - if(user.admin == true) { - - textshadow = 'box-shadow: #fcff4d 0px 0px 8px;' - } - - if(user.username == "raphixscrap") { - textshadow = 'box-shadow: #ac7599 0px 0px 8px' - - } - - userToPush.push(`

${user.global_name}

${user.username}

`) - - } - - website_list.innerHTML = userToPush.join("") - } - -}) - -socket.on("ALWAYS/ALL_RADIO", (resp) => { - - if(wasOnHome) { - - const radio_list = document.getElementById("radio_list") - const radioToPush = new Array() - - radioToPush.push("

Radio

") - radioToPush.push(` - -
-

Ajout d'une radio

- -
-

- -
-

URL

- - -
-
-`) - - - - for(var title of resp ) { - - var thumbnail = title.thumbnail - if(!thumbnail) { - - thumbnail = "/images/black-image.svg" - - } - - radioToPush.push(`

${title.title} - ${title.author}

`) - - } - - if(isAdmin) { - - radioToPush.push(` -
Ajouter une radio
`) - } - - radio_list.innerHTML = radioToPush.join("") - - if(isAdmin) { - - - - const radio_dialog = document.getElementById("radio_dialog") - const radio_close = document.getElementById("radio_close") - const radio_send = document.getElementById("radio_send") - const radio_add = document.getElementById("radio_add") - const radio_info = document.getElementById("radio_info") - const radio_host = document.getElementById("radio_host") - - if(radio_add) { - radio_add.addEventListener("click", () => { - radio_info.innerHTML = "" - radio_host.value = "" - radio_dialog.showModal() - }) - - radio_close.addEventListener("click", () => { - radio_info.innerHTML = "" - radio_dialog.close() - }) - - radio_send.addEventListener("click", () => { - if(radio_host.value != '') { - - send("RADIO/ADD", radio_host.value) - radio_dialog.close() - } else { - - radio_info.innerHTML = "Remplissez une URL !" - } - - }) - - } - - - - } - - for(var title of resp ) { - - const playBtn = document.getElementById(resp.indexOf(title) +'_radio_pplay') - - playBtn.addEventListener("click", () => { - - send("ADD_SONG_NOW", resp[playBtn.id.replace("_radio_pplay", "")]) - - }) - } - - - - } -}) - -loadHome() - -function delPlayList(key) { - - send("DELETE_PLAYLIST", key) - mainView.innerHTML = WelcomeContent - playlistSelected = null - playlistValue = null - -} - - -function playPlayList(key) { - - send("PLAY_PLAYLIST", key) - - -} - -function sendPlayList(key) { - - const playlist_popup = document.getElementById("playlist_popup") - - if(playlist_popup) { - - get("USER_LIST").then(resp => { - - const userToPush = new Array() - - for(var user of resp) { - - userToPush.push(`

${user.global_name}

${user.username}

`) - - } - - playlist_popup.innerHTML = userToPush.join("") - playlist_popup.style.width = '170px' - playlist_popup.style.top = (yMousePos - 30) + "px" - playlist_popup.style.left = (xMousePos - 165) + "px" - playlist_popup.style.overflowY = "auto"; - playlist_popup.style.height = "250px" - playlist_popup.classList.remove("invisible") - - - playlist_popup.addEventListener("mouseleave", () => { - - playlist_popup.classList.add("invisible") - - }) - - for(var user of resp) { - - const userElement = document.getElementById(resp.indexOf(user)) - - userElement.addEventListener("click", () => { - - playlist_popup.classList.add("invisible") - send("SEND_PLAYLIST", key, resp[userElement.id].id) - }) - } - - //send("SEND_PLAYLIST", key, user.id) - - }) - } - - - -} - -socket.on("DO_UPDATE_PLAYLIST", () => { - - get("PLAYLIST") -}) - -get("PLAYLIST") - -socket.on("ANSWER/GET/PLAYLIST", (data) => { - var contentToPush = new Array() - var selectionData = new Array() - - - contentToPush.push('
Créer une playlist
') - - - for (const [key, value] of Object.entries(data)) { - - contentToPush.push('

' + key + '

') - selectionData.push('') - } - - - - - if(contentToPush.join("") == "") { - - playlistContent.innerHTML = '

Aucun morceau trouvé !

' - - } else { - - playlistContent.innerHTML = contentToPush.join("") - playlistAvailable = selectionData - } - - if(playlistSelected && deleteJustBefore || playlistSelected && wasOnPlaylist) { - deleteJustBefore = null - loadPlaylist(playlistSelected, data[playlistSelected]) - } - - for (const [key, value] of Object.entries(data)) { - - const playlist_selector = document.getElementById(key + '_playlist') - - playlist_selector.addEventListener("click", () => { - - loadPlaylist(key, value) - wasOnPlaylist = true - - }) - } - - const buttons = document.querySelectorAll(".checker"); - - buttons.forEach(button => { - button.addEventListener("click", function () { - buttons.forEach(btn => { - if (btn === button) { - btn.style.color = "white"; - } else { - btn.style.color = ""; - } - }); - }); - }); - - - const addPlaylist = document.getElementById("createPlaylist") - const addPlaylist_dialog = document.getElementById("createPlaylist_dialog") - const addPlaylist_close = document.getElementById("createPlaylist_close") - const apText = document.getElementById("apText") - const apInfo = document.getElementById("apInfo") - const apCreate = document.getElementById("apCreate") - - - addPlaylist_close.addEventListener("click", () => { - apInfo.innerHTML = "" - addPlaylist_dialog.close() - }) - - addPlaylist.addEventListener("click", () => { - - apText.innerHTML = "" - addPlaylist_dialog.showModal() - }) - - apCreate.addEventListener("click", () => { - apInfo.innerHTML = "" - var wrongName = true - - const refusedChar = ['\\','/' ,':' ,'*','?' ,'"','<','>','|'] - - for(var char of refusedChar) { - - if(apText.value.includes(char)) { - wrongName = false - - } - } - - if(apText.value != "" && apText.value != " " && wrongName) { - - addPlaylist_dialog.close() - send("CREATE_PLAYLIST", apText.value) - } else { - - apInfo.innerHTML = "Le nom n'est pas valide !" - } - - - }) - - - - console.log(data) -}) - -function loadPlaylist(key, value) { - - wasOnHome = false - - var playlistToPush = new Array() - var playlist_songs = new Array() - - playlistSelected = key - playlistValue = value - - for(var title of value) { - - var PFormatduration = null - pdurationAll = title.duration - - const pmaxhours = Math.floor(pdurationAll / 3600000); - - var pmaxmin = Math.trunc(pdurationAll / 60000) - (Math.floor(pdurationAll / 60000 / 60) * 60); - var pmaxsec = Math.floor(pdurationAll / 1000) - (Math.floor(pdurationAll / 1000 / 60) * 60); - - - if (pmaxsec < 10) { - pmaxsec = `0${pmaxsec}`; - } - - - if(pmaxhours != 0) { - - if (pmaxmin < 10) { - pmaxmin = `0${pmaxmin}`; - } - - - pmax = pmaxhours + ":" + pmaxmin + ":" + pmaxsec - } else { - pmax = pmaxmin + ":" + pmaxsec - - } - - PFormatduration = pmax - - var thumbnail = title.thumbnail - - if(!thumbnail) { - - thumbnail = "/images/black-image.svg" - - } - - if(title.duration == 9223372036854776000) { - - PFormatduration = " LIVE" - } - - playlist_songs.push('

' + title.title + '

' + title.author + '

' + PFormatduration + '

') - - } - - - - playlistToPush.push(``) - playlistToPush.push('

' + key + '


' + playlist_songs.join("")) - - if(playlistToPush.join("") == "") { - - mainView.innerHTML = '

Aucun morceau trouvé !

' - - } else { - - mainView.innerHTML = playlistToPush.join("") - - - } - - for(var title of value) { - - const add_to = document.getElementById(value.indexOf(title) + "_padd") - const playNow = document.getElementById(value.indexOf(title) + "_pplay") - const deleteBtn = document.getElementById(value.indexOf(title) + "_pdelete") - - add_to.addEventListener("click", () => { - - send("ADD_SONG", value[add_to.id.replace("_padd", "")]) - }) - - playNow.addEventListener("click", () => { - - send("ADD_SONG_NOW", value[add_to.id.replace("_padd", "")]) - - }) - - deleteBtn.addEventListener("click", () => { - - deleteJustBefore = true - send("DELETE_SONG_TO_PLAYLIST", key, value[add_to.id.replace("_padd", "")]) - - }) - - - } - -} - - - -searchBtn.addEventListener("click", () => { - - mainView.innerHTML = '
' - const searchBar = document.getElementById("searchBar") - const searchcontent = document.getElementById("search_content") - - wasOnPlaylist = false - - searchBar.addEventListener("change", () => { - - - send("SEARCH", searchBar.value).then(answerOfResult => { - - var results = answerOfResult.results - var playlistReconnised = answerOfResult.playlist - - if(searchBar.value.includes("https://") || searchBar.value.includes("http://")) { - - searchBar.value= "" - } - - if(!playlistReconnised) { - - if(results.tracks != null) { - const data = results.tracks - - console.log(data) - var contentToPush = new Array() - - for(var title of data) { - - var PFormatduration = null - pdurationAll = title.duration - - const pmaxhours = Math.floor(pdurationAll / 3600000); - - var pmaxmin = Math.trunc(pdurationAll / 60000) - (Math.floor(pdurationAll / 60000 / 60) * 60); - var pmaxsec = Math.floor(pdurationAll / 1000) - (Math.floor(pdurationAll / 1000 / 60) * 60); - - - if (pmaxsec < 10) { - pmaxsec = `0${pmaxsec}`; - } - - - if(pmaxhours != 0) { - - if (pmaxmin < 10) { - pmaxmin = `0${pmaxmin}`; - } - - - pmax = pmaxhours + ":" + pmaxmin + ":" + pmaxsec - } else { - pmax = pmaxmin + ":" + pmaxsec - - } - - var thumbnail = title.thumbnail - - if(!thumbnail) { - - thumbnail = "/images/black-image.svg" - } - - - PFormatduration = pmax - - if(title.duration == 9223372036854776000) { - - PFormatduration = " LIVE" - } - - contentToPush.push('

' + title.title + '

' + title.author + '

' + PFormatduration + '

Lire maintenant
Ajouter Ă  une playlist
Copier le lien

Ajouter Ă  une playlist

Selectionner la playlist

') - } - - if(contentToPush.join("") == "") { - - searchcontent.innerHTML = '

Aucun morceau trouvé !

' - - } else { - - searchcontent.innerHTML = contentToPush.join("") - } - - for(var title of data) { - - const add_to = document.getElementById(data.indexOf(title) + "_ladd") - const test_lmore = document.getElementById(data.indexOf(title) + "_lmore") - const testPopup = document.getElementById(data.indexOf(title) + "_popup") - const playNow = document.getElementById(data.indexOf(title) + "_playNow") - const copy = document.getElementById(data.indexOf(title) + "_copy") - const addPlaylist = document.getElementById(data.indexOf(title) + "_goPlaylist") - - const PlaylistManager = document.getElementById(data.indexOf(title) + "playlistManager") - const playlistManager_close = document.getElementById(data.indexOf(title) + "playlistManager_close") - const playlistSelection = document.getElementById(data.indexOf(title) + "playlistSelection") - const playlist_add_music = document.getElementById(data.indexOf(title) + "playlist_add_music") - const playlist_add_img = document.getElementById(data.indexOf(title) + "playlist_add_img") - const playlistAddSong = document.getElementById(data.indexOf(title) + "playlistAddSong") - - var thumbnail = data[add_to.id.replace("_ladd", "")].thumbnail - - if(!thumbnail) { - - thumbnail = "/images/black-image.svg" - } - - testPopup.style.display = "none" - - add_to.addEventListener("click", () => { - - send("ADD_SONG", data[add_to.id.replace("_ladd", "")]) - }) - - copy.addEventListener("click", () => { - navigator.clipboard.writeText(data[add_to.id.replace("_ladd", "")].uri) - testPopup.style.display = "none" - }) - - addPlaylist.addEventListener("click", () => { - - PlaylistManager.showModal() - playlist_add_music.innerHTML = data[add_to.id.replace("_ladd", "")].title - playlist_add_img.src = thumbnail - playlistSelection.innerHTML = playlistAvailable - }) - - playlistManager_close.addEventListener("click", () => { - - PlaylistManager.close() - }) - - playlistAddSong.addEventListener("click", () => { - - - PlaylistManager.close() - - socket.emit("SEND/ADD_SONG_TO_PLAYLIST", playlistSelection.value , data[add_to.id.replace("_ladd", "")]) - - }) - - test_lmore.addEventListener("click",( ) => { - - - testPopup.style.display = "flex" - testPopup.style.top = yMousePos + "px" - - }) - - testPopup.addEventListener("mouseleave", () => { - - testPopup.style.display = "none" - - }) - - playNow.addEventListener("click", () => { - - send("ADD_SONG_NOW", data[add_to.id.replace("_ladd", "")]) - - }) - - - - - } - - - } else { - - searchcontent.innerHTML = '

Aucun morceau trouvé !

' - - } - - } else { - - //https://www.youtube.com/playlist?list=PLA8VHLKYzqTvCcIKhsjGS41nG1zBpRZPy - - - var playlistToPush = new Array() - var playlist_songs = new Array() - - - for(var title of results.videos) { - - var PFormatduration = null - pdurationAll = title.milis_length - - const pmaxhours = Math.floor(pdurationAll / 3600000); - - var pmaxmin = Math.trunc(pdurationAll / 60000) - (Math.floor(pdurationAll / 60000 / 60) * 60); - var pmaxsec = Math.floor(pdurationAll / 1000) - (Math.floor(pdurationAll / 1000 / 60) * 60); - - - if (pmaxsec < 10) { - pmaxsec = `0${pmaxsec}`; - } - - - if(pmaxhours != 0) { - - if (pmaxmin < 10) { - pmaxmin = `0${pmaxmin}`; - } - - - pmax = pmaxhours + ":" + pmaxmin + ":" + pmaxsec - } else { - pmax = pmaxmin + ":" + pmaxsec - - } - - PFormatduration = pmax - - if(title.milis_length == 9223372036854776000) { - - PFormatduration = " LIVE" - } - - - playlist_songs.push('

' + title.title + '

' + title.author.name + '

' + PFormatduration + '

') - - } - - playlistToPush.push('

' + results.author.name + " - (" + results.videos.length + " titres)" + '

' + results.title + '


' + playlist_songs.join("")) - - if(playlistToPush.join("") == "") { - - searchcontent.innerHTML = '

Aucun morceau trouvé !

' - - } else { - - searchcontent.innerHTML = playlistToPush.join("") - - - } - - - - - for(var title of results.videos) { - - const add_to = document.getElementById(results.videos.indexOf(title) + "_padd") - const playNow = document.getElementById(results.videos.indexOf(title) + "_pplay") - - - add_to.addEventListener("click", () => { - - send("FP_ADD_SONG", results.videos[add_to.id.replace("_padd", "")].url) - }) - - playNow.addEventListener("click", () => { - - send("FP_ADD_SONG_NOW", results.videos[add_to.id.replace("_padd", "")].url) - - }) - - - - - } - } - - }) - - }) -}) - -function fp_play_playlist(key) { - - send("FP_PLAY_PLAYLIST", key) -} - - -var timeoutId = null - -socket.on("NOTIFICATION", (data) => { - - if(timeoutId) { - - clearTimeout(timeoutId) - } - - const alertDiv = document.getElementById("alert") - const alert_image = document.getElementById("alert_image") - const alert_text = document.getElementById("alert_text") - - alert_image.src = data.image_src - alert_text.innerHTML = data.text - - - - alertDiv.classList.add("alert_div_on") - - timeoutId = setTimeout(() => { - - alertDiv.classList.remove("alert_div_on") - }, 4000) - - alertDiv.addEventListener("click", () => { - - - if(timeoutId) { - - clearTimeout(timeoutId) - } - - - alertDiv.classList.remove("alert_div_on") - - }) -}) - - - - -const cPlaylistManager = document.getElementById("current_playlistManager") -const cplaylistManager_close = document.getElementById("current_playlistManager_close") -const cplaylistSelection = document.getElementById("current_playlistSelection") -const cplaylist_add_music = document.getElementById("current_playlist_add_music") -const cplaylist_add_img = document.getElementById("current_playlist_add_img") -const cplaylistAddSong = document.getElementById("current_playlistAddSong") - -takeCurrent.addEventListener("click", () => { - - if(currentSong != null) { - - var thumbnail = currentSong.thumbnail - - if(!thumbnail) { - - thumbnail = "/images/black-image.svg" - } - - cPlaylistManager.showModal() - cplaylist_add_music.innerHTML = currentSong.title - cplaylist_add_img.src = thumbnail - cplaylistSelection.innerHTML = playlistAvailable - - } - -}) - -cplaylistManager_close.addEventListener("click", () => { - - cPlaylistManager.close() -}) - -cplaylistAddSong.addEventListener("click", () => { - - - cPlaylistManager.close() - socket.emit("SEND/ADD_SONG_TO_PLAYLIST", cplaylistSelection.value , currentSong ) - - - -}) - - - -volBox.classList.add("invisible") -listBox.classList.add("invisible") - -list.addEventListener("click" , () => { - - volBox.classList.add("invisible") - - if(listBox.classList.contains('invisible')) { - listBox.classList.remove("invisible") - - } else { - - listBox.classList.add("invisible") - } -}) - -// Apply the width of element1 to element2 - - -vol.addEventListener("click", () => { - - listBox.classList.add("invisible") - - if(volBox.classList.contains('invisible')) { - volBox.classList.remove("invisible") - - } else { - - volBox.classList.add("invisible") - } - -}) - -volRange.addEventListener("click", () => { - - - send("VOLUME", volRange.value) -}) - -volRange.addEventListener("input", () => { - - - volTxt.innerHTML = volRange.value + "%" -}) - - - -disconnect.addEventListener("click", () => { - - get("DISCONNECT") -}) - - - - -reportBtn.addEventListener("click", () => { - - report_desc.value = "" - report_level.value = "Majeur" - report_dialog.showModal() -}) - -report_close.addEventListener("click", () => { - - report_dialog.close() -}) - -report_send.addEventListener("click", () => { - - send("REPORT", {"level":report_level.value, "desc": report_desc.value}) - report_dialog.close() -}) - -loop.addEventListener("click", () => { - - get("LOOP") -}) - -shuffle.addEventListener("click", () => { - - get("SHUFFLE") -}) - - - -var durationAll = 0 -var durationProgress = 0 -var isPlaying = false -let interval; - -durationBar.addEventListener("change", () => { - - send("SEEK", durationBar.value) - -}) - - -userInfo.then(user => { - - settingsBtn.style.display = "none" - - var betastar = "" - - if(user.beta) { - - betastar = "

BETA

" - } - - var textshadow = "" - - if(user.admin == true) { - - settingsBtn.style.display = "flex" - isAdmin = true - textshadow = 'box-shadow: #fcff4d 0px 0px 8px;' - } - - - - if(user.user.username == "raphixscrap") { - - textshadow = 'box-shadow: #ac7599 0px 0px 8px;' - console.log("RAPHIX !!! IS IN THE PLACE") - } - - - userInfoDiv.innerHTML = "

" + user.user.global_name + "

" + user.user.username + "

" + betastar + "
" - - -}) - - -userInfoDiv.addEventListener("click", () => { - - if(userInfoPopup.classList.contains("invisible")) { - - userInfoPopup.classList.remove("invisible") - userInfoPopup.style.left = (xMousePos - 110) + "px" - userInfoPopup.style.top = yMousePos + "px" - - } - -}) - -userInfoPopup.classList.add("invisible") - -userInfoPopup.addEventListener("mouseleave", () => { - - userInfoPopup.classList.add("invisible") -}) - - - - - -get("MUSIC_STATE").then(data => { - console.log(data) -}) - -play.addEventListener('click', () => { - - get("PAUSE") -}) - -document.body.onkeyup = function(e) { - - if ((e.key == " " || - e.code == "Space" || - e.keyCode == 32) && - e.srcElement.localName != "input" && e.srcElement.localName != "textarea" - ) { - play.click() - } - } - -backward.addEventListener('click', () => { - - get("BACKWARD") -}) - - -forward.addEventListener("click", () => { - - get("FORWARD") -}) - -socket.on("/ALWAYS/MUSIC_STATE", async (data) => { - - await disableDrag() - await enableDrag() - - stopInterval() - console.log(data) - - durationAll = 0 - durationProgress = 0 - isPlaying = false - - if(data.isOnline) { - - vol.classList.remove("disabled") - shuffle.classList.remove("disabled") - list.classList.remove("disabled") - play.classList.remove("pri_disable") - disconnect.classList.remove("invisible") - volRange.classList.add("disabled") - - volRange.disabled = false - } else { - - vol.classList.add("disabled") - shuffle.classList.add("disabled") - list.classList.add("disabled") - play.classList.add("pri_disable") - disconnect.classList.add("invisible") - volRange.classList.add("disabled") - volRange.disabled = true - volRange.value = 0 - volTxt.innerHTML = "0%" - volBox.classList.add("invisible") - - } - - if(data.volume) { - volRange.step = 1 - volRange.max = 200 - volRange.min = 1 - volRange.value = Math.trunc(data.volume / 10) - volTxt.innerHTML = Math.trunc(data.volume / 10) + "%" - - var volNum = Math.trunc(data.volume / 10) - - - - } else { - - volRange.classList.add("disabled") - volRange.disabled = true - volRange.value = 0 - volTxt.innerHTML = "0%" - } - - if(data.shuffle == true) { - shuffle.innerHTML = '' - - } else { - - shuffle.innerHTML = '' - } - - if(data.loop == true) { - loop.innerHTML = '' - - } else { - - loop.innerHTML = '' - } - - if(data.current == null) { - - musicURL.innerHTML = '' - musicTitle.innerHTML = "

Aucun titre joué

" - loop.classList.add("invisible") - takeCurrent.classList.add("invisible") - } else { - - var thumbnail = data.current.thumbnail - - if(!thumbnail) { - - thumbnail = "/images/black-image.svg" - } - - musicURL.innerHTML = '' - musicTitle.innerHTML = "

" + data.current.title + "

" - currentSong = data.current - takeCurrent.classList.remove("invisible") - loop.classList.remove("invisible") - } - - if(data.durationAll) { - durationBar.disabled = false - durationBar.classList.remove("grised") - setTime() - - durationAll = data.durationAll - durationProgress = data.durationNow - durationBar.value = durationProgress - setTime() - - } else { - - - isPlaying = false - durationAll = 0 - durationProgress = 0 - durationBar.disabled = true - durationBar.classList.add("grised") - durationBar.value = 0 - durationTextAct.innerHTML = "-:--" - durationTextTotal.innerHTML = "-:--" - - } - - - if(data.playing == 1) { - play.innerHTML = '' - isPlaying = true - startInterval() - } else { - - play.innerHTML = '' - isPlaying = false - - } - - - - if(data.current && data.playing == 0) { - setTime() - - } - - if(data.durationAll == 9223372036854776000) { - - isPlaying = false - durationAll = 0 - durationProgress = 0 - durationBar.disabled = true - durationBar.classList.add("grised") - durationBar.style.display = "none" - durationBar.value = 0 - durationTextAct.innerHTML = "" - durationTextTotal.innerHTML = " LIVE" - - } else { - - durationBar.style.display = "unset" - } - - - - if(data.queue != null) { - - var contentToPush = new Array() - var queueNum = 0 - - for(var title of data.queue) { - queueNum += 1 - console.log(queueNum) - console.log(data.queue.indexOf(title) + " - " + title.title) - var thumbnail = title.thumbnail - if(!thumbnail) { - - thumbnail = "/images/black-image.svg" - - } - contentToPush.push('

' + title.title + '

') - } - - if(contentToPush.join("") == "") { - - listNumber.classList.add("invisible") - listBox.innerHTML = '

Aucun morceau dans la liste de lecture !

' - - } else { - listNumber.innerHTML = '' + queueNum + '' - listNumber.classList.remove("invisible") - listBox.innerHTML = contentToPush.join("") - } - - //CODE INTEGER QUEUE LIST MOVE - - const container = document.getElementById('listBox'); - const draggableItems = document.querySelectorAll('.draggable'); - - let draggingElement = null; - - draggableItems.forEach(item => { - item.addEventListener('dragstart', (e) => { - e.dataTransfer.setData('text/plain', item.innerHTML); - draggingElement = item; - }); - - item.addEventListener('dragend', () => { - draggingElement = null; - setTimeout(() => { - item.style.display = 'flex'; // Restaure l'affichage de l'élément - }, 0); - updateOrder(); - }); - }); - - container.addEventListener('dragover', (e) => { - e.preventDefault(); - const afterElement = getDragAfterElement(container, e.clientY); - if (draggingElement !== null) { - if (afterElement == null) { - container.appendChild(draggingElement); - } else { - const rect = afterElement.getBoundingClientRect(); - if (e.clientY < rect.top + rect.height / 2) { - container.insertBefore(draggingElement, afterElement); - } else { - container.insertBefore(draggingElement, afterElement.nextElementSibling); - } - } - } - }); - - function getDragAfterElement(container, y) { - const draggableElements = [...container.querySelectorAll('.draggable:not(.dragging)')]; - return draggableElements.reduce((closest, child) => { - const box = child.getBoundingClientRect(); - const offset = y - box.top - box.height / 2; - if (offset < 0 && offset > closest.offset) { - return { offset: offset, element: child }; - } else { - return closest; - } - }, { offset: Number.NEGATIVE_INFINITY, element: null }).element; - } - - function updateOrder() { - const draggableItems = document.querySelectorAll('.draggable'); - const order = []; - draggableItems.forEach(item => { - order.push(item.id.replace("_queue_song", "")); - }); - console.log('Ordre des divs:', order); - send("MOVE_QUEUE_BY_ENTIRE", order) - } - - - - // END OF CODE INTEGER - - for(var title of data.queue) { - - console.log(data.queue.indexOf(title) + " - " + title.title) - - const titleBtn = document.getElementById(data.queue.indexOf(title)+ "_ldelete") - const moveBtn = document.getElementById(data.queue.indexOf(title)+ "_lmove") - - titleBtn.addEventListener("click", () => { - - socket.emit("SEND/DELETE_QUEUE", titleBtn.id.replace("_ldelete", ""), data.queue[moveBtn.id.replace("_lmove", "")].title ) - }) - - moveBtn.addEventListener("click", () => { - - send("MOVE_QUEUE", moveBtn.id.replace("_lmove", "")) - - }) - } - - - } else { - - listBox.innerHTML = '

Lancez un titre et ajoutez vos morceaux ici !

' - listNumber.classList.add("invisible") - } - -}) - -function startInterval() { - interval = setInterval(() => { - - - if(isPlaying == true) { - setTime() - - } - - }, 1000) - -} - -function stopInterval() { - clearInterval(interval); -} - - - - - - -function setTime() { - - - durationBar.max = durationAll - durationProgress += 1000 - durationBar.value = durationProgress - - - const maxhours = Math.floor(durationAll / 3600000); - const nowhours = Math.floor(durationProgress / 3600000); - - - - var maxmin = Math.trunc(durationAll / 60000) - (Math.floor(durationAll / 60000 / 60) * 60); - var maxsec = Math.floor(durationAll / 1000) - (Math.floor(durationAll / 1000 / 60) * 60); - var nowmin = Math.trunc(durationProgress / 60000) - (Math.floor(durationProgress / 60000 / 60) * 60); - var nowsec = Math.floor(durationProgress / 1000) - (Math.floor(durationProgress / 1000 / 60) * 60); - - console.log(durationAll) - console.log(durationProgress) - console.log("---------------------") - - var now = "" - var max = "" - - - if (maxmin < 10) { - maxmin = `0${maxmin}`; - } - - if (nowmin < 10) { - nowmin = `0${nowmin}`; - } - - if (maxsec < 10) { - maxsec = `0${maxsec}`; - } - - if (nowsec < 10) { - nowsec = `0${nowsec}`; - } - - if(maxhours != 0) { - - max = maxhours + ":" + maxmin + ":" + maxsec - } else { - max = maxmin + ":" + maxsec - - } - - if(nowhours != 0) { - - now = nowhours + ":" + nowmin + ":" + nowsec - } else { - now = nowmin + ":" + nowsec - - } - - - - durationTextAct.innerHTML = now - durationTextTotal.innerHTML = max -} - - - -function disableDrag() { - // Ajoutez un gestionnaire d'événement pour l'événement dragover - document.addEventListener('dragover', function (e) { - e.preventDefault(); // Empêche le comportement par défaut du navigateur - }); - - // Ajoutez un gestionnaire d'événement pour l'événement drop - document.addEventListener('drop', function (e) { - e.preventDefault(); // Empêche le comportement par défaut du navigateur - }); -} - - - -// Pour réactiver le drag-and-drop, vous pouvez supprimer les gestionnaires d'événements -function enableDrag() { - // Supprimez le gestionnaire d'événement pour l'événement dragover - document.removeEventListener('dragover', function (e) { - e.preventDefault(); // Empêche le comportement par défaut du navigateur - }); - - // Supprimez le gestionnaire d'événement pour l'événement drop - document.removeEventListener('drop', function (e) { - e.preventDefault(); // Empêche le comportement par défaut du navigateur - }); -} - diff --git a/src/web/public/javascript/__login_script.js b/src/web/public/javascript/__login_script.js deleted file mode 100644 index b1b43c6..0000000 --- a/src/web/public/javascript/__login_script.js +++ /dev/null @@ -1,11 +0,0 @@ -const loginBtn = document.getElementById("loginBtn") - -loginBtn.addEventListener("click", () => { - - const discordLink = get("DISCORD_LOGIN_LINK") - discordLink.then(link => { - - window.location.href = link - }) - -}) \ No newline at end of file diff --git a/src/web/public/javascript/basics.js b/src/web/public/javascript/basics.js new file mode 100644 index 0000000..a990651 --- /dev/null +++ b/src/web/public/javascript/basics.js @@ -0,0 +1,187 @@ +/** + * @param {string} id + * @returns element + */ +function getID(id) { + return document.getElementById(id); +} + +// Get The position of the mouse + +var xMousePos = 0; +var yMousePos = 0; + +document.onmousemove = function(e) +{ + xMousePos = e.clientX + window.scrollX; + yMousePos = e.clientY + window.scrollY; + +} + +function disableDrag() { + // Ajoutez un gestionnaire d'événement pour l'événement dragover + document.addEventListener('dragover', function (e) { + e.preventDefault(); // Empêche le comportement par défaut du navigateur + }); + + // Ajoutez un gestionnaire d'événement pour l'événement drop + document.addEventListener('drop', function (e) { + e.preventDefault(); // Empêche le comportement par défaut du navigateur + }); +} + + + +// Pour réactiver le drag-and-drop, vous pouvez supprimer les gestionnaires d'événements +function enableDrag() { + // Supprimez le gestionnaire d'événement pour l'événement dragover + document.removeEventListener('dragover', function (e) { + e.preventDefault(); // Empêche le comportement par défaut du navigateur + }); + + // Supprimez le gestionnaire d'événement pour l'événement drop + document.removeEventListener('drop', function (e) { + e.preventDefault(); // Empêche le comportement par défaut du navigateur + }); +} + + +function startInterval() { + interval = setInterval(() => { + + + if(isPlaying == true) { + setTime() + + } + + }, 1000) + +} + +function stopInterval() { + clearInterval(interval); +} + + + +function setTime() { + + + durationBar.max = durationAll + durationProgress += 1000 + durationBar.value = durationProgress + + + const maxhours = Math.floor(durationAll / 3600000); + const nowhours = Math.floor(durationProgress / 3600000); + + + + var maxmin = Math.trunc(durationAll / 60000) - (Math.floor(durationAll / 60000 / 60) * 60); + var maxsec = Math.floor(durationAll / 1000) - (Math.floor(durationAll / 1000 / 60) * 60); + var nowmin = Math.trunc(durationProgress / 60000) - (Math.floor(durationProgress / 60000 / 60) * 60); + var nowsec = Math.floor(durationProgress / 1000) - (Math.floor(durationProgress / 1000 / 60) * 60); + + console.log(durationAll) + console.log(durationProgress) + console.log("---------------------") + + var now = "" + var max = "" + + + if (maxmin < 10) { + maxmin = `0${maxmin}`; + } + + if (nowmin < 10) { + nowmin = `0${nowmin}`; + } + + if (maxsec < 10) { + maxsec = `0${maxsec}`; + } + + if (nowsec < 10) { + nowsec = `0${nowsec}`; + } + + if(maxhours != 0) { + + max = maxhours + ":" + maxmin + ":" + maxsec + } else { + max = maxmin + ":" + maxsec + + } + + if(nowhours != 0) { + + now = nowhours + ":" + nowmin + ":" + nowsec + } else { + now = nowmin + ":" + nowsec + + } + + + + durationTextAct.innerHTML = now + durationTextTotal.innerHTML = max +} + +function getTimeCode(pdurationAll) { + var pmax = "" + + + const pmaxhours = Math.floor(pdurationAll / 3600000); + + var pmaxmin = Math.trunc(pdurationAll / 60000) - (Math.floor(pdurationAll / 60000 / 60) * 60); + var pmaxsec = Math.floor(pdurationAll / 1000) - (Math.floor(pdurationAll / 1000 / 60) * 60); + + + if (pmaxsec < 10) { + pmaxsec = `0${pmaxsec}`; + } + + + if(pmaxhours != 0) { + + if (pmaxmin < 10) { + pmaxmin = `0${pmaxmin}`; + } + + + pmax = pmaxhours + ":" + pmaxmin + ":" + pmaxsec + } else { + pmax = pmaxmin + ":" + pmaxsec + + } + return pmax +} + +function loadHome() { + + userLocation = "home" + + mainView.innerHTML = WelcomeContent + + get("ALL_CONNECTED_USER") + get("ALL_RADIO") + + + +} + +const buttons = document.querySelectorAll(".sside_line"); + + buttons.forEach(button => { + button.addEventListener("click", function () { + buttons.forEach(btn => { + if (btn === button) { + btn.style.color = "white"; + } else { + btn.style.color = ""; + } + }); + }); + }); \ No newline at end of file diff --git a/src/web/public/javascript/indexscript.js b/src/web/public/javascript/indexscript.js new file mode 100644 index 0000000..1fa1629 --- /dev/null +++ b/src/web/public/javascript/indexscript.js @@ -0,0 +1,137 @@ + +updateUsersPictures() + +AlwaysRequest("UPDATE_SELF", () => { + updateUsersPictures() +}) + +function updateUsersPictures() { + + const userInfo = get("USER_INFO") + + userInfo.then(user => { + + settingsBtn.style.display = "none" + + if(user.admin == true) { + + settingsBtn.style.display = "flex" + userAdmin = true + } + + userInfoDiv.innerHTML = "

" + user.user.global_name + "

" + user.user.username + "

" + "
" + + + }) +} + + + + +userInfoDiv.addEventListener("click", () => { + + if(userInfoPopup.classList.contains("invisible")) { + + userInfoPopup.classList.remove("invisible") + userInfoPopup.style.left = (xMousePos - 110) + "px" + userInfoPopup.style.top = yMousePos + "px" + + } + +}) + +userInfoPopup.classList.add("invisible") + +userInfoPopup.addEventListener("mouseleave", () => { + + userInfoPopup.classList.add("invisible") +}) + +// Load users connected + +AlwaysRequest("ALL_CONNECTED_USER", (data) => { + if(userLocation == "home") { + + const website_list = document.getElementById("website_list") + const userToPush = new Array() + + userToPush.push("

Utilisateurs connecté(es)

") + + for(var user of data) { + + userToPush.push(`

${user.global_name}

${user.username}

`) + + } + + website_list.innerHTML = userToPush.join("") + + } + +}) + + + +var timeoutId = null + +socket.on("NOTIFICATION", (data) => { + + if(timeoutId) { + + clearTimeout(timeoutId) + } + + const notifDiv = document.getElementById("notif") + const notif_image = document.getElementById("notif_image") + const notif_text = document.getElementById("notif_text") + + notif_image.src = data.image_src + notif_text.innerHTML = data.text + + + + notifDiv.classList.add("notif_div_on") + + timeoutId = setTimeout(() => { + + notifDiv.classList.remove("notif_div_on") + }, 4000) + + notifDiv.addEventListener("click", () => { + + + if(timeoutId) { + + clearTimeout(timeoutId) + } + + + notifDiv.classList.remove("notif_div_on") + + }) +}) + + +// Window Selector + + + +homeBtn.style.color = "white" + +homeBtn.addEventListener("click", () => { + + loadHome() + +}) + +// Restart + + +restartBtn.addEventListener("click", () => { + + get("RESTART") +}) + + +// Start Operation + +loadHome() \ No newline at end of file diff --git a/src/web/public/javascript/login-script.js b/src/web/public/javascript/login-script.js new file mode 100644 index 0000000..383336b --- /dev/null +++ b/src/web/public/javascript/login-script.js @@ -0,0 +1,9 @@ +const loginBtn = document.getElementById("loginBtn") + +loginBtn.addEventListener("click", () => { + + + window.location.href = "/internal/discordlink" + + +}) \ No newline at end of file diff --git a/src/web/public/javascript/middle.js b/src/web/public/javascript/middle.js new file mode 100644 index 0000000..def9f07 --- /dev/null +++ b/src/web/public/javascript/middle.js @@ -0,0 +1,68 @@ +const userInfoDiv = getID("userInfo") +const userInfoPopup = getID("userPopup") +const userInfoglobal = getID("userInfoglobal") + +const musicTitle = getID("music_title") +const musicURL = getID("music_img") + +const durationBar = getID("duration") +const durationTextAct = getID("durationTextAct") +const durationTextTotal = getID("durationTextTotal") + +const backward = getID("backward") +const play = getID("play") +const forward = getID("forward") + +const settingsBtn = getID("settings_btn") + +const loop = getID("loop") +const vol = getID("volbtn") +const shuffle = getID("shuffle") +const list = getID("list_btn") +const takeCurrent = getID("takeCurrent") + +const volBox = getID("volumeBox") +const volTxt = getID("volumeTxt") +const volDiv = getID("volDiv") +const volRange = getID("volumeInput") + +const listBox = getID("listBox") +const listNumber = getID("listNumber") + +const disconnect = getID("disconnect") + +const report_dialog = getID("report_dialog") +const report_close = getID("report_close") +const reportBtn = getID("reportBtn") +const report_level = getID("report_level") +const report_desc = getID("report_desc") +const report_send = getID("report_send") + +const searchBtn = getID("search_btn") +const homeBtn = getID("home_btn") +const mainView = getID("mainView") + +const restartBtn = getID("restartBtn") +const WelcomeContent = mainView.firstElementChild.outerHTML +const playlistContent = getID("playlist-content") + + + +// Get the current location of the user +var userLocation = "home" +var userAdmin = false + +// Player + +var durationAll = 0 +var durationProgress = 0 +var isPlaying = false +let interval; + +// Playlist + +var playlistSelected = null +var playlistValue = null +var deleteJustBefore = null +var currentSong = null +var playlistAvailable = null \ No newline at end of file diff --git a/src/web/public/javascript/player.js b/src/web/public/javascript/player.js new file mode 100644 index 0000000..ba66c8f --- /dev/null +++ b/src/web/public/javascript/player.js @@ -0,0 +1,371 @@ +AlwaysRequest("MUSIC_STATE", async (data) => { + await disableDrag() + await enableDrag() + + stopInterval() + console.log(data) + + durationAll = 0 + durationProgress = 0 + isPlaying = false + + if(data.isOnline) { + + vol.classList.remove("disabled") + shuffle.classList.remove("disabled") + list.classList.remove("disabled") + play.classList.remove("pri_disable") + disconnect.classList.remove("invisible") + volRange.classList.add("disabled") + + volRange.disabled = false + } else { + + vol.classList.add("disabled") + shuffle.classList.add("disabled") + list.classList.add("disabled") + play.classList.add("pri_disable") + disconnect.classList.add("invisible") + volRange.classList.add("disabled") + volRange.disabled = true + volRange.value = 0 + volTxt.innerHTML = "0%" + volBox.classList.add("invisible") + + } + + if(data.volume) { + volRange.step = 1 + volRange.max = 200 + volRange.min = 1 + volRange.value = Math.trunc(data.volume / 10) + volTxt.innerHTML = Math.trunc(data.volume / 10) + "%" + + var volNum = Math.trunc(data.volume / 10) + + + + } else { + + volRange.classList.add("disabled") + volRange.disabled = true + volRange.value = 0 + volTxt.innerHTML = "0%" + } + + if(data.shuffle == true) { + shuffle.innerHTML = '' + + } else { + + shuffle.innerHTML = '' + } + + if(data.loop == true) { + loop.innerHTML = '' + + } else { + + loop.innerHTML = '' + } + + if(data.current == null) { + + musicURL.innerHTML = '' + musicTitle.innerHTML = "

Aucun titre joué

" + loop.classList.add("invisible") + takeCurrent.classList.add("invisible") + } else { + + var thumbnail = data.current.thumbnail + + if(!thumbnail) { + + thumbnail = "/images/black-image.svg" + } + + musicURL.innerHTML = '' + musicTitle.innerHTML = "

" + data.current.title + "

" + currentSong = data.current + takeCurrent.classList.remove("invisible") + loop.classList.remove("invisible") + } + + if(data.durationAll) { + durationBar.disabled = false + durationBar.classList.remove("grised") + setTime() + + durationAll = data.durationAll + durationProgress = data.durationNow + durationBar.value = durationProgress + setTime() + + } else { + + + isPlaying = false + durationAll = 0 + durationProgress = 0 + durationBar.disabled = true + durationBar.classList.add("grised") + durationBar.value = 0 + durationTextAct.innerHTML = "-:--" + durationTextTotal.innerHTML = "-:--" + + } + + + if(data.playing == 1) { + play.innerHTML = '' + isPlaying = true + startInterval() + } else { + + play.innerHTML = '' + isPlaying = false + + } + + + + if(data.current && data.playing == 0) { + setTime() + + } + + if(data.durationAll == 9223372036854776000) { + + isPlaying = false + durationAll = 0 + durationProgress = 0 + durationBar.disabled = true + durationBar.classList.add("grised") + durationBar.style.display = "none" + durationBar.value = 0 + durationTextAct.innerHTML = "" + durationTextTotal.innerHTML = " LIVE" + + } else { + + durationBar.style.display = "unset" + } + + + + if(data.queue != null) { + + var contentToPush = new Array() + var queueNum = 0 + + for(var title of data.queue) { + queueNum += 1 + console.log(queueNum) + console.log(data.queue.indexOf(title) + " - " + title.title) + var thumbnail = title.thumbnail + if(!thumbnail) { + + thumbnail = "/images/black-image.svg" + + } + contentToPush.push('

' + title.title + '

') + } + + if(contentToPush.join("") == "") { + + listNumber.classList.add("invisible") + listBox.innerHTML = '

Aucun morceau dans la liste de lecture !

' + + } else { + listNumber.innerHTML = '' + queueNum + '' + listNumber.classList.remove("invisible") + listBox.innerHTML = contentToPush.join("") + } + + //CODE INTEGER QUEUE LIST MOVE + + const container = document.getElementById('listBox'); + const draggableItems = document.querySelectorAll('.draggable'); + + let draggingElement = null; + + draggableItems.forEach(item => { + item.addEventListener('dragstart', (e) => { + e.dataTransfer.setData('text/plain', item.innerHTML); + draggingElement = item; + }); + + item.addEventListener('dragend', () => { + draggingElement = null; + setTimeout(() => { + item.style.display = 'flex'; // Restaure l'affichage de l'élément + }, 0); + updateOrder(); + }); + }); + + container.addEventListener('dragover', (e) => { + e.preventDefault(); + const afterElement = getDragAfterElement(container, e.clientY); + if (draggingElement !== null) { + if (afterElement == null) { + container.appendChild(draggingElement); + } else { + const rect = afterElement.getBoundingClientRect(); + if (e.clientY < rect.top + rect.height / 2) { + container.insertBefore(draggingElement, afterElement); + } else { + container.insertBefore(draggingElement, afterElement.nextElementSibling); + } + } + } + }); + + function getDragAfterElement(container, y) { + const draggableElements = [...container.querySelectorAll('.draggable:not(.dragging)')]; + return draggableElements.reduce((closest, child) => { + const box = child.getBoundingClientRect(); + const offset = y - box.top - box.height / 2; + if (offset < 0 && offset > closest.offset) { + return { offset: offset, element: child }; + } else { + return closest; + } + }, { offset: Number.NEGATIVE_INFINITY, element: null }).element; + } + + function updateOrder() { + const draggableItems = document.querySelectorAll('.draggable'); + const order = []; + draggableItems.forEach(item => { + order.push(item.id.replace("_queue_song", "")); + }); + console.log('Ordre des divs:', order); + post("MOVE_QUEUE_BY_ENTIRE", order) + } + + + + // END OF CODE INTEGER + + for(var title of data.queue) { + + console.log(data.queue.indexOf(title) + " - " + title.title) + + const titleBtn = document.getElementById(data.queue.indexOf(title)+ "_ldelete") + const moveBtn = document.getElementById(data.queue.indexOf(title)+ "_lmove") + + titleBtn.addEventListener("click", () => { + + post("DELETE_QUEUE", titleBtn.id.replace("_ldelete", ""), data.queue[moveBtn.id.replace("_lmove", "")].title ) + }) + + moveBtn.addEventListener("click", () => { + + post("MOVE_QUEUE", moveBtn.id.replace("_lmove", "")) + + }) + } + + + } else { + + listBox.innerHTML = '

Lancez un titre et ajoutez vos morceaux ici !

' + listNumber.classList.add("invisible") + } + +}) + + + +play.addEventListener('click', () => { + + get("PAUSE") +}) + +document.body.onkeyup = function(e) { + + if ((e.key == " " || + e.code == "Space" || + e.keyCode == 32) && + e.srcElement.localName != "input" && e.srcElement.localName != "textarea" + ) { + play.click() + } + } + +backward.addEventListener('click', () => { + + get("BACKWARD") +}) + + +forward.addEventListener("click", () => { + + get("FORWARD") +}) + +volBox.classList.add("invisible") +listBox.classList.add("invisible") + +list.addEventListener("click" , () => { + + volBox.classList.add("invisible") + + if(listBox.classList.contains('invisible')) { + listBox.classList.remove("invisible") + + } else { + + listBox.classList.add("invisible") + } +}) + +vol.addEventListener("click", () => { + + listBox.classList.add("invisible") + + if(volBox.classList.contains('invisible')) { + volBox.classList.remove("invisible") + + } else { + + volBox.classList.add("invisible") + } + +}) + +volRange.addEventListener("click", () => { + + + post("VOLUME", volRange.value) +}) + +volRange.addEventListener("input", () => { + + + volTxt.innerHTML = volRange.value + "%" +}) + +loop.addEventListener("click", () => { + + get("LOOP") +}) + +shuffle.addEventListener("click", () => { + + get("SHUFFLE") +}) + + +disconnect.addEventListener("click", () => { + + get("DISCONNECT") +}) + + +durationBar.addEventListener("change", () => { + + post("SEEK", durationBar.value) + +}) \ No newline at end of file diff --git a/src/web/public/javascript/playlist.js b/src/web/public/javascript/playlist.js new file mode 100644 index 0000000..2d87301 --- /dev/null +++ b/src/web/public/javascript/playlist.js @@ -0,0 +1,312 @@ +function delPlayList(key) { + + post("DELETE_PLAYLIST", key) + mainView.innerHTML = WelcomeContent + playlistSelected = null + playlistValue = null + +} + + +function playPlayList(key) { + + post("PLAY_PLAYLIST", key) + + +} + +function sendPlayList(key) { + + const playlist_popup = document.getElementById("playlist_popup") + + if(playlist_popup) { + + get("USER_LIST").then(resp => { + + const userToPush = new Array() + + for(var user of resp) { + + userToPush.push(``) + + } + + playlist_popup.innerHTML = userToPush.join("") + playlist_popup.style.width = '170px' + playlist_popup.style.top = (yMousePos - 30) + "px" + playlist_popup.style.left = (xMousePos - 165) + "px" + playlist_popup.style.overflowY = "auto"; + playlist_popup.style.height = "250px" + playlist_popup.classList.remove("invisible") + + + playlist_popup.addEventListener("mouseleave", () => { + + playlist_popup.classList.add("invisible") + + }) + + for(var user of resp) { + + const userElement = document.getElementById(resp.indexOf(user)) + + userElement.addEventListener("click", () => { + + playlist_popup.classList.add("invisible") + post("SEND_PLAYLIST", {key: key, dest: resp[userElement.id].id}) + }) + } + + //post("SEND_PLAYLIST", key, user.id) + + }) + } + + + +} + + +function loadPlaylist(key, value) { + + userLocation = "playlist" + + var playlistToPush = new Array() + var playlist_songs = new Array() + + playlistSelected = key + playlistValue = value + + for(var title of value) { + + var PFormatduration = getTimeCode(title.duration) + + var thumbnail = title.thumbnail + + if(!thumbnail) { + + thumbnail = "/images/black-image.svg" + + } + + if(title.duration == 9223372036854776000) { + + PFormatduration = " LIVE" + } + + playlist_songs.push('

' + title.title + '

' + title.author + '

' + PFormatduration + '

') + + } + + + + playlistToPush.push(``) + playlistToPush.push('

' + key + '


' + playlist_songs.join("")) + + if(playlistToPush.join("") == "") { + + mainView.innerHTML = '

Aucun morceau trouvé !

' + + } else { + + mainView.innerHTML = playlistToPush.join("") + + + } + + for(var title of value) { + + const add_to = document.getElementById(value.indexOf(title) + "_padd") + const playNow = document.getElementById(value.indexOf(title) + "_pplay") + const deleteBtn = document.getElementById(value.indexOf(title) + "_pdelete") + + add_to.addEventListener("click", () => { + + post("ADD_SONG", value[add_to.id.replace("_padd", "")]) + }) + + playNow.addEventListener("click", () => { + + post("ADD_SONG_NOW", value[add_to.id.replace("_padd", "")]) + + }) + + deleteBtn.addEventListener("click", () => { + + deleteJustBefore = true + post("DELETE_SONG_TO_PLAYLIST", {data: key, song: value[add_to.id.replace("_padd", "")]}) + + }) + + + } + +} + +function fp_play_playlist(key) { + + post("FP_PLAY_PLAYLIST", key) +} + +socket.on("DO_UPDATE_PLAYLIST", () => { + + get("PLAYLIST") +}) + +get("PLAYLIST") + + +socket.on("ANSWER/GET/PLAYLIST", (data) => { + var contentToPush = new Array() + var selectionData = new Array() + + contentToPush.push(`

Mes Playlists

`) + contentToPush.push('
Créer une playlist
') + + + for (const [key, value] of Object.entries(data)) { + + contentToPush.push('

' + key + '

') + selectionData.push('') + } + + + + + if(contentToPush.join("") == "") { + + playlistContent.innerHTML = '

Aucun morceau trouvé !

' + + } else { + + playlistContent.innerHTML = contentToPush.join("") + playlistAvailable = selectionData + } + + if(playlistSelected && deleteJustBefore || playlistSelected && userLocation == "playlist") { + deleteJustBefore = null + loadPlaylist(playlistSelected, data[playlistSelected]) + } + + for (const [key, value] of Object.entries(data)) { + + const playlist_selector = document.getElementById(key + '_playlist') + + playlist_selector.addEventListener("click", () => { + + loadPlaylist(key, value) + userLocation = "playlist" + + }) + } + + const buttons = document.querySelectorAll(".checker"); + + buttons.forEach(button => { + button.addEventListener("click", function () { + buttons.forEach(btn => { + if (btn === button) { + btn.style.color = "white"; + } else { + btn.style.color = ""; + } + }); + }); + }); + + + const addPlaylist = document.getElementById("createPlaylist") + const addPlaylist_dialog = document.getElementById("createPlaylist_dialog") + const addPlaylist_close = document.getElementById("createPlaylist_close") + const apText = document.getElementById("apText") + const apInfo = document.getElementById("apInfo") + const apCreate = document.getElementById("apCreate") + + + addPlaylist_close.addEventListener("click", () => { + apInfo.innerHTML = "" + addPlaylist_dialog.close() + }) + + addPlaylist.addEventListener("click", () => { + + apText.innerHTML = "" + addPlaylist_dialog.showModal() + }) + + apCreate.addEventListener("click", () => { + apInfo.innerHTML = "" + var wrongName = true + + const refusedChar = ['\\','/' ,':' ,'*','?' ,'"','<','>','|'] + + for(var char of refusedChar) { + + if(apText.value.includes(char)) { + wrongName = false + + } + } + + if(apText.value != "" && apText.value != " " && wrongName) { + + addPlaylist_dialog.close() + post("CREATE_PLAYLIST", apText.value) + } else { + + apInfo.innerHTML = "Le nom n'est pas valide !" + } + + + }) + + + + console.log(data) +}) + + + +// Current Playlist and Song + +const cPlaylistManager = document.getElementById("current_playlistManager") +const cplaylistManager_close = document.getElementById("current_playlistManager_close") +const cplaylistSelection = document.getElementById("current_playlistSelection") +const cplaylist_add_music = document.getElementById("current_playlist_add_music") +const cplaylist_add_img = document.getElementById("current_playlist_add_img") +const cplaylistAddSong = document.getElementById("current_playlistAddSong") + +takeCurrent.addEventListener("click", () => { + + if(currentSong != null) { + + var thumbnail = currentSong.thumbnail + + if(!thumbnail) { + + thumbnail = "/images/black-image.svg" + } + + cPlaylistManager.showModal() + cplaylist_add_music.innerHTML = currentSong.title + cplaylist_add_img.src = thumbnail + cplaylistSelection.innerHTML = playlistAvailable + + } + +}) + +cplaylistManager_close.addEventListener("click", () => { + + cPlaylistManager.close() +}) + +cplaylistAddSong.addEventListener("click", () => { + + + cPlaylistManager.close() + post("ADD_SONG_TO_PLAYLIST", {data: cplaylistSelection.value , song: currentSong} ) + + + +}) \ No newline at end of file diff --git a/src/web/public/javascript/radios.js b/src/web/public/javascript/radios.js new file mode 100644 index 0000000..015e235 --- /dev/null +++ b/src/web/public/javascript/radios.js @@ -0,0 +1,100 @@ +AlwaysRequest("ALL_RADIO", (resp) => { + if(userLocation == "home") { + + const radio_list = document.getElementById("radio_list") + const radioToPush = new Array() + + radioToPush.push("

Radio

") + radioToPush.push(` + +
+

Ajout d'une radio

+ +
+

+ +
+

URL

+ + +
+
+ `) + + + + for(var title of resp ) { + + var thumbnail = title.thumbnail + if(!thumbnail) { + + thumbnail = "/images/black-image.svg" + + } + + radioToPush.push(`

${title.title} - ${title.author}

`) + + } + + if(userAdmin) { + + radioToPush.push(` +
Ajouter une radio
`) + } + + radio_list.innerHTML = radioToPush.join("") + + if(userAdmin) { + + const radio_dialog = document.getElementById("radio_dialog") + const radio_close = document.getElementById("radio_close") + const radio_send = document.getElementById("radio_send") + const radio_add = document.getElementById("radio_add") + const radio_info = document.getElementById("radio_info") + const radio_host = document.getElementById("radio_host") + + if(radio_add) { + radio_add.addEventListener("click", () => { + radio_info.innerHTML = "" + radio_host.value = "" + radio_dialog.showModal() + }) + + radio_close.addEventListener("click", () => { + radio_info.innerHTML = "" + radio_dialog.close() + }) + + radio_send.addEventListener("click", () => { + if(radio_host.value != '') { + + post("RADIO/ADD", radio_host.value) + radio_dialog.close() + } else { + + radio_info.innerHTML = "Remplissez une URL !" + } + + }) + + } + + } + + for(var title of resp ) { + + const playBtn = document.getElementById(resp.indexOf(title) +'_radio_pplay') + + playBtn.addEventListener("click", () => { + + post("ADD_SONG_NOW", resp[playBtn.id.replace("_radio_pplay", "")]) + + }) + } + + + } + +}) + + diff --git a/src/web/public/javascript/report.js b/src/web/public/javascript/report.js new file mode 100644 index 0000000..0ef57b6 --- /dev/null +++ b/src/web/public/javascript/report.js @@ -0,0 +1,18 @@ + +reportBtn.addEventListener("click", () => { + + report_desc.value = "" + report_level.value = "Majeur" + report_dialog.showModal() +}) + +report_close.addEventListener("click", () => { + + report_dialog.close() +}) + +report_send.addEventListener("click", () => { + + post("REPORT", {"level":report_level.value, "desc": report_desc.value}) + report_dialog.close() +}) \ No newline at end of file diff --git a/src/web/public/javascript/search.js b/src/web/public/javascript/search.js new file mode 100644 index 0000000..ac1ca84 --- /dev/null +++ b/src/web/public/javascript/search.js @@ -0,0 +1,214 @@ + +searchBtn.addEventListener("click", () => { + + mainView.innerHTML = '
' + const searchBar = document.getElementById("searchBar") + const searchcontent = document.getElementById("search_content") + + searchBar.addEventListener("change", () => { + + + post("SEARCH", searchBar.value).then(answerOfResult => { + + var results = answerOfResult.results + var playlistReconnised = answerOfResult.playlist + + if(searchBar.value.includes("https://") || searchBar.value.includes("http://")) { + + searchBar.value= "" + } + + if(!playlistReconnised) { + + if(results.tracks != null) { + const data = results.tracks + + console.log(data) + var contentToPush = new Array() + + for(var title of data) { + + + + var thumbnail = title.thumbnail + + if(!thumbnail) { + + thumbnail = "/images/black-image.svg" + } + + + var PFormatduration = getTimeCode(title.duration) + + if(title.duration == 9223372036854776000) { + + PFormatduration = " LIVE" + } + + contentToPush.push('

' + title.title + '

' + title.author + '

' + PFormatduration + '

Lire maintenant
Ajouter Ă  une playlist
Copier le lien

Ajouter Ă  une playlist

Selectionner la playlist

') + } + + if(contentToPush.join("") == "") { + + searchcontent.innerHTML = '

Aucun morceau trouvé !

' + + } else { + + searchcontent.innerHTML = contentToPush.join("") + } + + for(var title of data) { + + const add_to = document.getElementById(data.indexOf(title) + "_ladd") + const test_lmore = document.getElementById(data.indexOf(title) + "_lmore") + const testPopup = document.getElementById(data.indexOf(title) + "_popup") + const playNow = document.getElementById(data.indexOf(title) + "_playNow") + const copy = document.getElementById(data.indexOf(title) + "_copy") + const addPlaylist = document.getElementById(data.indexOf(title) + "_goPlaylist") + + const PlaylistManager = document.getElementById(data.indexOf(title) + "playlistManager") + const playlistManager_close = document.getElementById(data.indexOf(title) + "playlistManager_close") + const playlistSelection = document.getElementById(data.indexOf(title) + "playlistSelection") + const playlist_add_music = document.getElementById(data.indexOf(title) + "playlist_add_music") + const playlist_add_img = document.getElementById(data.indexOf(title) + "playlist_add_img") + const playlistAddSong = document.getElementById(data.indexOf(title) + "playlistAddSong") + + var thumbnail = data[add_to.id.replace("_ladd", "")].thumbnail + + if(!thumbnail) { + + thumbnail = "/images/black-image.svg" + } + + testPopup.style.display = "none" + + add_to.addEventListener("click", () => { + + post("ADD_SONG", data[add_to.id.replace("_ladd", "")]) + }) + + copy.addEventListener("click", () => { + navigator.clipboard.writeText(data[add_to.id.replace("_ladd", "")].uri) + testPopup.style.display = "none" + }) + + addPlaylist.addEventListener("click", () => { + + PlaylistManager.showModal() + playlist_add_music.innerHTML = data[add_to.id.replace("_ladd", "")].title + playlist_add_img.src = thumbnail + playlistSelection.innerHTML = playlistAvailable + }) + + playlistManager_close.addEventListener("click", () => { + + PlaylistManager.close() + }) + + playlistAddSong.addEventListener("click", () => { + + + PlaylistManager.close() + + post("ADD_SONG_TO_PLAYLIST", {data: playlistSelection.value , song: data[add_to.id.replace("_ladd", "")]}) + + }) + + test_lmore.addEventListener("click",( ) => { + + + testPopup.style.display = "flex" + testPopup.style.top = yMousePos + "px" + + }) + + testPopup.addEventListener("mouseleave", () => { + + testPopup.style.display = "none" + + }) + + playNow.addEventListener("click", () => { + + post("ADD_SONG_NOW", data[add_to.id.replace("_ladd", "")]) + + }) + + + + + } + + + } else { + + searchcontent.innerHTML = '

Aucun morceau trouvé !

' + + } + + } else { + + //https://www.youtube.com/playlist?list=PLA8VHLKYzqTvCcIKhsjGS41nG1zBpRZPy + + + var playlistToPush = new Array() + var playlist_songs = new Array() + + + for(var title of results.videos) { + + var PFormatduration = getTimeCode(title.milis_length) + + if(title.milis_length == 9223372036854776000) { + + PFormatduration = " LIVE" + } + + + playlist_songs.push('

' + title.title + '

' + title.author.name + '

' + PFormatduration + '

') + + } + + playlistToPush.push('

' + results.author.name + " - (" + results.videos.length + " titres)" + '

' + results.title + '


' + playlist_songs.join("")) + + if(playlistToPush.join("") == "") { + + searchcontent.innerHTML = '

Aucun morceau trouvé !

' + + } else { + + searchcontent.innerHTML = playlistToPush.join("") + + + } + + + + + for(var title of results.videos) { + + const add_to = document.getElementById(results.videos.indexOf(title) + "_padd") + const playNow = document.getElementById(results.videos.indexOf(title) + "_pplay") + + + add_to.addEventListener("click", () => { + + post("FP_ADD_SONG", results.videos[add_to.id.replace("_padd", "")].url) + }) + + playNow.addEventListener("click", () => { + + post("FP_ADD_SONG_NOW", results.videos[add_to.id.replace("_padd", "")].url) + + }) + + + + + } + } + + }) + + }) +}) \ No newline at end of file diff --git a/src/web/public/javascript/__settings_script.js b/src/web/public/javascript/settings.js similarity index 74% rename from src/web/public/javascript/__settings_script.js rename to src/web/public/javascript/settings.js index 0e3bba4..726220c 100644 --- a/src/web/public/javascript/__settings_script.js +++ b/src/web/public/javascript/settings.js @@ -1,9 +1,7 @@ -var wasOnNodes = false settingsBtn.addEventListener("click", () => { - wasOnHome = false - + mainView.innerHTML = `
@@ -17,40 +15,53 @@ settingsBtn.addEventListener("click", () => {
` - const settings_logs = document.getElementById("settings_logs") - const settings_connexion = document.getElementById("settings_connexion") - const settings_users = document.getElementById("settings_users") - const settings_content = document.getElementById("settings_content") + const settings_logs = getID("settings_logs") + const settings_connexion = getID("settings_connexion") + const settings_users = getID("settings_users") + const settings_content = getID("settings_content") + settings_logs.style.color = "white" loadLogs() + + + settings_logs.addEventListener("click", () => { loadLogs() - wasOnNodes = false + }) settings_connexion.addEventListener("click", () => { loadConnexion() - wasOnNodes = true + }) settings_users.addEventListener("click", () => { loadUsers() - wasOnNodes = false + }) - settings_logs.style.color = "white" + function loadUsers() { socket.emit("GET/USERS") + userLocation = "users" } + function loadConnexion() { + + userLocation = "nodes" + socket.emit("GET/NODES") + + } + function loadLogs() { + userLocation = "logs" settings_content.innerHTML = `
@@ -60,14 +71,14 @@ settingsBtn.addEventListener("click", () => { ` - const logs_selection = document.getElementById("logs_selection") - const logs_content = document.getElementById("logs_content") + const logs_selection = getID("logs_selection") + const logs_content = getID("logs_content") const logs_data = get("LOGS") logs_data.then(data => { - + var optionToPush = new Array() for(var log of data) { optionToPush.push("") @@ -81,7 +92,6 @@ settingsBtn.addEventListener("click", () => { var logToPush = new Array() - for(var line of log.value.split("\n")) { @@ -143,34 +153,12 @@ settingsBtn.addEventListener("click", () => { } - function loadConnexion() { - - - socket.emit("GET/NODES") - - } - - - - const buttons = document.querySelectorAll(".sside_line"); - - buttons.forEach(button => { - button.addEventListener("click", function () { - buttons.forEach(btn => { - if (btn === button) { - btn.style.color = "white"; - } else { - btn.style.color = ""; - } - }); - }); - }); }) -socket.on("ALWAYS/USERS",(data) => { +AlwaysRequest('USERS',(data) => { - const settings_content = document.getElementById("settings_content") + const settings_content = getID("settings_content") if(settings_content) { @@ -182,12 +170,8 @@ socket.on("ALWAYS/USERS",(data) => { var admin_bar = '' - if(user.beta == true) { - - admin_bar = "

BETA

" - } - userToPush.push("
") + userToPush.push("
") } @@ -200,8 +184,8 @@ socket.on("ALWAYS/USERS",(data) => { for(var user of data) { - let adminBtn = document.getElementById(data.indexOf(user) + "_uadmin") - let deleteBtn = document.getElementById(data.indexOf(user) + "_udelete") + let adminBtn = getID(data.indexOf(user) + "_uadmin") + let deleteBtn = getID(data.indexOf(user) + "_udelete") if(data[adminBtn.id.replace("_uadmin", "")].admin == true) { @@ -212,7 +196,7 @@ socket.on("ALWAYS/USERS",(data) => { adminBtn.addEventListener("click", () => { - send("USERS/ADMIN", data[adminBtn.id.replace("_uadmin", "")]) + post("USERS/ADMIN", data[adminBtn.id.replace("_uadmin", "")]) socket.emit("GET/USERS") }) @@ -220,7 +204,7 @@ socket.on("ALWAYS/USERS",(data) => { deleteBtn.addEventListener("click", () => { - send("USERS/DELETE", data[adminBtn.id.replace("_uadmin", "")]) + post("USERS/DELETE", data[adminBtn.id.replace("_uadmin", "")]) socket.emit("GET/USERS") }) @@ -234,11 +218,11 @@ socket.on("ALWAYS/USERS",(data) => { }) -socket.on("ALWAYS/NODES",(data) => { +AlwaysRequest("NODES",(data) => { - const settings_content = document.getElementById("settings_content") + const settings_content = getID("settings_content") - if(settings_content && wasOnNodes) { + if(settings_content && userLocation == "nodes") { var dataToPush = new Array() @@ -299,14 +283,14 @@ socket.on("ALWAYS/NODES",(data) => { settings_content.innerHTML = dataToPush.join("") - const an_dialog = document.getElementById("an_dialog") - const an_close = document.getElementById("an_close") - const an_add = document.getElementById("an_create") - const an_host = document.getElementById("an_host") - const an_port = document.getElementById("an_port") - const an_password = document.getElementById("an_password") - const an_send = document.getElementById("an_send") - const an_info = document.getElementById("an_info") + const an_dialog = getID("an_dialog") + const an_close = getID("an_close") + const an_add = getID("an_create") + const an_host = getID("an_host") + const an_port = getID("an_port") + const an_password = getID("an_password") + const an_send = getID("an_send") + const an_info = getID("an_info") an_add.addEventListener("click", () => { an_info.innerHTML = "" @@ -332,7 +316,7 @@ socket.on("ALWAYS/NODES",(data) => { "retryAmount": 1 } - send("NODES/ADD", data) + post("NODES/ADD", data) an_dialog.close() @@ -348,18 +332,18 @@ socket.on("ALWAYS/NODES",(data) => { for(var node of data) { - let reloadBtn = document.getElementById(data.indexOf(node) + "_reload") - let deleteBtn = document.getElementById(data.indexOf(node) + "_delete") + let reloadBtn = getID(data.indexOf(node) + "_reload") + let deleteBtn = getID(data.indexOf(node) + "_delete") reloadBtn.addEventListener("click", () => { - send("NODES/RELOAD", data[reloadBtn.id.replace("_reload", "")]) + post("NODES/RELOAD", data[reloadBtn.id.replace("_reload", "")]) }) deleteBtn.addEventListener("click", () => { console.log(deleteBtn) console.log(data[reloadBtn.id.replace("_reload", "")]) - send("NODES/DELETE", data[reloadBtn.id.replace("_reload", "")]) + post("NODES/DELETE", data[reloadBtn.id.replace("_reload", "")]) }) diff --git a/src/web/public/javascript/tooltip.js b/src/web/public/javascript/tooltip.js new file mode 100644 index 0000000..86357c4 --- /dev/null +++ b/src/web/public/javascript/tooltip.js @@ -0,0 +1,80 @@ +const tooltip = document.getElementById("tooltip") + +tooltip.style.visibility = 'hidden' +tooltip.style.display = 'none' +const alreadyDeclare = new Array() + +const tooltip_list = { + "radio_add": "Ajouter par l'URL", + "sendplaylist": "Envoyer la playlist", + "playlistplay": "Jouer la playlist", + "playlistdelete": "Effacer la playlist", + "an_create": "Ajouter un serveur", + "pplay": "Jouer maintenant", + "delete": "Supprimer", + "add": "Ajouter à la liste de lecture", + "backward": "Précédent", + "forward": "Suivant", + "lmore": "Plus d'options", + "loop": "Répéter le titre", + "shuffle": "Mélanger la liste de lecture", + "list_btn": "Liste de lecture", + "disconnect": "Déconnecter le bot", + "reload": "Relancer le serveur", + "admin": "Donner les permissions", + "takeCurrent": "Ajouter le titre à une playlist", + "volbtn": "Volume" + } + +document.onmousemove = function(e) +{ + xMousePos = e.clientX + window.scrollX; + yMousePos = e.clientY + window.scrollY; + + for(var key in tooltip_list) { + + showToolTip(key, tooltip_list[key], e) + + } + +}; + + +function showToolTip(id, text, e) { + + if(e.target) { + + if(e.target.id.includes(id)) { + + if(!alreadyDeclare.includes(e.target.id)) { + alreadyDeclare.push(e.target.id) + const elementAssociate = document.getElementById(e.target.id) + + elementAssociate.addEventListener("mousemove", () => { + tooltip.style.visibility = 'visible' + tooltip.style.display = 'unset' + tooltip.style.top = ( yMousePos - ( tooltip.offsetHeight + 20)) + "px" + tooltip.style.width = "150px" + tooltip.style.left =(xMousePos - 75 )+ "px" + tooltip.innerHTML = text + + }) + + elementAssociate.addEventListener("mouseleave", () => { + + + alreadyDeclare.splice(alreadyDeclare.indexOf(e.target.id), 1) + + tooltip.style.visibility = 'hidden' + tooltip.style.display = 'none' + + }) + + } + + + } + + } + +} \ No newline at end of file diff --git a/src/web/public/stylesheets/style.css b/src/web/public/stylesheets/style.css index 0060860..c33d80e 100644 --- a/src/web/public/stylesheets/style.css +++ b/src/web/public/stylesheets/style.css @@ -1266,3 +1266,29 @@ p { } + +.tile { + + width: 60px; + height: 60px; + margin-right: 10px; +} + +.playlist_div p { + display: flex !important; +} + +#createPlaylist { + display: flex; + gap: 10px; +} + +#createPlaylist svg { + + font-size: 52px; +} + +.playlist-content p { + + display: none; +} \ No newline at end of file diff --git a/src/web/public/stylesheets/style_new.css b/src/web/public/stylesheets/style_new.css new file mode 100644 index 0000000..38fce37 --- /dev/null +++ b/src/web/public/stylesheets/style_new.css @@ -0,0 +1,209 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300&display=swap'); +@font-face { + font-family: 'Gunship'; + src: url(gunship.ttf); +} + +html { + + min-height: 100%; + min-width: 100%; + margin: 0 !important; + +} + + +body { + background-color: #000000 !important; + color: #ffffff !important; + font-family: 'Inter', sans-serif !important; + font-size: 20px; + margin: 0 !important; +} + +/* Window */ + +.window { + + width: 100%; + display: flex; + +} + +.content { + + width: 100%; +} + +/* Title */ + +.title { + + color:white; + display: flex; + justify-content: space-between; + align-items: center; + +} + +.title_logo { + + width: 80px; + height: 80px; +} + +.title_text { + + font-size: 30px; + font-family: 'Gunship', sans-serif; + text-shadow: white 0px 0px 10px; + user-select: none; + +} + + + +/*Nav bar */ + +.navbar { + + +} + +/* Player */ + +.player_box { + + background-color: rgba(0, 0, 0); + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 1.5%; + align-items: center; + position: absolute; + width: 100%; + height: 15vh; + bottom: 0; + color: white; +} + +.player_durationbar { + + margin-top: 1vh; + display: flex; + flex-direction: row; + align-items: center; + +} + +.player_middle { + + display: flex; + text-align: center; + align-items: center; + flex-direction: column; + } + + +.player_title { + display: flex; + flex-direction: row; + align-items: center; + width: 30vw; +} + +.player_actionbar { + text-align: right; + width: 30vw; + display: flex; + justify-content: end; + gap: 0.8vw; + } + +.player_duration { + width: 25vw; + margin-right: 0.5vw; + margin-left: 0.5vw; + +} + +/* Images */ + +.tile { + + width: 60px; + height: 60px; +} + +/* Home */ + +.home_view { + + +} + + +/* Playlist */ + + +/* Notification */ + +.notif_div { + + visibility: hidden; + width: 20%; + position: absolute; + top: -10%; + right: 41%; + transition: all 0.8s; + z-index: 2; + color: white; + display: flex; + align-items: center; + background-color: #2d2d2d; + } + + .notif_image { + + width: 4vw; + height: 4vw; + margin-right: 3% !important; + + } + + .notif_text { + + width: 100%; + margin-right: 1% !important; + font-size: 12px; + + } + + .notif_div_on { + transition: all 0.8s; + top: 4% !important; + visibility: visible; + } + + +/* Special */ + +.invisible { + display: none; +} + +* { + box-sizing: border-box; +} + +.grised { + + filter : invert(50%); + + } + + .disabled { + + color: rgb(47, 47, 47) !important; + } + \ No newline at end of file diff --git a/src/web/routes/index.js b/src/web/routes/index.js index 2b13326..13d4079 100644 --- a/src/web/routes/index.js +++ b/src/web/routes/index.js @@ -2,12 +2,10 @@ var express = require('express'); var router = express.Router(); var path = require("path") var auth = require("../../modules/sub-auth") -var log = require("../../modules/sub-log") +var log = require("loguix") var { __glob } = require("../../modules/global-variables") var uuid = require("uuid") const metric = require("webmetrik") -metric.setMetricFile(__glob.METRIC_FILE) -metric.publishMetrics("8001", "raphraph") var fs = require("fs") @@ -51,7 +49,13 @@ router.get('/', function(req, res, next) { } else { var fileMd = md.render(fs.readFileSync(__glob.README).toString()) - res.render("index", {welcome: fileMd}) + if(process.env.DEV) { + res.render("index", {welcome: fileMd, dev: "

DEVELOPEMENT

"}) + } else { + + res.render("index", {welcome: fileMd, dev: ""}) + } + } diff --git a/src/web/routes/internal.js b/src/web/routes/internal.js index 2a724c9..21172f6 100644 --- a/src/web/routes/internal.js +++ b/src/web/routes/internal.js @@ -2,7 +2,7 @@ var express = require('express'); var router = express.Router(); var path = require("path") var auth = require("../../modules/sub-auth") -var log = require("../../modules/sub-log") +var log = require("loguix") var uuid = require("uuid") var fs = require("fs"); const { __glob, __web } = require('../../modules/global-variables'); @@ -31,7 +31,12 @@ router.get('/redirect', function(req, res, next) { var user = data const token = uuid.v4().toString() - user.token = token + if(typeof user.token != "object") { + + user.token = [] + } + + user.token.push(token) auth.addUser(user) res.cookie("token", token, { maxAge: 90000000000000, httpOnly: true }) @@ -51,11 +56,7 @@ router.get('/redirect', function(req, res, next) { res.redirect('/login?error=MIGRATE_ACCOUNT_ONLY') - } else if(error == "NOT_IN_BETA") { - - res.redirect('/login?error=NOT_IN_BETA') - - } else if(error == "NOT_IN_CLP") { + } else if(error == "NOT_IN_CLP") { res.redirect('/login?error=NOT_IN_CLP') @@ -92,11 +93,25 @@ router.get("/socketlink", (req,res,next) => { } }) +router.get("/discordlink", (req,res,next) => { + var discordlink = null + if(process.env.DEV) { + + alog.log("Mode Developpeur Actif : Redirige vers LOCALHOST") + discordlink = "https://discord.com/api/oauth2/authorize?client_id=1094727789682380922&redirect_uri=http%3A%2F%2Flocalhost%3A4000%2Finternal%2Fredirect&response_type=code&scope=identify%20guilds%20guilds.members.read" //DEV + } else { + discordlink = "https://discord.com/api/oauth2/authorize?client_id=1094727789682380922&redirect_uri=https%3A%2F%2Fsubsonics.raphix.fr%2Finternal%2Fredirect&response_type=code&scope=identify%20guilds%20guilds.members.read" //OFFICIEL + } + + res.redirect(302, discordlink) + +}) + router.get("/logout", (req,res,next) => { if(auth.checkUser(req.cookies.token)) { - auth.removeUser(req.cookies.token) + auth.removeToken(req.cookies.token) res.clearCookie("token") res.redirect(302, "/login") } else { diff --git a/src/web/routes/login.js b/src/web/routes/login.js index e2a1f65..1514905 100644 --- a/src/web/routes/login.js +++ b/src/web/routes/login.js @@ -2,7 +2,7 @@ var express = require('express'); var router = express.Router(); var path = require("path") var auth = require("../../modules/sub-auth") -var log = require("../../modules/sub-log") +var log = require("loguix") var package = require('../../../package.json') var uuid = require("uuid") @@ -49,12 +49,7 @@ router.get('/', function(req, res, next) { } - if(req.query.error == "NOT_IN_BETA") { - - error = "

Demande Ă  Raphix pour t'inscrire Ă  la Beta !

" - - } - + res.render("login", {login: error, version: verInfo}) } diff --git a/src/web/templates/index.ejs b/src/web/templates/index.ejs index 3c321f7..b8ac743 100644 --- a/src/web/templates/index.ejs +++ b/src/web/templates/index.ejs @@ -148,8 +148,19 @@ - - + + + + + + + + + + + + + diff --git a/src/web/templates/index_new.ejs b/src/web/templates/index_new.ejs new file mode 100644 index 0000000..8ce9443 --- /dev/null +++ b/src/web/templates/index_new.ejs @@ -0,0 +1,183 @@ + + + + + + + Subsonics - Web + + +
+ +
+
+
+ <%- welcome %> + +
+
+
+ +
+
+ +
+
+
+
+
+
+ + + +
+
+ +

Aucun titre joué

+ <%- dev %> +
+ +
+
+ + + + + +
+
+

0:00

+ +

0:00

+
+
+ +
+ +
+ +
+ +

100%

+
+
+ +
+ +
+ +
+
+
+ +
+ + + + + +
+

Créer une playlist

+ +
+
+ +

+

Nom de la playlist

+ + +
+
+ + +
+

Rapport de bug

+ +
+
+

Catégorie :

+ +

Description

+ + +
+
+ +
+

Ajouter Ă  une playlist

+ +
+
+

+

Selectionner la playlist

+ + +
+
+ + + + Tooltip Text + + + +
+ +

Lorem ipsum, dolor sit amet consectetur adipisicing elit.

+
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/web/templates/login.ejs b/src/web/templates/login.ejs index 31fc3ae..681edd0 100644 --- a/src/web/templates/login.ejs +++ b/src/web/templates/login.ejs @@ -21,9 +21,7 @@
<%- version %>
- - - +