chat and localisation
more translations allow links in chat parallell webpack builds
This commit is contained in:
parent
1db8adbb39
commit
26c6de0b02
|
@ -775,7 +775,7 @@ msgstr "Gesamtzeit"
|
||||||
|
|
||||||
#: src/components/CanvasItem.jsx:54
|
#: src/components/CanvasItem.jsx:54
|
||||||
msgid "Ranked"
|
msgid "Ranked"
|
||||||
msgstr ""
|
msgstr "Gewertet"
|
||||||
|
|
||||||
#: src/components/CanvasItem.jsx:56
|
#: src/components/CanvasItem.jsx:56
|
||||||
msgid "Requirements"
|
msgid "Requirements"
|
||||||
|
|
1087
i18n/dz.po
Normal file
1087
i18n/dz.po
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -12,6 +12,62 @@ msgstr ""
|
||||||
"Plural-Forms: nplurals = 2; plural = (n != 1);\n"
|
"Plural-Forms: nplurals = 2; plural = (n != 1);\n"
|
||||||
"X-Generator: Poedit 2.3\n"
|
"X-Generator: Poedit 2.3\n"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:243
|
||||||
|
msgid "You can not send chat messages with proxy"
|
||||||
|
msgstr "Du kannst keine Nachrichten senden wenn du ein Proxy benutzt"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:248
|
||||||
|
msgid "Couldn't send your message, pls log out and back in again."
|
||||||
|
msgstr "Konnte die Nachricht nicht senden, bitte logge duch aus und wieder an."
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:262
|
||||||
|
#, javascript-format
|
||||||
|
msgid "You are sending messages too fast, you have to wait ${ waitTime }s :("
|
||||||
|
msgstr "Du sendest zu viele Nachrichten, du musst ${ waitTime }s warten :("
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:266
|
||||||
|
msgid "You don't have access to this channel"
|
||||||
|
msgstr "Du hast keinen Zugriff zu diesen Kanal"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:282
|
||||||
|
msgid "Your mail has to be verified in order to chat"
|
||||||
|
msgstr "E-Mail muss verifiziert sein um Nachrichten zu senden"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:287
|
||||||
|
msgid "You are permanently muted, join our guilded to apppeal the mute"
|
||||||
|
msgstr ""
|
||||||
|
"Du bsit permanent stummgeschaltet, gehe zu unser guilded um dagegen "
|
||||||
|
"einzusprechen"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:292
|
||||||
|
#, javascript-format
|
||||||
|
msgid "You are muted for another ${ timeMin } minutes"
|
||||||
|
msgstr "Du bist für ${ timeMin } Minuten stummgeschaltet"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:294
|
||||||
|
msgid "You are muted for another ${ muted } seconds"
|
||||||
|
msgstr "Du bist for ${ muted } Sekunden stummgeschaltet"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:302
|
||||||
|
msgid "Ow no! Spam protection decided to mute you"
|
||||||
|
msgstr "Oh nein! Spam-Schutz hat dich stummgeschaltet"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:313
|
||||||
|
msgid "You can't send a message this long :("
|
||||||
|
msgstr "Do kannst keine so langen Nachrichten senden"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:317
|
||||||
|
msgid "Please use int channel"
|
||||||
|
msgstr "Bitte benutze int Kanal"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:321
|
||||||
|
msgid "Your country is temporary muted from chat"
|
||||||
|
msgstr "Dein Land ist temporär stummgeschaltet"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:329
|
||||||
|
msgid "Stop flooding."
|
||||||
|
msgstr "Stoppe zu spamen."
|
||||||
|
|
||||||
#: src/ssr-components/Main.jsx:53
|
#: src/ssr-components/Main.jsx:53
|
||||||
msgid "PixelPlanet.fun"
|
msgid "PixelPlanet.fun"
|
||||||
msgstr "PixelPlanet.Fun"
|
msgstr "PixelPlanet.Fun"
|
||||||
|
@ -141,7 +197,7 @@ msgid ""
|
||||||
"next 30min here: "
|
"next 30min here: "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Du hast ein neues Passwort beantragt. Du kannst es nun während der nächsten "
|
"Du hast ein neues Passwort beantragt. Du kannst es nun während der nächsten "
|
||||||
"30min hier ändern:"
|
"30min hier ändern"
|
||||||
|
|
||||||
#: src/core/mail.js:128 src/ssr-components/PasswordReset.jsx:19
|
#: src/core/mail.js:128 src/ssr-components/PasswordReset.jsx:19
|
||||||
#: src/ssr-components/PasswordReset.jsx:28
|
#: src/ssr-components/PasswordReset.jsx:28
|
||||||
|
@ -237,7 +293,7 @@ msgstr "Passwort muss mindestens 6 Zeichen lang sein."
|
||||||
|
|
||||||
#: src/utils/validation.js:60
|
#: src/utils/validation.js:60
|
||||||
msgid "Password must be shorter than 60 characters."
|
msgid "Password must be shorter than 60 characters."
|
||||||
msgstr "Passwort muss kürzer als 60 Zeichen sein"
|
msgstr "Passwort muss kürzer als 60 Zeichen sein."
|
||||||
|
|
||||||
#: src/utils/validation.js:74
|
#: src/utils/validation.js:74
|
||||||
msgid "Could not connect to server, please try again later :("
|
msgid "Could not connect to server, please try again later :("
|
||||||
|
@ -302,7 +358,7 @@ msgstr "Du wirst automatisch weitergeleitet nach 15s"
|
||||||
#: src/ssr-components/RedirectionPage.jsx:21
|
#: src/ssr-components/RedirectionPage.jsx:21
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Or ${ clickHere } to go back to pixelplanet"
|
msgid "Or ${ clickHere } to go back to pixelplanet"
|
||||||
msgstr "oder ${ clickHere } um zu pixelplanet zurückzukehren"
|
msgstr "Oder ${ clickHere } um zu pixelplanet zurückzukehren"
|
||||||
|
|
||||||
#: src/ssr-components/RedirectionPage.jsx:25
|
#: src/ssr-components/RedirectionPage.jsx:25
|
||||||
msgid "PixelPlanet.fun Accounts"
|
msgid "PixelPlanet.fun Accounts"
|
||||||
|
|
|
@ -3,6 +3,60 @@ msgstr ""
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:243
|
||||||
|
msgid "You can not send chat messages with proxy"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:248
|
||||||
|
msgid "Couldn't send your message, pls log out and back in again."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:262
|
||||||
|
#, javascript-format
|
||||||
|
msgid "You are sending messages too fast, you have to wait ${ waitTime }s :("
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:266
|
||||||
|
msgid "You don't have access to this channel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:282
|
||||||
|
msgid "Your mail has to be verified in order to chat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:287
|
||||||
|
msgid "You are permanently muted, join our guilded to apppeal the mute"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:292
|
||||||
|
#, javascript-format
|
||||||
|
msgid "You are muted for another ${ timeMin } minutes"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:294
|
||||||
|
msgid "You are muted for another ${ muted } seconds"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:302
|
||||||
|
msgid "Ow no! Spam protection decided to mute you"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:313
|
||||||
|
msgid "You can't send a message this long :("
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:317
|
||||||
|
msgid "Please use int channel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:321
|
||||||
|
msgid "Your country is temporary muted from chat"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/core/ChatProvider.js:329
|
||||||
|
msgid "Stop flooding."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/ssr-components/Main.jsx:53
|
#: src/ssr-components/Main.jsx:53
|
||||||
msgid "PixelPlanet.fun"
|
msgid "PixelPlanet.fun"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
677
i18n/template.txt
Normal file
677
i18n/template.txt
Normal file
|
@ -0,0 +1,677 @@
|
||||||
|
"Copied!"
|
||||||
|
|
||||||
|
"Error :("
|
||||||
|
|
||||||
|
"Didn't get an answer from pixelplanet. Maybe try to refresh?"
|
||||||
|
|
||||||
|
"OK"
|
||||||
|
|
||||||
|
"Invalid Canvas"
|
||||||
|
|
||||||
|
"This canvas doesn't exist"
|
||||||
|
|
||||||
|
"Invalid Coordinates"
|
||||||
|
|
||||||
|
"x out of bounds"
|
||||||
|
|
||||||
|
"y out of bounds"
|
||||||
|
|
||||||
|
"z out of bounds"
|
||||||
|
|
||||||
|
"Wrong Color"
|
||||||
|
|
||||||
|
"Invalid color selected"
|
||||||
|
|
||||||
|
"Just for registered Users"
|
||||||
|
|
||||||
|
"You have to be logged in to place on this canvas"
|
||||||
|
|
||||||
|
"Place more :)"
|
||||||
|
|
||||||
|
"You can not access this canvas yet. You need to place more pixels"
|
||||||
|
|
||||||
|
"Pixel protected!"
|
||||||
|
|
||||||
|
"No Proxies Allowed :("
|
||||||
|
|
||||||
|
"You are using a Proxy."
|
||||||
|
|
||||||
|
"Weird"
|
||||||
|
|
||||||
|
"Couldn't set Pixel"
|
||||||
|
|
||||||
|
"Error ${ retCode }"
|
||||||
|
|
||||||
|
"Close"
|
||||||
|
|
||||||
|
"Close Menu"
|
||||||
|
|
||||||
|
"Open Menu"
|
||||||
|
|
||||||
|
"Close Chat"
|
||||||
|
|
||||||
|
"Open Chat"
|
||||||
|
|
||||||
|
"Copy to Clipboard"
|
||||||
|
|
||||||
|
"User online"
|
||||||
|
|
||||||
|
"Pixels placed"
|
||||||
|
|
||||||
|
"Canvas Selection"
|
||||||
|
|
||||||
|
"Make Screenshot"
|
||||||
|
|
||||||
|
"User Area"
|
||||||
|
|
||||||
|
"Settings"
|
||||||
|
|
||||||
|
"Help"
|
||||||
|
|
||||||
|
"Channel settings"
|
||||||
|
|
||||||
|
"maximize"
|
||||||
|
|
||||||
|
"Start chatting here"
|
||||||
|
|
||||||
|
"Chat here"
|
||||||
|
|
||||||
|
"You must be logged in to chat"
|
||||||
|
|
||||||
|
"Close Palette"
|
||||||
|
|
||||||
|
"Open Palette"
|
||||||
|
|
||||||
|
"Globe View"
|
||||||
|
|
||||||
|
"Ping"
|
||||||
|
|
||||||
|
"DM"
|
||||||
|
|
||||||
|
"Block"
|
||||||
|
|
||||||
|
"Privacy Policy"
|
||||||
|
|
||||||
|
"Terms of Service"
|
||||||
|
|
||||||
|
"your IP"
|
||||||
|
|
||||||
|
"Place color pixels on a large canvas with other players online!"
|
||||||
|
|
||||||
|
""
|
||||||
|
"Our main canvas is a huge worldmap, you can place wherever you like, but "
|
||||||
|
"you will have to wait a specific Cooldown between pixels. You can check out "
|
||||||
|
"the cooldown and requiremnts on the Canvas Selection menu (globe button on "
|
||||||
|
"top). Some canvases have a different cooldown for replacing a user-set "
|
||||||
|
"pixels than placing on a unset pixel. i.e. 4s/7s means 4s on fresh pixels "
|
||||||
|
"and 7s on already set pixels."
|
||||||
|
|
||||||
|
""
|
||||||
|
"Higher zoomlevels take some time to update, the 3D globe gets updated at "
|
||||||
|
"least once per day."
|
||||||
|
|
||||||
|
"Have fun!"
|
||||||
|
|
||||||
|
"recommended"
|
||||||
|
|
||||||
|
"Source on "
|
||||||
|
|
||||||
|
"Map Data"
|
||||||
|
|
||||||
|
""
|
||||||
|
"The bare map data that we use, together with converted OpenStreetMap tiles "
|
||||||
|
"for orientation, can be downloaded from mega.nz here: "
|
||||||
|
|
||||||
|
"Detected as Proxy?"
|
||||||
|
|
||||||
|
""
|
||||||
|
"If you got detected as proxy, but you are none, please go to our ${ "
|
||||||
|
"guildedLink } or send us an e-mail with ${ getIPLink } to ${ mailLink }. Do "
|
||||||
|
"not post your IP anywhere else. We are sorry for the inconvenience."
|
||||||
|
|
||||||
|
"Controls"
|
||||||
|
|
||||||
|
"Click a color in palette to select it"
|
||||||
|
|
||||||
|
"Press ${ bindG } to toggle grid"
|
||||||
|
|
||||||
|
"Press ${ bindX } to toggle showing of pixel activity"
|
||||||
|
|
||||||
|
"Press ${ bindH } to toggle historical view"
|
||||||
|
|
||||||
|
"Press ${ bindR } to copy coordinates"
|
||||||
|
|
||||||
|
"Press ${ bindQ } or ${ bindE } to zoom"
|
||||||
|
|
||||||
|
"Press ${ bindW }, ${ bindA }, ${ bindS }, ${ bindD } to move"
|
||||||
|
|
||||||
|
"Press ${ bindAUp }, ${ bindALeft }, ${ bindADown }, ${ bindARight } to move"
|
||||||
|
|
||||||
|
"Drag ${ mouseSymbol } mouse or ${ touchSymbol } pan to move"
|
||||||
|
|
||||||
|
"Scroll ${ mouseSymbol } mouse wheel or ${ touchSymbol } pinch to zoom"
|
||||||
|
|
||||||
|
"Hold left ${ bindShift } for placing while moving mouse"
|
||||||
|
|
||||||
|
""
|
||||||
|
"Hold right ${ bindShift } for placing while moving mouse according to "
|
||||||
|
"historical view"
|
||||||
|
|
||||||
|
"${ mouseSymbol } Left click or ${ touchSymbol } tap to place a pixel"
|
||||||
|
|
||||||
|
""
|
||||||
|
"Click ${ mouseSymbol } middle mouse button or ${ touchSymbol } long-tap to "
|
||||||
|
"select current hovering color"
|
||||||
|
|
||||||
|
"Press ${ bindE } and ${ bindC } to fly up and down"
|
||||||
|
|
||||||
|
"${ mouseSymbol } Hold left mouse button and drag mouse to rotate"
|
||||||
|
|
||||||
|
""
|
||||||
|
"${ mouseSymbol } Scroll mouse wheel or hold ${ mouseSymbol } middle mouse "
|
||||||
|
"button and drag to zoom"
|
||||||
|
|
||||||
|
"${ mouseSymbol } Right click and drag mouse to pan"
|
||||||
|
|
||||||
|
""
|
||||||
|
"${ mouseSymbol } Right click or ${ touchSymbol } double-tap to remove a "
|
||||||
|
"pixel"
|
||||||
|
|
||||||
|
"Partners:"
|
||||||
|
|
||||||
|
""
|
||||||
|
"This site is protected by reCAPTCHA and the Google ${ reCaptchaPP } and ${ "
|
||||||
|
"reCaptchaTOS } apply."
|
||||||
|
|
||||||
|
""
|
||||||
|
"This site is protected by hCAPTCHA and its ${ hCaptchaPP } and ${ "
|
||||||
|
"hCaptchaTOS } apply."
|
||||||
|
|
||||||
|
"Welcome to PixelPlanet.fun"
|
||||||
|
|
||||||
|
"Mute"
|
||||||
|
|
||||||
|
"Show Grid"
|
||||||
|
|
||||||
|
"Turn on grid to highlight pixel borders."
|
||||||
|
|
||||||
|
"Show Pixel Activity"
|
||||||
|
|
||||||
|
"Show circles where pixels are placed."
|
||||||
|
|
||||||
|
"Disable Game Sounds"
|
||||||
|
|
||||||
|
"All sound effects will be disabled."
|
||||||
|
|
||||||
|
"Enable chat notifications"
|
||||||
|
|
||||||
|
"Play a sound when new chat messages arrive"
|
||||||
|
|
||||||
|
"Auto Zoom In"
|
||||||
|
|
||||||
|
""
|
||||||
|
"Zoom in instead of placing a pixel when you tap the canvas and your zoom is "
|
||||||
|
"small."
|
||||||
|
|
||||||
|
"Compact Palette"
|
||||||
|
|
||||||
|
"Display Palette in a compact form that takes less screen space."
|
||||||
|
|
||||||
|
"Potato Mode"
|
||||||
|
|
||||||
|
"For when you are playing on a potato."
|
||||||
|
|
||||||
|
"Light Grid"
|
||||||
|
|
||||||
|
"Show Grid in white instead of black."
|
||||||
|
|
||||||
|
"Historical View"
|
||||||
|
|
||||||
|
"Check out past versions of the canvas."
|
||||||
|
|
||||||
|
"Themes"
|
||||||
|
|
||||||
|
"How pixelplanet should look like."
|
||||||
|
|
||||||
|
"Register new account here"
|
||||||
|
|
||||||
|
"Consider joining us on Guilded:"
|
||||||
|
|
||||||
|
"Register New Account"
|
||||||
|
|
||||||
|
"Login to access more features and stats."
|
||||||
|
|
||||||
|
"Login with Name or Mail:"
|
||||||
|
|
||||||
|
"I forgot my Password."
|
||||||
|
|
||||||
|
"or login with:"
|
||||||
|
|
||||||
|
"or register here:"
|
||||||
|
|
||||||
|
"Register"
|
||||||
|
|
||||||
|
"Profile"
|
||||||
|
|
||||||
|
"Ranking"
|
||||||
|
|
||||||
|
"Converter"
|
||||||
|
|
||||||
|
"Admintools"
|
||||||
|
|
||||||
|
"Modtools"
|
||||||
|
|
||||||
|
"Loading..."
|
||||||
|
|
||||||
|
""
|
||||||
|
"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."
|
||||||
|
|
||||||
|
""
|
||||||
|
"Here we collect those canvases to archive them in a proper way (which is "
|
||||||
|
"currently just one)."
|
||||||
|
|
||||||
|
"Political Compass Canvas"
|
||||||
|
|
||||||
|
""
|
||||||
|
"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 coolodwn and 60s stacking. It got launched on May 11th and "
|
||||||
|
"remained active for months till it got shut down on November 30th."
|
||||||
|
|
||||||
|
""
|
||||||
|
"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."
|
||||||
|
|
||||||
|
"Canvas Archive"
|
||||||
|
|
||||||
|
""
|
||||||
|
"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:"
|
||||||
|
|
||||||
|
"Archive"
|
||||||
|
|
||||||
|
"Enter your mail adress and we will send you a new password:"
|
||||||
|
|
||||||
|
"Restore my Password"
|
||||||
|
|
||||||
|
"Chat"
|
||||||
|
|
||||||
|
"Error"
|
||||||
|
|
||||||
|
"Name or Email"
|
||||||
|
|
||||||
|
"Password"
|
||||||
|
|
||||||
|
"LogIn"
|
||||||
|
|
||||||
|
"Todays Placed Pixels"
|
||||||
|
|
||||||
|
"Daily Rank"
|
||||||
|
|
||||||
|
"Placed Pixels"
|
||||||
|
|
||||||
|
"Total Rank"
|
||||||
|
|
||||||
|
"Your name is: ${ name }"
|
||||||
|
|
||||||
|
"Log out"
|
||||||
|
|
||||||
|
"Change Username"
|
||||||
|
|
||||||
|
"Change Mail"
|
||||||
|
|
||||||
|
"Change Password"
|
||||||
|
|
||||||
|
"Delete Account"
|
||||||
|
|
||||||
|
"Social Settings"
|
||||||
|
|
||||||
|
"Total"
|
||||||
|
|
||||||
|
"Daily"
|
||||||
|
|
||||||
|
"Ranking updates every 5 min. Daily rankings get reset at midnight UTC."
|
||||||
|
|
||||||
|
"Cooldown"
|
||||||
|
|
||||||
|
"Stacking till"
|
||||||
|
|
||||||
|
"Ranked"
|
||||||
|
|
||||||
|
"Requirements"
|
||||||
|
|
||||||
|
"User Account"
|
||||||
|
|
||||||
|
"and ${ canvas.req } Pixels set"
|
||||||
|
|
||||||
|
"Dimensions"
|
||||||
|
|
||||||
|
"Sent you a mail with instructions to reset your password."
|
||||||
|
|
||||||
|
"Email"
|
||||||
|
|
||||||
|
"Submit"
|
||||||
|
|
||||||
|
"Cancel"
|
||||||
|
|
||||||
|
"Name"
|
||||||
|
|
||||||
|
"Confirm Password"
|
||||||
|
|
||||||
|
"Build image on canvas."
|
||||||
|
|
||||||
|
"Build image and set it to protected."
|
||||||
|
|
||||||
|
"Build image, but reset cooldown to unset-pixel cd."
|
||||||
|
|
||||||
|
"Image Upload"
|
||||||
|
|
||||||
|
"Upload images to canvas"
|
||||||
|
|
||||||
|
"File"
|
||||||
|
|
||||||
|
"Coordinates in X_Y format:"
|
||||||
|
|
||||||
|
"Pixel Protection"
|
||||||
|
|
||||||
|
""
|
||||||
|
"Set protection of areas (if you need finer grained control, "
|
||||||
|
"use protect with image upload and alpha layers)"
|
||||||
|
|
||||||
|
"Rollback to Date"
|
||||||
|
|
||||||
|
"Rollback an area of the canvas to a set date (00:00 UTC)"
|
||||||
|
|
||||||
|
"IP Actions"
|
||||||
|
|
||||||
|
"Do stuff with IPs (one IP per line)"
|
||||||
|
|
||||||
|
"Manage Moderators"
|
||||||
|
|
||||||
|
"Remove Moderator"
|
||||||
|
|
||||||
|
"There are no mods"
|
||||||
|
|
||||||
|
"Assign new Mod"
|
||||||
|
|
||||||
|
"Enter UserName of new Mod"
|
||||||
|
|
||||||
|
"User Name"
|
||||||
|
|
||||||
|
"Choose Canvas"
|
||||||
|
|
||||||
|
"Palette Download"
|
||||||
|
|
||||||
|
"Palette for ${ gimpLink }"
|
||||||
|
|
||||||
|
"Credit for the Palette of the Moon goes to ${ starhouseLink }."
|
||||||
|
|
||||||
|
"Image Converter"
|
||||||
|
|
||||||
|
"Convert an image to canvas colors"
|
||||||
|
|
||||||
|
"Choose Strategy"
|
||||||
|
|
||||||
|
"Choose Color Mode"
|
||||||
|
|
||||||
|
"Add Grid (uncheck if you need a 1:1 template)"
|
||||||
|
|
||||||
|
"Offset"
|
||||||
|
|
||||||
|
"Scale Image"
|
||||||
|
|
||||||
|
"Width"
|
||||||
|
|
||||||
|
"Height"
|
||||||
|
|
||||||
|
"Keep Ratio"
|
||||||
|
|
||||||
|
"Anti Aliasing"
|
||||||
|
|
||||||
|
"Reset"
|
||||||
|
|
||||||
|
"Download Template"
|
||||||
|
|
||||||
|
"Email can't be empty."
|
||||||
|
|
||||||
|
"Email should be at least 5 characters long."
|
||||||
|
|
||||||
|
"Email can't be longer than 40 characters."
|
||||||
|
|
||||||
|
"Email should at least contain a dot"
|
||||||
|
|
||||||
|
"Email should contain a @"
|
||||||
|
|
||||||
|
"Name can't be empty."
|
||||||
|
|
||||||
|
"Name must be at least 4 characters long"
|
||||||
|
|
||||||
|
"Name must be shorter than 26 characters"
|
||||||
|
|
||||||
|
"Name contains invalid character like @, /, \\ or #"
|
||||||
|
|
||||||
|
"No password given."
|
||||||
|
|
||||||
|
"Password must be at least 6 characters long."
|
||||||
|
|
||||||
|
"Password must be shorter than 60 characters."
|
||||||
|
|
||||||
|
"Could not connect to server, please try again later :("
|
||||||
|
|
||||||
|
"I think we experienced some error :("
|
||||||
|
|
||||||
|
"Block all Private Messages"
|
||||||
|
|
||||||
|
"Unblock Users"
|
||||||
|
|
||||||
|
"You have no users blocked"
|
||||||
|
|
||||||
|
""
|
||||||
|
"Changed Mail successfully. We sent you a verification mail, "
|
||||||
|
"please verify your new mail adress."
|
||||||
|
|
||||||
|
"New Mail"
|
||||||
|
|
||||||
|
"Save"
|
||||||
|
|
||||||
|
"Passwords do not match."
|
||||||
|
|
||||||
|
"Changed Password successfully."
|
||||||
|
|
||||||
|
"Old Password"
|
||||||
|
|
||||||
|
"New Password"
|
||||||
|
|
||||||
|
"Confirm New Password"
|
||||||
|
|
||||||
|
"Yes, Delete My Account!"
|
||||||
|
|
||||||
|
"A new verification mail is getting sent to you."
|
||||||
|
|
||||||
|
"You successfully linked your mc account."
|
||||||
|
|
||||||
|
"You denied."
|
||||||
|
|
||||||
|
""
|
||||||
|
"Please verify your mail address \n"
|
||||||
|
"or your account could get deleted after a few days."
|
||||||
|
|
||||||
|
"Click here to request a new verification mail."
|
||||||
|
|
||||||
|
"You requested to link your mc account ${ minecraftname }."
|
||||||
|
|
||||||
|
"Accept"
|
||||||
|
|
||||||
|
"Deny"
|
||||||
|
|
||||||
|
"New Username"
|
||||||
|
|
||||||
|
"Place color pixels on an map styled canvas with other players online"
|
||||||
|
|
||||||
|
"Double click on globe to go back."
|
||||||
|
|
||||||
|
"Loading..."
|
||||||
|
|
||||||
|
"PixelPlanet.Fun 3DGlobe"
|
||||||
|
|
||||||
|
"A 3D globe of our whole map"
|
||||||
|
|
||||||
|
"You sent an empty password or invalid data :("
|
||||||
|
|
||||||
|
"This password-reset link isn't valid anymore :("
|
||||||
|
|
||||||
|
"Your passwords do not match :("
|
||||||
|
|
||||||
|
"User doesn't exist in our database :("
|
||||||
|
|
||||||
|
"Passowrd successfully changed."
|
||||||
|
|
||||||
|
"Invalid url :( Please check your mail again."
|
||||||
|
|
||||||
|
"This passwort reset link is wrong or already expired, please request a new "
|
||||||
|
"one (Note: you can use those links just once)"
|
||||||
|
|
||||||
|
""
|
||||||
|
"We already sent you a verification mail, you can request another one in ${ "
|
||||||
|
"minLeft } minutes."
|
||||||
|
|
||||||
|
"Welcome ${ name } to PixelPlanet, plese verify your mail"
|
||||||
|
|
||||||
|
"Hello ${ name }"
|
||||||
|
|
||||||
|
""
|
||||||
|
"welcome to our little community of pixelplacers, to use your account, you "
|
||||||
|
"have to verify your mail. You can do that here: "
|
||||||
|
|
||||||
|
"Click to Verify"
|
||||||
|
|
||||||
|
"Or by copying following url:"
|
||||||
|
|
||||||
|
"Have fun and don't hesitate to contact us if you encouter any problems :)"
|
||||||
|
|
||||||
|
"Thanks"
|
||||||
|
|
||||||
|
""
|
||||||
|
"We already sent you a mail with instructions. Please wait before requesting "
|
||||||
|
"another mail."
|
||||||
|
|
||||||
|
"Couldn't find this mail in our database"
|
||||||
|
|
||||||
|
"You forgot your password for PixelPlanet? Get a new one here"
|
||||||
|
|
||||||
|
"Hello"
|
||||||
|
|
||||||
|
""
|
||||||
|
"You requested to get a new password. You can change your password within "
|
||||||
|
"the next 30min here: "
|
||||||
|
|
||||||
|
"Reset Password"
|
||||||
|
|
||||||
|
""
|
||||||
|
"If you did not request this mail, please just ignore it (the ip that "
|
||||||
|
"requested this mail was ${ ip })."
|
||||||
|
|
||||||
|
"Click here"
|
||||||
|
|
||||||
|
"to go back to pixelplanet"
|
||||||
|
|
||||||
|
"Hello ${ name }, you can set your new password here:"
|
||||||
|
|
||||||
|
"New Password"
|
||||||
|
|
||||||
|
"Confirm New Password"
|
||||||
|
|
||||||
|
"Submit"
|
||||||
|
|
||||||
|
"PixelPlanet.fun Password Reset"
|
||||||
|
|
||||||
|
"Reset your password here"
|
||||||
|
|
||||||
|
"Email can't be empty."
|
||||||
|
|
||||||
|
"Email should be at least 5 characters long."
|
||||||
|
|
||||||
|
"Email can't be longer than 40 characters."
|
||||||
|
|
||||||
|
"Email should at least contain a dot"
|
||||||
|
|
||||||
|
"Email should contain a @"
|
||||||
|
|
||||||
|
"Name can't be empty."
|
||||||
|
|
||||||
|
"Name must be at least 4 characters long"
|
||||||
|
|
||||||
|
"Name must be shorter than 26 characters"
|
||||||
|
|
||||||
|
"Name contains invalid character like @, /, \\ or #"
|
||||||
|
|
||||||
|
"No password given."
|
||||||
|
|
||||||
|
"Password must be at least 6 characters long."
|
||||||
|
|
||||||
|
"Password must be shorter than 60 characters."
|
||||||
|
|
||||||
|
"Could not connect to server, please try again later :("
|
||||||
|
|
||||||
|
"I think we experienced some error :("
|
||||||
|
|
||||||
|
"You are not authenticated."
|
||||||
|
|
||||||
|
"Incorrect password!"
|
||||||
|
|
||||||
|
"You are not even logged in."
|
||||||
|
|
||||||
|
"Mail verification"
|
||||||
|
|
||||||
|
"You are now verified :)"
|
||||||
|
|
||||||
|
""
|
||||||
|
"Your mail verification code is invalid or already expired :(, please "
|
||||||
|
"request a new one."
|
||||||
|
|
||||||
|
"E-Mail already in use."
|
||||||
|
|
||||||
|
"Username already in use."
|
||||||
|
|
||||||
|
"Failed to create new user :("
|
||||||
|
|
||||||
|
"Failed to establish session after register :("
|
||||||
|
|
||||||
|
"You will be automatically redirected after 15s"
|
||||||
|
|
||||||
|
"Or ${ clickHere } to go back to pixelplanet"
|
||||||
|
|
||||||
|
"PixelPlanet.fun Accounts"
|
||||||
|
|
||||||
|
"Earth"
|
||||||
|
|
||||||
|
"Moon"
|
||||||
|
|
||||||
|
"3D Canvas"
|
||||||
|
|
||||||
|
"Coronavirus"
|
||||||
|
|
||||||
|
"PixelZone"
|
||||||
|
|
||||||
|
"PixelCanvas"
|
||||||
|
|
||||||
|
"1bit"
|
||||||
|
|
||||||
|
"Our main canvas, a huge map of the world. Place everywhere you like"
|
||||||
|
|
||||||
|
"Moon canvas. Safe space for art. No flags or large text (unless part of art)"
|
||||||
|
|
||||||
|
"Place Voxels on a 3D canvas with others"
|
||||||
|
|
||||||
|
"Special canvas to spread awareness of SARS-CoV2"
|
||||||
|
|
||||||
|
"Mirror of PixelZone"
|
||||||
|
|
||||||
|
"Mirror of PixelCanvas"
|
||||||
|
|
||||||
|
"Black and White canvas"
|
154
package-lock.json
generated
154
package-lock.json
generated
|
@ -3562,6 +3562,12 @@
|
||||||
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
|
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"easy-stack": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"ee-first": {
|
"ee-first": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||||
|
@ -3651,6 +3657,15 @@
|
||||||
"integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==",
|
"integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"errno": {
|
||||||
|
"version": "0.1.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
|
||||||
|
"integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"prr": "~1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"error-ex": {
|
"error-ex": {
|
||||||
"version": "1.3.2",
|
"version": "1.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
|
||||||
|
@ -4306,6 +4321,12 @@
|
||||||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
||||||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
|
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
|
||||||
},
|
},
|
||||||
|
"event-pubsub": {
|
||||||
|
"version": "4.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz",
|
||||||
|
"integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"events": {
|
"events": {
|
||||||
"version": "3.2.0",
|
"version": "3.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
|
||||||
|
@ -5477,6 +5498,21 @@
|
||||||
"resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz",
|
"resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz",
|
||||||
"integrity": "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg=="
|
"integrity": "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg=="
|
||||||
},
|
},
|
||||||
|
"js-message": {
|
||||||
|
"version": "1.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz",
|
||||||
|
"integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"js-queue": {
|
||||||
|
"version": "2.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz",
|
||||||
|
"integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"easy-stack": "^1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"js-tokens": {
|
"js-tokens": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||||
|
@ -5524,6 +5560,15 @@
|
||||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
|
||||||
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
|
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
|
||||||
},
|
},
|
||||||
|
"json-stable-stringify": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"jsonify": "~0.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"json-stable-stringify-without-jsonify": {
|
"json-stable-stringify-without-jsonify": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
|
||||||
|
@ -5538,6 +5583,12 @@
|
||||||
"minimist": "^1.2.5"
|
"minimist": "^1.2.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"jsonify": {
|
||||||
|
"version": "0.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
|
||||||
|
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"jsx-ast-utils": {
|
"jsx-ast-utils": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz",
|
||||||
|
@ -5834,12 +5885,30 @@
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
||||||
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
|
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
|
||||||
},
|
},
|
||||||
|
"lodash.assign": {
|
||||||
|
"version": "4.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
|
||||||
|
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"lodash.clonedeep": {
|
"lodash.clonedeep": {
|
||||||
"version": "4.5.0",
|
"version": "4.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
|
||||||
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
|
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"lodash.endswith": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz",
|
||||||
|
"integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"lodash.flatten": {
|
||||||
|
"version": "4.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
|
||||||
|
"integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"lodash.isplainobject": {
|
"lodash.isplainobject": {
|
||||||
"version": "4.0.6",
|
"version": "4.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
||||||
|
@ -6312,6 +6381,17 @@
|
||||||
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
|
||||||
"integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
|
"integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
|
||||||
},
|
},
|
||||||
|
"node-ipc": {
|
||||||
|
"version": "9.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.3.tgz",
|
||||||
|
"integrity": "sha512-8RS4RZyS/KMKKYG8mrje+cLxwATe9dBCuOiqKFSWND4oOuKytfuKCiR9yinvhoXF/nGdX/WnbywaUee+9U87zA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"event-pubsub": "4.3.0",
|
||||||
|
"js-message": "1.0.7",
|
||||||
|
"js-queue": "2.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node-modules-regexp": {
|
"node-modules-regexp": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
|
||||||
|
@ -6850,6 +6930,59 @@
|
||||||
"semver": "^5.1.0"
|
"semver": "^5.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"parallel-webpack": {
|
||||||
|
"version": "2.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/parallel-webpack/-/parallel-webpack-2.6.0.tgz",
|
||||||
|
"integrity": "sha512-aOOLfQ40yWWRt8214F0zNWp0DWbeCs7tJaEur0/XUlYU8Yht1sMTYt+eNrbY4VkM4O/SRSme7cdZJTtIantiOw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"ajv": "^4.9.2",
|
||||||
|
"bluebird": "^3.0.6",
|
||||||
|
"chalk": "^1.1.1",
|
||||||
|
"interpret": "^1.0.1",
|
||||||
|
"lodash.assign": "^4.0.8",
|
||||||
|
"lodash.endswith": "^4.0.1",
|
||||||
|
"lodash.flatten": "^4.2.0",
|
||||||
|
"minimist": "^1.2.0",
|
||||||
|
"node-ipc": "^9.1.0",
|
||||||
|
"pluralize": "^1.2.1",
|
||||||
|
"supports-color": "^3.1.2",
|
||||||
|
"worker-farm": "^1.3.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"ajv": {
|
||||||
|
"version": "4.11.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
|
||||||
|
"integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"co": "^4.6.0",
|
||||||
|
"json-stable-stringify": "^1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"has-flag": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"interpret": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"supports-color": {
|
||||||
|
"version": "3.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
|
||||||
|
"integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"has-flag": "^1.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"parent-module": {
|
"parent-module": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
|
||||||
|
@ -7123,6 +7256,12 @@
|
||||||
"resolved": "https://registry.npmjs.org/plural-forms/-/plural-forms-0.5.3.tgz",
|
"resolved": "https://registry.npmjs.org/plural-forms/-/plural-forms-0.5.3.tgz",
|
||||||
"integrity": "sha512-t/hkjsTeDwaK9n/z6tUiSHySTC8sPnTiS5YF3Y5p4L+eomzXh7O0vEemkjwb68/82w0Rjw4uED3X84X7vXf9lg=="
|
"integrity": "sha512-t/hkjsTeDwaK9n/z6tUiSHySTC8sPnTiS5YF3Y5p4L+eomzXh7O0vEemkjwb68/82w0Rjw4uED3X84X7vXf9lg=="
|
||||||
},
|
},
|
||||||
|
"pluralize": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
|
||||||
|
"integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"postcss": {
|
"postcss": {
|
||||||
"version": "8.1.10",
|
"version": "8.1.10",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.10.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.10.tgz",
|
||||||
|
@ -7287,6 +7426,12 @@
|
||||||
"ipaddr.js": "1.9.1"
|
"ipaddr.js": "1.9.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"prr": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"pseudomap": {
|
"pseudomap": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
|
||||||
|
@ -10090,6 +10235,15 @@
|
||||||
"typical": "^5.0.0"
|
"typical": "^5.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"worker-farm": {
|
||||||
|
"version": "1.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
|
||||||
|
"integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"errno": "~0.1.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
"wrap-ansi": {
|
"wrap-ansi": {
|
||||||
"version": "5.1.0",
|
"version": "5.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "babel-node scripts/run prebuild && npm run webpack",
|
"build": "babel-node scripts/run prebuild && npm run webpack",
|
||||||
"clean": "babel-node scripts/run clean",
|
"clean": "babel-node scripts/run clean",
|
||||||
"webpack": "webpack --config webpack.config.web.babel.js && webpack --config webpack.config.client.babel.js",
|
"webpack": "webpack --config ./webpack.config.web.babel.js && parallel-webpack --config ./webpack.config.client.babel.js",
|
||||||
"babel-node": "cd $INIT_CWD && babel-node",
|
"babel-node": "cd $INIT_CWD && babel-node",
|
||||||
"lint": "cd $INIT_CWD && eslint --ext .jsx --ext .js",
|
"lint": "cd $INIT_CWD && eslint --ext .jsx --ext .js",
|
||||||
"lint:src": "eslint --ext .jsx --ext .js src",
|
"lint:src": "eslint --ext .jsx --ext .js src",
|
||||||
|
@ -133,6 +133,7 @@
|
||||||
"json-loader": "^0.5.4",
|
"json-loader": "^0.5.4",
|
||||||
"mkdirp": "^1.0.4",
|
"mkdirp": "^1.0.4",
|
||||||
"npm-check": "^5.9.2",
|
"npm-check": "^5.9.2",
|
||||||
|
"parallel-webpack": "^2.6.0",
|
||||||
"react-hot-loader": "^4.13.0",
|
"react-hot-loader": "^4.13.0",
|
||||||
"react-svg-loader": "^3.0.3",
|
"react-svg-loader": "^3.0.3",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
|
|
|
@ -82,6 +82,14 @@ function ChatMessage({
|
||||||
return (<span className={className}>{txt}</span>);
|
return (<span className={className}>{txt}</span>);
|
||||||
} if (type === 'c') {
|
} if (type === 'c') {
|
||||||
return (<a href={`./${txt}`}>{txt}</a>);
|
return (<a href={`./${txt}`}>{txt}</a>);
|
||||||
|
} if (type === 'l') {
|
||||||
|
return (
|
||||||
|
<a
|
||||||
|
href={txt}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>{txt}</a>
|
||||||
|
);
|
||||||
} if (type === 'p') {
|
} if (type === 'p') {
|
||||||
return (
|
return (
|
||||||
<span
|
<span
|
||||||
|
|
|
@ -219,20 +219,33 @@ export class ChatProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async sendMessage(user, message, channelId: number = 0) {
|
/*
|
||||||
|
* @param user User object
|
||||||
|
* @param message string of message
|
||||||
|
* @param channelId integer of channel
|
||||||
|
* @param ttag for translating return string
|
||||||
|
* @return error message if unsuccessful, otherwise null
|
||||||
|
*/
|
||||||
|
async sendMessage(
|
||||||
|
user,
|
||||||
|
message,
|
||||||
|
channelId,
|
||||||
|
ttag,
|
||||||
|
) {
|
||||||
const { id } = user;
|
const { id } = user;
|
||||||
|
const { t } = ttag;
|
||||||
const name = user.getName();
|
const name = user.getName();
|
||||||
|
|
||||||
if (!user.userlvl && await cheapDetector(user.ip)) {
|
if (!user.userlvl && await cheapDetector(user.ip)) {
|
||||||
logger.info(
|
logger.info(
|
||||||
`${name} / ${user.ip} tried to send chat message with proxy`,
|
`${name} / ${user.ip} tried to send chat message with proxy`,
|
||||||
);
|
);
|
||||||
return 'You can not send chat messages with proxy';
|
return t`You can not send chat messages with proxy`;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!name || !id) {
|
if (!name || !id) {
|
||||||
// eslint-disable-next-line max-len
|
// eslint-disable-next-line max-len
|
||||||
return 'Couldn\'t send your message, pls log out and back in again.';
|
return t`Couldn\'t send your message, pls log out and back in again.`;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.charAt(0) === '/' && user.userlvl) {
|
if (message.charAt(0) === '/' && user.userlvl) {
|
||||||
|
@ -244,40 +257,41 @@ export class ChatProvider {
|
||||||
}
|
}
|
||||||
const waitLeft = user.rateLimiter.tick();
|
const waitLeft = user.rateLimiter.tick();
|
||||||
if (waitLeft) {
|
if (waitLeft) {
|
||||||
|
const waitTime = Math.floor(waitLeft / 1000);
|
||||||
// eslint-disable-next-line max-len
|
// eslint-disable-next-line max-len
|
||||||
return `You are sending messages too fast, you have to wait ${Math.floor(waitLeft / 1000)}s :(`;
|
return t`You are sending messages too fast, you have to wait ${waitTime}s :(`;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.userHasChannelAccess(user, channelId)) {
|
if (!this.userHasChannelAccess(user, channelId)) {
|
||||||
return 'You don\'t have access to this channel';
|
return t`You don\'t have access to this channel`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const country = user.regUser.flag || 'xx';
|
const country = user.regUser.flag || 'xx';
|
||||||
const displayCountry = (name.endsWith('berg') || name.endsWith('stein'))
|
let displayCountry = (name.endsWith('berg') || name.endsWith('stein'))
|
||||||
? 'il'
|
? 'il'
|
||||||
: country;
|
: country;
|
||||||
|
/*
|
||||||
if (!user.regUser.verified) {
|
* hard coded flag for Manchukuo_1940
|
||||||
return 'Your mail has to be verified in order to chat';
|
* TODO make it possible to modify user flags
|
||||||
|
*/
|
||||||
|
if (user.id === 2927) {
|
||||||
|
displayCountry = 'bt';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.length > 4
|
if (!user.regUser.verified) {
|
||||||
&& message === message.toUpperCase()
|
return t`Your mail has to be verified in order to chat`;
|
||||||
&& message !== message.toLowerCase()
|
|
||||||
) {
|
|
||||||
return 'Stop shouting';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const muted = await ChatProvider.checkIfMuted(user);
|
const muted = await ChatProvider.checkIfMuted(user);
|
||||||
if (muted === -1) {
|
if (muted === -1) {
|
||||||
return 'You are permanently muted, join our guilded to apppeal the mute';
|
return t`You are permanently muted, join our guilded to apppeal the mute`;
|
||||||
}
|
}
|
||||||
if (muted > 0) {
|
if (muted > 0) {
|
||||||
if (muted > 120) {
|
if (muted > 120) {
|
||||||
const timeMin = Math.round(muted / 60);
|
const timeMin = Math.round(muted / 60);
|
||||||
return `You are muted for another ${timeMin} minutes`;
|
return t`You are muted for another ${timeMin} minutes`;
|
||||||
}
|
}
|
||||||
return `You are muted for another ${muted} seconds`;
|
return t`You are muted for another ${muted} seconds`;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < this.filters.length; i += 1) {
|
for (let i = 0; i < this.filters.length; i += 1) {
|
||||||
|
@ -285,7 +299,7 @@ export class ChatProvider {
|
||||||
const count = (message.match(filter.regexp) || []).length;
|
const count = (message.match(filter.regexp) || []).length;
|
||||||
if (count >= filter.matches) {
|
if (count >= filter.matches) {
|
||||||
this.mute(name, channelId, 30);
|
this.mute(name, channelId, 30);
|
||||||
return 'Ow no! Spam protection decided to mute you';
|
return t`Ow no! Spam protection decided to mute you`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,21 +308,17 @@ export class ChatProvider {
|
||||||
message = message.replace(subsitute.regexp, subsitute.replace);
|
message = message.replace(subsitute.regexp, subsitute.replace);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.includes('http')) {
|
|
||||||
return 'no shitty links pls';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message.length > 200) {
|
if (message.length > 200) {
|
||||||
// eslint-disable-next-line max-len
|
// eslint-disable-next-line max-len
|
||||||
return 'You can\'t send a message this long :(';
|
return t`You can\'t send a message this long :(`;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.match(this.cyrillic) && channelId === this.enChannelId) {
|
if (message.match(this.cyrillic) && channelId === this.enChannelId) {
|
||||||
return 'Please use int channel';
|
return t`Please use int channel`;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.mutedCountries.includes(country)) {
|
if (this.mutedCountries.includes(country)) {
|
||||||
return 'Your country is temporary muted from chat';
|
return t`Your country is temporary muted from chat`;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.last_message && user.last_message === message) {
|
if (user.last_message && user.last_message === message) {
|
||||||
|
@ -316,7 +326,7 @@ export class ChatProvider {
|
||||||
if (user.message_repeat >= 4) {
|
if (user.message_repeat >= 4) {
|
||||||
this.mute(name, channelId, 60);
|
this.mute(name, channelId, 60);
|
||||||
user.message_repeat = 0;
|
user.message_repeat = 0;
|
||||||
return 'Stop flooding.';
|
return t`Stop flooding.`;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
user.message_repeat = 0;
|
user.message_repeat = 0;
|
||||||
|
|
|
@ -8,14 +8,17 @@
|
||||||
* splits chat message into array of what it represents
|
* splits chat message into array of what it represents
|
||||||
* [[type, text],[type, text], ...]
|
* [[type, text],[type, text], ...]
|
||||||
* type:
|
* type:
|
||||||
|
* 'l': external link
|
||||||
* 't': text
|
* 't': text
|
||||||
* 'p': ping
|
* 'p': ping
|
||||||
* 'c': coordinates
|
* 'c': coordinates or ppfun link
|
||||||
* 'm': mention of somebody else
|
* 'm': mention of somebody else
|
||||||
* nameRegExp has to be in the form of:
|
* nameRegExp has to be in the form of:
|
||||||
new RegExp(`(^|\\s+)(@${ownName})(\\s+|$)`, 'g');
|
new RegExp(`(^|\\s+)(@${ownName})(\\s+|$)`, 'g');
|
||||||
*/
|
*/
|
||||||
const linkRegExp = /(#[a-z]*,-?[0-9]*,-?[0-9]*(,-?[0-9]+)?)/gi;
|
// eslint-disable-next-line
|
||||||
|
const linkRegExp = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi;
|
||||||
|
const ppLinkRegExp = /(#[a-z]*,-?[0-9]*,-?[0-9]*(,-?[0-9]+)?)/gi;
|
||||||
const linkRegExpFilter = (val, ind) => ((ind % 3) !== 2);
|
const linkRegExpFilter = (val, ind) => ((ind % 3) !== 2);
|
||||||
const mentionRegExp = /(^|\s)(@\S+)/g;
|
const mentionRegExp = /(^|\s)(@\S+)/g;
|
||||||
const spaceFilter = (val, ind) => (val !== ' ' && (ind !== 0 | val !== ''));
|
const spaceFilter = (val, ind) => (val !== ' ' && (ind !== 0 | val !== ''));
|
||||||
|
@ -49,10 +52,11 @@ function splitChatMessage(message, nameRegExp = null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
let arr = [['t', message.trim()]];
|
let arr = [['t', message.trim()]];
|
||||||
arr = splitChatMessageRegexp(arr, linkRegExp, 'c', linkRegExpFilter);
|
arr = splitChatMessageRegexp(arr, ppLinkRegExp, 'c', linkRegExpFilter);
|
||||||
if (nameRegExp) {
|
if (nameRegExp) {
|
||||||
arr = splitChatMessageRegexp(arr, nameRegExp, 'p', spaceFilter);
|
arr = splitChatMessageRegexp(arr, nameRegExp, 'p', spaceFilter);
|
||||||
}
|
}
|
||||||
|
arr = splitChatMessageRegexp(arr, linkRegExp, 'l', linkRegExpFilter);
|
||||||
arr = splitChatMessageRegexp(arr, mentionRegExp, 'm', spaceFilter);
|
arr = splitChatMessageRegexp(arr, mentionRegExp, 'm', spaceFilter);
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -340,6 +340,7 @@ class SocketServer extends WebSocketEvents {
|
||||||
user,
|
user,
|
||||||
message,
|
message,
|
||||||
channelId,
|
channelId,
|
||||||
|
user.ttag,
|
||||||
);
|
);
|
||||||
if (errorMsg) {
|
if (errorMsg) {
|
||||||
ws.send(JSON.stringify([
|
ws.send(JSON.stringify([
|
||||||
|
|
|
@ -7,6 +7,7 @@ import express from 'express';
|
||||||
import session from '../core/session';
|
import session from '../core/session';
|
||||||
import passport from '../core/passport';
|
import passport from '../core/passport';
|
||||||
import User from '../data/models/User';
|
import User from '../data/models/User';
|
||||||
|
import { expressTTag } from '../core/ttag';
|
||||||
import { getIPFromRequest } from '../utils/ip';
|
import { getIPFromRequest } from '../utils/ip';
|
||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
@ -16,6 +17,8 @@ router.use(session);
|
||||||
router.use(passport.initialize());
|
router.use(passport.initialize());
|
||||||
router.use(passport.session());
|
router.use(passport.session());
|
||||||
|
|
||||||
|
router.use(expressTTag);
|
||||||
|
|
||||||
|
|
||||||
function authenticateClient(req) {
|
function authenticateClient(req) {
|
||||||
return new Promise(
|
return new Promise(
|
||||||
|
@ -26,6 +29,7 @@ function authenticateClient(req) {
|
||||||
const user = (req.user) ? req.user
|
const user = (req.user) ? req.user
|
||||||
: new User(null, getIPFromRequest(req));
|
: new User(null, getIPFromRequest(req));
|
||||||
user.setCountry(countryCode);
|
user.setCountry(countryCode);
|
||||||
|
user.ttag = req.ttag;
|
||||||
resolve(user);
|
resolve(user);
|
||||||
});
|
});
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -113,7 +113,7 @@ export function buildWebpackClientConfig(development, analyze, locale) {
|
||||||
path.resolve(__dirname, 'src'),
|
path.resolve(__dirname, 'src'),
|
||||||
],
|
],
|
||||||
options: {
|
options: {
|
||||||
cacheDirectory: development,
|
cacheDirectory: true,
|
||||||
babelrc: false,
|
babelrc: false,
|
||||||
presets: [
|
presets: [
|
||||||
['@babel/preset-env', {
|
['@babel/preset-env', {
|
||||||
|
@ -194,7 +194,18 @@ export function buildWebpackClientConfig(development, analyze, locale) {
|
||||||
chunkModules: false,
|
chunkModules: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
cache: true,
|
/*
|
||||||
|
* this does not much tbqh
|
||||||
|
cache: {
|
||||||
|
type: 'filesystem',
|
||||||
|
cacheDirectory: path.resolve(
|
||||||
|
__dirname,
|
||||||
|
'node_modules',
|
||||||
|
'.cache',
|
||||||
|
'webpack',
|
||||||
|
),
|
||||||
|
},
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user