diff --git a/public/language/ar/admin/development/info.json b/public/language/ar/admin/development/info.json index 7948d86494..4c97beee13 100644 --- a/public/language/ar/admin/development/info.json +++ b/public/language/ar/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "رقم الآي بي %1 ", "nodes-responded": "عدد %1 نقطة/نقاط استجابوا خلال %2 جزء من الثانية.", "host": "المضيف", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/bg/admin/development/info.json b/public/language/bg/admin/development/info.json index 08f70c0692..15d3c07e08 100644 --- a/public/language/bg/admin/development/info.json +++ b/public/language/bg/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 възела отговориха в рамките на %2мсек!", "host": "сървър", - "primary": "основен / изпълнение на задачите", + "primary": "primary / jobs", "pid": "ид. на процеса", "nodejs": "nodejs", "online": "на линия", @@ -19,6 +19,7 @@ "registered": "Регистрирани", "sockets": "Сокети", + "connection-count": "Connection Count", "guests": "Гости", "info": "Информация" diff --git a/public/language/bn/admin/development/info.json b/public/language/bn/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/bn/admin/development/info.json +++ b/public/language/bn/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/cs/admin/development/info.json b/public/language/cs/admin/development/info.json index c47e061cb2..19fb830e9d 100644 --- a/public/language/cs/admin/development/info.json +++ b/public/language/cs/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 vazeb odpovědělo během %2ms.", "host": "host", - "primary": "primární / spuštěné úlohy", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "připojen", @@ -19,6 +19,7 @@ "registered": "Registrován", "sockets": "Sockety", + "connection-count": "Connection Count", "guests": "Hosté", "info": "Informace" diff --git a/public/language/da/admin/development/info.json b/public/language/da/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/da/admin/development/info.json +++ b/public/language/da/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/de/admin/development/info.json b/public/language/de/admin/development/info.json index 082f1b212c..75e634b208 100644 --- a/public/language/de/admin/development/info.json +++ b/public/language/de/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP%1", "nodes-responded": "%1 Knoten antworteten innerhalb von %2ms", "host": "Host", - "primary": "Primärer / Laufjob", + "primary": "primary / jobs", "pid": "PID", "nodejs": "Node.js Version", "online": "Online", @@ -19,6 +19,7 @@ "registered": "Registriert", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Gäste", "info": "Info" diff --git a/public/language/el/admin/development/info.json b/public/language/el/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/el/admin/development/info.json +++ b/public/language/el/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/en-US/admin/development/info.json b/public/language/en-US/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/en-US/admin/development/info.json +++ b/public/language/en-US/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/en-x-pirate/admin/development/info.json b/public/language/en-x-pirate/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/en-x-pirate/admin/development/info.json +++ b/public/language/en-x-pirate/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/es/admin/development/info.json b/public/language/es/admin/development/info.json index 5f934d3a40..6f37b0c1e8 100644 --- a/public/language/es/admin/development/info.json +++ b/public/language/es/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "¡%1 nodos respondieron en %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "en-linea", @@ -19,6 +19,7 @@ "registered": "Registrado", "sockets": "Toma", + "connection-count": "Connection Count", "guests": "Invitados", "info": "Información" diff --git a/public/language/et/admin/development/info.json b/public/language/et/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/et/admin/development/info.json +++ b/public/language/et/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/fa-IR/admin/development/info.json b/public/language/fa-IR/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/fa-IR/admin/development/info.json +++ b/public/language/fa-IR/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/fi/admin/development/info.json b/public/language/fi/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/fi/admin/development/info.json +++ b/public/language/fi/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/fr/admin/development/info.json b/public/language/fr/admin/development/info.json index b33bf0a4fa..3f9de021d1 100644 --- a/public/language/fr/admin/development/info.json +++ b/public/language/fr/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 noeuds ont répondu en %2ms !", "host": "hôte", - "primary": "Tâches principales / Exécuter", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "en ligne", @@ -19,6 +19,7 @@ "registered": "Enregistré", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Invités", "info": "Info" diff --git a/public/language/gl/admin/development/info.json b/public/language/gl/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/gl/admin/development/info.json +++ b/public/language/gl/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/he/admin/development/info.json b/public/language/he/admin/development/info.json index b3a30f3a12..e97a7a872b 100644 --- a/public/language/he/admin/development/info.json +++ b/public/language/he/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 צמתים הגיבו בתוך %2מילי שניות!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "מקוון", @@ -19,6 +19,7 @@ "registered": "רשום", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "אורחים", "info": "מידע" diff --git a/public/language/hr/admin/development/info.json b/public/language/hr/admin/development/info.json index 0eb118a954..3b21db6c9a 100644 --- a/public/language/hr/admin/development/info.json +++ b/public/language/hr/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "Domaćin", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "Na mreži", @@ -19,6 +19,7 @@ "registered": "Registriran", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Gosti", "info": "Info" diff --git a/public/language/hu/admin/development/info.json b/public/language/hu/admin/development/info.json index d67e35f340..48bf12d34b 100644 --- a/public/language/hu/admin/development/info.json +++ b/public/language/hu/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 csomópont válaszolt %2mp-n belül!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Regisztrált", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Vendégek", "info": "Információ" diff --git a/public/language/hy/admin/development/info.json b/public/language/hy/admin/development/info.json index 881192a02e..ca2bdf9f66 100644 --- a/public/language/hy/admin/development/info.json +++ b/public/language/hy/admin/development/info.json @@ -3,7 +3,7 @@ "ip": " IP % 1", "nodes-responded": "%1 հանգույցներ արձագանքեցին %2ms-ի սահմաններում:", "host": "host", - "primary": "առաջնային / գործարկվող աշխատատեղեր", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "առցանց", @@ -19,6 +19,7 @@ "registered": "Գրանցված", "sockets": "Վարդակներ", + "connection-count": "Connection Count", "guests": "Հյուրեր", "info": "տեղեկատվություն" diff --git a/public/language/id/admin/development/info.json b/public/language/id/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/id/admin/development/info.json +++ b/public/language/id/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/it/admin/development/info.json b/public/language/it/admin/development/info.json index 28b9bf2831..3c1c07b0ee 100644 --- a/public/language/it/admin/development/info.json +++ b/public/language/it/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodi hanno risposto entro %2ms!", "host": "host", - "primary": "processi primari/eseguiti", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registrato", "sockets": "Socket", + "connection-count": "Connection Count", "guests": "Ospiti", "info": "Informazioni" diff --git a/public/language/ja/admin/development/info.json b/public/language/ja/admin/development/info.json index f70dd00849..857c419a66 100644 --- a/public/language/ja/admin/development/info.json +++ b/public/language/ja/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1ノードは%2ms以内に応答しました!", "host": "ホスト", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "オンライン", @@ -19,6 +19,7 @@ "registered": "登録数", "sockets": "ソケット数", + "connection-count": "Connection Count", "guests": "ゲスト数", "info": "情報" diff --git a/public/language/ko/admin/development/info.json b/public/language/ko/admin/development/info.json index 4237eaa8ae..08cb8a739b 100644 --- a/public/language/ko/admin/development/info.json +++ b/public/language/ko/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1개의 노드가 %2밀리초 안에 응답했습니다!", "host": "호스트", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "PID", "nodejs": "Node.js", "online": "온라인", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "소켓", + "connection-count": "Connection Count", "guests": "비회원", "info": "정보" diff --git a/public/language/lt/admin/development/info.json b/public/language/lt/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/lt/admin/development/info.json +++ b/public/language/lt/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/lv/admin/development/info.json b/public/language/lv/admin/development/info.json index d07a526789..87cb89d8cf 100644 --- a/public/language/lv/admin/development/info.json +++ b/public/language/lv/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 serveri atbildēja %2ms laikā!", "host": "serveris", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "tiešsaistē", @@ -19,6 +19,7 @@ "registered": "Reģistrētie", "sockets": "Tīkla savienojumi", + "connection-count": "Connection Count", "guests": "Viesi", "info": "Info" diff --git a/public/language/ms/admin/development/info.json b/public/language/ms/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/ms/admin/development/info.json +++ b/public/language/ms/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/nb/admin/development/info.json b/public/language/nb/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/nb/admin/development/info.json +++ b/public/language/nb/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/nl/admin/development/info.json b/public/language/nl/admin/development/info.json index 774d976cc8..b5ee1a8838 100644 --- a/public/language/nl/admin/development/info.json +++ b/public/language/nl/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Geregistreerd", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Gasten", "info": "Informatie" diff --git a/public/language/pl/admin/development/info.json b/public/language/pl/admin/development/info.json index 32667ed213..e01afabd4a 100644 --- a/public/language/pl/admin/development/info.json +++ b/public/language/pl/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 maszyn odpowiedziało w ciągu %2ms!", "host": "host", - "primary": "główne / uruchomione zadania", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "dostępny", @@ -19,6 +19,7 @@ "registered": "Zarejestrowane", "sockets": "Sockety", + "connection-count": "Connection Count", "guests": "Goście", "info": "Informacja" diff --git a/public/language/pt-BR/admin/development/info.json b/public/language/pt-BR/admin/development/info.json index e1a5b6b618..e0fabb3ddb 100644 --- a/public/language/pt-BR/admin/development/info.json +++ b/public/language/pt-BR/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes respondidos dentro de %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registrado", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Visitantes", "info": "Informação" diff --git a/public/language/pt-PT/admin/development/info.json b/public/language/pt-PT/admin/development/info.json index e88ef6e50d..9dc6b6665e 100644 --- a/public/language/pt-PT/admin/development/info.json +++ b/public/language/pt-PT/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nós responderam dentro de %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registados", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Convidados", "info": "Informação" diff --git a/public/language/ro/admin/development/info.json b/public/language/ro/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/ro/admin/development/info.json +++ b/public/language/ro/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/ru/admin/development/info.json b/public/language/ru/admin/development/info.json index 63d6faae67..a7f1481f88 100644 --- a/public/language/ru/admin/development/info.json +++ b/public/language/ru/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "Узлов: %1. Время ответа %2мс!", "host": "хост", - "primary": "первичный", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "онлайн", @@ -19,6 +19,7 @@ "registered": "Авторизованных", "sockets": "Сокеты", + "connection-count": "Connection Count", "guests": "Гостей", "info": "Сырые данные" diff --git a/public/language/rw/admin/development/info.json b/public/language/rw/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/rw/admin/development/info.json +++ b/public/language/rw/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/sc/admin/development/info.json b/public/language/sc/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/sc/admin/development/info.json +++ b/public/language/sc/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/sk/admin/development/info.json b/public/language/sk/admin/development/info.json index 62f5cb9863..c6dbfd349e 100644 --- a/public/language/sk/admin/development/info.json +++ b/public/language/sk/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 väzieb odpovedalo počas %2ms.", "host": "hosť", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "pripojený", @@ -19,6 +19,7 @@ "registered": "Registrovaný", "sockets": "Sockety", + "connection-count": "Connection Count", "guests": "Hostia", "info": "Informácie" diff --git a/public/language/sl/admin/development/info.json b/public/language/sl/admin/development/info.json index 4c469cc598..f53089170f 100644 --- a/public/language/sl/admin/development/info.json +++ b/public/language/sl/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 vozlišč se je odzvalo v %2ms!", "host": "gostitelj", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "na spletu", @@ -19,6 +19,7 @@ "registered": "Registrirani", "sockets": "Vtičnice", + "connection-count": "Connection Count", "guests": "Gostje", "info": "Info" diff --git a/public/language/sq-AL/admin/development/info.json b/public/language/sq-AL/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/sq-AL/admin/development/info.json +++ b/public/language/sq-AL/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/sr/admin/development/info.json b/public/language/sr/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/sr/admin/development/info.json +++ b/public/language/sr/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/sv/admin/development/info.json b/public/language/sv/admin/development/info.json index 11202d9c3a..9834719daf 100644 --- a/public/language/sv/admin/development/info.json +++ b/public/language/sv/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes responded within %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Registered", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Guests", "info": "Info" diff --git a/public/language/th/admin/development/info.json b/public/language/th/admin/development/info.json index 504759aa23..b4bc043e18 100644 --- a/public/language/th/admin/development/info.json +++ b/public/language/th/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nodes ตอบสนองแล้วภายใน %2ms!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "ลงทะเบียนแล้ว", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "ผู้เยี่ยมเยียน", "info": "ข้อมูล" diff --git a/public/language/tr/admin/development/info.json b/public/language/tr/admin/development/info.json index 4aa20f221e..d1bccbc674 100644 --- a/public/language/tr/admin/development/info.json +++ b/public/language/tr/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%2ms içinde %1 düğüm yanıt verdi!", "host": "sunucu", - "primary": "ana sunucu / işlemleri gerçekleştir", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "çevrimiçi", @@ -19,6 +19,7 @@ "registered": "Kayıtlı", "sockets": "Soketler", + "connection-count": "Connection Count", "guests": "Ziyaretçiler", "info": "Bilgi" diff --git a/public/language/uk/admin/development/info.json b/public/language/uk/admin/development/info.json index c28dc7bb38..42f90c8282 100644 --- a/public/language/uk/admin/development/info.json +++ b/public/language/uk/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 вузлів відповіли за %2мс!", "host": "host", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "online", @@ -19,6 +19,7 @@ "registered": "Зареєстровано", "sockets": "Сокети", + "connection-count": "Connection Count", "guests": "Гостей", "info": "Інфо" diff --git a/public/language/vi/admin/development/info.json b/public/language/vi/admin/development/info.json index 4a76411c21..c7a739651b 100644 --- a/public/language/vi/admin/development/info.json +++ b/public/language/vi/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1 nút đã phản hồi trong %2ms!", "host": "máy chủ", - "primary": "công việc chính/điều hành", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "trực tuyến", @@ -19,6 +19,7 @@ "registered": "Đã đăng ký", "sockets": "Sockets", + "connection-count": "Connection Count", "guests": "Khách", "info": "Thông tin" diff --git a/public/language/zh-CN/admin/development/info.json b/public/language/zh-CN/admin/development/info.json index 00ceddc309..bc2790c78e 100644 --- a/public/language/zh-CN/admin/development/info.json +++ b/public/language/zh-CN/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1个节点在%2ms内响应!", "host": "主机", - "primary": "主/运行任务", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "在线", @@ -19,6 +19,7 @@ "registered": "已注册", "sockets": "接口", + "connection-count": "Connection Count", "guests": "游客", "info": "信息" diff --git a/public/language/zh-TW/admin/development/info.json b/public/language/zh-TW/admin/development/info.json index 9b2d42dcfd..da81891ca4 100644 --- a/public/language/zh-TW/admin/development/info.json +++ b/public/language/zh-TW/admin/development/info.json @@ -3,7 +3,7 @@ "ip": "IP %1", "nodes-responded": "%1個節點在%2ms內響應!", "host": "主機", - "primary": "primary / run jobs", + "primary": "primary / jobs", "pid": "pid", "nodejs": "nodejs", "online": "在線", @@ -19,6 +19,7 @@ "registered": "已註冊", "sockets": "網路接口", + "connection-count": "Connection Count", "guests": "訪客", "info": "資訊" diff --git a/public/openapi/components/schemas/UserObject.yaml b/public/openapi/components/schemas/UserObject.yaml index 4bbf83abc3..820e77c0a2 100644 --- a/public/openapi/components/schemas/UserObject.yaml +++ b/public/openapi/components/schemas/UserObject.yaml @@ -331,6 +331,12 @@ UserObjectFull: example: - administrators - Staff + iconBackgrounds: + type: array + items: + type: string + description: A valid CSS colour code + example: '#fff' muted: type: boolean description: Whether or not the user has been muted. diff --git a/public/openapi/read/admin/config.yaml b/public/openapi/read/admin/config.yaml index 61e035d2fe..147d917eb9 100644 --- a/public/openapi/read/admin/config.yaml +++ b/public/openapi/read/admin/config.yaml @@ -152,12 +152,6 @@ get: type: boolean enableQuickReply: type: boolean - iconBackgrounds: - type: array - items: - type: string - description: A valid CSS colour code - example: '#fff' emailPrompt: type: number useragent: diff --git a/public/openapi/read/admin/development/info.yaml b/public/openapi/read/admin/development/info.yaml index 493958b564..81b9e3f49e 100644 --- a/public/openapi/read/admin/development/info.yaml +++ b/public/openapi/read/admin/development/info.yaml @@ -116,6 +116,8 @@ get: type: number socketCount: type: number + connectionCount: + type: number users: type: object properties: diff --git a/public/openapi/read/config.yaml b/public/openapi/read/config.yaml index ceb99c0d58..2fd51603a5 100644 --- a/public/openapi/read/config.yaml +++ b/public/openapi/read/config.yaml @@ -152,12 +152,6 @@ get: type: boolean enableQuickReply: type: boolean - iconBackgrounds: - type: array - items: - type: string - description: A valid CSS colour code - example: '#fff' emailPrompt: type: number useragent: diff --git a/public/src/modules/accounts/picture.js b/public/src/modules/accounts/picture.js index d8ab277f24..ddd3005453 100644 --- a/public/src/modules/accounts/picture.js +++ b/public/src/modules/accounts/picture.js @@ -27,7 +27,7 @@ define('accounts/picture', [ icon: { text: ajaxify.data['icon:text'], bgColor: ajaxify.data['icon:bgColor'] }, defaultAvatar: ajaxify.data.defaultAvatar, allowProfileImageUploads: ajaxify.data.allowProfileImageUploads, - iconBackgrounds: config.iconBackgrounds, + iconBackgrounds: ajaxify.data.iconBackgrounds, user: { uid: ajaxify.data.uid, username: ajaxify.data.username, diff --git a/src/api/users.js b/src/api/users.js index 924dd1daa0..6450885bbf 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -640,7 +640,7 @@ usersAPI.changePicture = async (caller, data) => { picture = returnData && returnData.picture; } - const validBackgrounds = await user.getIconBackgrounds(caller.uid); + const validBackgrounds = await user.getIconBackgrounds(); if (!validBackgrounds.includes(data.bgColor)) { data.bgColor = validBackgrounds[0]; } diff --git a/src/controllers/accounts/blocks.js b/src/controllers/accounts/blocks.js index a3f6cba3ff..185d922970 100644 --- a/src/controllers/accounts/blocks.js +++ b/src/controllers/accounts/blocks.js @@ -12,9 +12,9 @@ blocksController.getBlocks = async function (req, res) { const resultsPerPage = 50; const start = Math.max(0, page - 1) * resultsPerPage; const stop = start + resultsPerPage - 1; + const payload = res.locals.userData; + const { uid, username, userslug, blocksCount } = payload; - const { uid, username, userslug, blocksCount } = await user.getUserFields(res.locals.uid, ['uid', 'username', 'userslug', 'blocksCount']); - const payload = {}; const uids = await user.blocks.list(uid); const data = await plugins.hooks.fire('filter:user.getBlocks', { uids: uids, diff --git a/src/controllers/accounts/categories.js b/src/controllers/accounts/categories.js index 4dfaf95f31..04222c1468 100644 --- a/src/controllers/accounts/categories.js +++ b/src/controllers/accounts/categories.js @@ -9,7 +9,8 @@ const meta = require('../../meta'); const categoriesController = module.exports; categoriesController.get = async function (req, res) { - const { username, userslug } = await user.getUserFields(res.locals.uid, ['username', 'userslug']); + const payload = res.locals.userData; + const { username, userslug } = payload; const [states, allCategoriesData] = await Promise.all([ user.getCategoryWatchState(res.locals.uid), categories.buildForSelect(res.locals.uid, 'find', ['descriptionParsed', 'depth', 'slug']), @@ -31,7 +32,6 @@ categoriesController.get = async function (req, res) { } }); - const payload = {}; payload.categories = categoriesData; payload.title = `[[pages:account/watched-categories, ${username}]]`; payload.breadcrumbs = helpers.buildBreadcrumbs([ diff --git a/src/controllers/accounts/consent.js b/src/controllers/accounts/consent.js index c4ec132a11..ecd8915bd7 100644 --- a/src/controllers/accounts/consent.js +++ b/src/controllers/accounts/consent.js @@ -2,7 +2,6 @@ const db = require('../../database'); const meta = require('../../meta'); -const user = require('../../user'); const helpers = require('../helpers'); const consentController = module.exports; @@ -11,11 +10,10 @@ consentController.get = async function (req, res, next) { if (!meta.config.gdpr_enabled) { return next(); } - - const { username, userslug } = await user.getUserFields(res.locals.uid, ['username', 'userslug']); + const payload = res.locals.userData; + const { username, userslug } = payload; const consented = await db.getObjectField(`user:${res.locals.uid}`, 'gdpr_consent'); - const payload = {}; payload.gdpr_consent = parseInt(consented, 10) === 1; payload.digest = { frequency: meta.config.dailyDigestFreq || 'off', diff --git a/src/controllers/accounts/edit.js b/src/controllers/accounts/edit.js index f3b8ce58ec..599f898c24 100644 --- a/src/controllers/accounts/edit.js +++ b/src/controllers/accounts/edit.js @@ -6,13 +6,16 @@ const helpers = require('../helpers'); const groups = require('../../groups'); const privileges = require('../../privileges'); const plugins = require('../../plugins'); -const accountHelpers = require('./helpers'); const file = require('../../file'); const editController = module.exports; -editController.get = async function (req, res) { - const [{ +editController.get = async function (req, res, next) { + const { userData } = res.locals; + if (!userData) { + return next(); + } + const { username, userslug, isSelf, @@ -20,36 +23,36 @@ editController.get = async function (req, res) { groups: _groups, groupTitleArray, allowMultipleBadges, - }, canUseSignature, canManageUsers] = await Promise.all([ - accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query), + } = userData; + + const [canUseSignature, canManageUsers] = await Promise.all([ privileges.global.can('signature', req.uid), privileges.admin.can('admin:users', req.uid), ]); - const payload = {}; - payload.maximumSignatureLength = meta.config.maximumSignatureLength; - payload.maximumAboutMeLength = meta.config.maximumAboutMeLength; - payload.maximumProfileImageSize = meta.config.maximumProfileImageSize; - payload.allowMultipleBadges = meta.config.allowMultipleBadges === 1; - payload.allowAccountDelete = meta.config.allowAccountDelete === 1; - payload.allowWebsite = !isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:website']; - payload.allowAboutMe = !isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:aboutme']; - payload.allowSignature = canUseSignature && (!isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:signature']); - payload.profileImageDimension = meta.config.profileImageDimension; - payload.defaultAvatar = user.getDefaultAvatar(); + userData.maximumSignatureLength = meta.config.maximumSignatureLength; + userData.maximumAboutMeLength = meta.config.maximumAboutMeLength; + userData.maximumProfileImageSize = meta.config.maximumProfileImageSize; + userData.allowMultipleBadges = meta.config.allowMultipleBadges === 1; + userData.allowAccountDelete = meta.config.allowAccountDelete === 1; + userData.allowWebsite = !isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:website']; + userData.allowAboutMe = !isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:aboutme']; + userData.allowSignature = canUseSignature && (!isSelf || !!meta.config['reputation:disabled'] || reputation >= meta.config['min:rep:signature']); + userData.profileImageDimension = meta.config.profileImageDimension; + userData.defaultAvatar = user.getDefaultAvatar(); - payload.groups = _groups.filter(g => g && g.userTitleEnabled && !groups.isPrivilegeGroup(g.name) && g.name !== 'registered-users'); + userData.groups = _groups.filter(g => g && g.userTitleEnabled && !groups.isPrivilegeGroup(g.name) && g.name !== 'registered-users'); if (req.uid === res.locals.uid || canManageUsers) { const { associations } = await plugins.hooks.fire('filter:auth.list', { uid: res.locals.uid, associations: [] }); - payload.sso = associations; + userData.sso = associations; } if (!allowMultipleBadges) { - payload.groupTitle = groupTitleArray[0]; + userData.groupTitle = groupTitleArray[0]; } - payload.groups.sort((a, b) => { + userData.groups.sort((a, b) => { const i1 = groupTitleArray.indexOf(a.name); const i2 = groupTitleArray.indexOf(b.name); if (i1 === -1) { @@ -59,14 +62,14 @@ editController.get = async function (req, res) { } return i1 - i2; }); - payload.groups.forEach((group) => { + userData.groups.forEach((group) => { group.userTitle = group.userTitle || group.displayName; group.selected = groupTitleArray.includes(group.name); }); - payload.groupSelectSize = Math.min(10, Math.max(5, payload.groups.length + 1)); + userData.groupSelectSize = Math.min(10, Math.max(5, userData.groups.length + 1)); - payload.title = `[[pages:account/edit, ${username}]]`; - payload.breadcrumbs = helpers.buildBreadcrumbs([ + userData.title = `[[pages:account/edit, ${username}]]`; + userData.breadcrumbs = helpers.buildBreadcrumbs([ { text: username, url: `/user/${userslug}`, @@ -75,9 +78,9 @@ editController.get = async function (req, res) { text: '[[user:edit]]', }, ]); - payload.editButtons = []; + userData.editButtons = []; - res.render('account/edit', payload); + res.render('account/edit', userData); }; editController.password = async function (req, res, next) { @@ -102,6 +105,7 @@ editController.email = async function (req, res, next) { }; async function renderRoute(name, req, res) { + const { userData } = res.locals; const [isAdmin, { username, userslug }, hasPassword] = await Promise.all([ privileges.admin.can('admin:users', req.uid), user.getUserFields(res.locals.uid, ['username', 'userslug']), @@ -112,14 +116,14 @@ async function renderRoute(name, req, res) { return helpers.notAllowed(req, res); } - const payload = { hasPassword }; + userData.hasPassword = hasPassword; if (name === 'password') { - payload.minimumPasswordLength = meta.config.minimumPasswordLength; - payload.minimumPasswordStrength = meta.config.minimumPasswordStrength; + userData.minimumPasswordLength = meta.config.minimumPasswordLength; + userData.minimumPasswordStrength = meta.config.minimumPasswordStrength; } - payload.title = `[[pages:account/edit/${name}, ${username}]]`; - payload.breadcrumbs = helpers.buildBreadcrumbs([ + userData.title = `[[pages:account/edit/${name}, ${username}]]`; + userData.breadcrumbs = helpers.buildBreadcrumbs([ { text: username, url: `/user/${userslug}`, @@ -133,7 +137,7 @@ async function renderRoute(name, req, res) { }, ]); - res.render(`account/edit/${name}`, payload); + res.render(`account/edit/${name}`, userData); } editController.uploadPicture = async function (req, res, next) { diff --git a/src/controllers/accounts/follow.js b/src/controllers/accounts/follow.js index 44ad00d3de..58dba7f3c0 100644 --- a/src/controllers/accounts/follow.js +++ b/src/controllers/accounts/follow.js @@ -15,18 +15,16 @@ followController.getFollowers = async function (req, res, next) { }; async function getFollow(tpl, name, req, res) { + const { userData: payload } = res.locals; const { username, userslug, followerCount, followingCount, - } = await user.getUserFields(res.locals.uid, [ - 'username', 'userslug', 'followerCount', 'followingCount', - ]); + } = payload; const page = parseInt(req.query.page, 10) || 1; const resultsPerPage = 50; const start = Math.max(0, page - 1) * resultsPerPage; const stop = start + resultsPerPage - 1; - const payload = {}; payload.title = `[[pages:${tpl}, ${username}]]`; const method = name === 'following' ? 'getFollowing' : 'getFollowers'; diff --git a/src/controllers/accounts/groups.js b/src/controllers/accounts/groups.js index 27c0797afe..3a9d66243e 100644 --- a/src/controllers/accounts/groups.js +++ b/src/controllers/accounts/groups.js @@ -9,7 +9,7 @@ const groupsController = module.exports; groupsController.get = async function (req, res) { const { username, userslug } = await user.getUserFields(res.locals.uid, ['username', 'userslug']); - const payload = {}; + const payload = res.locals.userData; let groupsData = await groups.getUserGroups([res.locals.uid]); groupsData = groupsData[0]; diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index bbd76b5003..b7deaf70b8 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -40,11 +40,7 @@ helpers.getUserDataByUserSlug = async function (userslug, callerUID, query = {}) await parseAboutMe(results.userData); let { userData } = results; - const { userSettings } = results; - const { isAdmin } = results; - const { isGlobalModerator } = results; - const { isModerator } = results; - const { canViewInfo } = results; + const { userSettings, isAdmin, isGlobalModerator, isModerator, canViewInfo } = results; const isSelf = parseInt(callerUID, 10) === parseInt(userData.uid, 10); if (meta.config['reputation:disabled']) { @@ -93,6 +89,7 @@ helpers.getUserDataByUserSlug = async function (userslug, callerUID, query = {}) userData.isFollowing = results.isFollowing; userData.canChat = results.canChat; userData.hasPrivateChat = results.hasPrivateChat; + userData.iconBackgrounds = results.iconBackgrounds; userData.showHidden = results.canEdit; // remove in v1.19.0 userData.allowProfilePicture = !userData.isSelf || !!meta.config['reputation:disabled'] || userData.reputation >= meta.config['min:rep:profile-picture']; userData.allowCoverPicture = !userData.isSelf || !!meta.config['reputation:disabled'] || userData.reputation >= meta.config['min:rep:cover-picture']; @@ -169,6 +166,7 @@ async function getAllData(uid, callerUID) { canViewInfo: privileges.global.can('view:users:info', callerUID), canChat: canChat(callerUID, uid), hasPrivateChat: messaging.hasPrivateChat(callerUID, uid), + iconBackgrounds: user.getIconBackgrounds(), }); } diff --git a/src/controllers/accounts/info.js b/src/controllers/accounts/info.js index b62de6b486..7081acc7df 100644 --- a/src/controllers/accounts/info.js +++ b/src/controllers/accounts/info.js @@ -13,19 +13,17 @@ infoController.get = async function (req, res) { const start = (page - 1) * itemsPerPage; const stop = start + itemsPerPage - 1; - const [{ username, userslug }, isPrivileged] = await Promise.all([ - user.getUserFields(res.locals.uid, ['username', 'userslug']), + const payload = res.locals.userData; + const { username, userslug } = payload; + const [isPrivileged, history, sessions, usernames, emails] = await Promise.all([ user.isPrivileged(req.uid), - ]); - const [history, sessions, usernames, emails, notes] = await Promise.all([ user.getModerationHistory(res.locals.uid), user.auth.getSessions(res.locals.uid, req.sessionID), user.getHistory(`user:${res.locals.uid}:usernames`), user.getHistory(`user:${res.locals.uid}:emails`), - getNotes({ uid: res.locals.uid, isPrivileged }, start, stop), ]); - const payload = {}; + const notes = await getNotes({ uid: res.locals.uid, isPrivileged }, start, stop); payload.history = history; payload.sessions = sessions; diff --git a/src/controllers/accounts/posts.js b/src/controllers/accounts/posts.js index 46ae337a38..3bd48726b8 100644 --- a/src/controllers/accounts/posts.js +++ b/src/controllers/accounts/posts.js @@ -177,16 +177,16 @@ async function getPostsFromUserSet(template, req, res) { const data = templateToData[template]; const page = Math.max(1, parseInt(req.query.page, 10) || 1); - // exposeUid returns -2 for all remote users for ease of processing, restoring uid let { uid } = res.locals; if (uid === -2) { uid = await db.getObjectField('handle:uid', req.params.userslug.toLowerCase()); } - const [{ username, userslug }, settings] = await Promise.all([ - user.getUserFields(uid, ['username', 'userslug']), - user.getSettings(req.uid), - ]); + const payload = res.locals.userData; + const { username, userslug } = uid === -2 ? + await user.getUserFields(uid, ['username', 'userslug']) : + payload; + const settings = await user.getSettings(req.uid); const itemsPerPage = data.type === 'topics' ? settings.topicsPerPage : settings.postsPerPage; const start = (page - 1) * itemsPerPage; @@ -213,7 +213,6 @@ async function getPostsFromUserSet(template, req, res) { } const { itemCount, itemData } = result; - const payload = {}; payload[data.type] = itemData[data.type]; payload.nextStart = itemData.nextStart; diff --git a/src/controllers/accounts/profile.js b/src/controllers/accounts/profile.js index 9aec78ee91..91f4bc551b 100644 --- a/src/controllers/accounts/profile.js +++ b/src/controllers/accounts/profile.js @@ -1,6 +1,5 @@ 'use strict'; -const nconf = require('nconf'); const _ = require('lodash'); const db = require('../../database'); @@ -10,24 +9,13 @@ const posts = require('../../posts'); const categories = require('../../categories'); const plugins = require('../../plugins'); const privileges = require('../../privileges'); -const accountHelpers = require('./helpers'); const helpers = require('../helpers'); const utils = require('../../utils'); const profileController = module.exports; profileController.get = async function (req, res, next) { - const lowercaseSlug = req.params.userslug.toLowerCase(); - - if (req.params.userslug !== lowercaseSlug) { - if (res.locals.isAPI) { - req.params.userslug = lowercaseSlug; - } else { - return res.redirect(`${nconf.get('relative_path')}/user/${lowercaseSlug}`); - } - } - - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); + const { userData } = res.locals; if (!userData) { return next(); } diff --git a/src/controllers/accounts/sessions.js b/src/controllers/accounts/sessions.js index 74896346d7..520f466f5b 100644 --- a/src/controllers/accounts/sessions.js +++ b/src/controllers/accounts/sessions.js @@ -6,13 +6,15 @@ const helpers = require('../helpers'); const sessionController = module.exports; sessionController.get = async function (req, res) { - const { username, userslug } = await user.getUserFields(res.locals.uid, ['username', 'userslug']); + const payload = res.locals.userData; + const { username, userslug } = payload; - const payload = { - sessions: await user.auth.getSessions(res.locals.uid, req.sessionID), - title: '[[pages:account/sessions]]', - breadcrumbs: helpers.buildBreadcrumbs([{ text: username, url: `/user/${userslug}` }, { text: '[[pages:account/sessions]]' }]), - }; + payload.sessions = await user.auth.getSessions(res.locals.uid, req.sessionID); + payload.title = '[[pages:account/sessions]]'; + payload.breadcrumbs = helpers.buildBreadcrumbs([ + { text: username, url: `/user/${userslug}` }, + { text: '[[pages:account/sessions]]' }, + ]); res.render('account/sessions', payload); }; diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index 2f5259822a..6248bc5ddd 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -13,13 +13,12 @@ const plugins = require('../../plugins'); const notifications = require('../../notifications'); const db = require('../../database'); const helpers = require('../helpers'); -const accountHelpers = require('./helpers'); const slugify = require('../../slugify'); const settingsController = module.exports; settingsController.get = async function (req, res, next) { - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); + const { userData } = res.locals; if (!userData) { return next(); } diff --git a/src/controllers/accounts/tags.js b/src/controllers/accounts/tags.js index 736b67aae0..a4a30404c3 100644 --- a/src/controllers/accounts/tags.js +++ b/src/controllers/accounts/tags.js @@ -1,7 +1,6 @@ 'use strict'; const db = require('../../database'); -const user = require('../../user'); const helpers = require('../helpers'); const tagsController = module.exports; @@ -10,10 +9,10 @@ tagsController.get = async function (req, res) { if (req.uid !== res.locals.uid) { return helpers.notAllowed(req, res); } - const { username, userslug } = await user.getUserFields(res.locals.uid, ['username', 'userslug']); + const payload = res.locals.userData; + const { username, userslug } = payload; const tagData = await db.getSortedSetRange(`uid:${res.locals.uid}:followed_tags`, 0, -1); - const payload = {}; payload.tags = tagData; payload.title = `[[pages:account/watched-tags, ${username}]]`; payload.breadcrumbs = helpers.buildBreadcrumbs([ diff --git a/src/controllers/accounts/uploads.js b/src/controllers/accounts/uploads.js index edfbe23740..b438b472f2 100644 --- a/src/controllers/accounts/uploads.js +++ b/src/controllers/accounts/uploads.js @@ -6,14 +6,14 @@ const nconf = require('nconf'); const db = require('../../database'); const helpers = require('../helpers'); -const user = require('../../user'); const meta = require('../../meta'); const pagination = require('../../pagination'); const uploadsController = module.exports; uploadsController.get = async function (req, res) { - const { username, userslug } = await user.getUserFields(res.locals.uid, ['username', 'userslug']); + const payload = res.locals.userData; + const { username, userslug } = payload; const page = Math.max(1, parseInt(req.query.page, 10) || 1); const itemsPerPage = 25; const start = (page - 1) * itemsPerPage; @@ -23,7 +23,6 @@ uploadsController.get = async function (req, res) { db.getSortedSetRevRange(`uid:${res.locals.uid}:uploads`, start, stop), ]); - const payload = {}; payload.uploads = uploadNames.map(uploadName => ({ name: uploadName, url: path.resolve(nconf.get('upload_url'), uploadName), diff --git a/src/controllers/api.js b/src/controllers/api.js index 22574a9ce6..56b629f6db 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -88,7 +88,6 @@ apiController.loadConfig = async function (req) { thumbs: { size: meta.config.topicThumbSize, }, - iconBackgrounds: await user.getIconBackgrounds(req.uid), emailPrompt: meta.config.emailPrompt, useragent: req.useragent, fontawesome: { diff --git a/src/middleware/render.js b/src/middleware/render.js index 4ae47a4161..e01110936f 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -116,7 +116,7 @@ module.exports = function (middleware) { } try { - await renderMethod(template, { ...res.locals.templateValues, ...options }, fn); + await renderMethod(template, options, fn); } catch (err) { next(err); } diff --git a/src/middleware/uploads.js b/src/middleware/uploads.js index 5b1e9c392f..d1ce5b09b2 100644 --- a/src/middleware/uploads.js +++ b/src/middleware/uploads.js @@ -5,12 +5,12 @@ const meta = require('../meta'); const helpers = require('./helpers'); const user = require('../user'); -const cache = cacheCreate({ - ttl: meta.config.uploadRateLimitCooldown * 1000, -}); +let cache; exports.clearCache = function () { - cache.clear(); + if (cache) { + cache.clear(); + } }; exports.ratelimit = helpers.try(async (req, res, next) => { @@ -18,7 +18,11 @@ exports.ratelimit = helpers.try(async (req, res, next) => { if (!meta.config.uploadRateLimitThreshold || (uid && await user.isAdminOrGlobalMod(uid))) { return next(); } - + if (!cache) { + cache = cacheCreate({ + ttl: meta.config.uploadRateLimitCooldown * 1000, + }); + } const count = (cache.get(`${req.ip}:uploaded_file_count`) || 0) + req.files.files.length; if (count > meta.config.uploadRateLimitThreshold) { return next(new Error(['[[error:upload-ratelimit-reached]]'])); diff --git a/src/middleware/user.js b/src/middleware/user.js index 342730c507..82621bf71e 100644 --- a/src/middleware/user.js +++ b/src/middleware/user.js @@ -248,7 +248,18 @@ module.exports = function (middleware) { }; middleware.buildAccountData = async (req, res, next) => { - res.locals.templateValues = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); + // use lowercase slug on api routes, or direct to the user/ + const lowercaseSlug = req.params.userslug.toLowerCase(); + if (req.params.userslug !== lowercaseSlug) { + if (res.locals.isAPI) { + req.params.userslug = lowercaseSlug; + } else { + const newPath = req.path.replace(new RegExp(`/${req.params.userslug}`), () => `/${lowercaseSlug}`); + return res.redirect(`${nconf.get('relative_path')}${newPath}`); + } + } + + res.locals.userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); next(); }; diff --git a/src/user/bans.js b/src/user/bans.js index 465f6300e6..c52a24db6b 100644 --- a/src/user/bans.js +++ b/src/user/bans.js @@ -42,7 +42,7 @@ module.exports = function (User) { await db.sortedSetAdd('users:banned', now, uid); await db.sortedSetAdd(`uid:${uid}:bans:timestamp`, now, banKey); await db.setObject(banKey, banData); - await User.setUserField(uid, 'banned:expire', banData.expire); + await User.setUserFields(uid, { banned: 1, 'banned:expire': banData.expire }); if (until > now) { await db.sortedSetAdd('users:banned:expire', until, uid); } else { @@ -69,7 +69,7 @@ module.exports = function (User) { uids = isArray ? uids : [uids]; const userData = await User.getUsersFields(uids, ['email:confirmed']); - await db.setObject(uids.map(uid => `user:${uid}`), { 'banned:expire': 0 }); + await db.setObject(uids.map(uid => `user:${uid}`), { banned: 0, 'banned:expire': 0 }); const now = Date.now(); const unbanDataArray = []; /* eslint-disable no-await-in-loop */ @@ -124,16 +124,15 @@ module.exports = function (User) { User.bans.unbanIfExpired = async function (uids) { // loading user data will unban if it has expired -barisu - const userData = await User.getUsersFields(uids, ['banned:expire']); + const userData = await User.getUsersFields(uids, ['banned', 'banned:expire']); return User.bans.calcExpiredFromUserData(userData); }; - User.bans.calcExpiredFromUserData = async function (userData) { + User.bans.calcExpiredFromUserData = function (userData) { const isArray = Array.isArray(userData); userData = isArray ? userData : [userData]; - const banned = await groups.isMembers(userData.map(u => u.uid), groups.BANNED_USERS); - userData = userData.map((userData, index) => ({ - banned: banned[index], + userData = userData.map(userData => ({ + banned: !!(userData && userData.banned), 'banned:expire': userData && userData['banned:expire'], banExpired: userData && userData['banned:expire'] <= Date.now() && userData['banned:expire'] !== 0, })); diff --git a/src/user/data.js b/src/user/data.js index 84a0f3952a..a671fd6bd0 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -45,6 +45,8 @@ module.exports = function (User) { 'email:confirmed': 0, }; + let iconBackgrounds; + User.getUsersFields = async function (uids, fields) { if (!Array.isArray(uids) || !uids.length) { return []; @@ -201,8 +203,12 @@ module.exports = function (User) { ['showfullname'] )); } + if (!iconBackgrounds) { + iconBackgrounds = await User.getIconBackgrounds(); + } - await Promise.all(users.map(async (user) => { + const unbanUids = []; + users.forEach((user) => { if (!user) { return; } @@ -218,7 +224,7 @@ module.exports = function (User) { user.email = validator.escape(user.email ? user.email.toString() : ''); } - if (!parseInt(user.uid, 10) && !activitypub.helpers.isUri(user.uid)) { + if (!user.uid && !activitypub.helpers.isUri(user.uid)) { for (const [key, value] of Object.entries(User.guestData)) { user[key] = value; } @@ -248,15 +254,12 @@ module.exports = function (User) { } // User Icons - if (requestedFields.includes('picture') && user.username && parseInt(user.uid, 10) !== 0 && !meta.config.defaultAvatar) { - const iconBackgrounds = await User.getIconBackgrounds(user.uid); - let bgColor = await User.getUserField(user.uid, 'icon:bgColor'); - if (!iconBackgrounds.includes(bgColor)) { - bgColor = Array.prototype.reduce.call(user.username, (cur, next) => cur + next.charCodeAt(), 0); - bgColor = iconBackgrounds[bgColor % iconBackgrounds.length]; + if (requestedFields.includes('picture') && user.username && user.uid !== 0 && !meta.config.defaultAvatar) { + if (!iconBackgrounds.includes(user['icon:bgColor'])) { + const nameAsIndex = Array.from(user.username).reduce((cur, next) => cur + next.charCodeAt(), 0); + user['icon:bgColor'] = iconBackgrounds[nameAsIndex % iconBackgrounds.length]; } user['icon:text'] = (user.username[0] || '').toUpperCase(); - user['icon:bgColor'] = bgColor; } if (user.hasOwnProperty('joindate')) { @@ -267,22 +270,25 @@ module.exports = function (User) { user.lastonlineISO = utils.toISOString(user.lastonline) || user.joindateISO; } + if (user.hasOwnProperty('mutedUntil')) { + user.muted = user.mutedUntil > Date.now(); + } + if (user.hasOwnProperty('banned') || user.hasOwnProperty('banned:expire')) { - const result = await User.bans.calcExpiredFromUserData(user); + const result = User.bans.calcExpiredFromUserData(user); user.banned = result.banned; const unban = result.banned && result.banExpired; user.banned_until = unban ? 0 : user['banned:expire']; user.banned_until_readable = user.banned_until && !unban ? utils.toISOString(user.banned_until) : 'Not Banned'; if (unban) { - await User.bans.unban(user.uid, '[[user:info.ban-expired]]'); + unbanUids.push(user.uid); user.banned = false; } } - - if (user.hasOwnProperty('mutedUntil')) { - user.muted = user.mutedUntil > Date.now(); - } - })); + }); + if (unbanUids.length) { + await User.bans.unban(unbanUids, '[[user:info.ban-expired]]'); + } return await plugins.hooks.fire('filter:users.get', users); } @@ -332,14 +338,20 @@ module.exports = function (User) { } } - User.getIconBackgrounds = async (uid = 0) => { - let iconBackgrounds = [ + + User.getIconBackgrounds = async () => { + if (iconBackgrounds) { + return iconBackgrounds; + } + + const _iconBackgrounds = [ '#f44336', '#e91e63', '#9c27b0', '#673ab7', '#3f51b5', '#2196f3', '#009688', '#1b5e20', '#33691e', '#827717', '#e65100', '#ff5722', '#795548', '#607d8b', ]; - ({ iconBackgrounds } = await plugins.hooks.fire('filter:user.iconBackgrounds', { uid, iconBackgrounds })); + const data = await plugins.hooks.fire('filter:user.iconBackgrounds', { iconBackgrounds: _iconBackgrounds }); + iconBackgrounds = data.iconBackgrounds; return iconBackgrounds; }; diff --git a/test/user.js b/test/user.js index 6ac7de44a9..25c0ddc6f0 100644 --- a/test/user.js +++ b/test/user.js @@ -607,7 +607,7 @@ describe('User', () => { it('should return an icon text and valid background if username and picture is explicitly requested', async () => { const payload = await User.getUserFields(testUid, ['username', 'picture']); - const validBackgrounds = await User.getIconBackgrounds(testUid); + const validBackgrounds = await User.getIconBackgrounds(); assert.strictEqual(payload['icon:text'], userData.username.slice(0, 1).toUpperCase()); assert(payload['icon:bgColor']); assert(validBackgrounds.includes(payload['icon:bgColor'])); @@ -616,7 +616,7 @@ describe('User', () => { it('should return a valid background, even if an invalid background colour is set', async () => { await User.setUserField(testUid, 'icon:bgColor', 'teal'); const payload = await User.getUserFields(testUid, ['username', 'picture']); - const validBackgrounds = await User.getIconBackgrounds(testUid); + const validBackgrounds = await User.getIconBackgrounds(); assert(payload['icon:bgColor']); assert(validBackgrounds.includes(payload['icon:bgColor']));