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 |
| 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:

View File

@ -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."

View File

@ -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 ""

View File

@ -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",

View File

@ -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
: (

View File

@ -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}
/>

View File

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

View File

@ -1,8 +1,12 @@
/* 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 CanvasItem from '../CanvasItem';
import { selectCanvas } from '../../store/actions';
const imageStyle = {
maxWidth: '20%',
padding: 2,
@ -10,35 +14,65 @@ const imageStyle = {
verticalAlign: 'middle',
};
const Archive = () => (
<div className="content">
<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, we decide to remove them.`}<br />
{t`Here we collect those canvases to archive them in a proper way (which is currently just one).`}
</p>
<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>
);
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 (
<div className="content">
<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 />
{t`Here we collect removed canvases to archive them in a proper way.`}
</p>
{
(window.ssv?.backupurl) && (
<>
<h3>{t`Removed Canvases with history available`}</h3>
{
Object.keys(canvases).map((canvasId) => (
canvases[canvasId].ed
&& (
<CanvasItem
key={canvasId}
online={online[canvasId]}
canvasId={canvasId}
canvas={canvases[canvasId]}
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;

View File

@ -26,30 +26,31 @@ const CanvasSelect = () => {
return (
<div className="content">
<p>
{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:`}&nbsp;
{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:`}&nbsp;
<span
role="button"
tabIndex={0}
className="modallink"
onClick={() => link('ARCHIVE')}
>{t`Archive`}</span>)
>{t`Archive`}</span>
</p>
{
Object.keys(canvases).map((canvasId) => (
(!canvases[canvasId].hid || showHiddenCanvases)
&& (
<CanvasItem
key={canvasId}
online={online[canvasId]}
canvasId={canvasId}
canvas={canvases[canvasId]}
selCanvas={selCanvas}
/>
)
))
}
Object.keys(canvases).map((canvasId) => (
(!canvases[canvasId].hid || showHiddenCanvases)
&& !canvases[canvasId].ed
&& (
<CanvasItem
key={canvasId}
online={online[canvasId]}
canvasId={canvasId}
canvas={canvases[canvasId]}
selCanvas={selCanvas}
/>
)
))
}
</div>
);
};

View File

@ -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;

View File

@ -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;

View File

@ -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;
}

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() {
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

View File

@ -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;

View File

@ -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,
};
}