Moved auth and language processing to middlewear. Fixed memory leak occurring with each database connection. Added posting on 3DS. Moved endpoints to single route between portal and ctr. Added post character limit (280 characters).

This commit is contained in:
jay.poff@outlook.com 2021-09-18 19:19:02 -05:00
parent 949e66493c
commit 11be7687d5
52 changed files with 2481 additions and 2687 deletions

585
package-lock.json generated
View File

@ -54,7 +54,6 @@
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@ -104,11 +103,21 @@
"sprintf-js": "~1.0.2"
}
},
"arr-flatten": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
"integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"arraybuffer-to-string": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/arraybuffer-to-string/-/arraybuffer-to-string-1.0.2.tgz",
"integrity": "sha512-WbIYlLVmvIAyUBdQRRuyGOJRriOQy9OAsWcyURmsRQp9+g647hdMSS2VFKXbJLVw0daUu06hqwLXm9etVrXI9A=="
},
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@ -120,8 +129,7 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"async": {
"version": "0.9.2",
@ -132,25 +140,27 @@
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
},
"atob-lite": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz",
"integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
"dev": true
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
"integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
"dev": true
"integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
},
"balanced-match": {
"version": "1.0.0",
@ -175,7 +185,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dev": true,
"requires": {
"tweetnacl": "^0.14.3"
}
@ -203,6 +212,11 @@
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
},
"bmp-js": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
"integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM="
},
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
@ -250,6 +264,11 @@
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
"buffer-to-uint8array": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/buffer-to-uint8array/-/buffer-to-uint8array-1.1.0.tgz",
"integrity": "sha1-z29BKHwCL0WNp1LDkcGo1TXsX3I="
},
"busboy": {
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
@ -294,8 +313,7 @@
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"chalk": {
"version": "2.4.2",
@ -313,6 +331,16 @@
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
},
"clamp": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz",
"integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ="
},
"clip-pixels": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/clip-pixels/-/clip-pixels-1.0.1.tgz",
"integrity": "sha512-nJ22fZvCwkJfMppkOEE7GciLX08rDnVzEJ+U46kBFZtwNzH2V4tNxMWa9Tc365WspCxy1c3NtGJ5EeT4SgjmCA=="
},
"code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
@ -335,6 +363,14 @@
"color-name": "1.1.3"
}
},
"color-id": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz",
"integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==",
"requires": {
"clamp": "^1.0.1"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
@ -358,11 +394,22 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
},
"compute-dims": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/compute-dims/-/compute-dims-1.1.0.tgz",
"integrity": "sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg==",
"requires": {
"utils-copy": "^1.0.0",
"validate.io-array": "^1.0.6",
"validate.io-matrix-like": "^1.0.2",
"validate.io-ndarray-like": "^1.0.0",
"validate.io-positive-integer": "^1.0.0"
}
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -386,6 +433,16 @@
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
},
"const-max-uint32": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/const-max-uint32/-/const-max-uint32-1.0.2.tgz",
"integrity": "sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY="
},
"const-pinf-float64": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz",
"integrity": "sha1-9u+w15+cCYbT558pI6v5twtj1yY="
},
"content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
@ -439,7 +496,6 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
}
@ -468,8 +524,7 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"delegates": {
"version": "1.0.0",
@ -532,11 +587,15 @@
}
}
},
"dtype": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz",
"integrity": "sha1-zQUjI84GFETs0uj1dI9popvihDQ="
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"dev": true,
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
@ -641,26 +700,27 @@
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"dev": true
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
"file-type": {
"version": "10.11.0",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz",
"integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw=="
},
"file-uri-to-path": {
"version": "1.0.0",
@ -691,17 +751,28 @@
"unpipe": "~1.0.0"
}
},
"flatten-vertex-data": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz",
"integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==",
"requires": {
"dtype": "^2.0.0"
}
},
"flip-pixels": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/flip-pixels/-/flip-pixels-1.0.2.tgz",
"integrity": "sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA=="
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
"dev": true
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
@ -753,7 +824,6 @@
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
}
@ -771,14 +841,12 @@
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"dev": true
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"dev": true,
"requires": {
"ajv": "^6.12.3",
"har-schema": "^2.0.0"
@ -822,7 +890,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
@ -842,6 +909,116 @@
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
"image-decode": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/image-decode/-/image-decode-1.2.2.tgz",
"integrity": "sha512-WJSWrPNmEnWVYGkY22bA6206MKYjfGl01fdlwIp6ovdnPL2qGJyC3wQj8QqYbdblchzwgglFg8Jcb/1f6fhaTQ==",
"requires": {
"bmp-js": "^0.1.0",
"buffer-to-uint8array": "^1.1.0",
"image-type": "^3.0.0",
"jpeg-js": "^0.3.4",
"omggif": "^1.0.9",
"pngjs": "^3.3.3",
"to-array-buffer": "^3.0.0",
"utif": "^2.0.1"
},
"dependencies": {
"jpeg-js": {
"version": "0.3.7",
"resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.7.tgz",
"integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ=="
},
"pngjs": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
"integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
}
}
},
"image-encode": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/image-encode/-/image-encode-1.3.1.tgz",
"integrity": "sha512-XlDSaqGFrW0Rn08fxJM725+h9Hfx/D9u1RVMP8IrcSRN5Ib74UgVf7yuzoS8YAxKc6HqQ8bhDSvy+rIzCUoAYg==",
"requires": {
"bmp-js": "^0.1.0",
"image-palette": "^2.0.1",
"image-type": "^3.0.0",
"is-plain-obj": "^1.1.0",
"jpeg-js": "^0.4.1",
"next-pow-2": "^1.0.0",
"object-assign": "^4.1.1",
"omggif": "^1.0.9",
"pngjs": "^3.3.3",
"pxls": "^2.3.1",
"to-array-buffer": "^3.0.0",
"utif": "^2.0.1"
},
"dependencies": {
"pngjs": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
"integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
}
}
},
"image-palette": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz",
"integrity": "sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ==",
"requires": {
"color-id": "^1.1.0",
"pxls": "^2.0.0",
"quantize": "^1.0.2"
}
},
"image-pixels": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/image-pixels/-/image-pixels-2.2.2.tgz",
"integrity": "sha512-jcHECwLUEUBMQLqpZF0Bs0ac/jvZXs/97JwD6J39rP98vgTyvvNKhUjYaWf+BSKKPYXfenctOQV95sDC7Z/aZQ==",
"requires": {
"arr-flatten": "^1.1.0",
"arraybuffer-to-string": "^1.0.2",
"clip-pixels": "^1.0.1",
"flip-pixels": "^1.0.1",
"image-decode": "^1.1.0",
"image-type": "^3.0.0",
"is-base64": "^0.1.0",
"is-blob": "^2.0.0",
"is-browser": "^2.1.0",
"is-buffer": "^2.0.3",
"is-float-array": "^1.0.0",
"is-plain-obj": "^1.1.0",
"is-promise": "^2.1.0",
"is-relative": "^1.0.0",
"is-url": "^1.2.4",
"object-assign": "^4.1.1",
"parse-rect": "^1.2.0",
"primitive-pool": "^1.1.0",
"pxls": "^2.3.2",
"request": "^2.88.0",
"to-array-buffer": "^3.1.1",
"to-uint8": "^1.4.0",
"weak-map": "^1.0.5"
}
},
"image-type": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/image-type/-/image-type-3.1.0.tgz",
"integrity": "sha512-edYRXKQ3WD2yHXFGUbwoJVn5v7j1A6Z505uZUYIfzCwOOhPGLYSc3VOucF9fqbsaUbgb37DdjOU+WV4uo7ZooQ==",
"requires": {
"file-type": "^10.9.0"
}
},
"indexed-image-converter": {
"version": "github:PretendoNetwork/indexed-image-converter#f413e562396ac78cb71b6ab8dc8164bc077dd839",
"from": "github:PretendoNetwork/indexed-image-converter",
"requires": {
"image-encode": "^1.3.1",
"image-palette": "^2.1.0",
"image-pixels": "^2.2.2"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
@ -862,6 +1039,31 @@
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
},
"is-base64": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-base64/-/is-base64-0.1.0.tgz",
"integrity": "sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg=="
},
"is-blob": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz",
"integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw=="
},
"is-browser": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz",
"integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ=="
},
"is-buffer": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
},
"is-float-array": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-float-array/-/is-float-array-1.0.0.tgz",
"integrity": "sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ=="
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
@ -870,11 +1072,41 @@
"number-is-nan": "^1.0.0"
}
},
"is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
},
"is-promise": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
},
"is-relative": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
"integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
"requires": {
"is-unc-path": "^1.0.0"
}
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"is-unc-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
"integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
"requires": {
"unc-path-regex": "^0.1.2"
}
},
"is-url": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
"integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
},
"isarray": {
"version": "1.0.0",
@ -893,8 +1125,7 @@
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"jake": {
"version": "10.8.2",
@ -927,6 +1158,11 @@
}
}
},
"jpeg-js": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz",
"integrity": "sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q=="
},
"js-yaml": {
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
@ -939,26 +1175,22 @@
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"dev": true
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
"dev": true
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
"dev": true
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"jsonfile": {
"version": "6.1.0",
@ -980,7 +1212,6 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"dev": true,
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
@ -1214,6 +1445,11 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
"next-pow-2": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/next-pow-2/-/next-pow-2-1.0.0.tgz",
"integrity": "sha1-y1wvHa4EDFbN1c2h3FxqOjOPQ2c="
},
"node-abi": {
"version": "2.26.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.26.0.tgz",
@ -1274,14 +1510,18 @@
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
"object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
},
"object-to-xml": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/object-to-xml/-/object-to-xml-2.0.0.tgz",
@ -1293,6 +1533,11 @@
"sanitizer": "0.1.3"
}
},
"omggif": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
"integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@ -1319,6 +1564,14 @@
"resolved": "https://registry.npmjs.org/pako/-/pako-2.0.2.tgz",
"integrity": "sha512-9e8DRI3+dRLomCmMBAH30B2ejh+blwXr7VmMEx/pVFZlSDA7oyI8uKMhKXr8IrZpoxBF2YlxUvhqRXzTT1i0NA=="
},
"parse-rect": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz",
"integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==",
"requires": {
"pick-by-alias": "^1.2.0"
}
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@ -1332,8 +1585,12 @@
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"pick-by-alias": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz",
"integrity": "sha1-X3yysfIabh6ISgyHhVqko3NhEHs="
},
"pngjs": {
"version": "6.0.0",
@ -1361,6 +1618,11 @@
"tunnel-agent": "^0.6.0"
}
},
"primitive-pool": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/primitive-pool/-/primitive-pool-1.1.0.tgz",
"integrity": "sha512-pl4l1R9OWWb4XmUpeX30yGz8ukZ25EiLhwlP2KqOqCb8NkwJt8qUeuCQEsk8CiAS7msICbPD18csu8jcIX7GNg=="
},
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@ -1378,8 +1640,7 @@
"psl": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
"dev": true
"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
},
"pump": {
"version": "3.0.0",
@ -1393,14 +1654,31 @@
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
"pxls": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz",
"integrity": "sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw==",
"requires": {
"arr-flatten": "^1.1.0",
"compute-dims": "^1.1.0",
"flip-pixels": "^1.0.2",
"is-browser": "^2.1.0",
"is-buffer": "^2.0.3",
"to-uint8": "^1.4.1"
}
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
},
"quantize": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz",
"integrity": "sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4="
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@ -1442,6 +1720,11 @@
"util-deprecate": "~1.0.1"
}
},
"regex-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz",
"integrity": "sha1-kEih6uuHD01IDavHb8Qs3MC8OnI="
},
"regexp-clone": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
@ -1451,7 +1734,6 @@
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"dev": true,
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
@ -1478,8 +1760,7 @@
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"dev": true
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
}
}
},
@ -1656,7 +1937,6 @@
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"dev": true,
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
@ -1680,6 +1960,15 @@
"integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=",
"dev": true
},
"string-to-arraybuffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz",
"integrity": "sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q==",
"requires": {
"atob-lite": "^2.0.0",
"is-base64": "^0.1.0"
}
},
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
@ -1780,6 +2069,28 @@
"debug": "^2.6.1"
}
},
"to-array-buffer": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/to-array-buffer/-/to-array-buffer-3.2.0.tgz",
"integrity": "sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ==",
"requires": {
"flatten-vertex-data": "^1.0.2",
"is-blob": "^2.0.1",
"string-to-arraybuffer": "^1.0.0"
}
},
"to-uint8": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/to-uint8/-/to-uint8-1.4.1.tgz",
"integrity": "sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg==",
"requires": {
"arr-flatten": "^1.1.0",
"clamp": "^1.0.1",
"is-base64": "^0.1.0",
"is-float-array": "^1.0.0",
"to-array-buffer": "^3.0.0"
}
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
@ -1806,7 +2117,6 @@
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"dev": true,
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
@ -1823,8 +2133,7 @@
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"type-is": {
"version": "1.6.18",
@ -1835,12 +2144,22 @@
"mime-types": "~2.1.24"
}
},
"type-name": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz",
"integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q="
},
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
"unc-path-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
},
"universalify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
@ -1855,26 +2174,158 @@
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
"integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
"dev": true,
"requires": {
"punycode": "^2.1.0"
}
},
"utif": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz",
"integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
"requires": {
"pako": "^1.0.5"
},
"dependencies": {
"pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
}
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"utils-copy": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz",
"integrity": "sha1-biuXmCqozXPhGCo+b4vsPA9AWKc=",
"requires": {
"const-pinf-float64": "^1.0.0",
"object-keys": "^1.0.9",
"type-name": "^2.0.0",
"utils-copy-error": "^1.0.0",
"utils-indexof": "^1.0.0",
"utils-regex-from-string": "^1.0.0",
"validate.io-array": "^1.0.3",
"validate.io-buffer": "^1.0.1",
"validate.io-nonnegative-integer": "^1.0.0"
}
},
"utils-copy-error": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-copy-error/-/utils-copy-error-1.0.1.tgz",
"integrity": "sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U=",
"requires": {
"object-keys": "^1.0.9",
"utils-copy": "^1.1.0"
}
},
"utils-indexof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz",
"integrity": "sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w=",
"requires": {
"validate.io-array-like": "^1.0.1",
"validate.io-integer-primitive": "^1.0.0"
}
},
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"utils-regex-from-string": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz",
"integrity": "sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk=",
"requires": {
"regex-regex": "^1.0.0",
"validate.io-string-primitive": "^1.0.0"
}
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"dev": true
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
},
"validate.io-array": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz",
"integrity": "sha1-W1osr9j4uFq7L4hroVPy2Tond00="
},
"validate.io-array-like": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz",
"integrity": "sha1-evn363tRcVvrIhVmjsXM5U+t21o=",
"requires": {
"const-max-uint32": "^1.0.2",
"validate.io-integer-primitive": "^1.0.0"
}
},
"validate.io-buffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz",
"integrity": "sha1-hS1nNAIZFNXROvwyUxdh43IO1E4="
},
"validate.io-integer": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz",
"integrity": "sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg=",
"requires": {
"validate.io-number": "^1.0.3"
}
},
"validate.io-integer-primitive": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz",
"integrity": "sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY=",
"requires": {
"validate.io-number-primitive": "^1.0.0"
}
},
"validate.io-matrix-like": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz",
"integrity": "sha1-XsMqddCInaxzbepovdYUWxVe38M="
},
"validate.io-ndarray-like": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz",
"integrity": "sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk="
},
"validate.io-nonnegative-integer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz",
"integrity": "sha1-gGkkOgjF+Y6VQTySnf17GPP28p8=",
"requires": {
"validate.io-integer": "^1.0.5"
}
},
"validate.io-number": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz",
"integrity": "sha1-9j/+2iSL8opnqNSODjtGGhZluvg="
},
"validate.io-number-primitive": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz",
"integrity": "sha1-0uAfICmJNp3PEVVElWQgOv5YTlU="
},
"validate.io-positive-integer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz",
"integrity": "sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI=",
"requires": {
"validate.io-integer": "^1.0.5"
}
},
"validate.io-string-primitive": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz",
"integrity": "sha1-uBNbn7E3K94C/dU60dDM1t55j+4="
},
"vary": {
"version": "1.1.2",
@ -1885,13 +2336,17 @@
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"weak-map": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz",
"integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes="
},
"wide-align": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",

View File

@ -24,6 +24,8 @@
"express": "^4.17.1",
"fs-extra": "^9.0.1",
"hashmap": "^2.4.0",
"image-pixels": "^2.2.2",
"indexed-image-converter": "github:PretendoNetwork/indexed-image-converter",
"memory-cache": "^0.2.0",
"moment": "^2.29.1",
"mongoose": "^5.10.14",
@ -38,6 +40,7 @@
"xmlbuilder2": "^2.4.0"
},
"devDependencies": {
"bmp-js": "^0.1.0",
"ejs": "^3.1.5",
"express-subdomain": "^1.0.5",
"multer": "^1.4.2",

View File

@ -13,6 +13,9 @@ var HashMap = require('hashmap');
let TGA = require('tga');
let pako = require('pako');
let PNG = require('pngjs').PNG;
var bmp = require("bmp-js");
const { toImage } = require('indexed-image-converter');
const imagePixels = require('image-pixels');
let communityMap = new HashMap();
let userMap = new HashMap();
@ -165,25 +168,41 @@ let methods = {
}
return decryptedBody;
},
processPainting: function (painting) {
let paintingBuffer = Buffer.from(painting, 'base64');
let output = '';
try
{
output = pako.inflate(paintingBuffer);
processPainting: async function (painting, isTGA) {
if (isTGA) {
let paintingBuffer = Buffer.from(painting, 'base64');
let output = '';
try {
output = pako.inflate(paintingBuffer);
} catch (err) {
console.error(err);
}
let tga = new TGA(Buffer.from(output));
let png = new PNG({
width: tga.width,
height: tga.height
});
png.data = tga.pixels;
let pngBuffer = PNG.sync.write(png);
return `data:image/png;base64,${pngBuffer.toString('base64')}`;
}
catch (err)
{
console.error(err);
else {
let paintingBuffer = Buffer.from(painting, 'base64');
let bitmap = bmp.decode(paintingBuffer)
const tga = this.createBMPTgaBuffer(bitmap.width, bitmap.height, bitmap.data, false);
let output;
try
{
output = pako.deflate(tga, {level: 6});
}
catch (err)
{
console.error(err);
}
return new Buffer(output).toString('base64')
}
let tga = new TGA(Buffer.from(output));
let png = new PNG({
width: tga.width,
height: tga.height
});
png.data = tga.pixels;
let pngBuffer = PNG.sync.write(png);
return `data:image/png;base64,${pngBuffer.toString('base64')}`;
},
nintendoPasswordHash: function(password, pid) {
const pidBuffer = Buffer.alloc(4);
@ -213,6 +232,35 @@ let methods = {
return data;
});
},
createBMPTgaBuffer: function(width, height, pixels, dontFlipY) {
var buffer = Buffer.alloc(18 + pixels.length);
// write header
buffer.writeInt8(0, 0);
buffer.writeInt8(0, 1);
buffer.writeInt8(2, 2);
buffer.writeInt16LE(0, 3);
buffer.writeInt16LE(0, 5);
buffer.writeInt8(0, 7);
buffer.writeInt16LE(0, 8);
buffer.writeInt16LE(0, 10);
buffer.writeInt16LE(width, 12);
buffer.writeInt16LE(height, 14);
buffer.writeInt8(32, 16);
buffer.writeInt8(8, 17);
var offset = 18;
for (var i = 0; i < height; i++) {
for (var j = 0; j < width; j++) {
var idx = ((dontFlipY ? i : height - i - 1) * width + j) * 4;
buffer.writeUInt8(pixels[idx + 1], offset++); // b
buffer.writeUInt8(pixels[idx + 2], offset++); // g
buffer.writeUInt8(pixels[idx + 3], offset++); // r
buffer.writeUInt8(255, offset++); // a
}
}
return buffer;
},
processLanguage: function (header) {
if(!header)
return translations.EN;

View File

@ -21,7 +21,7 @@ async function connect() {
function verifyConnected() {
if (!connection) {
throw new Error('Cannot make database requets without being connected');
connect();
}
}

30
src/middleware/auth.js Normal file
View File

@ -0,0 +1,30 @@
const config = require('../config.json');
const util = require('../authentication');
function auth(request, response, next) {
if(!request.headers["x-nintendo-parampack"] || !request.headers["x-nintendo-servicetoken"]) {
return response.render('console/ban_notification.ejs', {
user: null,
error: "Missing auth headers"
});
}
else {
let pid = util.data.processServiceToken(request.headers["x-nintendo-servicetoken"]);
let paramPackData = util.data.decodeParamPack(request.headers["x-nintendo-parampack"]);
if(pid === null)
return response.render('console/ban_notification.ejs', {
user: null,
error: "Unable to parse service token. Are you using a NNID?"
});
else {
response.header('X-Nintendo-WhiteList', config.whitelist);
request.lang = util.data.processLanguage(request.headers["x-nintendo-parampack"]);
request.pid = pid;
request.paramPackData = paramPackData;
request.directory = request.subdomains[1];
return next();
}
}
}
module.exports = auth;

View File

@ -3,6 +3,7 @@ const express = require('express');
const morgan = require('morgan');
const ejs = require('ejs');
const xmlparser = require('./middleware/xml-parser');
const auth = require('./middleware/auth');
const database = require('./database');
const logger = require('./logger');
const config = require('./config.json');
@ -28,6 +29,7 @@ app.use(express.urlencoded({
parameterLimit: 100000
}));
app.use(xmlparser);
app.use(auth);
// import the servers into one

View File

@ -5,17 +5,16 @@ const routes = require('./routes');
const router = express.Router();
const portal = express.Router();
const ctr = express.Router();
const console = express.Router();
const admin = express.Router();
const web_api = express.Router();
// Create subdomains
logger.info('[JUXT-WEB] Creating \'Wii U\' subdomain');
router.use(subdomain('portal.olv', portal));
router.use(subdomain('portal.olv', console));
logger.info('[JUXT-WEB] Creating \'3DS\' subdomain');
router.use(subdomain('ctr.olv', ctr));
router.use(subdomain('ctr.olv', console));
logger.info('[JUXT-WEB] Creating \'Admin\' subdomain');
router.use(subdomain('admin.olv', admin));
@ -24,22 +23,14 @@ logger.info('[JUXT-WEB] Creating \'Web API\' subdomain');
router.use(subdomain('web_api.olv', admin));
// Setup routes
portal.use('/titles/show', routes.PORTAL_SHOW);
portal.use('/communities', routes.PORTAL_COMMUNITIES);
portal.use('/users', routes.PORTAL_USER);
portal.use('/posts', routes.PORTAL_POST);
portal.use('/activity-feed', routes.PORTAL_FEED);
portal.use('/messages', routes.PORTAL_MESSAGES);
portal.use('/news', routes.PORTAL_NEWS);
portal.use('/', routes.PORTAL_WEB);
ctr.use('/titles/show', routes.CTR_SHOW);
ctr.use('/communities', routes.CTR_COMMUNITIES);
ctr.use('/users', routes.CTR_USER);
ctr.use('/posts', routes.CTR_POST);
ctr.use('/news', routes.CTR_NEWS);
ctr.use('/activity-feed', routes.CTR_FEED);
ctr.use('/', routes.CTR_WEB);
console.use('/titles/show', routes.PORTAL_SHOW);
console.use('/communities', routes.PORTAL_COMMUNITIES);
console.use('/users', routes.PORTAL_USER);
console.use('/posts', routes.PORTAL_POST);
console.use('/activity-feed', routes.PORTAL_FEED);
console.use('/messages', routes.PORTAL_MESSAGES);
console.use('/news', routes.PORTAL_NEWS);
console.use('/', routes.PORTAL_WEB);
admin.use('/', routes.WEB_ADMIN);
admin.use('/v1/', routes.WEB_API);

View File

@ -426,7 +426,7 @@ router.get('/users/loadPosts', function (req, res) {
let communityMap = await util.data.getCommunityHash();
if(newPosts.length > 0)
{
res.render('portal/more_posts.ejs', {
res.render('console/more_posts.ejs', {
communityMap: communityMap,
moment: moment,
user: user,

View File

@ -57,7 +57,7 @@ router.get('/css/juxt.css', function (req, res) {
});
router.get('/favicon.ico', function (req, res) {
res.sendFile('css/favicon.ico', {root: path.join(__dirname, '../../../../webfiles/portal/')});
res.sendFile('css/favicon.ico', {root: path.join(__dirname, '../../../../webfiles/console/')});
});
router.get('/icons/:image_id.png', function (req, res) {

View File

@ -0,0 +1,135 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var multer = require('multer');
var moment = require('moment');
var upload = multer({ dest: 'uploads/' });
var router = express.Router();
router.get('/', async function (req, res) {
let popularCommunities = await database.getMostPopularCommunities(9);
let newCommunities = await database.getNewCommunities(6);
res.render(req.directory + '/communities.ejs', {
// EJS variable and server-side variable
popularCommunities: popularCommunities,
newCommunities: newCommunities,
cdnURL: config.CDN_domain,
lang: req.lang
});
});
router.get('/all', async function (req, res) {
let communities = await database.getCommunities(90);
res.render(req.directory + '/all_communities.ejs', {
communities: communities,
cdnURL: config.CDN_domain,
lang: req.lang
});
});
router.get('/announcements', async function (req, res) {
let user = await database.getUserByPID(req.pid);
let community = await database.getCommunityByID('announcements');
let communityMap = await util.data.getCommunityHash();
let newPosts = await database.getNumberNewCommunityPostsByID(community, 25);
let totalNumPosts = await database.getTotalPostsByCommunity(community);
res.render(req.directory + '/announcements.ejs', {
moment: moment,
community: community,
newPosts: newPosts,
communityMap: communityMap,
user: user,
totalNumPosts: totalNumPosts,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
});
router.get('/:communityID/:type', async function (req, res) {
let user = await database.getUserByPID(req.pid);
if(req.params.communityID === 'announcements')
res.redirect('/communities/announcements')
let community = await database.getCommunityByID(req.params.communityID.toString());
let communityMap = await util.data.getCommunityHash();
let newPosts = await database.getNumberNewCommunityPostsByID(community, 5);
let totalNumPosts = await database.getTotalPostsByCommunity(community)
res.render(req.directory + '/community.ejs', {
// EJS variable and server-side variable
moment: moment,
community: community,
communityMap: communityMap,
newPosts: newPosts,
totalNumPosts: totalNumPosts,
user: user,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
});
router.get('/:communityID/:type/loadPosts', async function (req, res) {
let post = await database.getPostByID(req.query.postID);
let user = await database.getUserByPID(req.pid);
let communityMap = await util.data.getCommunityHash();
let posts;
if(post !== null)
posts = await database.getCommunityPostsAfterTimestamp(post, 1);
else {
let community = await database.getCommunityByID(req.params.communityID)
switch (req.params.type) {
case 'popular':
posts = await database.getNumberPopularCommunityPostsByID(community, 10);
break;
case 'verified':
posts = await database.getNumberVerifiedCommunityPostsByID(community, 10);
break;
default:
posts = await database.getNewPostsByCommunity(community, 10);
break;
}
}
if(posts.length > 0)
{
res.render(req.directory + '/more_posts.ejs', {
communityMap: communityMap,
moment: moment,
database: database,
user: user,
newPosts: posts,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.sendStatus(204);
}
});
router.post('/follow', upload.none(), async function (req, res) {
let community = await database.getCommunityByID(req.body.communityID);
let user = await database.getUserByPID(req.pid);
if(req.body.type === 'true' && user !== null && user.followed_communities.indexOf(community.community_id) === -1)
{
community.upFollower();
user.addToCommunities(community.community_id);
res.sendStatus(200);
}
else if(req.body.type === 'false' && user !== null && user.followed_communities.indexOf(community.community_id) !== -1)
{
community.downFollower();
user.removeFromCommunities(community.community_id);
res.sendStatus(200);
}
else
res.sendStatus(423);
});
module.exports = router;

View File

@ -0,0 +1,53 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var moment = require('moment');
var router = express.Router();
router.get('/', async function (req, res) {
let user = await database.getUserByPID(req.pid);
let communityMap = await util.data.getCommunityHash();
let posts = await database.getNewsFeed(user, 3);
res.render(req.directory + '/feed.ejs', {
moment: moment,
user: user,
posts: posts,
communityMap: communityMap,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
});
router.get('/loadposts', async function (req, res) {
let post = await database.getPostByID(req.query.postID);
let user = await database.getUserByPID(req.pid);
let communityMap = await util.data.getCommunityHash();
let posts;
if(post !== null)
posts = await database.getNewsFeedAfterTimestamp(user, 3, post);
if(posts.length > 0)
{
res.render(req.directory + '/more_posts.ejs', {
communityMap: communityMap,
moment: moment,
database: database,
user: user,
newPosts: posts,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.sendStatus(204);
}
});
module.exports = router;

View File

@ -0,0 +1,25 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var moment = require('moment');
var router = express.Router();
router.get('/', async function (req, res) {
let user = await database.getUserByPID(req.pid);
res.render(req.directory + '/messages.ejs', {
moment: moment,
user: user,
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
user.notification_list.filter(noti => noti.read === false).forEach(function(notification) {
notification.read = true;
});
user.markModified('notification_list');
user.save();
});
module.exports = router;

View File

@ -0,0 +1,24 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var moment = require('moment');
var router = express.Router();
router.get('/', async function (req, res) {
let user = await database.getUserByPID(req.pid);
res.render(req.directory + '/notifications.ejs', {
moment: moment,
user: user,
cdnURL: config.CDN_domain,
lang: req.lang
});
user.notification_list.filter(noti => noti.read === false).forEach(function(notification) {
notification.read = true;
});
user.markModified('notification_list');
user.save();
});
module.exports = router;

View File

@ -0,0 +1,154 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
const { POST } = require('../../../../models/post');
var multer = require('multer');
var moment = require('moment');
var upload = multer({ dest: 'uploads/' });
const snowflake = require('node-snowflake').Snowflake;
var router = express.Router();
router.post('/empathy', async function (req, res) {
let post = await database.getPostByID(req.body.postID);
let user = await database.getUserByPID(req.pid);
if(req.body.type === 'up' && user.likes.indexOf(post.id) === -1 && user.id !== post.pid)
{
post.upEmpathy();
user.addToLikes(post.id)
res.sendStatus(200);
}
else if(req.body.type === 'down' && user.likes.indexOf(post.id) !== -1 && user.id !== post.pid)
{
post.downEmpathy();
user.removeFromLike(post.id);
res.sendStatus(200);
}
else
res.sendStatus(423);
});
router.get('/:post_id', async function (req, res) {
let user = await database.getUserByPID(req.pid);
let post = await database.getPostByID(req.params.post_id.toString());
if(post === null)
return res.sendStatus(404);
let community = await database.getCommunityByID(post.community_id);
let communityMap = await util.data.getCommunityHash();
let replies = await database.getPostReplies(req.params.post_id.toString(), 25)
res.render(req.directory + '/post.ejs', {
moment: moment,
user: user,
post: post,
replies: replies,
community: community,
communityMap: communityMap,
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
});
router.post('/:post_id/new', upload.none(), async function (req, res, next) {
let user = await database.getUserByPID(req.pid);
if(user.account_status !== 0) {
throw new Error('User not allowed to post')
}
let parentPost = await database.getPostByID(req.params.post_id.toString())
let community = await database.getCommunityByID(req.body.olive_community_id);
let appData = "";
if (req.body.app_data) {
appData = req.body.app_data.replace(/\0/g, "").trim();
}
let painting = "", paintingURI = "";
if (req.body.painting && req.body.painting !== 'eJztwTEBACAMA7DCNRlIQRbu4ZoEviTJTNvjZNUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL55fYLL3w==') {
painting = req.body.painting.replace(/\0/g, "").trim();
paintingURI = await util.data.processPainting(painting);
}
let screenshot = "";
if (req.body.screenshot) {
screenshot = req.body.screenshot.replace(/\0/g, "").trim();
}
parentPost.reply_count = parentPost.reply_count + 1;
parentPost.save();
const document = {
title_id: community.title_id[0],
community_id: community.community_id,
screen_name: user.user_id,
body: req.body.body,
app_data: appData,
painting: painting,
painting_uri: paintingURI,
screenshot: screenshot,
country_id: req.paramPackData.country_id,
created_at: new Date(),
feeling_id: req.body.emotion,
id: snowflake.nextId(),
is_autopost: req.body.is_autopost,
is_spoiler: (req.body.spoiler) ? 1 : 0,
is_app_jumpable: req.body.is_app_jumpable,
language_id: req.body.language_id,
mii: user.mii,
mii_face_url: user.pfp_uri,
pid: req.pid,
platform_id: req.paramPackData.platform_id,
region_id: req.paramPackData.region_id,
verified: user.official,
parent: parentPost.id
};
const newPost = new POST(document);
newPost.save();
await database.pushNewNotificationByPID(parentPost.pid, user.user_id + ' replied to your post!', '/posts/' + parentPost.id)
res.redirect('/posts/' + req.params.post_id.toString());
});
router.post('/new', upload.none(), async function (req, res, next) {
let user = await database.getUserByPID(req.pid);
if(user.account_status !== 0) {
throw new Error('User not allowed to post')
}
let community = await database.getCommunityByID(req.body.olive_community_id);
let appData = "";
if (req.body.app_data) {
appData = req.body.app_data.replace(/\0/g, "").trim();
}
let painting = "", paintingURI = "";
if (req.body.painting && req.body.painting !== 'eJztwTEBACAMA7DCNRlIQRbu4ZoEviTJTNvjZNUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL55fYLL3w==') {
painting = req.body.painting.replace(/\0/g, "").trim();
paintingURI = await util.data.processPainting(painting, true);
}
let screenshot = "";
if (req.body.screenshot) {
screenshot = req.body.screenshot.replace(/\0/g, "").trim();
}
const document = {
title_id: community.title_id[0],
community_id: community.community_id,
screen_name: user.user_id,
body: req.body.body,
app_data: appData,
painting: painting,
painting_uri: paintingURI,
screenshot: screenshot,
country_id: req.paramPackData.country_id,
created_at: new Date(),
feeling_id: req.body.emotion,
id: snowflake.nextId(),
is_autopost: req.body.is_autopost,
is_spoiler: (req.body.spoiler) ? 1 : 0,
is_app_jumpable: req.body.is_app_jumpable,
language_id: req.body.language_id,
mii: user.mii,
mii_face_url: user.pfp_uri,
pid: req.pid,
platform_id: req.paramPackData.platform_id,
region_id: req.paramPackData.region_id,
verified: user.official
};
const newPost = new POST(document);
newPost.save();
res.redirect('/communities/' + community.community_id + '/new');
});
module.exports = router;

View File

@ -0,0 +1,99 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var moment = require('moment');
var router = express.Router();
router.get('/', async function (req, res) {
console.log(req.pid);
try {
if(req.pid === 1000000000) {
res.render(req.directory + '/guest_notice.ejs', {
cdnURL: config.CDN_domain,
lang: req.lang,
});
}
else {
let user = await database.getUserByPID(req.pid);
if(user === null)
{
res.render(req.directory + '/first_run.ejs', {
cdnURL: config.CDN_domain,
lang: req.lang,
});
}
else {
if(moment(user.ban_lift_date).format('YYYY-MM-DD') <= moment().format('YYYY-MM-DD') && user.account_status !== 3) {
user.account_status = 0;
user.save()
}
/**
* Account Status
* 0 - Fine
* 1 - Limited from Posting
* 2 - Temporary Ban
* 3 - Forever Ban
*/
if(user.account_status !== 0)
{
res.render(req.directory + '/ban_notification.ejs', {
user: user,
moment: moment,
cdnURL: config.CDN_domain,
lang: req.lang,
});
}
else
{
let popularCommunities = await database.getMostPopularCommunities(9);
let newCommunities = await database.getNewCommunities(6);
res.render(req.directory + '/communities.ejs', {
popularCommunities: popularCommunities,
newCommunities: newCommunities,
cdnURL: config.CDN_domain,
lang: req.lang
});
}
}
}
}
catch (e) {
console.log(e)
}
});
router.get('/first', async function (req, res) {
res.render(req.directory + '/first_run.ejs', {
cdnURL: config.CDN_domain,
lang: req.lang,
});
});
router.post('/newUser', async function (req, res) {
if(req.pid === null)
{
res.sendStatus(401);
}
else
{
let user = await database.getUserByPID(req.pid);
if(user === null)
{
await util.data.create_user(req.pid, req.body.experience, req.body.notifications, req.body.region);
util.data.refreshCache();
if(await database.getUserByPID(req.pid) !== null)
res.sendStatus(200);
else
res.sendStatus(504);
}
else
{
res.sendStatus(504);
}
}
});
module.exports = router;

View File

@ -0,0 +1,215 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var multer = require('multer');
var moment = require('moment');
var upload = multer({ dest: 'uploads/' });
var router = express.Router();
router.get('/menu', async function (req, res) {
let user = await database.getUserByPID(req.pid);
res.render('ctr/user_menu.ejs', {
user: user,
});
});
router.get('/me', async function (req, res) {
let user = await database.getUserByPID(req.pid);
let newPosts = await database.getNumberUserPostsByID(req.pid, 10);
let numPosts = await database.getTotalPostsByUserID(req.pid);
let communityMap = await util.data.getCommunityHash();
res.render(req.directory + '/me_page.ejs', {
communityMap: communityMap,
moment: moment,
user: user,
newPosts: newPosts,
numPosts: numPosts,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
});
router.post('/me', upload.none(), async function (req, res) {
let user = await database.getUserByPID(req.pid);
user.country_visibility = !!req.body.country;
user.birthday_visibility = !!req.body.birthday;
user.game_skill_visibility = !!req.body.experience;
user.profile_comment_visibility = !!req.body.commentShow;
if (req.body.comment)
user.setProfileComment(req.body.comment);
else
user.setProfileComment('');
res.redirect('/users/me');
});
router.get('/show', async function (req, res) {
var userID = req.query.pid;
if(userID === 'me') {
res.sendStatus(504);
return;
}
let parentUser = await database.getUserByPID(req.pid);
let user = await database.getUserByPID(userID);
if(user === null)
res.sendStatus(404);
if(user.pid === parentUser.pid)
res
let newPosts = await database.getNumberUserPostsByID(user.pid, 10);
let numPosts = await database.getTotalPostsByUserID(user.pid);
let communityMap = await util.data.getCommunityHash();
res.render(req.directory + '/user_page.ejs', {
// EJS variable and server-side variable
communityMap: communityMap,
moment: moment,
user: user,
newPosts: newPosts,
numPosts: numPosts,
parentUser: parentUser,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
});
router.get('/loadPosts', async function (req, res) {
let post = await database.getPostByID(req.query.postID);
let user = await database.getUserByPID(req.pid);
let newPosts = '';
if(post !== null)
newPosts = await database.getUserPostsAfterTimestamp(post, 10);
else
newPosts = await database.getNumberUserPostsByID(req.query.pid, 10);
let communityMap = await util.data.getCommunityHash();
if(newPosts.length > 0)
{
res.render(req.directory + '/more_posts.ejs', {
communityMap: communityMap,
moment: moment,
user: user,
newPosts: newPosts,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.sendStatus(204)
}
});
router.get('/following', async function (req, res) {
let user = await database.getUserByPID(req.query.pid);
let followers = await database.getFollowedUsers(user);
let communities = user.followed_communities;
let communityMap = await util.data.getCommunityHash();
if(user.followed_users[0] === '0')
followers.splice(0, 1);
if(communities[0] === '0')
communities.splice(0, 1);
if(user.following > 0)
{
res.render(req.directory + '/following_list.ejs', {
moment: moment,
user: user,
followers: followers,
communities: communities,
communityMap: communityMap,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.send('<p class="no-posts-text">' + req.lang.user_page.no_following + '</p>')
}
});
router.get('/followers', async function (req, res) {
let user = await database.getUserByPID(req.query.pid);
let followers = await database.getFollowingUsers(user);
let communities = [];
let userMap = await util.data.getUserHash();
if(followers[0] === '0')
followers.splice(0, 1);
if(user.followers > 0)
{
res.render(req.directory + '/following_list.ejs', {
moment: moment,
user: user,
followers: followers,
communities: communities,
userMap: userMap,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.send('<p class="no-posts-text">' + req.lang.user_page.no_followers + '</p>')
}
});
router.get('/friends', async function (req, res) {
let user = await database.getUserByPID(req.query.pid);
let friends = null;
let userMap = await util.data.getUserHash();
if(friends)
{
res.render(req.directory + '/following_list.ejs', {
moment: moment,
user: user,
friends: friends,
userMap: userMap,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: req.lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.send('<p class="no-posts-text">' + req.lang.user_page.no_friends + '</p>')
}
});
router.post('/follow', upload.none(), async function (req, res) {
let userToFollow = await database.getUserByPID(req.body.userID);
let user = await database.getUserByPID(req.pid);
if(req.body.type === 'true' && user !== null && user.followed_users.indexOf(userToFollow.pid) === -1)
{
userToFollow.addToFollowers(user.pid);
user.addToUsers(userToFollow.pid);
res.sendStatus(200);
await database.pushNewNotificationByPID(userToFollow.pid, user.user_id + ' ' + req.lang.notifications.new_follower, '/users/show?pid=' + user.pid)
}
else if(req.body.type === 'false' && user !== null && user.followed_users.indexOf(userToFollow.pid) !== -1)
{
userToFollow.removeFromFollowers(user.pid);
user.removeFromUsers(userToFollow.pid);
res.sendStatus(200);
}
else
res.sendStatus(423);
});
module.exports = router;

View File

@ -0,0 +1,129 @@
var express = require('express');
var router = express.Router();
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
var path = require('path');
router.get('/css/:filename', function (req, res) {
res.set("Content-Type", "text/css");
res.sendFile('/css/' + req.params.filename, {root: path.join(__dirname, '../../../../webfiles/' + req.directory)});
});
router.get('/js/:filename', function (req, res) {
res.set("Content-Type", "application/javascript; charset=utf-8");
res.sendFile('/js/' + req.params.filename, {root: path.join(__dirname, '../../../../webfiles/' + req.directory)});
});
router.get('/fonts/:filename', function (req, res) {
res.set("Content-Type", "font/woff");
res.sendFile('/fonts/' + req.params.filename, {root: path.join(__dirname, '../../../../webfiles/' + req.directory)});
});
router.get('/favicon.ico', function (req, res) {
res.set("Content-Type", "image/x-icon");
res.sendFile('/css/favicon.ico', {root: path.join(__dirname, '../../../../webfiles/' + req.directory)});
});
router.get('/icons/:image_id.png', async function (req, res) {
res.set("Content-Type", "image/png");
let community = await database.getCommunityByID(req.params.image_id.toString());
if(community !== null) {
if(community.browser_icon.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(community.browser_icon.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(community.browser_icon, 'base64'));
}
else {
let user = await database.getUserByPID(req.params.image_id.toString());
if(user !== null)
if(user.pfp_uri.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(user.pfp_uri.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(user.pfp_uri, 'base64'));
else
res.sendStatus(404);
}
});
router.get('/tip/:image_id.png', async function (req, res) {
res.set("Content-Type", "image/png");
let community = await database.getCommunityByID(req.params.image_id.toString());
if(community !== null) {
if(community.browser_thumbnail.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(community.browser_thumbnail.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(community.browser_thumbnail, 'base64'));
}
else {
let user = await database.getUserByPID(req.params.image_id.toString());
if (user !== null)
if (user.pfp_uri.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(user.pfp_uri.replace('data:image/png;base64,', ''), 'base64'));
else
res.send(Buffer.from(user.pfp_uri, 'base64'));
else
res.sendStatus(404);
}
});
router.get('/banner/:image_id.png', async function (req, res) {
res.set("Content-Type", "image/png");
let community = await database.getCommunityByID(req.params.image_id.toString());
if(community !== null)
if(community.WiiU_browser_header.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(community.WiiU_browser_header.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(community.WiiU_browser_header, 'base64'));
else
res.sendStatus(404);
});
router.get('/screenshot/:image_id.png', async function (req, res) {
res.set("Content-Type", "image/png");
let post = await database.getPostByID(req.params.image_id.toString());
if(post !== null && post.screenshot !== '')
if(post.screenshot.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(post.screenshot.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(post.screenshot, 'base64'));
else
res.sendStatus(404);
});
router.get('/drawing/:image_id.png', async function (req, res) {
res.set("Content-Type", "image/png");
let post = await database.getPostByID(req.params.image_id.toString());
if(post !== null && post.painting_uri !== '')
if(post.painting_uri.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(post.painting_uri.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(post.painting_uri, 'base64'));
else
res.sendStatus(404);
});
router.get('/notifications.json', async function (req, res) {
let user = await database.getUserByPID(req.pid);
if(user.notification_list) {
res.send(
{
message_count: 0,
notification_count: user.notification_list.filter(notification => notification.read === false).length,
}
)
}
});
router.get('/:post_id/oembed.json', async function (req, res) {
let post = await database.getPostByID(req.params.post_id.toString());
let user = await database.getUserByPID(post.pid);
let doc = {
"author_name": user.user_id,
"author_url": "https://portal.olv.pretendo.cc/users/show?pid=" + user.pid,
}
res.send(doc)
});
module.exports = router;

View File

@ -1,226 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
var multer = require('multer');
var moment = require('moment');
var upload = multer({ dest: 'uploads/' });
var router = express.Router();
router.get('/', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2');
database.connect().then(async e => {
let popularCommunities = await database.getMostPopularCommunities(9);
let newCommunities = await database.getNewCommunities(6);
res.render('ctr/communities.ejs', {
// EJS variable and server-side variable
popularCommunities: popularCommunities,
newCommunities: newCommunities
});
}).catch(error => {
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/all', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2');
database.connect().then(async e => {
let communities = await database.getCommunities(90);
res.render('ctr/all_communities.ejs', {
communities: communities,
});
}).catch(error => {
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/announcements', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2');
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let community = await database.getCommunityByID('announcements');
let newPosts = await database.getNumberNewCommunityPostsByID(community, 25);
let totalNumPosts = await database.getTotalPostsByCommunity(community);
res.render('ctr/announcements.ejs', {
moment: moment,
community: community,
newPosts: newPosts,
user: user,
totalNumPosts: totalNumPosts
});
}).catch(error => {
console.error(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/:communityID/:type', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2');
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let community = await database.getCommunityByID(req.params.communityID.toString());
let newPosts = await database.getNumberNewCommunityPostsByID(community, 1);
let totalNumPosts = await database.getTotalPostsByCommunity(community)
res.render('ctr/community.ejs', {
moment: moment,
community: community,
newPosts: newPosts,
totalNumPosts: totalNumPosts,
user: user
});
}).catch(error => {
console.error(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/:communityID/:type/loadPosts', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2');
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let post = await database.getPostByID(req.query.postID);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let communityMap = await util.data.getCommunityHash();
let posts;
if(post !== null)
posts = await database.getCommunityPostsAfterTimestamp(post, 1);
else {
let community = await database.getCommunityByID(req.params.communityID)
switch (req.params.type) {
case 'popular':
posts = await database.getNumberPopularCommunityPostsByID(community, 10);
break;
case 'verified':
posts = await database.getNumberVerifiedCommunityPostsByID(community, 10);
break;
default:
posts = await database.getNewPostsByCommunity(community, 10);
break;
}
}
if(posts.length > 0)
{
res.render('ctr/more_posts.ejs', {
communityMap: communityMap,
moment: moment,
database: database,
user: user,
newPosts: posts,
});
}
else
{
res.sendStatus(204);
}
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.post('/follow', upload.none(), function (req, res) {
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let community = await database.getCommunityByID(req.body.communityID);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
if(req.body.type === 'true' && user !== null && user.followed_communities.indexOf(community.id) === -1)
{
console.log('following!')
community.upFollower();
user.addToCommunities(community.id);
res.sendStatus(200);
}
else if(req.body.type === 'false' && user !== null && user.followed_communities.indexOf(community.id) !== -1)
{
console.log('unfollowing!')
community.downFollower();
user.removeFromCommunities(community.id);
res.sendStatus(200);
}
else
res.sendStatus(423);
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 423;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,86 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
var moment = require('moment');
var router = express.Router();
router.get('/', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2||fonts.googleapis.com,,2');
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let communityMap = await util.data.getCommunityHash();
let posts = await database.getNewsFeed(user, 3);
res.render('ctr/feed.ejs', {
moment: moment,
user: user,
posts: posts,
communityMap: communityMap,
});
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/loadposts', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2');
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let post = await database.getPostByID(req.query.postID);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let communityMap = await util.data.getCommunityHash();
let posts;
if(post !== null)
posts = await database.getNewsFeedAfterTimestamp(user, 3, post);
if(posts.length > 0)
{
res.render('ctr/more_posts.ejs', {
communityMap: communityMap,
moment: moment,
database: database,
user: user,
newPosts: posts,
});
}
else
{
res.sendStatus(204);
}
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,44 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
var moment = require('moment');
var router = express.Router();
router.get('/', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2||fonts.googleapis.com,,2');
database.connect().then(async e => {
//let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
res.render('ctr/notifications.ejs', {
moment: moment,
user: user,
});
user.notification_list.filter(noti => noti.read === false).forEach(function(notification) {
notification.read = true;
});
user.markModified('notification_list');
user.save();
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,133 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const { POST } = require('../../../../models/post');
var multer = require('multer');
var upload = multer({ dest: 'uploads/' });
const snowflake = require('node-snowflake').Snowflake;
var router = express.Router();
router.post('/empathy', function (req, res) {
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let post = await database.getPostByID(req.body.postID);
let user = await database.getUserByPID(pid);
if(user.pid === 1000000000) {
res.sendStatus(403);
return;
}
if(req.body.type === 'up' && user.likes.indexOf(post.id) === -1 && user.id !== post.pid)
{
post.upEmpathy();
user.addToLikes(post.id)
res.sendStatus(200);
}
else if(req.body.type === 'down' && user.likes.indexOf(post.id) !== -1 && user.id !== post.pid)
{
post.downEmpathy();
user.removeFromLike(post.id);
res.sendStatus(200);
}
else
res.sendStatus(423);
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 423;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.post('/new', upload.none(), async function (req, res, next) {
try
{
let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
{
throw new Error('The User token was not valid');
}
else
{
let usrObj = await database.getUserByPID(pid);
if(usrObj.account_status !== 0) {
throw new Error('User not allowed to post')
}
let community = await database.getCommunityByID(req.body.olive_community_id);
let appData = "";
if (req.body.app_data) {
appData = req.body.app_data.replace(/\0/g, "").trim();
}
let painting = "";
if (req.body.painting) {
painting = req.body.painting.replace(/\0/g, "").trim();
}
let paintingURI = "";
if (req.body.painting) {
paintingURI = await util.data.processPainting(painting);
}
let screenshot = "";
if (req.body.screenshot) {
screenshot = req.body.screenshot.replace(/\0/g, "").trim();
}
const document = {
title_id: community.title_id[0],
community_id: community.community_id,
screen_name: usrObj.user_id,
body: req.body.body,
app_data: appData,
painting: painting,
painting_uri: paintingURI,
screenshot: screenshot,
country_id: paramPackData.country_id,
created_at: new Date(),
feeling_id: req.body.feeling_id,
id: snowflake.nextId(),
is_autopost: req.body.is_autopost,
is_spoiler: req.body.is_spoiler,
is_app_jumpable: req.body.is_app_jumpable,
language_id: req.body.language_id,
mii: usrObj.mii,
mii_face_url: usrObj.pfp_uri,
pid: pid,
platform_id: paramPackData.platform_id,
region_id: paramPackData.region_id,
};
const newPost = new POST(document);
newPost.save();
res.redirect('/communities/' + community.community_id + '/new');
}
}
catch (e)
{
console.error(e);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 7,
message: "POSTING_FROM_NNID"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
}
});
module.exports = router;

View File

@ -1,116 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
var moment = require('moment');
var router = express.Router();
router.get('/', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2');
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let user = null;
if(pid === null)
{
res.render('ctr/guest_notice.ejs', {});
}
else
{
user = await database.getUserByPID(pid);
if(user === null)
{
res.render('ctr/first_run.ejs', {});
}
if(moment(user.ban_lift_date).format('YYYY-MM-DD') <= moment().format('YYYY-MM-DD') && user.account_status !== 3) {
user.account_status = 0;
user.save()
}
/**
* Account Status
* 0 - Fine
* 1 - Limited from Posting
* 2 - Temporary Ban
* 3 - Forever Ban
*/
console.log(user.account_status)
if(user.account_status !== 0)
{
res.render('ctr/ban_notification.ejs', {
user: user,
moment: moment
});
}
else
{
let popularCommunities = await database.getMostPopularCommunities(9);
let newCommunities = await database.getNewCommunities(6);
res.render('ctr/communities.ejs', {
popularCommunities: popularCommunities,
newCommunities: newCommunities
});
}
}
}).catch(error => {
console.log(error)
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/first', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2');
res.render('ctr/first_run.ejs', {});
});
router.post('/newUser', function (req, res) {
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let user = null;
if(pid === null)
{
res.sendStatus(401);
}
else
{
user = await database.getUserByPID(pid);
if(user === null)
{
await util.data.create_user(pid, req.body.experience, req.body.notifications, req.body.region);
if(await database.getUserByPID(pid) !== null)
res.sendStatus(200);
else
res.sendStatus(504);
}
else
{
res.sendStatus(504);
}
}
}).catch(error => {
console.log(error)
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,126 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const ejs = require('ejs');
var router = express.Router();
/* GET discovery server. */
router.get('/menu', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2||fonts.googleapis.com,,2');
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
res.render('ctr/user_menu.ejs', {
user: user,
});
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/me', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2||fonts.googleapis.com,,2');
var isAJAX = ((req.query.ajax+'').toLowerCase() === 'true')
database.connect().then(async e => {
//let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
//console.log(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let newPosts = await database.getPostsByUserID(pid);
let numPosts = await database.getNumberUserPostsByID(pid);
if(isAJAX) {
res.render('ctr/user_page.ejs', {
// EJS variable and server-side variable
user: user,
newPosts: newPosts,
numPosts: numPosts
});
}
else {
res.render('ctr/user_page.ejs', {
// EJS variable and server-side variable
user: user,
newPosts: newPosts,
numPosts: numPosts
});
}
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/show', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2||fonts.googleapis.com,,2');
var isAJAX = ((req.query.ajax+'').toLowerCase() === 'true')
var userID = req.query.pid;
database.connect().then(async e => {
let user = await database.getUserByPID(userID);
let newPosts = await database.getPostsByUserID(user.pid);
let numPosts = await database.getNumberUserPostsByID(user.pid);
if(isAJAX) {
res.render('ctr/user_page_ajax.ejs', {
// EJS variable and server-side variable
user: user,
newPosts: newPosts,
numPosts: numPosts
});
}
else {
res.render('ctr/user_page.ejs', {
// EJS variable and server-side variable
user: user,
newPosts: newPosts,
numPosts: numPosts
});
}
}).catch(error => {
console.error(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,137 +0,0 @@
var express = require('express');
var router = express.Router();
const database = require('../../../../database');
const util = require('../../../../authentication');
var path = require('path');
router.get('/css/juxt.css', function (req, res) {
res.set("Content-Type", "text/css");
res.sendFile('css/juxt.css', {root: path.join(__dirname, '../../../../webfiles/ctr/')});
});
router.get('/js/juxt.js', function (req, res) {
res.set("Content-Type", "application/javascript; charset=utf-8");
res.sendFile('js/juxt.js', {root: path.join(__dirname, '../../../../webfiles/ctr/')});
});
router.get('/js/pjax.js', function (req, res) {
res.set("Content-Type", "application/javascript; charset=utf-8");
res.sendFile('js/pjax.js', {root: path.join(__dirname, '../../../../webfiles/ctr/')});
});
router.get('/fonts/Poppins-Light.woff', function (req, res) {
res.set("Content-Type", "font/woff");
res.sendFile('fonts/Poppins-Light.woff', {root: path.join(__dirname, '../../../../webfiles/ctr/')});
});
router.get('/fonts/Poppins-Light.ttf', function (req, res) {
res.set("Content-Type", "font/ttf");
res.sendFile('fonts/Poppins-Light.ttf', {root: path.join(__dirname, '../../../../webfiles/ctr/')});
});
router.get('/favicon.ico', function (req, res) {
res.set("Content-Type", "image/x-icon");
res.sendFile('css/favicon.ico', {root: path.join(__dirname, '../../../../webfiles/portal/')});
});
router.get('/icons/:image_id.png', function (req, res) {
res.set("Content-Type", "image/png");
database.connect().then(async e => {
let community = await database.getCommunityByID(req.params.image_id.toString());
if(community !== null) {
if(community.browser_icon.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(community.browser_icon.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(community.browser_icon, 'base64'));
}
else {
let user = await database.getUserByPID(req.params.image_id.toString());
if(user !== null)
if(user.pfp_uri.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(user.pfp_uri.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(user.pfp_uri, 'base64'));
else
res.sendStatus(404);
}
}).catch(error => {
console.error(error);
res.sendStatus(404)
});
});
router.get('/tip/:image_id.png', function (req, res) {
res.set("Content-Type", "image/png");
database.connect().then(async e => {
let community = await database.getCommunityByID(req.params.image_id.toString());
if(community !== null) {
if(community.browser_thumbnail.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(community.browser_thumbnail.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(community.browser_thumbnail, 'base64'));
}
else {
let user = await database.getUserByPID(req.params.image_id.toString());
if(user !== null)
if(user.pfp_uri.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(user.pfp_uri.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(user.pfp_uri, 'base64'));
else
res.sendStatus(404);
}
}).catch(error => {
console.error(error);
res.sendStatus(404)
});
});
router.get('/banner/:image_id.png', function (req, res) {
res.set("Content-Type", "image/png");
database.connect().then(async e => {
let community = await database.getCommunityByID(req.params.image_id.toString());
if(community !== null)
if(community.WiiU_browser_header.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(community.WiiU_browser_header.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(community.WiiU_browser_header, 'base64'));
else
res.sendStatus(404);
}).catch(error => {
console.error(error);
res.sendStatus(404)
});
});
router.get('/notifications.json', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2||fonts.googleapis.com,,2');
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
res.send(
{
messages: 0,
news: user.notification_list.filter(notification => notification.read === false).length,
}
)
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,19 +1,12 @@
module.exports = {
PORTAL_SHOW: require('./portal/show'),
PORTAL_WEB: require('./portal/web'),
PORTAL_COMMUNITIES: require('./portal/communities'),
PORTAL_USER: require('./portal/userpage'),
PORTAL_POST: require('./portal/posts'),
PORTAL_FEED: require('./portal/feed'),
PORTAL_NEWS: require('./portal/notifications'),
PORTAL_MESSAGES: require('./portal/messages'),
CTR_SHOW: require('./ctr/show'),
CTR_WEB: require('./ctr/web'),
CTR_COMMUNITIES: require('./ctr/communities'),
CTR_USER: require('./ctr/userpage'),
CTR_POST: require('./ctr/posts'),
CTR_FEED: require('./ctr/feed'),
CTR_NEWS: require('./ctr/notifications'),
PORTAL_SHOW: require('./console/show'),
PORTAL_WEB: require('./console/web'),
PORTAL_COMMUNITIES: require('./console/communities'),
PORTAL_USER: require('./console/userpage'),
PORTAL_POST: require('./console/posts'),
PORTAL_FEED: require('./console/feed'),
PORTAL_NEWS: require('./console/notifications'),
PORTAL_MESSAGES: require('./console/messages'),
WEB_ADMIN: require('./admin/home'),
WEB_API: require('./admin/api'),
};

View File

@ -1,255 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var multer = require('multer');
var moment = require('moment');
var upload = multer({ dest: 'uploads/' });
var router = express.Router();
router.get('/', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let popularCommunities = await database.getMostPopularCommunities(9);
let newCommunities = await database.getNewCommunities(6);
res.render('portal/communities.ejs', {
// EJS variable and server-side variable
popularCommunities: popularCommunities,
newCommunities: newCommunities,
cdnURL: config.CDN_domain,
lang: lang
});
}).catch(error => {
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/all', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let communities = await database.getCommunities(90);
res.render('portal/all_communities.ejs', {
communities: communities,
cdnURL: config.CDN_domain,
lang: lang
});
}).catch(error => {
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/announcements', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let community = await database.getCommunityByID('announcements');
let communityMap = await util.data.getCommunityHash();
let newPosts = await database.getNumberNewCommunityPostsByID(community, 25);
let totalNumPosts = await database.getTotalPostsByCommunity(community);
res.render('portal/announcements.ejs', {
moment: moment,
community: community,
newPosts: newPosts,
communityMap: communityMap,
user: user,
totalNumPosts: totalNumPosts,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}).catch(error => {
console.error(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/:communityID/:type', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
if(req.params.communityID === 'announcements')
res.redirect('/communities/announcements')
let community = await database.getCommunityByID(req.params.communityID.toString());
let communityMap = await util.data.getCommunityHash();
let newPosts = await database.getNumberNewCommunityPostsByID(community, 5);
let totalNumPosts = await database.getTotalPostsByCommunity(community)
res.render('portal/community.ejs', {
// EJS variable and server-side variable
moment: moment,
community: community,
communityMap: communityMap,
newPosts: newPosts,
totalNumPosts: totalNumPosts,
user: user,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}).catch(error => {
console.error(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/:communityID/:type/loadPosts', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let post = await database.getPostByID(req.query.postID);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let communityMap = await util.data.getCommunityHash();
let posts;
if(post !== null)
posts = await database.getCommunityPostsAfterTimestamp(post, 1);
else {
let community = await database.getCommunityByID(req.params.communityID)
switch (req.params.type) {
case 'popular':
posts = await database.getNumberPopularCommunityPostsByID(community, 10);
break;
case 'verified':
posts = await database.getNumberVerifiedCommunityPostsByID(community, 10);
break;
default:
posts = await database.getNewPostsByCommunity(community, 10);
break;
}
}
if(posts.length > 0)
{
res.render('portal/more_posts.ejs', {
communityMap: communityMap,
moment: moment,
database: database,
user: user,
newPosts: posts,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.sendStatus(204);
}
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.post('/follow', upload.none(), function (req, res) {
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let community = await database.getCommunityByID(req.body.communityID);
if(pid === null) {
throw "Guest Accounts Cannot Follow Communities";
}
let user = await database.getUserByPID(pid);
if(req.body.type === 'true' && user !== null && user.followed_communities.indexOf(community.community_id) === -1)
{
community.upFollower();
user.addToCommunities(community.community_id);
res.sendStatus(200);
}
else if(req.body.type === 'false' && user !== null && user.followed_communities.indexOf(community.community_id) !== -1)
{
community.downFollower();
user.removeFromCommunities(community.community_id);
res.sendStatus(200);
}
else
res.sendStatus(423);
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 423;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,101 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var moment = require('moment');
var router = express.Router();
router.get('/', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let communityMap = await util.data.getCommunityHash();
let posts = await database.getNewsFeed(user, 3);
res.render('portal/feed.ejs', {
moment: moment,
user: user,
posts: posts,
communityMap: communityMap,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
user.notification_list.filter(noti => noti.read === false).forEach(function(notification) {
notification.read = true;
});
user.markModified('notification_list');
user.save();
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/loadposts', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let post = await database.getPostByID(req.query.postID);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let communityMap = await util.data.getCommunityHash();
let posts;
if(post !== null)
posts = await database.getNewsFeedAfterTimestamp(user, 3, post);
if(posts.length > 0)
{
res.render('portal/more_posts.ejs', {
communityMap: communityMap,
moment: moment,
database: database,
user: user,
newPosts: posts,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.sendStatus(204);
}
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,49 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var moment = require('moment');
var router = express.Router();
router.get('/', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
//let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
res.render('portal/messages.ejs', {
moment: moment,
user: user,
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
user.notification_list.filter(noti => noti.read === false).forEach(function(notification) {
notification.read = true;
});
user.markModified('notification_list');
user.save();
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,48 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var moment = require('moment');
var router = express.Router();
router.get('/', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
//let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
res.render('portal/notifications.ejs', {
moment: moment,
user: user,
cdnURL: config.CDN_domain,
lang: lang
});
user.notification_list.filter(noti => noti.read === false).forEach(function(notification) {
notification.read = true;
});
user.markModified('notification_list');
user.save();
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,256 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
const { POST } = require('../../../../models/post');
var multer = require('multer');
var moment = require('moment');
var upload = multer({ dest: 'uploads/' });
const snowflake = require('node-snowflake').Snowflake;
var router = express.Router();
router.post('/empathy', function (req, res) {
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let post = await database.getPostByID(req.body.postID);
if(pid === null) {
res.sendStatus(403);
return;
}
let user = await database.getUserByPID(pid);
if(req.body.type === 'up' && user.likes.indexOf(post.id) === -1 && user.id !== post.pid)
{
post.upEmpathy();
user.addToLikes(post.id)
res.sendStatus(200);
}
else if(req.body.type === 'down' && user.likes.indexOf(post.id) !== -1 && user.id !== post.pid)
{
post.downEmpathy();
user.removeFromLike(post.id);
res.sendStatus(200);
}
else
res.sendStatus(423);
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 423;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/:post_id', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
//let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let post = await database.getPostByID(req.params.post_id.toString());
let community = await database.getCommunityByID(post.community_id);
let communityMap = await util.data.getCommunityHash();
let replies = await database.getPostReplies(req.params.post_id.toString(), 25)
res.render('portal/post.ejs', {
moment: moment,
user: user,
post: post,
replies: replies,
community: community,
communityMap: communityMap,
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.post('/:post_id/new', upload.none(), async function (req, res, next) {
try
{
let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
{
throw new Error('The User token was not valid');
}
else
{
let usrObj = await database.getUserByPID(pid);
if(usrObj.account_status !== 0) {
throw new Error('User not allowed to post')
}
let parentPost = await database.getPostByID(req.params.post_id.toString())
let community = await database.getCommunityByID(req.body.olive_community_id);
let appData = "";
if (req.body.app_data) {
appData = req.body.app_data.replace(/\0/g, "").trim();
}
let painting = "", paintingURI = "";
if (req.body.painting && req.body.painting !== 'eJztwTEBACAMA7DCNRlIQRbu4ZoEviTJTNvjZNUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL55fYLL3w==') {
painting = req.body.painting.replace(/\0/g, "").trim();
paintingURI = await util.data.processPainting(painting);
}
let screenshot = "";
if (req.body.screenshot) {
screenshot = req.body.screenshot.replace(/\0/g, "").trim();
}
parentPost.reply_count = parentPost.reply_count + 1;
parentPost.save();
const document = {
title_id: community.title_id[0],
community_id: community.community_id,
screen_name: usrObj.user_id,
body: req.body.body,
app_data: appData,
painting: painting,
painting_uri: paintingURI,
screenshot: screenshot,
country_id: paramPackData.country_id,
created_at: new Date(),
feeling_id: req.body.emotion,
id: snowflake.nextId(),
is_autopost: req.body.is_autopost,
is_spoiler: (req.body.spoiler) ? 1 : 0,
is_app_jumpable: req.body.is_app_jumpable,
language_id: req.body.language_id,
mii: usrObj.mii,
mii_face_url: usrObj.pfp_uri,
pid: pid,
platform_id: paramPackData.platform_id,
region_id: paramPackData.region_id,
verified: usrObj.official,
parent: req.params.post_id.toString()
};
const newPost = new POST(document);
newPost.save();
await database.pushNewNotificationByPID(parentPost.pid, usrObj.user_id + ' replied to your post!', '/posts/' + parentPost.id)
res.redirect('/posts/' + req.params.post_id.toString());
}
}
catch (e)
{
console.error(e);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 7,
message: "POSTING_FROM_NNID"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
}
});
router.post('/new', upload.none(), async function (req, res, next) {
try
{
let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
{
throw new Error('The User token was not valid');
}
else
{
let usrObj = await database.getUserByPID(pid);
if(usrObj.account_status !== 0) {
throw new Error('User not allowed to post')
}
let community = await database.getCommunityByID(req.body.olive_community_id);
let appData = "";
if (req.body.app_data) {
appData = req.body.app_data.replace(/\0/g, "").trim();
}
let painting = "", paintingURI = "";
if (req.body.painting && req.body.painting !== 'eJztwTEBACAMA7DCNRlIQRbu4ZoEviTJTNvjZNUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL55fYLL3w==') {
painting = req.body.painting.replace(/\0/g, "").trim();
paintingURI = await util.data.processPainting(painting);
}
let screenshot = "";
if (req.body.screenshot) {
screenshot = req.body.screenshot.replace(/\0/g, "").trim();
}
const document = {
title_id: community.title_id[0],
community_id: community.community_id,
screen_name: usrObj.user_id,
body: req.body.body,
app_data: appData,
painting: painting,
painting_uri: paintingURI,
screenshot: screenshot,
country_id: paramPackData.country_id,
created_at: new Date(),
feeling_id: req.body.emotion,
id: snowflake.nextId(),
is_autopost: req.body.is_autopost,
is_spoiler: (req.body.spoiler) ? 1 : 0,
is_app_jumpable: req.body.is_app_jumpable,
language_id: req.body.language_id,
mii: usrObj.mii,
mii_face_url: usrObj.pfp_uri,
pid: pid,
platform_id: paramPackData.platform_id,
region_id: paramPackData.region_id,
verified: usrObj.official
};
const newPost = new POST(document);
newPost.save();
res.redirect('/communities/' + community.community_id + '/new');
}
}
catch (e)
{
console.error(e);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 7,
message: "POSTING_FROM_NNID"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
}
});
module.exports = router;

View File

@ -1,135 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var moment = require('moment');
var router = express.Router();
router.get('/', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let user = null;
if(pid === null)
{
res.render('portal/guest_notice.ejs', {
cdnURL: config.CDN_domain,
lang: lang,
});
}
else
{
user = await database.getUserByPID(pid);
if(user === null)
{
res.render('portal/first_run.ejs', {
cdnURL: config.CDN_domain,
lang: lang,
});
}
else {
if(moment(user.ban_lift_date).format('YYYY-MM-DD') <= moment().format('YYYY-MM-DD') && user.account_status !== 3) {
user.account_status = 0;
user.save()
}
/**
* Account Status
* 0 - Fine
* 1 - Limited from Posting
* 2 - Temporary Ban
* 3 - Forever Ban
*/
if(user.account_status !== 0)
{
res.render('portal/ban_notification.ejs', {
user: user,
moment: moment,
cdnURL: config.CDN_domain,
lang: lang,
});
}
else
{
let popularCommunities = await database.getMostPopularCommunities(9);
let newCommunities = await database.getNewCommunities(6);
res.render('portal/communities.ejs', {
popularCommunities: popularCommunities,
newCommunities: newCommunities,
cdnURL: config.CDN_domain,
lang: lang
});
}
}
}
}).catch(error => {
console.log(error)
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/first', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
res.render('portal/first_run.ejs', {
cdnURL: config.CDN_domain,
lang: lang,
});
});
router.post('/newUser', function (req, res) {
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let user = null;
if(pid === null)
{
res.sendStatus(401);
}
else
{
user = await database.getUserByPID(pid);
if(user === null)
{
await util.data.create_user(pid, req.body.experience, req.body.notifications, req.body.region);
util.data.refreshCache();
if(await database.getUserByPID(pid) !== null)
res.sendStatus(200);
else
res.sendStatus(504);
}
else
{
res.sendStatus(504);
}
}
}).catch(error => {
console.log(error)
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,345 +0,0 @@
var express = require('express');
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
const config = require('../../../../config.json');
var multer = require('multer');
var moment = require('moment');
var upload = multer({ dest: 'uploads/' });
var router = express.Router();
router.get('/me', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let newPosts = await database.getNumberUserPostsByID(pid, 10);
let numPosts = await database.getTotalPostsByUserID(pid);
let communityMap = await util.data.getCommunityHash();
res.render('portal/me_page.ejs', {
communityMap: communityMap,
moment: moment,
user: user,
newPosts: newPosts,
numPosts: numPosts,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.post('/me', upload.none(), function (req, res) {
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if (pid === null)
throw new Error('User does not exist');
let user = await database.getUserByPID(pid);
user.country_visibility = !!req.body.country;
user.birthday_visibility = !!req.body.birthday;
user.game_skill_visibility = !!req.body.experience;
user.profile_comment_visibility = !!req.body.commentShow;
if (req.body.comment)
user.setProfileComment(req.body.comment);
else
user.setProfileComment('');
res.redirect('/users/me');
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
})
});
router.get('/show', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
var userID = req.query.pid;
if(userID === 'me') {
res.sendStatus(504);
return;
}
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
pid = 1000000000;
let parentUser = await database.getUserByPID(pid);
let user = await database.getUserByPID(userID);
if(user === null)
res.sendStatus(404);
if(user.pid === parentUser.pid)
res
let newPosts = await database.getNumberUserPostsByID(user.pid, 10);
let numPosts = await database.getTotalPostsByUserID(user.pid);
let communityMap = await util.data.getCommunityHash();
res.render('portal/user_page.ejs', {
// EJS variable and server-side variable
communityMap: communityMap,
moment: moment,
user: user,
newPosts: newPosts,
numPosts: numPosts,
parentUser: parentUser,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}).catch(error => {
console.error(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/loadPosts', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let post = await database.getPostByID(req.query.postID);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
let newPosts = '';
if(post !== null)
newPosts = await database.getUserPostsAfterTimestamp(post, 10);
else
newPosts = await database.getNumberUserPostsByID(req.query.pid, 10);
let communityMap = await util.data.getCommunityHash();
if(newPosts.length > 0)
{
res.render('portal/more_posts.ejs', {
communityMap: communityMap,
moment: moment,
user: user,
newPosts: newPosts,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.sendStatus(204)
}
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/following', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let user = await database.getUserByPID(req.query.pid);
let followers = await database.getFollowedUsers(user);
let communities = user.followed_communities;
let communityMap = await util.data.getCommunityHash();
if(user.followed_users[0] === '0')
followers.splice(0, 1);
if(communities[0] === '0')
communities.splice(0, 1);
if(user.following > 0)
{
res.render('portal/following_list.ejs', {
moment: moment,
user: user,
followers: followers,
communities: communities,
communityMap: communityMap,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.send('<p class="no-posts-text">' + lang.user_page.no_following + '</p>')
}
}).catch(error => {
console.log(error);
res.send('<p class="no-posts-text">' + lang.user_page.no_following + '</p>')
});
});
router.get('/followers', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let user = await database.getUserByPID(req.query.pid);
let followers = await database.getFollowingUsers(user);
let communities = [];
let userMap = await util.data.getUserHash();
if(followers[0] === '0')
followers.splice(0, 1);
if(user.followers > 0)
{
res.render('portal/following_list.ejs', {
moment: moment,
user: user,
followers: followers,
communities: communities,
userMap: userMap,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.send('<p class="no-posts-text">' + lang.user_page.no_followers + '</p>')
}
}).catch(error => {
console.log(error);
res.send('<p class="no-posts-text">' + lang.user_page.no_followers + '</p>')
});
});
router.get('/friends', function (req, res) {
res.header('X-Nintendo-WhiteList', config.whitelist);
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let user = await database.getUserByPID(req.query.pid);
let friends = null;
let userMap = await util.data.getUserHash();
if(friends)
{
res.render('portal/following_list.ejs', {
moment: moment,
user: user,
friends: friends,
userMap: userMap,
account_server: config.account_server_domain.slice(8),
cdnURL: config.CDN_domain,
lang: lang,
mii_image_CDN: config.mii_image_CDN
});
}
else
{
res.send('<p class="no-posts-text">' + lang.user_page.no_friends + '</p>')
}
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.post('/follow', upload.none(), function (req, res) {
let lang = util.data.processLanguage(req.headers["x-nintendo-parampack"]);
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
let userToFollow = await database.getUserByPID(req.body.userID);
if(pid === null)
pid = 1000000000;
let user = await database.getUserByPID(pid);
if(req.body.type === 'true' && user !== null && user.followed_users.indexOf(userToFollow.pid) === -1)
{
userToFollow.addToFollowers(user.pid);
user.addToUsers(userToFollow.pid);
res.sendStatus(200);
await database.pushNewNotificationByPID(userToFollow.pid, user.user_id + ' ' + lang.notifications.new_follower, '/users/show?pid=' + user.pid)
}
else if(req.body.type === 'false' && user !== null && user.followed_users.indexOf(userToFollow.pid) !== -1)
{
userToFollow.removeFromFollowers(user.pid);
user.removeFromUsers(userToFollow.pid);
res.sendStatus(200);
}
else
res.sendStatus(423);
}).catch(error => {
console.log(error);
res.set("Content-Type", "application/xml");
res.statusCode = 423;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -1,274 +0,0 @@
var express = require('express');
var router = express.Router();
var xml = require('object-to-xml');
const database = require('../../../../database');
const util = require('../../../../authentication');
var path = require('path');
router.get('/css/juxt.css', function (req, res) {
res.set("Content-Type", "text/css");
res.sendFile('css/juxt.css', {root: path.join(__dirname, '../../../../webfiles/portal/')});
});
router.get('/js/juxt.js', function (req, res) {
res.set("Content-Type", "application/javascript; charset=utf-8");
res.sendFile('js/juxt.js', {root: path.join(__dirname, '../../../../webfiles/portal/')});
});
router.get('/js/pjax.min.js', function (req, res) {
res.set("Content-Type", "application/javascript; charset=utf-8");
res.sendFile('js/pjax.min.js', {root: path.join(__dirname, '../../../../webfiles/portal/')});
});
router.get('/fonts/Poppins-Light.woff', function (req, res) {
res.set("Content-Type", "font/woff");
res.sendFile('fonts/Poppins-Light.woff', {root: path.join(__dirname, '../../../../webfiles/portal/')});
});
router.get('/fonts/Poppins-Light.ttf', function (req, res) {
res.set("Content-Type", "font/ttf");
res.sendFile('fonts/Poppins-Light.ttf', {root: path.join(__dirname, '../../../../webfiles/portal/')});
});
router.get('/favicon.ico', function (req, res) {
res.set("Content-Type", "image/x-icon");
res.sendFile('css/favicon.ico', {root: path.join(__dirname, '../../../../webfiles/portal/')});
});
router.get('/icons/:image_id.png', function (req, res) {
res.set("Content-Type", "image/png");
database.connect().then(async e => {
let community = await database.getCommunityByID(req.params.image_id.toString());
if(community !== null) {
if(community.browser_icon.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(community.browser_icon.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(community.browser_icon, 'base64'));
}
else {
let user = await database.getUserByPID(req.params.image_id.toString());
if(user !== null)
if(user.pfp_uri.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(user.pfp_uri.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(user.pfp_uri, 'base64'));
else
res.sendStatus(404);
}
}).catch(error => {
console.error(error);
res.sendStatus(404)
});
});
router.get('/tip/:image_id.png', function (req, res) {
res.set("Content-Type", "image/png");
database.connect().then(async e => {
let community = await database.getCommunityByID(req.params.image_id.toString());
if(community !== null) {
if(community.browser_thumbnail.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(community.browser_thumbnail.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(community.browser_thumbnail, 'base64'));
}
else {
let user = await database.getUserByPID(req.params.image_id.toString());
if(user !== null)
if(user.pfp_uri.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(user.pfp_uri.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(user.pfp_uri, 'base64'));
else
res.sendStatus(404);
}
}).catch(error => {
console.error(error);
res.sendStatus(404)
});
});
router.get('/banner/:image_id.png', function (req, res) {
res.set("Content-Type", "image/png");
database.connect().then(async e => {
let community = await database.getCommunityByID(req.params.image_id.toString());
if(community !== null)
if(community.WiiU_browser_header.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(community.WiiU_browser_header.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(community.WiiU_browser_header, 'base64'));
else
res.sendStatus(404);
}).catch(error => {
console.error(error);
res.sendStatus(404)
});
});
router.get('/screenshot/:image_id.png', function (req, res) {
res.set("Content-Type", "image/png");
database.connect().then(async e => {
let post = await database.getPostByID(req.params.image_id.toString());
if(post !== null && post.screenshot !== '')
if(post.screenshot.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(post.screenshot.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(post.screenshot, 'base64'));
else
res.sendStatus(404);
}).catch(error => {
console.error(error);
res.sendStatus(404)
});
});
router.get('/drawing/:image_id.png', function (req, res) {
res.set("Content-Type", "image/png");
database.connect().then(async e => {
let post = await database.getPostByID(req.params.image_id.toString());
if(post !== null && post.painting_uri !== '')
if(post.painting_uri.indexOf('data:image/png;base64,') !== -1)
res.send(Buffer.from(post.painting_uri.replace('data:image/png;base64,',''), 'base64'));
else
res.send(Buffer.from(post.painting_uri, 'base64'));
else
res.sendStatus(404);
}).catch(error => {
console.error(error);
res.sendStatus(404)
});
});
router.get('/notifications.json', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2||fonts.googleapis.com,,2');
database.connect().then(async e => {
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid === null)
res.sendStatus(403);
else {
let user = await database.getUserByPID(pid);
if(user.notification_list) {
res.send(
{
message_count: 0,
notification_count: user.notification_list.filter(notification => notification.read === false).length,
"messages": [
{
"screen_name": "JayDaBirb",
"mii_face_url": "http://mii-images.account.pretendo.cc/",
"is_official": true,
"is_read": false,
"created_at": "2020-04-29 01:04:80",
"feeling_id": 1,
"id": 1255383017044709400,
"message_content": "https://invite.gg/pretendo"
},
{
"screen_name": "PNID_Test06",
"mii_face_url": "http://mii-images.account.pretendo.cc/",
"is_official": false,
"is_read": true,
"created_at": "2020-05-18 02:17:50",
"feeling_id": 1,
"id": 1244384456055709400,
"message_content": "Testing message number 2 updated"
},
{
"screen_name": "PNID_Test14",
"mii_face_url": "http://mii-images.account.pretendo.cc/",
"is_official": false,
"is_read": true,
"created_at": "2020-05-18 02:17:50",
"feeling_id": 1,
"id": 1244384118059519400,
"message_content": "Testing message number 3"
},
{
"screen_name": "PNID_Test65",
"mii_face_url": "http://mii-images.account.pretendo.cc/",
"is_official": false,
"is_read": true,
"created_at": "2020-05-18 02:17:50",
"feeling_id": 1,
"id": 1244465118055709400,
"message_content": "Did you know our Miiverse fork is called Juxt? pretty cool huh? ;)"
},
{
"screen_name": "AnotherTestUser",
"mii_face_url": "http://mii-images.account.pretendo.cc/",
"is_official": false,
"is_read": true,
"created_at": "2020-05-18 02:17:50",
"feeling_id": 1,
"id": 1244384118792519400,
"message_content": "Frick frack tic tak"
},
{
"screen_name": "WowAnotherUserHuh",
"mii_face_url": "http://mii-images.account.pretendo.cc/",
"is_official": false,
"is_read": true,
"created_at": "2020-05-18 02:17:50",
"feeling_id": 1,
"id": 1244384648059589400,
"message_content": "Hey kid want some meme?"
},
{
"screen_name": "OkayLastOneIPromise",
"mii_face_url": "http://mii-images.account.pretendo.cc/",
"is_official": false,
"is_read": true,
"created_at": "2020-05-18 02:17:50",
"feeling_id": 1,
"id": 1244386594569545800,
"message_content": "I promise this is the last time I'll ask for mod pls I'm sorry"
}
],
}
)
}
}
}).catch(error => {
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
router.get('/:post_id/oembed.json', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2||fonts.googleapis.com,,2');
database.connect().then(async e => {
let post = await database.getPostByID(req.params.post_id.toString());
let user = await database.getUserByPID(post.pid);
let doc = {
"author_name": user.user_id,
"author_url": "https://portal.olv.pretendo.cc/users/show?pid=" + user.pid,
}
res.send(doc)
}).catch(error => {
console.log(error)
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 15,
message: "SERVER_ERROR"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
});
module.exports = router;

View File

@ -62,8 +62,8 @@
<div class="post-screenshot-picker" onclick="loadScreenshots()">
<div class="post-screenshot-picker-icon"></div>
<div class="post-screenshot-picker-dropdown">
<div><img src="" class="post-screenshot-preview" id="post-top-screen-preview" onclick="document.getElementById('screenshot-value').value = wiiuMainApplication.getScreenShot(true);"></div>
<div><img src="" class="post-screenshot-preview" id="post-bottom-screen-preview" onclick="document.getElementById('screenshot-value').value = wiiuMainApplication.getScreenShot(false);"></div>
<div><img src="" class="post-screenshot-preview" id="post-top-screen-preview" onclick="document.getElementById('screenshot-value').value = cave.capture_getUpperImageLeftDetail();"></div>
<div><img src="" class="post-screenshot-preview" id="post-bottom-screen-preview" onclick="document.getElementById('screenshot-value').value = cave.capture_getLowerImage();"></div>
<div onclick="document.getElementById('screenshot-value').value = ''; loadScreenshots()">No Screenshot</div>
<input type="hidden" id="screenshot-value" name="screenshot" value="">
</div>
@ -77,11 +77,11 @@
<div class="post-type-button-text selected" onclick="swapPostType(0)"></div>
</td>
<td rowspan="2" id="post-text-input">
<textarea class="post-textarea" id="comment" name="body" placeholder="Tap here to make a post." rows="4" cols="50" onchange="if(wiiuFilter.checkWord(this.value) === -2) { this.value = ''; alert('Prost cannot contain explicit language');}"></textarea>
<textarea class="post-textarea" id="comment" name="body" placeholder="Tap here to make a post." rows="4" cols="50" onchange="if(cave.checkWord(this.value) === -2) { this.value = ''; alert('Post cannot contain explicit language');}"></textarea>
</td>
<td rowspan="2" id="post-painting-input" style="display: none;">
<div class="post-memo">
<img class="post-memo-preview" id="memo" width="640px" height="240px" src="" style="display: none;" onclick="newPainting(false)">
<img class="post-memo-preview" id="memo" width="170px" height="77px" src="" style="display: none;" onclick="newPainting(false)">
<input type="hidden" id="memo-value" name="painting" value="">
</div>
</td>
@ -95,19 +95,19 @@
<tr>
<td colspan="2">
<label class="checkbox-container checkbox-post">Spoilers
<input type="checkbox" id="spoiler" name="spoiler" value="true" onclick="wiiuSound.playSoundByName('SE_WAVE_MENU', 1);">
<input type="checkbox" id="spoiler" name="spoiler" value="true" onclick="cave.snd_playSe('SE_OLV_OK');">
<span class="checkmark"></span>
</label>
</td>
</tr>
<tr style="height: 70px">
<td class="post-close-button-wrapper" colspan="2">
<div class="post-close-button" onclick="hideNewPostScreen();wiiuMemo.reset();">
<div class="post-close-button" onclick="hideNewPostScreen();cave.memo_clear();">
<p style="margin-top: -2px;">X <b>Close</b></p>
</div>
</td>
<td>
<input type="submit" value="Post" class="submit-button" onclick="wiiuSound.playSoundByName('SE_WAVE_MENU', 1);wiiuSound.playSoundByName('BGM_OLV_MAIN_LOOP_NOWAIT', 3);">
<input type="submit" value="Post" class="submit-button" onclick="cave.snd_playSe('SE_OLV_OK');">
</td>
</tr>
</table>
@ -154,44 +154,9 @@
<p class="no-posts-text">No Posts</p>
<%} else { %>
<button id="load-more-posts-button" onclick="loadCommunityPosts()" style="background: #1F8A42">Load More Posts</button>
<% newPosts.forEach(function(post) { %>
<div class="post-user-info-wrapper" id="<%= post.id %>">
<%if(post.verified) {%>
<img class="community-page-post-user-icon verified" src="<%= post.mii_face_url %>" data-pjax="/users/show?pid=<%= post.pid %>">
<span class="community-page-verified-user-badge community-page-verified" style="" data-pjax="/users/show?pid=<%= post.pid %>"></span>
<%} else {%>
<img class="community-page-post-user-icon" src="<%= post.mii_face_url %>" data-pjax="/users/show?pid=<%= post.pid %>">
<span class="community-page-verified-user-badge community-page-verified" style="display: none;" data-pjax="/users/show?pid=<%= post.pid %>"></span>
<%}%>
<h2 class="community-page-post-username" data-pjax="/users/show?pid=<%= post.pid %>"><%= post.screen_name %></h2>
<h4 class="community-page-post-time-stamp"><%= moment(post.created_at).fromNow() %></h4>
<div class="community-page-post-yeah-button-wrapper <%if(user.likes.indexOf(post.id) !== -1){ %> selected <%}%>">
<div class="community-page-post-yeah-button" onclick="yeah(this.parentNode, '<%= post.id %>')"></div>
</div>
<div id="yeah-<%= post.id %>" class="community-page-post-yeah-count"><%= post.empathy_count %> Yeahs</div>
</div>
<div class="community-page-post-wrapper">
<% if(post.body !== '' && post.painting === '' && post.screenshot === '' && !post.url) { %>
<h3><%= post.body %></h3>
<%} else { %>
<% if(post.screenshot !== '') { %>
<img id="<%= post.id %>" class="community-page-post-screenshot" src="data:image/png;base64,<%= post.screenshot %>">
<%}%>
<% if(post.painting !== '') { %>
<img id="<%= post.id%>" class="community-page-post-painting" src="<%= post.painting_uri %>">
<%}%>
<% if(post.url) { %>
<h3 style="font-weight: bolder; color: #4F279B">Video Playback is not yet supported on the 3DS</h3>
<%}%>
<% if(post.body) { %>
<div class="community-page-post-text-overlay">
<h3><%= post.body %></h3>
</div>
<%}%>
<%}%>
</div>
<% }); %>
<% newPosts.forEach(function(post) { %>
<%- include('post_template', { post: post, mii_image_CDN: mii_image_CDN, lang: lang, reply: false }); %>
<% }); %>
<%}%>
</div>
</div>

View File

@ -4,6 +4,7 @@ body {
margin: 0;
font-family: Poppins, Arial;
}
a {
text-decoration: none;
}
@ -287,6 +288,10 @@ h4 {
min-height: 55px;
border-bottom: 1.5px solid #d6d2d2;
}
.messages-list-wrapper:last-child {
border: none;
}
.messages-list-wrapper.bottom {
border-bottom: 0;
}
@ -469,14 +474,14 @@ h4 {
.about-wrapper {
display: none;
text-align: center;
width: 350px;
width: 400px;
height: 640px;
}
.about-header {
text-align: center;
font-size: 20px;
padding-top: 180px;
font-size: 30px;
padding-top: 160px;
}
.about-body {
@ -499,6 +504,7 @@ h4 {
font-size: large;
border-width: 0;
border-radius: 10px;
z-index: 5;
}
/*Community and User Page*/
@ -521,30 +527,32 @@ h4 {
}
.user-page-tab {
width: 260px;
width: 100px;
text-align: center;
color: black;
background-color: white;
cursor: pointer;
font-size: x-large;
font-size: small;
padding-top: 30px;
padding-bottom: 30px;
margin: -3px;
margin-top: -5px;
margin-bottom: -4px;
}
.user-page-tab.selected {
color: white;
background-color: #673DB6;
margin-top: -4px;
}
.user-page-tab.left {
border-top-left-radius: 10px;
border-bottom-left-radius: 10px;
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
}
.user-page-tab.right {
border-top-right-radius: 10px;
border-bottom-right-radius: 10px;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
.user-page-tab-triangle {
@ -750,6 +758,7 @@ h4 {
.community-page-post-user-icon {
width: 50px;
height: 50px;
border-radius: 4px;
margin-right: 5px;
float: left;
@ -789,11 +798,7 @@ h4 {
margin-top: -10px;
}
.no-posts-text {
margin-left: 40%;
color: rgba(113,141,148,1);
padding-top: 24px;
}
.no-posts-text {font-size: small;color: rgba(113,141,148,1);padding-bottom: 0;text-align: center;vertical-align: middle;line-height: 123px;}
h3 {
padding-left: 20px;
@ -914,20 +919,20 @@ iframe {
}
.post-close-button {
margin-left: 32px;
margin-left: 34px;
height: 15px;
width: 56px;
text-align: center;
margin-top: -15px;
position: absolute;
cursor: pointer;
font-size: small;
color: #673DB6;
background-color: white;
/* border-radius: 2px; */
border-radius: 5px;
border-color: #673DB6;
border-style: solid;
border-width: 2px;
margin-top: -35px;
position: absolute;
cursor: pointer;
border-width: initial;
}
/* New Post Container */
@ -1019,7 +1024,7 @@ textarea {
border-color: #673DB6;
border-style: solid;
border-width: initial;
margin-top: -34px;
margin-top: -15px;
margin-left: -24px;
position: absolute;
cursor: pointer;
@ -1029,10 +1034,10 @@ textarea {
background-color: #eee;
color: black;
font-size: 100px;
margin-left: 50px;
margin-left: 34px;
text-align: center;
width: 120px;
height: 150px;
width: 50px;
height: 48px;
border-top-left-radius: 5px;
margin-bottom: -5px;
-webkit-user-select: none;
@ -1059,13 +1064,10 @@ textarea {
}
.post-type-button-text.selected {
margin-left: 34px;
background-color: #673DB6;
color: white;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpSJVB1sQcchQnSyIijhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIjx4Lgf7+497t4BQqPCVLNrAlA1y0jFY2I2tyoGXiEgDD/6EZaYqSfSixl4jq97+Ph6F+VZ3uf+HH1K3mSATySeY7phEW8Qz2xaOud94hArSQrxOfG4QRckfuS67PIb56LDAs8MGZnUPHGIWCx2sNzBrGSoxNPEEUXVKF/Iuqxw3uKsVmqsdU/+wmBeW0lzneYI4lhCAkmIkFFDGRVYiNKqkWIiRfsxD/+w40+SSyZXGYwcC6hCheT4wf/gd7dmYWrSTQrGgO4X2/4YBQK7QLNu29/Htt08AfzPwJXW9lcbwOwn6fW2FjkCBraBi+u2Ju8BlzvA0JMuGZIj+WkKhQLwfkbflAMGb4HeNbe31j5OH4AMdbV8AxwcAmNFyl73eHdPZ2//nmn19wMlNnKIx2t1DgAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAN1wAADdcBQiibeAAAAAd0SU1FB+UCFQMROgDJkKcAAAOsSURBVHja7d27i1xlGIDx5x0mmyoqRGI2Cd7QwkZRrOwMhjQxghJB0MZCjUlhI2KztZ1gJYFgYWsWVxIhxMt/ELwUFhJjyBp2RRRiiuzGzWuxUynofOeye86Z59cF5swcvvc5Z2e+DAxIkiRJkiRJGr5o88kzcw7YAxwA7gHmXPKprAOrwDKwGhG3ehNAZs4DR4HngIPATudZyxrwFbAELEXESicDyMzdwNvAWw69NbeAj4CFiFjtTACZ+SbwHrDLGW2J68A7EfHhtgaQmWPgfeCkM9kWp4CTdd4jRI3hzwFngUPOYVudB56tGsGoxgt/4PA74TBQ+U/BqOLVfwJ43bXvjFcz840t+ROQmXcDl4A7XPdO+RN4KCJ+bfsOsODwO2kX8G6rd4DJJs/PuKPXVWvAfSV7BOPCFzhaYfjfAJ8AlycbGfp/c8D9wDHgsYLjdrK5A3uqlbPKzM9zeuuZ+VpmhvOsvN6Rmccnazmtc22dzI7MvFlwIn5KaG7tjxes+83JBl3jJ3FvwUlc9Mpv/E7wbcH6H2jjU8B8wWPPREQ6umZM1vJMwSH72ghgb8FjLzu2xl1q42ItCaDk3b/v9pu33sasRq7rbDMAA5AByABkADIAGYAMQAYgA5AByABkADIAGYAMQAYgA5AByABkADIAGYAMQAYgA5AByABkADIAGYAMQAYgA5AByABkADIAGYAMQAYgA5AByABkADIAGYAMQAYgA5AByAD0L3cWPPa6AQxPyW8IXzOAAcnMu4CXDGA2hz8GTgO7pzxkBfjdAIYx/EeA88DzBYd9VvKzveOOlX4EeAbYM+Oz3wE8CDxa4dilkgePOzL8B9j8ceTHve5ruQp82asAMvNh4Gtgv/OrbSEi1nqzD+DwG/U98HHpQSOHPwg3gJcjYqMXATj8Rt0GXomI76ocPHL4vfYXcCIiPq36BGOH31t/AC9GxBd1nmTk8HtpEXiy7vC3LACH34gN4ALwVES8EBE/NfGkY4ffSets7ukvA1fY3A4+FxG/Nf1C4w4PfwU4GBE/2EN7Rg7fANrg8IcmM4/l9DaymuXJnUM9vwOMKl75hyLiR8cygPcA3vYNwOEbgMM3AIdvAA7fABy+ATj8LtrK7wP8Ajzt5/zZvAO4yTPDAXjbn+EAHP6AArjh8GdYZs5n5m3/V2+2I1h0+LMdwL7MvPIfw7/q8Icfwf7JnWDjH18AWcxMv/jZM1HnbgA8MfnnxYi45nJKkiRJkiRJUhf9DSNBEBI1q2RhAAAAAElFTkSuQmCC');
background-size: 60%;
height: 50px;
width: 50px;
background-position: center;
background-repeat: no-repeat !important;
}
@ -1081,12 +1083,12 @@ textarea {
.post-textarea {
margin-bottom: 0;
height: 77px;
height: 75px;
width: 170px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
margin-left: -154px;
margin-top: -48.5px;
margin-top: -47.5px;
padding: 10px;
position: absolute;
font-size: small;
@ -1095,18 +1097,20 @@ textarea {
.post-memo {
background-color: #eee;
margin-bottom: 0;
height: 300px;
width: 835px;
height: 96px;
width: 190px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
margin-left: -4px;
margin-top: -48px;
margin-left: -154px;
text-align: center;
position: absolute;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
.post-memo-preview {
vertical-align: middle;
text-align: center;
margin-top: 30px;
margin-top: 9px;
}
.post-user-icon {
@ -1226,17 +1230,67 @@ textarea {
.post-screenshot-picker-dropdown {
display: none;
position: absolute;
margin-top: 14px;
width: 215px;
height: 293px;
border: 5px solid #c4bfbf;
border-radius: 10px;
margin-top: 3px;
margin-left: -204px;
width: 237px;
height: 165px;
border: 1.5px solid #c4bfbf;
border-radius: 3px;
background-color: #eee;
z-index: 10;
}
.post-screenshot-preview {
width: 180px;
height: 100px;
width: 100px;
height: 60px;
border-radius: 5px;
padding-top: 15px;
padding-top: 5px;
}
.spoiler-overlay > button {
height: 30px;
margin: auto;
margin-left: 87px;
background: #673DB6;
color: white;
border-width: 0;
border-radius: 5px;
}
.posts-wrapper {
}
.reply-banner {
height: 30px;
}
.reply-banner > h2 {
color: #673DB6;
position: absolute;
margin-top: 7px;
margin-left: 50px;
font-size: small;
}
.reply-banner > div {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAbCAYAAABiFp9rAAAABHNCSVQICAgIfAhkiAAAAZRJREFUSEvtlbFSwkAQhncRLBgLfAJ9A7FjnGSETkkBbyAWAp2WlvgG2hEcR3wCaQJlMkPGlrS8gwWVzjCS9S6RxAFMDnN0XHXF3v/d7b+3i3XFaAHCNRK+6Hb5Bja0sKH2iWsT0KQz1PY3xIEAxAH6sIxbkGgGtqkTzdRSXOLUNQuDQ0q7Fd3WHqJukQjEIW7GHSFgjoicaTpb6lqlySpgItDViZFP7eBoLhwFSwTigKZq1AjwOQ6GDcVwAPGIB7ozOn5805x1HReBYV3td1nfufD6HdFdx9Za64JEXsZBVQZ6nYuzLl5q2+eWbJjXRBuq0QPASihOXbbvuYArKyiyjInOmNZtEEM0nmayBQ9UK5q53a8PBxEP/vOS+DP0HowFDzb7vJ/7FX9YPILYxFuaP/xvYAqqiJAnwpy4nB/JNNNMlFfxXuA7uE9SB92PBSazIB9C6LI91Hhly1lREE6QAoqDSAGJQKSAfrcwX9D3ZNGQRKlrKoMiIZmLxq9yPRGIC9aVvsW+wulfLwkvIafoYlW+AbVv6Bm3qPJUAAAAAElFTkSuQmCC");
background-repeat: no-repeat;
background-size: contain;
margin-left: 20px;
margin-top: 4px;
width: 20px;
height: 20px;
position: absolute;
}
.replies-line {
border-left: 5px solid #6e7894;
margin: -11px 0 0 50px;
height: 17px;
position: absolute;
z-index: 5;
}
.replies-line:last-of-type {
display: none;
}

View File

@ -16,53 +16,18 @@
</p>
</div>
<div id="headers-activity-feed-icon" class="header-icon"></div>
<h2 class="header-title">Activity Feed</h2>
<h2 class="header-title"><%= lang.global.activity_feed %></h2>
</div>
<div class="bottom-screen">
<div class="community-page-posts-wrapper">
<div id="community-posts-inner-body">
<% if(posts.length === 0) {%>
<p class="no-posts-text">No Posts</p>
<p class="no-posts-text"><%= lang.activity_feed.empty %></p>
<%} else { %>
<button id="load-more-posts-button" onclick="loadFeedPosts()">Load More Posts</button>
<button id="load-more-posts-button" onclick="loadFeedPosts()"><%= lang.global.more %></button>
<% posts.forEach(function(post) { %>
<div class="post-user-info-wrapper" id="<%= post.id %>">
<%if(post.verified) {%>
<img class="community-page-post-user-icon verified" src="https://mii-images.cdn.<%= account_server %>/<%= post.pid %>/<% if(post.feeling_id === 1) {%>smile_open_mouth.png<%} else if(post.feeling_id === 2 ) {%>wink_left.png<%} else if(post.feeling_id === 3 ) {%>surprise_open_mouth.png<%} else if(post.feeling_id === 4 ) {%>frustrated.png<%} else if(post.feeling_id === 5 ) {%>sorrow.png<%} else {%>normal_face.png<%}%>" data-pjax="/users/show?pid=<%= post.pid %>" onclick="pjax.loadUrl('/users/show?pid=<%= post.pid %>')">
<span class="community-page-verified-user-badge community-page-verified" style=""></span>
<%} else {%>
<img class="community-page-post-user-icon" src="https://mii-images.cdn.<%= account_server %>/<%= post.pid %>/<% if(post.feeling_id === 1) {%>smile_open_mouth.png<%} else if(post.feeling_id === 2 ) {%>wink_left.png<%} else if(post.feeling_id === 3 ) {%>surprise_open_mouth.png<%} else if(post.feeling_id === 4 ) {%>frustrated.png<%} else if(post.feeling_id === 5 ) {%>sorrow.png<%} else {%>normal_face.png<%}%>" data-pjax="/users/show?pid=<%= post.pid %>" onclick="pjax.loadUrl('/users/show?pid=<%= post.pid %>')">
<span class="community-page-verified-user-badge community-page-verified" style="display: none;"></span>
<%}%>
<h2 class="community-page-post-username" data-pjax="/users/show?pid=<%= post.pid %>"><%= post.screen_name %></h2>
<h4 class="community-page-post-time-stamp"><%= moment(post.created_at).fromNow() %> - <a onclick="pjax.loadUrl('/communities/<%=communityMap.get(post.title_id + '-id')%>/new')"><%= communityMap.get(post.title_id) %></a></h4>
<div class="community-page-post-yeah-button-wrapper <%if(user.likes.indexOf(post.id) !== -1){ %> selected <%}%>">
<div class="community-page-post-yeah-button" onclick="yeah(this.parentNode, '<%= post.id %>')"></div>
</div>
<div id="yeah-<%= post.id %>" class="community-page-post-yeah-count"><%= post.empathy_count %> Yeahs</div>
</div>
<div class="community-page-post-wrapper">
<% if(post.body !== '' && post.painting === '' && post.screenshot === '' && !post.url) { %>
<h3><%= post.body %></h3>
<%} else { %>
<% if(post.screenshot !== '') { %>
<img id="<%= post.id %>" class="community-page-post-screenshot" src="data:image/png;base64,<%= post.screenshot %>">
<%}%>
<% if(post.painting !== '') { %>
<img id="<%= post.id%>" class="community-page-post-painting" src="<%= post.painting_uri %>">
<%}%>
<% if(post.url) { %>
<h3 style="font-weight: bolder; color: #4F279B">Video Playback is not yet supported on the 3DS</h3>
<%}%>
<% if(post.body) { %>
<div class="community-page-post-text-overlay">
<h3><%= post.body %></h3>
</div>
<%}%>
<%}%>
</div>
<%- include('post_template', { post: post, mii_image_CDN: mii_image_CDN, lang: lang, reply: false }); %>
<% }); %>
<%}%>
</div>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,38 +1,3 @@
<% newPosts.forEach(function(post) { %>
<div class="post-user-info-wrapper" id="<%= post.id %>">
<%if(post.verified) {%>
<img class="community-page-post-user-icon verified" src="<%= post.mii_face_url %>" data-pjax="/users/show?pid=<%= post.pid %>">
<span class="community-page-verified-user-badge community-page-verified" style="" data-pjax="/users/show?pid=<%= post.pid %>"></span>
<%} else {%>
<img class="community-page-post-user-icon" src="<%= post.mii_face_url %>" data-pjax="/users/show?pid=<%= post.pid %>">
<span class="community-page-verified-user-badge community-page-verified" style="display: none;" data-pjax="/users/show?pid=<%= post.pid %>"></span>
<%}%>
<h2 class="community-page-post-username" data-pjax="/users/show?pid=<%= post.pid %>"><%= post.screen_name %></h2>
<h4 class="community-page-post-time-stamp"><%= moment(post.created_at).fromNow() %> - <a onclick="pjax.loadUrl('/communities/<%=communityMap.get(post.title_id + '-id')%>/new')"><%= communityMap.get(post.title_id) %></h4>
<div class="community-page-post-yeah-button-wrapper <%if(user.likes.indexOf(post.id) !== -1){ %> selected <%}%>">
<div class="community-page-post-yeah-button" onclick="yeah(this.parentNode, '<%= post.id %>')"></div>
</div>
<div id="yeah-<%= post.id %>" class="community-page-post-yeah-count"><%= post.empathy_count %> Yeahs</div>
</div>
<div class="community-page-post-wrapper">
<% if(post.body !== '' && post.painting === '' && post.screenshot === '' && !post.url) { %>
<h3><%= post.body %></h3>
<%} else { %>
<% if(post.screenshot !== '') { %>
<img id="<%= post.id %>" class="community-page-post-screenshot" src="data:image/png;base64,<%= post.screenshot %>">
<%}%>
<% if(post.painting !== '') { %>
<img id="<%= post.id%>" class="community-page-post-painting" src="<%= post.painting_uri %>">
<%}%>
<% if(post.url) { %>
<h3 style="font-weight: bolder; color: #4F279B">Video Playback is not yet supported on the 3DS</h3>
<%}%>
<% if(post.body) { %>
<div class="community-page-post-text-overlay">
<h3><%= post.body %></h3>
</div>
<%}%>
<%}%>
</div>
<%- include('post_template', { post: post, mii_image_CDN: mii_image_CDN, lang: lang, reply: false }); %>
<% }); %>

View File

@ -23,34 +23,29 @@
<table cellspacing="0">
<tbody id="messages-list">
<% if(user.notification_list.length === 0) {%>
<p class="no-posts-text" style="margin-left: 36%;">No Notifications</p>
<p class="no-posts-text"><%= lang.notifications.none %></p>
<%} else { %>
<% let i = 0; user.notification_list.reverse().forEach(function(notification) { %>
<% if(i === 0) { %>
<tr class="message-wrapper" data-pjax="<%=notification.link%>">
<% for(let i = user.notification_list.length - 1; i >= 0; i--) { %>
<% if(i === user.notification_list.length - 1) { %>
<tr class="message-wrapper" data-pjax="<%=user.notification_list[i].link%>">
<td class="messages-unread-badge-wrapper top">
<%if(!notification.read) {%><div class="unread-badge"></div><%}%>
<%if(!user.notification_list[i].read) {%><div class="unread-badge"></div><%}%>
</td>
<td class="messages-list-wrapper top">
<h3 class="notifications-list-content"><%= notification.content %><span style="color: rgba(113,141,148,1)"> - <%= moment(notification.created_at).fromNow() %></span></h3>
<h3 class="notifications-list-content"><%= user.notification_list[i].content %><span style="color: rgba(113,141,148,1)"> - <%= moment(user.notification_list[i].created_at).fromNow() %></span></h3>
</td>
</tr>
<%i = -1;%>
<%} else {%>
<tr class="message-wrapper" data-pjax="<%=notification.link%>">
<tr class="message-wrapper" data-pjax="<%=user.notification_list[i].link%>">
<td class="messages-unread-badge-wrapper">
<%if(!notification.read) {%><div class="unread-badge"></div><%}%>
<%if(!user.notification_list[i].read) {%><div class="unread-badge"></div><%}%>
</td>
<td class="messages-list-wrapper">
<h3 class="notifications-list-content"><%= notification.content %><span style="color: rgba(113,141,148,1)"> - <%= moment(notification.created_at).fromNow() %></span></h3>
<h3 class="notifications-list-content"><%= user.notification_list[i].content %><span style="color: rgba(113,141,148,1)"> - <%= moment(user.notification_list[i].created_at).fromNow() %></span></h3>
</td>
</tr>
<%}%>
<%});%>
</tr>
<td></td>
<td class="messages-list-wrapper end"></td>
</tr>
<%}%>
<%}%>
</tbody>
</table>

37
src/webfiles/ctr/post.ejs Normal file
View File

@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>3DS Testing</title>
<script src="/js/pjax.js"></script>
<script src="/js/juxt.js"></script>
<link rel="stylesheet" type="text/css" href="/css/juxt.css">
</head>
<body>
<div id="main">
<div class="top-screen">
<div class="header-description">
<p>
</p>
</div>
<div id="" class="header-icon"><img class="community-page-info-icon" src="<%= user.pfp_uri %>"></div>
<h2 class="header-title">Post</h2>
</div>
<div class="bottom-screen">
<div class="communities-wrapper" id="popular-communities" style="margin-top: 15px">
<%- include('post_template', { post: post, mii_image_CDN: mii_image_CDN, lang: lang, reply: false }); %>
</div>
<span class="replies-line"></span>
<% replies.forEach(function(post) { %>
<div class="communities-wrapper" id="popular-communities" style="margin-top: 15px">
<%- include('post_template', { post: post, mii_image_CDN: mii_image_CDN, lang: lang, reply: true }); %>
</div>
<span class="replies-line"></span>
<% }); %>
<div class="toolbar-padding"></div>
</div>
</div>
<body onload="onStart()"></body>
</body>
</html>

View File

@ -0,0 +1,48 @@
<div class="posts-wrapper" id="<%= post.id %>">
<div class="post-user-info-wrapper" id="<%= post.id %>">
<%if(post.verified) {%>
<img class="community-page-post-user-icon verified" src="<%= mii_image_CDN %>/<%= post.pid %>/<% if(post.feeling_id === 1) {%>smile_open_mouth.png<%} else if(post.feeling_id === 2 ) {%>wink_left.png<%} else if(post.feeling_id === 3 ) {%>surprise_open_mouth.png<%} else if(post.feeling_id === 4 ) {%>frustrated.png<%} else if(post.feeling_id === 5 ) {%>sorrow.png<%} else {%>normal_face.png<%}%>" data-pjax="/users/show?pid=<%= post.pid %>">
<span class="community-page-verified-user-badge community-page-verified" style="" data-pjax="/users/show?pid=<%= post.pid %>"></span>
<%} else {%>
<img class="community-page-post-user-icon" src="<%= mii_image_CDN %>/<%= post.pid %>/<% if(post.feeling_id === 1) {%>smile_open_mouth.png<%} else if(post.feeling_id === 2 ) {%>wink_left.png<%} else if(post.feeling_id === 3 ) {%>surprise_open_mouth.png<%} else if(post.feeling_id === 4 ) {%>frustrated.png<%} else if(post.feeling_id === 5 ) {%>sorrow.png<%} else {%>normal_face.png<%}%>" data-pjax="/users/show?pid=<%= post.pid %>">
<span class="community-page-verified-user-badge community-page-verified" style="display: none;" data-pjax="/users/show?pid=<%= post.pid %>"></span>
<%}%>
<h2 class="community-page-post-username" data-pjax="/users/show?pid=<%= post.pid %>"><%= post.screen_name %></h2>
<h4 class="community-page-post-time-stamp"><%= moment(post.created_at).fromNow() %> - <a onclick="cave.snd_playSe('SE_OLV_OK');pjax.loadUrl('/communities/<%= post.community_id %>/new')"><%= communityMap.get(post.community_id) %></a></h4>
<div class="community-page-post-yeah-button-wrapper <%if(user.likes.indexOf(post.id) !== -1){ %> selected <%}%>">
<div class="community-page-post-yeah-button" onclick="<%if(user.pid !== 1000000000) {%>yeah(this.parentNode, '<%= post.id %>')<%}%>"></div>
</div>
<div id="yeah-<%= post.id %>" class="community-page-post-yeah-count"><%= post.empathy_count %> <%= lang.global.yeahs %></div>
</div>
<div class="spoiler-overlay" <% if(post.is_spoiler === 0) {%>style="display: none"<%}%>>
<button onclick="cave.snd_playSe('SE_OLV_OK'); this.parentElement.style.display = 'none'; document.getElementById('post-content-<%= post.id%>').style.display = 'block'">Click to Show Spoiler</button>
</div>
<div class="community-page-post-wrapper" id="post-content-<%= post.id%>" <%if(!reply){%>onclick="cave.snd_playSe('SE_OLV_OK'); pjax.loadUrl('/posts/<%= post.id%>')"<%}%> <% if(post.is_spoiler === 1) {%>style="display: none"<%}%>>
<% if(post.body !== '' && post.painting === '' && post.screenshot === '' && !post.url) { %>
<h3><%= post.body %></h3>
<%} else { %>
<% if(post.screenshot !== '') { %>
<img id="<%= post.id %>" class="community-page-post-screenshot" src="data:image/png;base64,<%= post.screenshot %>">
<%}%>
<% if(post.painting !== '') { %>
<img id="<%= post.id%>" class="community-page-post-painting" src="<%= post.painting_uri %>">
<%}%>
<% if(post.url) { %>
<h3 style="font-weight: bolder; color: #4F279B">Video Playback is not yet supported on the 3DS</h3>
<%}%>
<% if(post.body) { %>
<div class="community-page-post-text-overlay">
<h3><%= post.body %></h3>
</div>
<%}%>
<%}%>
</div>
<%if(post.reply_count > 0) {%>
<div class="reply-banner">
<div></div>
<h2><%= post.reply_count %> replies</h2>
</div>
<%}%>
</div>

View File

@ -15,7 +15,7 @@
</p>
</div>
<div id="" class="header-icon"><img class="community-page-info-icon" src="<%= user.pfp_uri %>"></div>
<div id="" class="header-icon"><img class="community-page-info-icon" src="<%= mii_image_CDN %>/<%= user.pid %>/normal_face.png"></div>
<h2 class="header-title"><%= user.user_id %></h2>
</div>
<div class="bottom-screen">

View File

@ -1,12 +1,20 @@
<%if(user === undefined || user === null) {%>
<body>
<h1>You are not authorized to access this application</h1>
<p>If you believe this is an issue, contact @Jemma#6508 on Discord</p>
<p>Error: <%=error%></p>
</body>
<%} else {%>
<script>
<%if(user.account_status === 1) {%>
<%if(user.account_status === 1) {%>
wiiuErrorViewer.openByCodeAndMessage(5980009, '<%=user.user_id%> has been limited from posting until: \n\n<%= moment(user.ban_lift_date) %>.\n\nReason: <%=user.ban_reason%>\n\nIf you have any questions contact the developers in the Discord server.');
location.href = '/communities'
<%} else if(user.account_status === 2) {%>
<%} else if(user.account_status === 2) {%>
wiiuErrorViewer.openByCodeAndMessage(5980010, '<%=user.user_id%> has been banned until: \n\n<%= moment(user.ban_lift_date) %>.\n\nReason: <%=user.ban_reason%>\n\nIf you have any questions contact the developers in the Discord server.');
wiiuBrowser.closeApplication();
<%} else if(user.account_status === 3) {%>
<%} else if(user.account_status === 3) {%>
wiiuErrorViewer.openByCodeAndMessage(5980011, '<%=user.user_id%> has been banned forever.\n\nReason: <%=user.ban_reason%>\n\nIf you have any questions contact the developers in the Discord server.');
wiiuBrowser.closeApplication();
<%}%>
</script>
<%}%>
</script>
<%}%>

View File

@ -88,7 +88,7 @@
<div class="post-type-button-text selected" onclick="swapPostType(0)"></div>
</td>
<td rowspan="2" id="post-text-input">
<textarea class="post-textarea" id="comment" name="body" placeholder="<%= lang.new_post.text_hint %>" rows="4" cols="50" onchange="if(wiiuFilter.checkWord(this.value) === -2) { this.value = ''; alert('<%= lang.new_post.swearing %>');}"></textarea>
<textarea class="post-textarea" id="comment" name="body" maxlength="280" placeholder="<%= lang.new_post.text_hint %>" rows="4" cols="50" onchange="if(wiiuFilter.checkWord(this.value) === -2) { this.value = ''; alert('<%= lang.new_post.swearing %>');}"></textarea>
</td>
<td rowspan="2" id="post-painting-input" style="display: none;">
<div class="post-memo">

View File

@ -303,7 +303,7 @@ ul, ol, menu, li {
}
.post-user-info-wrapper {
margin-bottom: 15px;
margin-bottom: 40px;
margin-left: 15px;
min-width: 520px;
}
@ -834,8 +834,8 @@ td.messages-list-wrapper.end {
border-radius: 10px;
white-space: nowrap;
overflow-x: auto;
box-shadow: 0 3px 15px 0 rgb(0 0 0 / 50%);
-webkit-box-shadow: 0 3px 15px 0 rgb(0 0 0 / 50%);
box-shadow: 0 3px 15px 0 rgba(0, 0, 0, 0);
-webkit-box-shadow: 0 3px 15px 0 rgba(0, 0, 0, 0);
}
#search-icon {
@ -1003,8 +1003,8 @@ h4 {
background-color: rgb(233, 233, 233);
border: 1.5px solid #e9e9e9;
border-radius: 10px;
box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%);
-webkit-box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%);
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0);
-webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0);
}
.community-page-follow-button-wrapper {
@ -1101,8 +1101,8 @@ h4 {
width: 760px;
border-radius: 10px;
margin-bottom: 20px;
box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%);
-webkit-box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%);
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0);
-webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0);
}
.community-page-post-painting {
@ -1110,8 +1110,9 @@ h4 {
height: 285px;
border-radius: 10px;
margin-bottom: 15px;
box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%);
-webkit-box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%);
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.5);
-webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.5);
image-rendering: pixelated;
}
.community-page-post-time-stamp {
@ -1214,8 +1215,8 @@ h4 {
text-align: center;
line-height: 18px;
-webkit-border-radius: 20px;
box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%);
-webkit-box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%);
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0);
-webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0);
}
.community-page-post-username {

View File

@ -17,7 +17,7 @@
<%- include('nav_bar', { selection: 1 }); %>
<div id="main">
<h1 id="title" class="page-header"><%= lang.global.activity_feed %></h1>
<div class="community-page-posts-wrapper">
<div class="community-page-post-box">
<div id="community-posts-inner-body">
<% if(posts.length === 0) {%>
<p class="no-posts-text"><%= lang.activity_feed.empty %></p>

File diff suppressed because one or more lines are too long

View File

@ -2,29 +2,35 @@
.post-user-info-wrapper {
margin-left: 30px;
}
.posts-wrapper {
height: 135px;
margin-bottom: 10px;
}
</style>
<% followers.forEach(function(user) { %>
<div class="post-user-info-wrapper" id="<%= user.pid %>">
<%if(user.official) {%>
<img class="community-page-post-user-icon verified" src="https://mii-images.cdn.<%= account_server %>/<%= user.pid %>/normal_face.png" data-pjax="/users/show?pid=<%= user.pid %>">
<span class="community-page-verified-user-badge community-page-verified" style=""></span>
<%} else {%>
<img class="community-page-post-user-icon" src="https://mii-images.cdn.<%= account_server %>/<%= user.pid %>/normal_face.png" data-pjax="/users/show?pid=<%= user.pid %>">
<span class="community-page-verified-user-badge community-page-verified" style="display: none;"></span>
<%}%>
<h2 class="community-page-post-username" style="padding-top: 13px;" data-pjax="/users/show?pid=<%= user.pid %>"><%= user.user_id %></h2>
<h4 class="community-page-post-time-stamp" style="width: 400px;white-space: nowrap;overflow: hidden;"><% if(user.profile_comment_visibility){%><%=user.profile_comment%><%}%></h4>
<div class="posts-wrapper" onclick="pjax.loadUrl('/users/show?pid=<%= user.pid %>')">
<div class="post-user-info-wrapper" id="<%= user.pid %>">
<%if(user.official) {%>
<img class="community-page-post-user-icon verified" src="https://mii-images.cdn.<%= account_server %>/<%= user.pid %>/normal_face.png">
<span class="community-page-verified-user-badge community-page-verified" style=""></span>
<%} else {%>
<img class="community-page-post-user-icon" src="https://mii-images.cdn.<%= account_server %>/<%= user.pid %>/normal_face.png">
<span class="community-page-verified-user-badge community-page-verified" style="display: none;"></span>
<%}%>
<h2 class="community-page-post-username" style="padding-top: 13px;" data-pjax="/users/show?pid=<%= user.pid %>"><%= user.user_id %></h2>
<h4 class="community-page-post-time-stamp" style="width: 400px;white-space: nowrap;overflow: hidden;"><% if(user.profile_comment_visibility){%><%=user.profile_comment%><%}%></h4>
</div>
</div>
<br>
<% }); %>
<% communities.forEach(function(community) { %>
<div class="post-user-info-wrapper" id="<%= community %>">
<img class="community-page-post-user-icon" src="<%= cdnURL %>/icons/<%= community %>.png" data-pjax="/communities/<%= community %>/new">
<h2 class="community-page-post-username" data-pjax="/communities/<%= community %>/new"><%= communityMap.get(community) %></h2>
<h4 class="community-page-post-time-stamp" style="width: 400px;white-space: nowrap;overflow: hidden;"><%=community.description%></h4>
<div class="posts-wrapper" onclick="pjax.loadUrl('/communities/<%= community %>/new')">
<div class="post-user-info-wrapper" id="<%= community %>">
<img class="community-page-post-user-icon" src="<%= cdnURL %>/icons/<%= community %>.png">
<h2 class="community-page-post-username" data-pjax="/communities/<%= community %>/new"><%= communityMap.get(community) %></h2>
<h4 class="community-page-post-time-stamp" style="width: 400px;white-space: nowrap;overflow: hidden;"><%=community.description%></h4>
</div>
</div>
<br>
<% }); %>
<div style="height: 30px"></div>

View File

@ -27,28 +27,27 @@
<% if(user.notification_list.length === 0) {%>
<p class="no-posts-text"><%= lang.notifications.none %></p>
<%} else { %>
<% let i = 0; user.notification_list.forEach(function(notification) { %>
<% if(i === 0) { %>
<tr class="message-wrapper" data-pjax="<%=notification.link%>">
<% for(let i = user.notification_list.length - 1; i >= 0; i--) { %>
<% if(i === user.notification_list.length - 1) { %>
<tr class="message-wrapper" data-pjax="<%=user.notification_list[i].link%>">
<td class="messages-unread-badge-wrapper top">
<%if(!notification.read) {%><div class="unread-badge"></div><%}%>
<%if(!user.notification_list[i].read) {%><div class="unread-badge"></div><%}%>
</td>
<td class="messages-list-wrapper top">
<h3 class="notifications-list-content"><%= notification.content %><span style="color: rgba(113,141,148,1)"> - <%= moment(notification.created_at).fromNow() %></span></h3>
<h3 class="notifications-list-content"><%= user.notification_list[i].content %><span style="color: rgba(113,141,148,1)"> - <%= moment(user.notification_list[i].created_at).fromNow() %></span></h3>
</td>
</tr>
<%i = -1;%>
<%} else {%>
<tr class="message-wrapper" data-pjax="<%=notification.link%>">
<tr class="message-wrapper" data-pjax="<%=user.notification_list[i].link%>">
<td class="messages-unread-badge-wrapper">
<%if(!notification.read) {%><div class="unread-badge"></div><%}%>
<%if(!user.notification_list[i].read) {%><div class="unread-badge"></div><%}%>
</td>
<td class="messages-list-wrapper">
<h3 class="notifications-list-content"><%= notification.content %><span style="color: rgba(113,141,148,1)"> - <%= moment(notification.created_at).fromNow() %></span></h3>
<h3 class="notifications-list-content"><%= user.notification_list[i].content %><span style="color: rgba(113,141,148,1)"> - <%= moment(user.notification_list[i].created_at).fromNow() %></span></h3>
</td>
</tr>
<%}%>
<%});%>
<%}%>
<%}%>
</tbody>
</table>

View File

@ -94,7 +94,7 @@
<div class="post-type-button-text selected" onclick="swapPostType(0)"></div>
</td>
<td rowspan="2" id="post-text-input">
<textarea class="post-textarea" id="comment" name="body" placeholder="<%= lang.new_post.text_hint %>" rows="4" cols="50" onchange="if(wiiuFilter.checkWord(this.value) === -2) { this.value = ''; alert('<%= lang.new_post.swearing %>');}"></textarea>
<textarea class="post-textarea" id="comment" name="body" maxlength="280" placeholder="<%= lang.new_post.text_hint %>" rows="4" cols="50" onchange="if(wiiuFilter.checkWord(this.value) === -2) { this.value = ''; alert('<%= lang.new_post.swearing %>');}"></textarea>
</td>
<td rowspan="2" id="post-painting-input" style="display: none;">
<div class="post-memo">

View File

@ -8,7 +8,7 @@
<span class="community-page-verified-user-badge community-page-verified" style="display: none;" data-pjax="/users/show?pid=<%= post.pid %>"></span>
<%}%>
<h2 class="community-page-post-username" data-pjax="/users/show?pid=<%= post.pid %>"><%= post.screen_name %></h2>
<h4 class="community-page-post-time-stamp"><%= moment(post.created_at).fromNow() %> - <p onclick="wiiuSound.playSoundByName('SE_WAVE_MENU', 1);pjax.loadUrl('/communities/<%= post.community_id %>/new')"><%= communityMap.get(post.community_id) %></p></h4>
<h4 class="community-page-post-time-stamp"><%= moment(post.created_at).fromNow() %> - <a onclick="wiiuSound.playSoundByName('SE_WAVE_MENU', 1);pjax.loadUrl('/communities/<%= post.community_id %>/new')"><%= communityMap.get(post.community_id) %></a></h4>
<div class="community-page-post-yeah-button-wrapper <%if(user.likes.indexOf(post.id) !== -1){ %> selected <%}%>">
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 33 30">