add ability to retire canvas and retire 1bit canvas

This commit is contained in:
HF 2024-01-04 15:41:23 +01:00
parent fac58caa71
commit 20046e88e0
15 changed files with 415 additions and 359 deletions

View File

@ -133,7 +133,6 @@ Meaning of some values:
| size | canvas size, power of 2 and between 256 and 65536 | | size | canvas size, power of 2 and between 256 and 65536 |
| bcd | Base cooldown for unset pixels | | bcd | Base cooldown for unset pixels |
| cds | Stack time of Cooldown | | cds | Stack time of Cooldown |
| sd | Start-date of the canvas (for historical view) |
#### Optional canvases Configuration #### Optional canvases Configuration
@ -145,6 +144,8 @@ Meaning of some values:
| ranked | If pixels on canvas count on player statistic (default: false) | | ranked | If pixels on canvas count on player statistic (default: false) |
| v | If 3D voxel canvas (boolean) (default: false) | | v | If 3D voxel canvas (boolean) (default: false) |
| hid | Hidden canvases, can be just seen by pressing P (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: Notes:

View File

@ -98,22 +98,22 @@ msgstr ""
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr ""
#: src/ssr/PopUp.jsx:55 #: src/ssr/Main.jsx:55
msgid "ppfun"
msgstr ""
#: src/ssr/PopUp.jsx:56
msgid "PixelPlanet.Fun PopUp"
msgstr ""
#: src/ssr/Main.jsx:64
msgid "PixelPlanet.Fun" msgid "PixelPlanet.Fun"
msgstr "" msgstr ""
#: src/ssr/Main.jsx:65 #: src/ssr/Main.jsx:56
msgid "Place color pixels on an map styled canvas with other players online" msgid "Place color pixels on an map styled canvas with other players online"
msgstr "" msgstr ""
#: src/ssr/PopUp.jsx:47
msgid "ppfun"
msgstr ""
#: src/ssr/PopUp.jsx:48
msgid "PixelPlanet.Fun PopUp"
msgstr ""
#: src/utils/validation.js:17 #: src/utils/validation.js:17
msgid "Email can't be empty." msgid "Email can't be empty."
msgstr "" msgstr ""
@ -204,6 +204,10 @@ msgstr ""
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: src/routes/api/baninfo.js:32
msgid "You are not banned"
msgstr ""
#: src/routes/api/modtools.js:53 #: src/routes/api/modtools.js:53
msgid "You are not logged in" msgid "You are not logged in"
msgstr "" msgstr ""
@ -216,8 +220,44 @@ msgstr ""
msgid "Just admins can do that" msgid "Just admins can do that"
msgstr "" msgstr ""
#: src/routes/api/baninfo.js:32 #: src/routes/api/auth/logout.js:11
msgid "You are not banned" 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 "" msgstr ""
#: src/routes/api/auth/change_mail.js:22 #: src/routes/api/auth/change_mail.js:22
@ -225,6 +265,23 @@ msgstr ""
msgid "This email provider is not allowed" msgid "This email provider is not allowed"
msgstr "" 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 #: src/routes/api/auth/register.js:31
msgid "No Captcha given" msgid "No Captcha given"
msgstr "" msgstr ""
@ -257,136 +314,79 @@ msgstr ""
msgid "Failed to establish session after register :(" msgid "Failed to establish session after register :("
msgstr "" msgstr ""
#: src/routes/api/auth/verify.js:26 #: src/canvasesDesc.js:20
#: 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
msgid "Earth" msgid "Earth"
msgstr "" msgstr ""
#: src/canvasesDesc.js:20 #: src/canvasesDesc.js:21
msgid "Moon" msgid "Moon"
msgstr "" msgstr ""
#: src/canvasesDesc.js:21 #: src/canvasesDesc.js:22
msgid "3D Canvas" msgid "3D Canvas"
msgstr "" msgstr ""
#: src/canvasesDesc.js:22 #: src/canvasesDesc.js:23
msgid "Coronavirus" msgid "Coronavirus"
msgstr "" msgstr ""
#: src/canvasesDesc.js:23 #: src/canvasesDesc.js:24
msgid "PixelZone" msgid "PixelZone"
msgstr "" msgstr ""
#: src/canvasesDesc.js:24 #: src/canvasesDesc.js:25
msgid "PixelCanvas" msgid "PixelCanvas"
msgstr "" msgstr ""
#: src/canvasesDesc.js:25 #: src/canvasesDesc.js:26
msgid "1bit" msgid "1bit"
msgstr "" msgstr ""
#: src/canvasesDesc.js:26 #: src/canvasesDesc.js:27
msgid "Top10" msgid "Top10"
msgstr "" msgstr ""
#: src/canvasesDesc.js:27 #: src/canvasesDesc.js:28
msgid "Thoia" msgid "Thoia"
msgstr "" msgstr ""
#: src/canvasesDesc.js:30 #: src/canvasesDesc.js:31
msgid "Our main canvas, a huge map of the world. Place everywhere you like" msgid "Our main canvas, a huge map of the world. Place everywhere you like"
msgstr "" msgstr ""
#: src/canvasesDesc.js:31 #: src/canvasesDesc.js:32
msgid "" msgid ""
"Moon canvas. Safe space for art. No flags or large text (unless part of " "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." "art) or art larger than 1.5k x 1.5k pixels."
msgstr "" msgstr ""
#: src/canvasesDesc.js:32 #: src/canvasesDesc.js:33
msgid "Place Voxels on a 3D canvas with others" msgid "Place Voxels on a 3D canvas with others"
msgstr "" msgstr ""
#: src/canvasesDesc.js:33 #: src/canvasesDesc.js:34
msgid "Special canvas to spread awareness of SARS-CoV2" msgid "Special canvas to spread awareness of SARS-CoV2"
msgstr "" msgstr ""
#: src/canvasesDesc.js:34 #: src/canvasesDesc.js:35
msgid "Mirror of PixelZone" msgid "Mirror of PixelZone"
msgstr "" msgstr ""
#: src/canvasesDesc.js:35 #: src/canvasesDesc.js:36
msgid "Mirror of PixelCanvas" msgid "Mirror of PixelCanvas"
msgstr "" msgstr ""
#: src/canvasesDesc.js:36 #: src/canvasesDesc.js:37
msgid "Black and White canvas" msgid "Black and White canvas"
msgstr "" msgstr ""
#: src/canvasesDesc.js:37 #: src/canvasesDesc.js:38
msgid "" msgid ""
"A canvas for the most active players from the the previous day. Daily " "A canvas for the most active players from the the previous day. Daily "
"ranking updates at 00:00 UTC." "ranking updates at 00:00 UTC."
msgstr "" msgstr ""
#: src/canvasesDesc.js:38 #: src/canvasesDesc.js:39
msgid "" msgid ""
"Thoia World Canvas. Advanced fictional worldbuilding and arts. Abandon the " "Thoia World Canvas. Advanced fictional worldbuilding and arts. Abandon the "
"old world and all it entails." "old world and all it entails."

View File

@ -46,6 +46,14 @@ msgstr ""
msgid "Hide Hidden Canvases" msgid "Hide Hidden Canvases"
msgstr "" 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 #: src/ui/PixelTransferController.js:70
msgid "Error :(" msgid "Error :("
msgstr "" msgstr ""
@ -171,14 +179,6 @@ msgstr ""
msgid "Error ${ retCode }" msgid "Error ${ retCode }"
msgstr "" 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/components/BanInfo.jsx:136
#: src/store/actions/index.js:7 #: src/store/actions/index.js:7
msgid "OK" msgid "OK"
@ -231,6 +231,13 @@ msgstr ""
msgid "You have new messages in chat" msgid "You have new messages in chat"
msgstr "" 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 #: src/components/OnlineBox.jsx:40
msgid "Online Users on Canvas" msgid "Online Users on Canvas"
msgstr "" msgstr ""
@ -243,26 +250,11 @@ msgstr ""
msgid "Pixels placed" msgid "Pixels placed"
msgstr "" 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/buttons/CanvasSwitchButton.jsx:20
#: src/components/windows/index.js:19 #: src/components/windows/index.js:19
msgid "Canvas Selection" msgid "Canvas Selection"
msgstr "" 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 #: src/components/buttons/ExpandMenuButton.jsx:22
msgid "Close Menu" msgid "Close Menu"
msgstr "" msgstr ""
@ -271,11 +263,19 @@ msgstr ""
msgid "Open Menu" msgid "Open Menu"
msgstr "" 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" msgid "Loading"
msgstr "" msgstr ""
#: src/components/HistorySelect.jsx:145 #: src/components/HistorySelect.jsx:147
msgid "Select Date above" msgid "Select Date above"
msgstr "" msgstr ""
@ -449,6 +449,54 @@ msgstr ""
msgid "Why?" msgid "Why?"
msgstr "" 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 #: src/components/windows/Help.jsx:42
msgid "Place color pixels on a large canvas with other players online!" msgid "Place color pixels on a large canvas with other players online!"
msgstr "" msgstr ""
@ -782,60 +830,16 @@ msgstr ""
#: src/components/Admintools.jsx:154 #: src/components/Admintools.jsx:154
#: src/components/Admintools.jsx:238 #: src/components/Admintools.jsx:238
#: src/components/ModCanvastools.jsx:302 #: src/components/ModCanvastools.jsx:305
#: src/components/ModCanvastools.jsx:382 #: src/components/ModCanvastools.jsx:390
#: src/components/ModCanvastools.jsx:455 #: src/components/ModCanvastools.jsx:467
#: src/components/ModCanvastools.jsx:546 #: src/components/ModCanvastools.jsx:562
#: src/components/ModIIDtools.jsx:135 #: src/components/ModIIDtools.jsx:135
#: src/components/windows/ForgotPassword.jsx:84 #: src/components/windows/ForgotPassword.jsx:84
#: src/components/windows/Register.jsx:127 #: src/components/windows/Register.jsx:127
msgid "Submit" msgid "Submit"
msgstr "" 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 #: src/components/windows/Chat.jsx:180
msgid "Start chatting here" msgid "Start chatting here"
msgstr "" msgstr ""
@ -949,13 +953,6 @@ msgstr ""
msgid "Copy" msgid "Copy"
msgstr "" 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 #: src/components/LogInArea.jsx:19
msgid "Login to access more features and stats." msgid "Login to access more features and stats."
msgstr "" msgstr ""
@ -980,6 +977,58 @@ msgstr ""
msgid "Register" msgid "Register"
msgstr "" 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 #: src/components/UserAreaContent.jsx:62
msgid "Today Placed Pixels" msgid "Today Placed Pixels"
msgstr "" msgstr ""
@ -1138,79 +1187,6 @@ msgstr ""
msgid "Ranking updates every 5 min. Daily rankings get reset at midnight UTC." msgid "Ranking updates every 5 min. Daily rankings get reset at midnight UTC."
msgstr "" 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 #: src/components/UserMessages.jsx:28
msgid "" msgid ""
"Please verify your mail address or your account could get deleted after a " "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." msgid "Click here to request a new verification mail."
msgstr "" 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 #: src/components/ChangePassword.jsx:21
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "" msgstr ""
@ -1245,24 +1229,6 @@ msgstr ""
msgid "Confirm New Password" msgid "Confirm New Password"
msgstr "" 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 #: src/components/SocialSettings.jsx:35
msgid "Block DMs" msgid "Block DMs"
msgstr "" msgstr ""
@ -1287,6 +1253,14 @@ msgstr ""
msgid "You have no users blocked" msgid "You have no users blocked"
msgstr "" msgstr ""
#: src/components/LogInForm.jsx:77
msgid "Name or Email"
msgstr ""
#: src/components/LogInForm.jsx:88
msgid "LogIn"
msgstr ""
#: src/components/ModCanvastools.jsx:168 #: src/components/ModCanvastools.jsx:168
msgid "Build image on canvas." msgid "Build image on canvas."
msgstr "" msgstr ""
@ -1333,50 +1307,50 @@ msgid "File"
msgstr "" msgstr ""
#: src/components/ModCanvastools.jsx:269 #: src/components/ModCanvastools.jsx:269
msgid "Coordinates in X_Y format:" msgid "Coordinates:"
msgstr "" msgstr ""
#: src/components/ModCanvastools.jsx:307 #: src/components/ModCanvastools.jsx:310
msgid "Pixel Protection" msgid "Pixel Protection"
msgstr "" msgstr ""
#: src/components/ModCanvastools.jsx:309 #: src/components/ModCanvastools.jsx:314
msgid "" msgid ""
"Set protection of areas (if you need finer grained control, " "Set protection of areas (if you need finer grained control, use protect "
"use protect with image upload and alpha layers)" "with image upload and alpha layers)"
msgstr "" msgstr ""
#: src/components/ModCanvastools.jsx:330 #: src/components/ModCanvastools.jsx:334
#: src/components/ModCanvastools.jsx:403 #: src/components/ModCanvastools.jsx:411
#: src/components/ModCanvastools.jsx:486 #: src/components/ModCanvastools.jsx:498
#: src/components/ModWatchtools.jsx:176 #: src/components/ModWatchtools.jsx:176
msgid "Top-left corner" msgid "Top-left corner"
msgstr "" msgstr ""
#: src/components/ModCanvastools.jsx:347 #: src/components/ModCanvastools.jsx:353
#: src/components/ModCanvastools.jsx:420 #: src/components/ModCanvastools.jsx:430
#: src/components/ModCanvastools.jsx:503 #: src/components/ModCanvastools.jsx:517
#: src/components/ModWatchtools.jsx:193 #: src/components/ModWatchtools.jsx:195
msgid "Bottom-right corner" msgid "Bottom-right corner"
msgstr "" msgstr ""
#: src/components/ModCanvastools.jsx:388 #: src/components/ModCanvastools.jsx:396
msgid "Rollback to Date" msgid "Rollback to Date"
msgstr "" 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)" msgid "Rollback an area of the canvas to a set date (00:00 UTC)"
msgstr "" msgstr ""
#: src/components/ModCanvastools.jsx:461 #: src/components/ModCanvastools.jsx:473
msgid "Canvas Cleaner" msgid "Canvas Cleaner"
msgstr "" msgstr ""
#: src/components/ModCanvastools.jsx:463 #: src/components/ModCanvastools.jsx:475
msgid "Apply a filter to clean trash in large canvas areas." msgid "Apply a filter to clean trash in large canvas areas."
msgstr "" msgstr ""
#: src/components/ModCanvastools.jsx:564 #: src/components/ModCanvastools.jsx:580
msgid "Stop Cleaner" msgid "Stop Cleaner"
msgstr "" msgstr ""
@ -1412,6 +1386,16 @@ msgstr ""
msgid "User Name" msgid "User Name"
msgstr "" 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 #: src/components/ModWatchtools.jsx:48
msgid "Interval is invalid" msgid "Interval is invalid"
msgstr "" msgstr ""
@ -1432,11 +1416,11 @@ msgstr ""
msgid "IID (optional)" msgid "IID (optional)"
msgstr "" msgstr ""
#: src/components/ModWatchtools.jsx:239 #: src/components/ModWatchtools.jsx:243
msgid "Get Pixels" msgid "Get Pixels"
msgstr "" msgstr ""
#: src/components/ModWatchtools.jsx:271 #: src/components/ModWatchtools.jsx:275
msgid "Get Users" msgid "Get Users"
msgstr "" msgstr ""
@ -1460,6 +1444,26 @@ msgstr ""
msgid "(0 = infinite)" msgid "(0 = infinite)"
msgstr "" 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 #: src/components/contextmenus/UserContextMenu.jsx:49
msgid "Ping" msgid "Ping"
msgstr "" msgstr ""

View File

@ -267,7 +267,8 @@
"cds": 1000000, "cds": 1000000,
"ranked": true, "ranked": true,
"req": 5000, "req": 5000,
"sd": "2020-11-09" "sd": "2020-11-09",
"ed": "2024-01-04"
}, },
"8": { "8": {
"ident": "t", "ident": "t",

View File

@ -197,7 +197,7 @@ function Converter() {
> >
{ {
Object.keys(canvases).map((canvas) => ( Object.keys(canvases).map((canvas) => (
(canvases[canvas].v (canvases[canvas].v || canvases[canvas].ed
|| (canvases[canvas].hid && !showHiddenCanvases)) || (canvases[canvas].hid && !showHiddenCanvases))
? null ? null
: ( : (

View File

@ -34,11 +34,13 @@ const HistorySelect = () => {
const [ const [
canvasId, canvasId,
canvasStartDate, canvasStartDate,
canvasEndDate,
historicalDate, historicalDate,
historicalTime, historicalTime,
] = useSelector((state) => [ ] = useSelector((state) => [
state.canvas.canvasId, state.canvas.canvasId,
state.canvas.canvasStartDate, state.canvas.canvasStartDate,
state.canvas.canvasEndDate,
state.canvas.historicalDate, state.canvas.historicalDate,
state.canvas.historicalTime, state.canvas.historicalTime,
], shallowEqual); ], shallowEqual);
@ -108,7 +110,7 @@ const HistorySelect = () => {
key="dateinput" key="dateinput"
value={selectedDate} value={selectedDate}
min={canvasStartDate} min={canvasStartDate}
max={max} max={canvasEndDate || max}
ref={dateSelect} ref={dateSelect}
onChange={handleDateChange} onChange={handleDateChange}
/> />

View File

@ -266,7 +266,7 @@ function ModCanvastools() {
</select> </select>
<p>{descAction}</p> <p>{descAction}</p>
<p> <p>
{t`Coordinates in X_Y format:`}&nbsp; {t`Coordinates:`}&nbsp;
<input <input
defaultValue={keptState.coords} defaultValue={keptState.coords}
style={{ style={{

View File

@ -1,8 +1,12 @@
/* eslint-disable max-len */ /* eslint-disable max-len */
import React from 'react'; import React, { useCallback } from 'react';
import { useDispatch, useSelector, shallowEqual } from 'react-redux';
import { t } from 'ttag'; import { t } from 'ttag';
import CanvasItem from '../CanvasItem';
import { selectCanvas } from '../../store/actions';
const imageStyle = { const imageStyle = {
maxWidth: '20%', maxWidth: '20%',
padding: 2, padding: 2,
@ -10,35 +14,65 @@ const imageStyle = {
verticalAlign: 'middle', verticalAlign: 'middle',
}; };
const Archive = () => ( const Archive = () => {
<div className="content"> const [canvases, online] = useSelector((state) => [
<p> state.canvas.canvases,
{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. \ state.ranks.online,
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.`}<br /> ], shallowEqual);
{t`Here we collect those canvases to archive them in a proper way (which is currently just one).`} const dispatch = useDispatch();
</p> const selCanvas = useCallback((canvasId) => dispatch(selectCanvas(canvasId)),
<h3>{t`Political Compass Canvas`}</h3> [dispatch]);
<img
style={imageStyle} return (
alt="political-compass" <div className="content">
src="https://storage.pixelplanet.fun/compass-preview.png" <p>
/> {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.`}<br />
<p> {t`Here we collect removed canvases to archive them in a proper way.`}
{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.`}<br /> </p>
{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.`} {
</p> (window.ssv?.backupurl) && (
<p className="modalinfo"> <>
Timelapse: <h3>{t`Removed Canvases with history available`}</h3>
<a href="https://storage.pixelplanet.fun/compass-timelapse.webm"> {
Download Object.keys(canvases).map((canvasId) => (
</a> canvases[canvasId].ed
</p> && (
<img <CanvasItem
style={{ padding: 2, maxWidth: '80%', verticalAlign: 'middle' }} key={canvasId}
alt="political-compass" online={online[canvasId]}
src="https://storage.pixelplanet.fun/compass-final.png" canvasId={canvasId}
/> canvas={canvases[canvasId]}
</div> selCanvas={selCanvas}
); />
)
))
}
</>
)
}
<h3>{t`Political Compass Canvas`}</h3>
<img
style={imageStyle}
alt="political-compass"
src="https://storage.pixelplanet.fun/compass-preview.png"
/>
<p>
{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.`}<br />
{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.`}
</p>
<p className="modalinfo">
Timelapse:
<a href="https://storage.pixelplanet.fun/compass-timelapse.webm">
Download
</a>
</p>
<img
style={{ padding: 2, maxWidth: '80%', verticalAlign: 'middle' }}
alt="political-compass"
src="https://storage.pixelplanet.fun/compass-final.png"
/>
</div>
);
};
export default Archive; export default Archive;

View File

@ -26,30 +26,31 @@ const CanvasSelect = () => {
return ( return (
<div className="content"> <div className="content">
<p> <p>
{t`Select the canvas you want to use. \ {t`Select the canvas you want to use.
Every canvas is unique and has different palettes, cooldown and requirements. \ Every canvas is unique and has different palettes, cooldown and requirements.
Archive of closed canvases can be accessed here:`}&nbsp; Archive of closed canvases can be accessed here:`}&nbsp;
<span <span
role="button" role="button"
tabIndex={0} tabIndex={0}
className="modallink" className="modallink"
onClick={() => link('ARCHIVE')} onClick={() => link('ARCHIVE')}
>{t`Archive`}</span>) >{t`Archive`}</span>
</p> </p>
{ {
Object.keys(canvases).map((canvasId) => ( Object.keys(canvases).map((canvasId) => (
(!canvases[canvasId].hid || showHiddenCanvases) (!canvases[canvasId].hid || showHiddenCanvases)
&& ( && !canvases[canvasId].ed
<CanvasItem && (
key={canvasId} <CanvasItem
online={online[canvasId]} key={canvasId}
canvasId={canvasId} online={online[canvasId]}
canvas={canvases[canvasId]} canvasId={canvasId}
selCanvas={selCanvas} canvas={canvases[canvasId]}
/> selCanvas={selCanvas}
) />
)) )
} ))
}
</div> </div>
); );
}; };

View File

@ -65,7 +65,7 @@ function createKeyPressHandler(store) {
: t`Grid OFF`)); : t`Grid OFF`));
return; return;
case 'h': case 'h':
if (window.ssv && window.ssv.backupurl) { if (window?.ssv.backupurl) {
store.dispatch(toggleHistoricalView()); store.dispatch(toggleHistoricalView());
} }
return; return;

View File

@ -87,8 +87,8 @@ export default async function drawByOffsets(
curReqIPs.set(ip, startTime); curReqIPs.set(ip, startTime);
const canvas = canvases[canvasId]; const canvas = canvases[canvasId];
if (!canvas) { if (!canvas || canvas.ed) {
// canvas doesn't exist // canvas doesn't exist or is expired
throw new Error(1); throw new Error(1);
} }
@ -124,13 +124,6 @@ export default async function drawByOffsets(
factor *= rankings.getCountryCoolDownFactor(user.country); 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 bcd = Math.floor(canvas.bcd * factor);
const pcd = Math.floor((canvas.pcd) ? canvas.pcd * factor : bcd); const pcd = Math.floor((canvas.pcd) ? canvas.pcd * factor : bcd);
const userId = user.id; const userId = user.id;

View File

@ -24,8 +24,8 @@ export async function updateBackupRedis(canvasRedis, backupRedis, canvases) {
for (let i = 0; i < ids.length; i += 1) { for (let i = 0; i < ids.length; i += 1) {
const id = ids[i]; const id = ids[i];
const canvas = canvases[id]; const canvas = canvases[id];
if (canvas.v || canvas.hid) { if (canvas.v || canvas.hid || canvas.ed) {
// ignore 3D and hidden canvases // ignore 3D, hidden and retired canvases
continue; continue;
} }
const chunksXY = (canvas.size / TILE_SIZE); const chunksXY = (canvas.size / TILE_SIZE);
@ -86,8 +86,8 @@ export async function incrementalBackupRedis(
const id = ids[ind]; const id = ids[ind];
const canvas = canvases[id]; const canvas = canvases[id];
if (canvas.v || canvas.hid) { if (canvas.v || canvas.hid || canvas.ed) {
// ignore 3D and hidden canvases // ignore 3D, hidden and retired canvases
continue; continue;
} }

View File

@ -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() { export function getToday() {
const date = new Date(); const date = new Date();
let day = date.getDate(); let day = date.getUTCDate();
let month = date.getMonth() + 1; let month = date.getUTCMonth() + 1;
if (month < 10) month = `0${month}`; if (month < 10) month = `0${month}`;
if (day < 10) day = `0${day}`; if (day < 10) day = `0${day}`;
return `${date.getFullYear()}-${month}-${day}`; return `${date.getUTCFullYear()}-${month}-${day}`;
} }
// z is assumed to be height here // z is assumed to be height here

View File

@ -584,6 +584,7 @@ class SocketServer {
this.deleteAllChunks(ws); this.deleteAllChunks(ws);
} }
ws.canvasId = canvasId; ws.canvasId = canvasId;
if (canvases[canvasId].ed) return;
const wait = await ws.user.getWait(canvasId); const wait = await ws.user.getWait(canvasId);
ws.send(dehydrateCoolDown(wait)); ws.send(dehydrateCoolDown(wait));
break; break;

View File

@ -23,6 +23,7 @@ export type CanvasState = {
is3D: boolean, is3D: boolean,
canvasSize: number, canvasSize: number,
canvasStartDate: string, canvasStartDate: string,
canvasEndDate: string,
palette: Palette, palette: Palette,
clrIgnore: number, clrIgnore: number,
view: Array, view: Array,
@ -68,10 +69,12 @@ function getViewFromURL(canvases) {
const clrIgnore = canvas.cli || 0; const clrIgnore = canvas.cli || 0;
const { const {
colors, colors,
sd: canvasStartDate, sd: canvasStartDate = null,
ed: canvasEndDate = null,
size: canvasSize, size: canvasSize,
} = canvas; } = canvas;
const is3D = !!canvas.v; const is3D = !!canvas.v;
const isHistoricalView = !!canvasEndDate;
const x = parseInt(almost[1], 10); const x = parseInt(almost[1], 10);
const y = parseInt(almost[2], 10); const y = parseInt(almost[2], 10);
@ -92,7 +95,8 @@ function getViewFromURL(canvases) {
} }
if (!is3D && canvasId !== null) { 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; view.length = 2;
} }
@ -103,12 +107,14 @@ function getViewFromURL(canvases) {
historicalCanvasSize: canvasSize, historicalCanvasSize: canvasSize,
is3D, is3D,
canvasStartDate, canvasStartDate,
canvasEndDate,
canvasMaxTiledZoom: getMaxTiledZoom(canvasSize), canvasMaxTiledZoom: getMaxTiledZoom(canvasSize),
palette: new Palette(colors, 0), palette: new Palette(colors, 0),
clrIgnore, clrIgnore,
selectedColor: clrIgnore, selectedColor: clrIgnore,
view, view,
viewscale: scale, viewscale: scale,
isHistoricalView,
scale, scale,
canvases, canvases,
}; };
@ -121,12 +127,14 @@ function getViewFromURL(canvases) {
historicalCanvasSize: canvasd.size, historicalCanvasSize: canvasd.size,
is3D: !!canvasd.v, is3D: !!canvasd.v,
canvasStartDate: null, canvasStartDate: null,
canvasEndDate: null,
canvasMaxTiledZoom: getMaxTiledZoom(canvasd.size), canvasMaxTiledZoom: getMaxTiledZoom(canvasd.size),
palette: new Palette(canvasd.colors, 0), palette: new Palette(canvasd.colors, 0),
clrIgnore: canvasd.cli || 0, clrIgnore: canvasd.cli || 0,
selectedColor: canvasd.cli || 0, selectedColor: canvasd.cli || 0,
view: [0, 0, 0], view: [0, 0, 0],
viewscale: DEFAULT_SCALE, viewscale: DEFAULT_SCALE,
isHistoricalView: false,
scale: DEFAULT_SCALE, scale: DEFAULT_SCALE,
canvases, canvases,
}; };
@ -135,7 +143,6 @@ function getViewFromURL(canvases) {
const initialState = { const initialState = {
...getViewFromURL(DEFAULT_CANVASES), ...getViewFromURL(DEFAULT_CANVASES),
isHistoricalView: false,
historicalDate: null, historicalDate: null,
historicalTime: null, historicalTime: null,
showHiddenCanvases: false, showHiddenCanvases: false,
@ -220,9 +227,11 @@ export default function canvasReducer(
} = state; } = state;
return { return {
...state, ...state,
scale: (scale < 1.0) ? 1.0 : scale, scale: (scale < 0.7) ? 0.7 : scale,
viewscale: (viewscale < 1.0) ? 1.0 : viewscale, viewscale: (viewscale < 0.7) ? 0.7 : viewscale,
isHistoricalView: !state.is3D && !state.isHistoricalView, isHistoricalView: !state.is3D && (
!state.isHistoricalView || state.canvasEndDate
),
}; };
} }
@ -289,7 +298,8 @@ export default function canvasReducer(
const clrIgnore = canvas.cli || 0; const clrIgnore = canvas.cli || 0;
const { const {
size: canvasSize, size: canvasSize,
sd: canvasStartDate, sd: canvasStartDate = null,
ed: canvasEndDate = null,
ident: canvasIdent, ident: canvasIdent,
colors, colors,
} = canvas; } = canvas;
@ -306,7 +316,9 @@ export default function canvasReducer(
selectedColor = prevCanvasCoords[canvasId].selectedColor; selectedColor = prevCanvasCoords[canvasId].selectedColor;
} }
//--- //---
const isHistoricalView = !is3D && state.isHistoricalView; const isHistoricalView = !is3D && (
state.isHistoricalView || !!canvasEndDate
);
const historicalCanvasSize = getHistoricalCanvasSize( const historicalCanvasSize = getHistoricalCanvasSize(
state.historicalDate, state.historicalDate,
canvasSize, canvasSize,
@ -324,6 +336,7 @@ export default function canvasReducer(
canvasSize, canvasSize,
is3D, is3D,
canvasStartDate, canvasStartDate,
canvasEndDate,
palette, palette,
clrIgnore, clrIgnore,
view, view,
@ -349,7 +362,9 @@ export default function canvasReducer(
let { canvasIdent, scale, view } = state; let { canvasIdent, scale, view } = state;
let canvasId = getIdFromObject(canvases, canvasIdent); let canvasId = getIdFromObject(canvases, canvasIdent);
if (canvasId === null) { if (canvasId === null || (
!window.ssv?.backupurl && canvases[canvasId].ed
)) {
canvasId = DEFAULT_CANVAS_ID; canvasId = DEFAULT_CANVAS_ID;
canvasIdent = canvases[DEFAULT_CANVAS_ID].ident; canvasIdent = canvases[DEFAULT_CANVAS_ID].ident;
} }
@ -358,13 +373,16 @@ export default function canvasReducer(
const is3D = !!canvas.v; const is3D = !!canvas.v;
const { const {
size: canvasSize, size: canvasSize,
sd: canvasStartDate, sd: canvasStartDate = null,
ed: canvasEndDate = null,
colors, colors,
} = canvas; } = canvas;
const palette = new Palette(colors, 0); const palette = new Palette(colors, 0);
const isHistoricalView = !!canvasEndDate;
if (!is3D) { 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]]; view = [view[0], view[1]];
} }
@ -380,6 +398,7 @@ export default function canvasReducer(
canvases, canvases,
viewscale: scale, viewscale: scale,
scale, scale,
isHistoricalView,
view, view,
}; };
} }