From 20046e88e0302372dee5b28b89bc3b013c7d3882 Mon Sep 17 00:00:00 2001 From: HF Date: Thu, 4 Jan 2024 15:41:23 +0100 Subject: [PATCH] add ability to retire canvas and retire 1bit canvas --- README.md | 3 +- i18n/template-ssr.pot | 174 +++++------ i18n/template.pot | 384 ++++++++++++------------ src/canvases.json | 3 +- src/components/Converter.jsx | 2 +- src/components/HistorySelect.jsx | 4 +- src/components/ModCanvastools.jsx | 2 +- src/components/windows/Archive.jsx | 96 ++++-- src/components/windows/CanvasSelect.jsx | 35 +-- src/controls/keypress.js | 2 +- src/core/draw.js | 11 +- src/core/tilesBackup.js | 8 +- src/core/utils.js | 8 +- src/socket/SocketServer.js | 1 + src/store/reducers/canvas.js | 41 ++- 15 files changed, 415 insertions(+), 359 deletions(-) diff --git a/README.md b/README.md index 7fbf329..6ca5cf1 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,6 @@ Meaning of some values: | size | canvas size, power of 2 and between 256 and 65536 | | bcd | Base cooldown for unset pixels | | cds | Stack time of Cooldown | -| sd | Start-date of the canvas (for historical view) | #### Optional canvases Configuration @@ -145,6 +144,8 @@ Meaning of some values: | ranked | If pixels on canvas count on player statistic (default: false) | | v | If 3D voxel canvas (boolean) (default: false) | | hid | Hidden canvases, can be just seen by pressing P (default: false)| +| sd | Start-date of the canvas (for historical view) | +| ed | end date for historical view (canvas retired) | Notes: diff --git a/i18n/template-ssr.pot b/i18n/template-ssr.pot index 59ec29a..c0a5c5b 100644 --- a/i18n/template-ssr.pot +++ b/i18n/template-ssr.pot @@ -98,22 +98,22 @@ msgstr "" msgid "Loading..." msgstr "" -#: src/ssr/PopUp.jsx:55 -msgid "ppfun" -msgstr "" - -#: src/ssr/PopUp.jsx:56 -msgid "PixelPlanet.Fun PopUp" -msgstr "" - -#: src/ssr/Main.jsx:64 +#: src/ssr/Main.jsx:55 msgid "PixelPlanet.Fun" msgstr "" -#: src/ssr/Main.jsx:65 +#: src/ssr/Main.jsx:56 msgid "Place color pixels on an map styled canvas with other players online" msgstr "" +#: src/ssr/PopUp.jsx:47 +msgid "ppfun" +msgstr "" + +#: src/ssr/PopUp.jsx:48 +msgid "PixelPlanet.Fun PopUp" +msgstr "" + #: src/utils/validation.js:17 msgid "Email can't be empty." msgstr "" @@ -204,6 +204,10 @@ msgstr "" msgid "Submit" msgstr "" +#: src/routes/api/baninfo.js:32 +msgid "You are not banned" +msgstr "" + #: src/routes/api/modtools.js:53 msgid "You are not logged in" msgstr "" @@ -216,8 +220,44 @@ msgstr "" msgid "Just admins can do that" msgstr "" -#: src/routes/api/baninfo.js:32 -msgid "You are not banned" +#: src/routes/api/auth/logout.js:11 +msgid "You are not even logged in." +msgstr "" + +#: src/routes/api/auth/delete_account.js:65 +#: src/routes/api/auth/logout.js:20 +msgid "Server error when logging out." +msgstr "" + +#: src/routes/api/auth/verify.js:26 +#: src/routes/api/auth/verify.js:35 +msgid "Mail verification" +msgstr "" + +#: src/routes/api/auth/verify.js:27 +msgid "You are now verified :)" +msgstr "" + +#: src/routes/api/auth/verify.js:35 +msgid "" +"Your mail verification code is invalid or already expired :(, please " +"request a new one." +msgstr "" + +#: src/routes/api/auth/change_mail.js:44 +#: src/routes/api/auth/change_passwd.js:34 +#: src/routes/api/auth/delete_account.js:36 +msgid "You are not authenticated." +msgstr "" + +#: src/routes/api/auth/change_mail.js:53 +#: src/routes/api/auth/change_passwd.js:43 +#: src/routes/api/auth/delete_account.js:55 +msgid "Incorrect password!" +msgstr "" + +#: src/routes/api/auth/delete_account.js:46 +msgid "Muted users can not delete their account." msgstr "" #: src/routes/api/auth/change_mail.js:22 @@ -225,6 +265,23 @@ msgstr "" msgid "This email provider is not allowed" msgstr "" +#: src/routes/api/auth/change_mail.js:62 +msgid "Muted users can not do this." +msgstr "" + +#: src/ssr/RedirectionPage.jsx:19 +msgid "PixelPlanet.fun Accounts" +msgstr "" + +#: src/ssr/RedirectionPage.jsx:29 +msgid "You will be automatically redirected after 15s" +msgstr "" + +#: src/ssr/RedirectionPage.jsx:30 +#, javascript-format +msgid "Or ${ clickHere } to go back to pixelplanet" +msgstr "" + #: src/routes/api/auth/register.js:31 msgid "No Captcha given" msgstr "" @@ -257,136 +314,79 @@ msgstr "" msgid "Failed to establish session after register :(" msgstr "" -#: src/routes/api/auth/verify.js:26 -#: src/routes/api/auth/verify.js:35 -msgid "Mail verification" -msgstr "" - -#: src/routes/api/auth/verify.js:27 -msgid "You are now verified :)" -msgstr "" - -#: src/routes/api/auth/verify.js:35 -msgid "" -"Your mail verification code is invalid or already expired :(, please " -"request a new one." -msgstr "" - -#: src/routes/api/auth/logout.js:11 -msgid "You are not even logged in." -msgstr "" - -#: src/routes/api/auth/delete_account.js:65 -#: src/routes/api/auth/logout.js:20 -msgid "Server error when logging out." -msgstr "" - -#: src/routes/api/auth/change_mail.js:44 -#: src/routes/api/auth/change_passwd.js:34 -#: src/routes/api/auth/delete_account.js:36 -msgid "You are not authenticated." -msgstr "" - -#: src/routes/api/auth/change_mail.js:53 -#: src/routes/api/auth/change_passwd.js:43 -#: src/routes/api/auth/delete_account.js:55 -msgid "Incorrect password!" -msgstr "" - -#: src/routes/api/auth/delete_account.js:46 -msgid "Muted users can not delete their account." -msgstr "" - -#: src/routes/api/auth/change_mail.js:62 -msgid "Muted users can not do this." -msgstr "" - -#: src/ssr/RedirectionPage.jsx:19 -msgid "PixelPlanet.fun Accounts" -msgstr "" - -#: src/ssr/RedirectionPage.jsx:29 -msgid "You will be automatically redirected after 15s" -msgstr "" - -#: src/ssr/RedirectionPage.jsx:30 -#, javascript-format -msgid "Or ${ clickHere } to go back to pixelplanet" -msgstr "" - -#: src/canvasesDesc.js:19 +#: src/canvasesDesc.js:20 msgid "Earth" msgstr "" -#: src/canvasesDesc.js:20 +#: src/canvasesDesc.js:21 msgid "Moon" msgstr "" -#: src/canvasesDesc.js:21 +#: src/canvasesDesc.js:22 msgid "3D Canvas" msgstr "" -#: src/canvasesDesc.js:22 +#: src/canvasesDesc.js:23 msgid "Coronavirus" msgstr "" -#: src/canvasesDesc.js:23 +#: src/canvasesDesc.js:24 msgid "PixelZone" msgstr "" -#: src/canvasesDesc.js:24 +#: src/canvasesDesc.js:25 msgid "PixelCanvas" msgstr "" -#: src/canvasesDesc.js:25 +#: src/canvasesDesc.js:26 msgid "1bit" msgstr "" -#: src/canvasesDesc.js:26 +#: src/canvasesDesc.js:27 msgid "Top10" msgstr "" -#: src/canvasesDesc.js:27 +#: src/canvasesDesc.js:28 msgid "Thoia" msgstr "" -#: src/canvasesDesc.js:30 +#: src/canvasesDesc.js:31 msgid "Our main canvas, a huge map of the world. Place everywhere you like" msgstr "" -#: src/canvasesDesc.js:31 +#: src/canvasesDesc.js:32 msgid "" "Moon canvas. Safe space for art. No flags or large text (unless part of " "art) or art larger than 1.5k x 1.5k pixels." msgstr "" -#: src/canvasesDesc.js:32 +#: src/canvasesDesc.js:33 msgid "Place Voxels on a 3D canvas with others" msgstr "" -#: src/canvasesDesc.js:33 +#: src/canvasesDesc.js:34 msgid "Special canvas to spread awareness of SARS-CoV2" msgstr "" -#: src/canvasesDesc.js:34 +#: src/canvasesDesc.js:35 msgid "Mirror of PixelZone" msgstr "" -#: src/canvasesDesc.js:35 +#: src/canvasesDesc.js:36 msgid "Mirror of PixelCanvas" msgstr "" -#: src/canvasesDesc.js:36 +#: src/canvasesDesc.js:37 msgid "Black and White canvas" msgstr "" -#: src/canvasesDesc.js:37 +#: src/canvasesDesc.js:38 msgid "" "A canvas for the most active players from the the previous day. Daily " "ranking updates at 00:00 UTC." msgstr "" -#: src/canvasesDesc.js:38 +#: src/canvasesDesc.js:39 msgid "" "Thoia World Canvas. Advanced fictional worldbuilding and arts. Abandon the " "old world and all it entails." diff --git a/i18n/template.pot b/i18n/template.pot index 2bdcda8..6bca8fa 100644 --- a/i18n/template.pot +++ b/i18n/template.pot @@ -46,6 +46,14 @@ msgstr "" msgid "Hide Hidden Canvases" msgstr "" +#: src/ui/rendererFactory.js:30 +msgid "Canvas Error" +msgstr "" + +#: src/ui/rendererFactory.js:31 +msgid "Can't render 3D canvas, do you have WebGL2 disabled?" +msgstr "" + #: src/ui/PixelTransferController.js:70 msgid "Error :(" msgstr "" @@ -171,14 +179,6 @@ msgstr "" msgid "Error ${ retCode }" msgstr "" -#: src/ui/rendererFactory.js:30 -msgid "Canvas Error" -msgstr "" - -#: src/ui/rendererFactory.js:31 -msgid "Can't render 3D canvas, do you have WebGL2 disabled?" -msgstr "" - #: src/components/BanInfo.jsx:136 #: src/store/actions/index.js:7 msgid "OK" @@ -231,6 +231,13 @@ msgstr "" msgid "You have new messages in chat" msgstr "" +#: src/components/Converter.jsx:565 +#: src/components/CoordinatesBox.jsx:31 +#: src/components/ModWatchtools.jsx:384 +#: src/components/ModWatchtools.jsx:402 +msgid "Copy to Clipboard" +msgstr "" + #: src/components/OnlineBox.jsx:40 msgid "Online Users on Canvas" msgstr "" @@ -243,26 +250,11 @@ msgstr "" msgid "Pixels placed" msgstr "" -#: src/components/Converter.jsx:565 -#: src/components/CoordinatesBox.jsx:31 -#: src/components/ModWatchtools.jsx:378 -#: src/components/ModWatchtools.jsx:396 -msgid "Copy to Clipboard" -msgstr "" - #: src/components/buttons/CanvasSwitchButton.jsx:20 #: src/components/windows/index.js:19 msgid "Canvas Selection" msgstr "" -#: src/components/buttons/ChatButton.jsx:88 -msgid "Close Chat" -msgstr "" - -#: src/components/buttons/ChatButton.jsx:88 -msgid "Open Chat" -msgstr "" - #: src/components/buttons/ExpandMenuButton.jsx:22 msgid "Close Menu" msgstr "" @@ -271,11 +263,19 @@ msgstr "" msgid "Open Menu" msgstr "" -#: src/components/HistorySelect.jsx:144 +#: src/components/buttons/ChatButton.jsx:88 +msgid "Close Chat" +msgstr "" + +#: src/components/buttons/ChatButton.jsx:88 +msgid "Open Chat" +msgstr "" + +#: src/components/HistorySelect.jsx:146 msgid "Loading" msgstr "" -#: src/components/HistorySelect.jsx:145 +#: src/components/HistorySelect.jsx:147 msgid "Select Date above" msgstr "" @@ -449,6 +449,54 @@ msgstr "" msgid "Why?" msgstr "" +#: src/components/windows/CanvasSelect.jsx:29 +msgid "" +"Select the canvas you want to use.\n" +"Every canvas is unique and has different palettes, cooldown and " +"requirements.\n" +"Archive of closed canvases can be accessed here:" +msgstr "" + +#: src/components/windows/CanvasSelect.jsx:37 +msgid "Archive" +msgstr "" + +#: src/components/windows/Archive.jsx:29 +msgid "" +"While we tend to not delete canvases, some canvases are started for fun or " +"as a request by users who currently like a meme. Those canvases can get " +"boring after a while and after weeks of no major change and if they really " +"aren't worth being kept active. And Some other canvases might outlive their " +"welcome and become useless." +msgstr "" + +#: src/components/windows/Archive.jsx:30 +msgid "Here we collect removed canvases to archive them in a proper way." +msgstr "" + +#: src/components/windows/Archive.jsx:35 +msgid "Removed Canvases with history available" +msgstr "" + +#: src/components/windows/Archive.jsx:53 +msgid "Political Compass Canvas" +msgstr "" + +#: src/components/windows/Archive.jsx:60 +msgid "" +"This canvas got requested during a time of political conflicts on the main " +"Earth canvas. It was a 1024x1024 representation of the political compass " +"with a 5s cooldown and 60s stacking. It got launched on May 11th and " +"remained active for months till it got shut down on November 30th." +msgstr "" + +#: src/components/windows/Archive.jsx:61 +msgid "" +"We decided to archive it as a timelapse with lossless encoded webm. Taking " +"a screenshot from the timelapse results in a perfect 1:1 representation of " +"how the canvas was at that time." +msgstr "" + #: src/components/windows/Help.jsx:42 msgid "Place color pixels on a large canvas with other players online!" msgstr "" @@ -782,60 +830,16 @@ msgstr "" #: src/components/Admintools.jsx:154 #: src/components/Admintools.jsx:238 -#: src/components/ModCanvastools.jsx:302 -#: src/components/ModCanvastools.jsx:382 -#: src/components/ModCanvastools.jsx:455 -#: src/components/ModCanvastools.jsx:546 +#: src/components/ModCanvastools.jsx:305 +#: src/components/ModCanvastools.jsx:390 +#: src/components/ModCanvastools.jsx:467 +#: src/components/ModCanvastools.jsx:562 #: src/components/ModIIDtools.jsx:135 #: src/components/windows/ForgotPassword.jsx:84 #: src/components/windows/Register.jsx:127 msgid "Submit" msgstr "" -#: src/components/windows/CanvasSelect.jsx:29 -msgid "" -"Select the canvas you want to use. Every canvas is unique and has " -"different palettes, cooldown and requirements. Archive of closed canvases " -"can be accessed here:" -msgstr "" - -#: src/components/windows/CanvasSelect.jsx:37 -msgid "Archive" -msgstr "" - -#: src/components/windows/Archive.jsx:16 -msgid "" -"While we tend to not delete canvases, some canvases are started for fun or " -"as a request by users who currently like a meme. Those canvases can get " -"boring after a while and after weeks of no major change and if they really " -"aren't worth being kept active, we decide to remove them." -msgstr "" - -#: src/components/windows/Archive.jsx:18 -msgid "" -"Here we collect those canvases to archive them in a proper way (which is " -"currently just one)." -msgstr "" - -#: src/components/windows/Archive.jsx:20 -msgid "Political Compass Canvas" -msgstr "" - -#: src/components/windows/Archive.jsx:27 -msgid "" -"This canvas got requested during a time of political conflicts on the main " -"Earth canvas. It was a 1024x1024 representation of the political compass " -"with a 5s cooldown and 60s stacking. It got launched on May 11th and " -"remained active for months till it got shut down on November 30th." -msgstr "" - -#: src/components/windows/Archive.jsx:28 -msgid "" -"We decided to archive it as a timelapse with lossless encoded webm. Taking " -"a screenshot from the timelapse results in a perfect 1:1 representation of " -"how the canvas was at that time." -msgstr "" - #: src/components/windows/Chat.jsx:180 msgid "Start chatting here" msgstr "" @@ -949,13 +953,6 @@ msgstr "" msgid "Copy" msgstr "" -#: src/components/ChangeMail.jsx:91 -#: src/components/ChangeName.jsx:68 -#: src/components/ChangePassword.jsx:109 -#: src/components/LanguageSelect.jsx:80 -msgid "Save" -msgstr "" - #: src/components/LogInArea.jsx:19 msgid "Login to access more features and stats." msgstr "" @@ -980,6 +977,58 @@ msgstr "" msgid "Register" msgstr "" +#: src/components/CanvasItem.jsx:29 +msgid "Online Users" +msgstr "" + +#: src/components/CanvasItem.jsx:34 +msgid "Cooldown" +msgstr "" + +#: src/components/CanvasItem.jsx:40 +msgid "Stacking till" +msgstr "" + +#: src/components/CanvasItem.jsx:42 +msgid "Ranked" +msgstr "" + +#: src/components/CanvasItem.jsx:44 +msgid "Yes" +msgstr "" + +#: src/components/CanvasItem.jsx:44 +msgid "No" +msgstr "" + +#: src/components/CanvasItem.jsx:50 +msgid "Requirements" +msgstr "" + +#: src/components/CanvasItem.jsx:53 +msgid "User Account" +msgstr "" + +#: src/components/CanvasItem.jsx:55 +#, javascript-format +msgid "and ${ canvas.req } Pixels set" +msgstr "" + +#: src/components/CanvasItem.jsx:58 +msgid "Top 10 Daily Ranking" +msgstr "" + +#: src/components/CanvasItem.jsx:64 +msgid "Dimensions" +msgstr "" + +#: src/components/ChangeMail.jsx:91 +#: src/components/ChangeName.jsx:68 +#: src/components/ChangePassword.jsx:109 +#: src/components/LanguageSelect.jsx:80 +msgid "Save" +msgstr "" + #: src/components/UserAreaContent.jsx:62 msgid "Today Placed Pixels" msgstr "" @@ -1138,79 +1187,6 @@ msgstr "" msgid "Ranking updates every 5 min. Daily rankings get reset at midnight UTC." msgstr "" -#: src/components/CanvasItem.jsx:29 -msgid "Online Users" -msgstr "" - -#: src/components/CanvasItem.jsx:34 -msgid "Cooldown" -msgstr "" - -#: src/components/CanvasItem.jsx:40 -msgid "Stacking till" -msgstr "" - -#: src/components/CanvasItem.jsx:42 -msgid "Ranked" -msgstr "" - -#: src/components/CanvasItem.jsx:44 -msgid "Yes" -msgstr "" - -#: src/components/CanvasItem.jsx:44 -msgid "No" -msgstr "" - -#: src/components/CanvasItem.jsx:50 -msgid "Requirements" -msgstr "" - -#: src/components/CanvasItem.jsx:53 -msgid "User Account" -msgstr "" - -#: src/components/CanvasItem.jsx:55 -#, javascript-format -msgid "and ${ canvas.req } Pixels set" -msgstr "" - -#: src/components/CanvasItem.jsx:58 -msgid "Top 10 Daily Ranking" -msgstr "" - -#: src/components/CanvasItem.jsx:64 -msgid "Dimensions" -msgstr "" - -#: src/core/chartSettings.js:30 -msgid "Top 10 Countries [pxls / day]" -msgstr "" - -#: src/core/chartSettings.js:127 -msgid "Players and Pixels per hour" -msgstr "" - -#: src/core/chartSettings.js:221 -msgid "Top 10 Players [pxls / day]" -msgstr "" - -#: src/core/chartSettings.js:294 -msgid "Countries by Pixels Today" -msgstr "" - -#: src/core/chartSettings.js:351 -msgid "Total Pixels placed per day" -msgstr "" - -#: src/components/LogInForm.jsx:77 -msgid "Name or Email" -msgstr "" - -#: src/components/LogInForm.jsx:88 -msgid "LogIn" -msgstr "" - #: src/components/UserMessages.jsx:28 msgid "" "Please verify your mail address or your account could get deleted after a " @@ -1225,6 +1201,14 @@ msgstr "" msgid "Click here to request a new verification mail." msgstr "" +#: src/components/ChangeName.jsx:64 +msgid "New Username" +msgstr "" + +#: src/components/DeleteAccount.jsx:66 +msgid "Yes, Delete My Account!" +msgstr "" + #: src/components/ChangePassword.jsx:21 msgid "Passwords do not match." msgstr "" @@ -1245,24 +1229,6 @@ msgstr "" msgid "Confirm New Password" msgstr "" -#: src/components/ChangeName.jsx:64 -msgid "New Username" -msgstr "" - -#: src/components/ChangeMail.jsx:59 -msgid "" -"Changed Mail successfully. We sent you a verification mail, " -"please verify your new mail address." -msgstr "" - -#: src/components/ChangeMail.jsx:87 -msgid "New Mail" -msgstr "" - -#: src/components/DeleteAccount.jsx:66 -msgid "Yes, Delete My Account!" -msgstr "" - #: src/components/SocialSettings.jsx:35 msgid "Block DMs" msgstr "" @@ -1287,6 +1253,14 @@ msgstr "" msgid "You have no users blocked" msgstr "" +#: src/components/LogInForm.jsx:77 +msgid "Name or Email" +msgstr "" + +#: src/components/LogInForm.jsx:88 +msgid "LogIn" +msgstr "" + #: src/components/ModCanvastools.jsx:168 msgid "Build image on canvas." msgstr "" @@ -1333,50 +1307,50 @@ msgid "File" msgstr "" #: src/components/ModCanvastools.jsx:269 -msgid "Coordinates in X_Y format:" +msgid "Coordinates:" msgstr "" -#: src/components/ModCanvastools.jsx:307 +#: src/components/ModCanvastools.jsx:310 msgid "Pixel Protection" msgstr "" -#: src/components/ModCanvastools.jsx:309 +#: src/components/ModCanvastools.jsx:314 msgid "" -"Set protection of areas (if you need finer grained control, " -"use protect with image upload and alpha layers)" +"Set protection of areas (if you need finer grained control, use protect " +"with image upload and alpha layers)" msgstr "" -#: src/components/ModCanvastools.jsx:330 -#: src/components/ModCanvastools.jsx:403 -#: src/components/ModCanvastools.jsx:486 +#: src/components/ModCanvastools.jsx:334 +#: src/components/ModCanvastools.jsx:411 +#: src/components/ModCanvastools.jsx:498 #: src/components/ModWatchtools.jsx:176 msgid "Top-left corner" msgstr "" -#: src/components/ModCanvastools.jsx:347 -#: src/components/ModCanvastools.jsx:420 -#: src/components/ModCanvastools.jsx:503 -#: src/components/ModWatchtools.jsx:193 +#: src/components/ModCanvastools.jsx:353 +#: src/components/ModCanvastools.jsx:430 +#: src/components/ModCanvastools.jsx:517 +#: src/components/ModWatchtools.jsx:195 msgid "Bottom-right corner" msgstr "" -#: src/components/ModCanvastools.jsx:388 +#: src/components/ModCanvastools.jsx:396 msgid "Rollback to Date" msgstr "" -#: src/components/ModCanvastools.jsx:390 +#: src/components/ModCanvastools.jsx:398 msgid "Rollback an area of the canvas to a set date (00:00 UTC)" msgstr "" -#: src/components/ModCanvastools.jsx:461 +#: src/components/ModCanvastools.jsx:473 msgid "Canvas Cleaner" msgstr "" -#: src/components/ModCanvastools.jsx:463 +#: src/components/ModCanvastools.jsx:475 msgid "Apply a filter to clean trash in large canvas areas." msgstr "" -#: src/components/ModCanvastools.jsx:564 +#: src/components/ModCanvastools.jsx:580 msgid "Stop Cleaner" msgstr "" @@ -1412,6 +1386,16 @@ msgstr "" msgid "User Name" msgstr "" +#: src/components/ChangeMail.jsx:59 +msgid "" +"Changed Mail successfully. We sent you a verification mail, " +"please verify your new mail address." +msgstr "" + +#: src/components/ChangeMail.jsx:87 +msgid "New Mail" +msgstr "" + #: src/components/ModWatchtools.jsx:48 msgid "Interval is invalid" msgstr "" @@ -1432,11 +1416,11 @@ msgstr "" msgid "IID (optional)" msgstr "" -#: src/components/ModWatchtools.jsx:239 +#: src/components/ModWatchtools.jsx:243 msgid "Get Pixels" msgstr "" -#: src/components/ModWatchtools.jsx:271 +#: src/components/ModWatchtools.jsx:275 msgid "Get Users" msgstr "" @@ -1460,6 +1444,26 @@ msgstr "" msgid "(0 = infinite)" msgstr "" +#: src/core/chartSettings.js:30 +msgid "Top 10 Countries [pxls / day]" +msgstr "" + +#: src/core/chartSettings.js:127 +msgid "Players and Pixels per hour" +msgstr "" + +#: src/core/chartSettings.js:221 +msgid "Top 10 Players [pxls / day]" +msgstr "" + +#: src/core/chartSettings.js:294 +msgid "Countries by Pixels Today" +msgstr "" + +#: src/core/chartSettings.js:351 +msgid "Total Pixels placed per day" +msgstr "" + #: src/components/contextmenus/UserContextMenu.jsx:49 msgid "Ping" msgstr "" diff --git a/src/canvases.json b/src/canvases.json index 622ad3c..7256a92 100644 --- a/src/canvases.json +++ b/src/canvases.json @@ -267,7 +267,8 @@ "cds": 1000000, "ranked": true, "req": 5000, - "sd": "2020-11-09" + "sd": "2020-11-09", + "ed": "2024-01-04" }, "8": { "ident": "t", diff --git a/src/components/Converter.jsx b/src/components/Converter.jsx index d6f597a..bcf46dc 100644 --- a/src/components/Converter.jsx +++ b/src/components/Converter.jsx @@ -197,7 +197,7 @@ function Converter() { > { Object.keys(canvases).map((canvas) => ( - (canvases[canvas].v + (canvases[canvas].v || canvases[canvas].ed || (canvases[canvas].hid && !showHiddenCanvases)) ? null : ( diff --git a/src/components/HistorySelect.jsx b/src/components/HistorySelect.jsx index d95612b..22207db 100644 --- a/src/components/HistorySelect.jsx +++ b/src/components/HistorySelect.jsx @@ -34,11 +34,13 @@ const HistorySelect = () => { const [ canvasId, canvasStartDate, + canvasEndDate, historicalDate, historicalTime, ] = useSelector((state) => [ state.canvas.canvasId, state.canvas.canvasStartDate, + state.canvas.canvasEndDate, state.canvas.historicalDate, state.canvas.historicalTime, ], shallowEqual); @@ -108,7 +110,7 @@ const HistorySelect = () => { key="dateinput" value={selectedDate} min={canvasStartDate} - max={max} + max={canvasEndDate || max} ref={dateSelect} onChange={handleDateChange} /> diff --git a/src/components/ModCanvastools.jsx b/src/components/ModCanvastools.jsx index 4aa4b7c..7a43e9e 100644 --- a/src/components/ModCanvastools.jsx +++ b/src/components/ModCanvastools.jsx @@ -266,7 +266,7 @@ function ModCanvastools() {

{descAction}

- {t`Coordinates in X_Y format:`}  + {t`Coordinates:`}  ( -

-

- {t`While we tend to not delete canvases, some canvases are started for fun or as a request by users who currently like a meme. \ -Those canvases can get boring after a while and after weeks of no major change and if they really aren't worth being kept active, we decide to remove them.`}
- {t`Here we collect those canvases to archive them in a proper way (which is currently just one).`} -

-

{t`Political Compass Canvas`}

- political-compass -

- {t`This canvas got requested during a time of political conflicts on the main Earth canvas. It was a 1024x1024 representation of the political compass with a 5s cooldown and 60s stacking. It got launched on May 11th and remained active for months till it got shut down on November 30th.`}
- {t`We decided to archive it as a timelapse with lossless encoded webm. Taking a screenshot from the timelapse results in a perfect 1:1 representation of how the canvas was at that time.`} -

-

- Timelapse: - - Download - -

- political-compass -
-); +const Archive = () => { + const [canvases, online] = useSelector((state) => [ + state.canvas.canvases, + state.ranks.online, + ], shallowEqual); + const dispatch = useDispatch(); + const selCanvas = useCallback((canvasId) => dispatch(selectCanvas(canvasId)), + [dispatch]); + + return ( +
+

+ {t`While we tend to not delete canvases, some canvases are started for fun or as a request by users who currently like a meme. Those canvases can get boring after a while and after weeks of no major change and if they really aren't worth being kept active. And Some other canvases might outlive their welcome and become useless.`}
+ {t`Here we collect removed canvases to archive them in a proper way.`} +

+ { + (window.ssv?.backupurl) && ( + <> +

{t`Removed Canvases with history available`}

+ { + Object.keys(canvases).map((canvasId) => ( + canvases[canvasId].ed + && ( + + ) + )) + } + + ) + } +

{t`Political Compass Canvas`}

+ political-compass +

+ {t`This canvas got requested during a time of political conflicts on the main Earth canvas. It was a 1024x1024 representation of the political compass with a 5s cooldown and 60s stacking. It got launched on May 11th and remained active for months till it got shut down on November 30th.`}
+ {t`We decided to archive it as a timelapse with lossless encoded webm. Taking a screenshot from the timelapse results in a perfect 1:1 representation of how the canvas was at that time.`} +

+

+ Timelapse: + + Download + +

+ political-compass +
+ ); +}; export default Archive; diff --git a/src/components/windows/CanvasSelect.jsx b/src/components/windows/CanvasSelect.jsx index 06e8b00..d696314 100644 --- a/src/components/windows/CanvasSelect.jsx +++ b/src/components/windows/CanvasSelect.jsx @@ -26,30 +26,31 @@ const CanvasSelect = () => { return (

- {t`Select the canvas you want to use. \ - Every canvas is unique and has different palettes, cooldown and requirements. \ - Archive of closed canvases can be accessed here:`}  + {t`Select the canvas you want to use. +Every canvas is unique and has different palettes, cooldown and requirements. +Archive of closed canvases can be accessed here:`}  link('ARCHIVE')} - >{t`Archive`}) + >{t`Archive`}

{ - Object.keys(canvases).map((canvasId) => ( - (!canvases[canvasId].hid || showHiddenCanvases) - && ( - - ) - )) - } + Object.keys(canvases).map((canvasId) => ( + (!canvases[canvasId].hid || showHiddenCanvases) + && !canvases[canvasId].ed + && ( + + ) + )) + }
); }; diff --git a/src/controls/keypress.js b/src/controls/keypress.js index 671fa9c..2120375 100644 --- a/src/controls/keypress.js +++ b/src/controls/keypress.js @@ -65,7 +65,7 @@ function createKeyPressHandler(store) { : t`Grid OFF`)); return; case 'h': - if (window.ssv && window.ssv.backupurl) { + if (window?.ssv.backupurl) { store.dispatch(toggleHistoricalView()); } return; diff --git a/src/core/draw.js b/src/core/draw.js index 8055547..fab94c7 100644 --- a/src/core/draw.js +++ b/src/core/draw.js @@ -87,8 +87,8 @@ export default async function drawByOffsets( curReqIPs.set(ip, startTime); const canvas = canvases[canvasId]; - if (!canvas) { - // canvas doesn't exist + if (!canvas || canvas.ed) { + // canvas doesn't exist or is expired throw new Error(1); } @@ -124,13 +124,6 @@ export default async function drawByOffsets( factor *= rankings.getCountryCoolDownFactor(user.country); - if (canvasId === 0 && (user.country === 'ir')) { - factor *= 0.5; - if (canvas.bcd * factor < 1000) { - factor = 1000 / canvas.bcd; - } - } - const bcd = Math.floor(canvas.bcd * factor); const pcd = Math.floor((canvas.pcd) ? canvas.pcd * factor : bcd); const userId = user.id; diff --git a/src/core/tilesBackup.js b/src/core/tilesBackup.js index 9f88aaf..65d6b5b 100644 --- a/src/core/tilesBackup.js +++ b/src/core/tilesBackup.js @@ -24,8 +24,8 @@ export async function updateBackupRedis(canvasRedis, backupRedis, canvases) { for (let i = 0; i < ids.length; i += 1) { const id = ids[i]; const canvas = canvases[id]; - if (canvas.v || canvas.hid) { - // ignore 3D and hidden canvases + if (canvas.v || canvas.hid || canvas.ed) { + // ignore 3D, hidden and retired canvases continue; } const chunksXY = (canvas.size / TILE_SIZE); @@ -86,8 +86,8 @@ export async function incrementalBackupRedis( const id = ids[ind]; const canvas = canvases[id]; - if (canvas.v || canvas.hid) { - // ignore 3D and hidden canvases + if (canvas.v || canvas.hid || canvas.ed) { + // ignore 3D, hidden and retired canvases continue; } diff --git a/src/core/utils.js b/src/core/utils.js index 321d457..9fb12f1 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -51,15 +51,15 @@ export function dateToString(date) { } /* - * get current date in YYYY-MM-DD + * get current UTC date in YYYY-MM-DD */ export function getToday() { const date = new Date(); - let day = date.getDate(); - let month = date.getMonth() + 1; + let day = date.getUTCDate(); + let month = date.getUTCMonth() + 1; if (month < 10) month = `0${month}`; if (day < 10) day = `0${day}`; - return `${date.getFullYear()}-${month}-${day}`; + return `${date.getUTCFullYear()}-${month}-${day}`; } // z is assumed to be height here diff --git a/src/socket/SocketServer.js b/src/socket/SocketServer.js index d2caf3f..87db2b0 100644 --- a/src/socket/SocketServer.js +++ b/src/socket/SocketServer.js @@ -584,6 +584,7 @@ class SocketServer { this.deleteAllChunks(ws); } ws.canvasId = canvasId; + if (canvases[canvasId].ed) return; const wait = await ws.user.getWait(canvasId); ws.send(dehydrateCoolDown(wait)); break; diff --git a/src/store/reducers/canvas.js b/src/store/reducers/canvas.js index 96f43ef..5985a32 100644 --- a/src/store/reducers/canvas.js +++ b/src/store/reducers/canvas.js @@ -23,6 +23,7 @@ export type CanvasState = { is3D: boolean, canvasSize: number, canvasStartDate: string, + canvasEndDate: string, palette: Palette, clrIgnore: number, view: Array, @@ -68,10 +69,12 @@ function getViewFromURL(canvases) { const clrIgnore = canvas.cli || 0; const { colors, - sd: canvasStartDate, + sd: canvasStartDate = null, + ed: canvasEndDate = null, size: canvasSize, } = canvas; const is3D = !!canvas.v; + const isHistoricalView = !!canvasEndDate; const x = parseInt(almost[1], 10); const y = parseInt(almost[2], 10); @@ -92,7 +95,8 @@ function getViewFromURL(canvases) { } if (!is3D && canvasId !== null) { - scale = clamp(scale, TILE_SIZE / canvasSize, MAX_SCALE); + const minScale = (isHistoricalView) ? 0.7 : TILE_SIZE / canvasSize; + scale = clamp(scale, minScale, MAX_SCALE); view.length = 2; } @@ -103,12 +107,14 @@ function getViewFromURL(canvases) { historicalCanvasSize: canvasSize, is3D, canvasStartDate, + canvasEndDate, canvasMaxTiledZoom: getMaxTiledZoom(canvasSize), palette: new Palette(colors, 0), clrIgnore, selectedColor: clrIgnore, view, viewscale: scale, + isHistoricalView, scale, canvases, }; @@ -121,12 +127,14 @@ function getViewFromURL(canvases) { historicalCanvasSize: canvasd.size, is3D: !!canvasd.v, canvasStartDate: null, + canvasEndDate: null, canvasMaxTiledZoom: getMaxTiledZoom(canvasd.size), palette: new Palette(canvasd.colors, 0), clrIgnore: canvasd.cli || 0, selectedColor: canvasd.cli || 0, view: [0, 0, 0], viewscale: DEFAULT_SCALE, + isHistoricalView: false, scale: DEFAULT_SCALE, canvases, }; @@ -135,7 +143,6 @@ function getViewFromURL(canvases) { const initialState = { ...getViewFromURL(DEFAULT_CANVASES), - isHistoricalView: false, historicalDate: null, historicalTime: null, showHiddenCanvases: false, @@ -220,9 +227,11 @@ export default function canvasReducer( } = state; return { ...state, - scale: (scale < 1.0) ? 1.0 : scale, - viewscale: (viewscale < 1.0) ? 1.0 : viewscale, - isHistoricalView: !state.is3D && !state.isHistoricalView, + scale: (scale < 0.7) ? 0.7 : scale, + viewscale: (viewscale < 0.7) ? 0.7 : viewscale, + isHistoricalView: !state.is3D && ( + !state.isHistoricalView || state.canvasEndDate + ), }; } @@ -289,7 +298,8 @@ export default function canvasReducer( const clrIgnore = canvas.cli || 0; const { size: canvasSize, - sd: canvasStartDate, + sd: canvasStartDate = null, + ed: canvasEndDate = null, ident: canvasIdent, colors, } = canvas; @@ -306,7 +316,9 @@ export default function canvasReducer( selectedColor = prevCanvasCoords[canvasId].selectedColor; } //--- - const isHistoricalView = !is3D && state.isHistoricalView; + const isHistoricalView = !is3D && ( + state.isHistoricalView || !!canvasEndDate + ); const historicalCanvasSize = getHistoricalCanvasSize( state.historicalDate, canvasSize, @@ -324,6 +336,7 @@ export default function canvasReducer( canvasSize, is3D, canvasStartDate, + canvasEndDate, palette, clrIgnore, view, @@ -349,7 +362,9 @@ export default function canvasReducer( let { canvasIdent, scale, view } = state; let canvasId = getIdFromObject(canvases, canvasIdent); - if (canvasId === null) { + if (canvasId === null || ( + !window.ssv?.backupurl && canvases[canvasId].ed + )) { canvasId = DEFAULT_CANVAS_ID; canvasIdent = canvases[DEFAULT_CANVAS_ID].ident; } @@ -358,13 +373,16 @@ export default function canvasReducer( const is3D = !!canvas.v; const { size: canvasSize, - sd: canvasStartDate, + sd: canvasStartDate = null, + ed: canvasEndDate = null, colors, } = canvas; const palette = new Palette(colors, 0); + const isHistoricalView = !!canvasEndDate; if (!is3D) { - scale = clamp(scale, TILE_SIZE / canvasSize, MAX_SCALE); + const minScale = (isHistoricalView) ? 0.7 : TILE_SIZE / canvasSize; + scale = clamp(scale, minScale, MAX_SCALE); view = [view[0], view[1]]; } @@ -380,6 +398,7 @@ export default function canvasReducer( canvases, viewscale: scale, scale, + isHistoricalView, view, }; }