Add coolui test

This commit is contained in:
Remco
2026-01-26 19:06:51 +01:00
parent 71a4c6677e
commit d872183654
1734 changed files with 56797 additions and 0 deletions
+11
View File
@@ -0,0 +1,11 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# You can see what browsers were selected by your queries by running:
# npx browserslist
last 1 Chrome version
last 1 Firefox version
last 1 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
+16
View File
@@ -0,0 +1,16 @@
# Editor configuration, see https://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true
[*.ts]
quote_type = single
[*.md]
max_line_length = off
trim_trailing_whitespace = false
+31
View File
@@ -0,0 +1,31 @@
/dist
/tmp
/out-tsc
/node_modules
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
/.sass-cache
/connect.lock
/coverage
*.log
.git
.DS_Store
Thumbs.db
# Nitro
/build
*.zip
.env
public/renderer-config*
public/ui-config*
+55
View File
@@ -0,0 +1,55 @@
# v2.2.0 - Cool UI Beta !! Use at Own Risk as it is still in Beta !!
## Prerequisites
- [Git](https://git-scm.com/)
- [NodeJS](https://nodejs.org/) >= 18
- If using NodeJS < 18 remove `--openssl-legacy-provider` from the package.json scripts
- [Yarn](https://yarnpkg.com/) `npm i yarn -g`
## Installation
- First you should open terminal and navigate to the folder where you want to clone Nitro and Nitro-Renderer
- Clone Nitro (Expl. C:\Github\)
- `git clone https://github.com/duckietm/Nitro-Cool-UI.git` <== For now switch to Dev-RendererV2
- `git clone https://github.com/duckietm/Nitro-Cool-UI-Renderer.git`
- Install the dependencies for the renderer : cd C:\Github\Nitro-Cool-UI-Renderer
- `yarn install`
- Now we will create a Link for the CoolUI : `yarn link` This will give you a link address `yarn link "@nitrots/nitro-renderer"`
- Install the dependencies for Cool UI : cd C:\Github\Nitro-Cool-UI
- `yarn install`
- `yarn link "@nitrots/nitro-renderer` <== This will link the renderer in the project
- Rename a few files
- Rename `public/renderer-config.json.example` to `public/renderer-config.json`
- Rename `public/ui-config.json.example` to `public/ui-config.json`
- Set your links
- Open `public/renderer-config.json`
- Update `socket.url, asset.url, image.library.url, & hof.furni.url`
- Open `public/ui-config.json`
- Update `camera.url, thumbnails.url, url.prefix, habbopages.url`
- `yarn build` <== the final step to build the DIST folder this is where your browser needs to point / or upload this to your /client if you do the compile on a other machine (preferd)
- You can override any variable by passing it to `NitroConfig` in the index.html
## Usage
- To use Nitro you need `.nitro` assets generated, see [nitro-converter](https://git.krews.org/nitro/nitro-converter) for instructions
- See [Morningstar Websockets](https://git.krews.org/nitro/ms-websockets) for instructions on configuring websockets on your server
### Development
Run Nitro in development mode when you are editing the files, this way you can see the changes in your browser instantly
```
yarn start
```
### Production
To build a production version of Nitro just run the following command
```
yarn build:prod
```
- A `dist` folder will be generated, these are the files that must be uploaded to your webserver
- Consult your CMS documentation for compatibility with Nitro and how to add the production files
+73
View File
@@ -0,0 +1,73 @@
const lightenHexColor = (hex, percent) =>
{
// Remove the hash symbol if present
hex = hex.replace(/^#/, '');
// Convert hex to RGB
let r = parseInt(hex.substring(0, 2), 16);
let g = parseInt(hex.substring(2, 4), 16);
let b = parseInt(hex.substring(4, 6), 16);
// Adjust RGB values
r = Math.round(Math.min(255, r + 255 * percent));
g = Math.round(Math.min(255, g + 255 * percent));
b = Math.round(Math.min(255, b + 255 * percent));
// Convert RGB back to hex
const result = ((r << 16) | (g << 8) | b).toString(16);
// Make sure result has 6 digits
return '#' + result.padStart(6, '0');
}
const darkenHexColor = (hex, percent) =>
{
// Remove the hash symbol if present
hex = hex.replace(/^#/, '');
// Convert hex to RGB
let r = parseInt(hex.substring(0, 2), 16);
let g = parseInt(hex.substring(2, 4), 16);
let b = parseInt(hex.substring(4, 6), 16);
// Calculate the darkened RGB values
r = Math.round(Math.max(0, r - 255 * percent));
g = Math.round(Math.max(0, g - 255 * percent));
b = Math.round(Math.max(0, b - 255 * percent));
// Convert RGB back to hex
const result = ((r << 16) | (g << 8) | b).toString(16);
// Make sure result has 6 digits
return '#' + result.padStart(6, '0');
};
const generateShades = (colors) =>
{
for (let color in colors)
{
let hex = colors[color]
let extended = {}
const shades = [ 50, 100, 200, 300, 400, 500, 600, 700, 900, 950 ];
for (let i = 0; i < shades.length; i++)
{
let shade = shades[i];
extended[shade] = lightenHexColor(hex, shades[(shades.length - 1 - i) ] / 950);
extended[-shade] = darkenHexColor(hex, shades[(shades.length - 1 - i) ] / 950)
}
colors[color] = {
DEFAULT: hex,
...extended
}
}
return colors;
}
module.exports = {
generateShades,
lightenHexColor
}
+138
View File
@@ -0,0 +1,138 @@
import typescriptEslintPlugin from "@typescript-eslint/eslint-plugin";
import typescriptEslintParser from "@typescript-eslint/parser";
import reactPlugin from "eslint-plugin-react";
import reactHooksPlugin from "eslint-plugin-react-hooks";
import path from "path";
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default [
{
files: ["**/*.jsx", "**/*.js", "**/*.tsx", "**/*.ts"],
plugins: {
react: reactPlugin,
"react-hooks": reactHooksPlugin,
"@typescript-eslint": typescriptEslintPlugin,
},
languageOptions: {
parser: typescriptEslintParser,
ecmaVersion: "latest",
parserOptions: {
sourceType: "module",
project: "./tsconfig.json",
tsconfigRootDir: __dirname,
ecmaFeatures: {
jsx: true,
},
},
},
rules: {
...reactPlugin.configs.recommended.rules,
...reactHooksPlugin.configs.recommended.rules,
...typescriptEslintPlugin.configs.recommended.rules,
...typescriptEslintPlugin.configs[
"recommended-requiring-type-checking"
].rules,
'indent': [
'error',
4,
{
'SwitchCase': 1
}
],
'no-multi-spaces': [
'error'
],
'no-trailing-spaces': [
'error',
{
'skipBlankLines': false,
'ignoreComments': true
}
],
'linebreak-style': [
'off'
],
'quotes': [
'error',
'single'
],
'semi': [
'error',
'always'
],
'brace-style': [
'error',
'allman'
],
'object-curly-spacing': [
'error',
'always'
],
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
'@typescript-eslint/no-floating-promises': 'off',
'@typescript-eslint/require-await': 'off',
'@typescript-eslint/no-unsafe-argument': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
'@typescript-eslint/no-misused-promises': 'off',
'@typescript-eslint/explicit-module-boundary-types': [
'off',
{
'allowedNames': [
'getMessageArray'
]
}
],
'@typescript-eslint/unbound-method': [
'off'
],
'@typescript-eslint/ban-ts-comment': [
'off'
],
'@typescript-eslint/no-empty-function': [
'error',
{
'allow': [
'functions',
'arrowFunctions',
'generatorFunctions',
'methods',
'generatorMethods',
'constructors'
]
}
],
'@typescript-eslint/no-unused-vars': [
'off'
],
'@typescript-eslint/ban-types': [
'error',
{
'types':
{
'String': true,
'Boolean': true,
'Number': true,
'Symbol': true,
'{}': false,
'Object': false,
'object': false,
'Function': false
},
'extendDefaults': true
}
],
'react/react-in-jsx-scope': 'off'
},
settings: {
react: {
version: "18.3.1",
},
},
},
];
+69
View File
@@ -0,0 +1,69 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="/favicon.ico" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1"
/>
<link
rel="apple-touch-icon"
sizes="180x180"
href="/apple-touch-icon.png"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="/favicon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="/favicon-16x16.png"
/>
<link
rel="manifest"
crossorigin="use-credentials"
href="/site.webmanifest"
/>
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#000000" />
<meta name="apple-mobile-web-app-title" content="Nitro" />
<meta name="application-name" content="Nitro" />
<meta name="msapplication-TileColor" content="#000000" />
<meta name="theme-color" content="#000000" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta
name="apple-mobile-web-app-status-bar-style"
content="black-translucent"
/>
<base href="./" />
<title>Nitro</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root" class="w-full h-full"></div>
<script>
window.NitroConfig = {
"config.urls": ["/renderer-config.json", "/ui-config.json"],
"sso.ticket":
new URLSearchParams(window.location.search).get("sso") ||
null,
"forward.type": new URLSearchParams(window.location.search).get(
"room",
)
? 2
: -1,
"forward.id":
new URLSearchParams(window.location.search).get("room") ||
0,
"friend.id":
new URLSearchParams(window.location.search).get("friend") ||
0,
};
</script>
<script type="module" src="./src/index.tsx"></script>
</body>
</html>
+49
View File
@@ -0,0 +1,49 @@
{
"name": "nitro-react",
"version": "2.2",
"homepage": ".",
"private": true,
"scripts": {
"start": "vite --host",
"build": "vite build",
"build:prod": "npx browserslist@latest --update-db && yarn build",
"eslint": "eslint ./src"
},
"dependencies": {
"@babel/runtime": "^7.26.9",
"@tanstack/react-virtual": "3.2.0",
"@types/react-transition-group": "^4.4.10",
"dompurify": "^3.1.5",
"framer-motion": "^11.2.12",
"react": "^18.3.1",
"react-bootstrap": "^2.10.9",
"react-dom": "^18.3.1",
"react-icons": "^5.2.1",
"react-slider": "^2.0.6",
"react-tiny-popover": "^8.0.4",
"react-youtube": "^7.13.1",
"use-between": "^1.3.5"
},
"devDependencies": {
"@tailwindcss/forms": "^0.5.7",
"@types/node": "^20.11.30",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"@types/react-slider": "^1.3.6",
"@typescript-eslint/eslint-plugin": "^7.13.1",
"@typescript-eslint/parser": "^7.13.1",
"@vitejs/plugin-react": "^4.3.1",
"autoprefixer": "^10.4.19",
"eslint": "^9.5.0",
"eslint-plugin-react": "^7.34.2",
"eslint-plugin-react-hooks": "^5.1.0-rc-1434af3d22-20240618",
"postcss": "^8.4.38",
"postcss-nested": "^6.0.1",
"sass": "^1.77.4",
"tailwindcss": "^3.4.4",
"typescript": "^5.4.5",
"typescript-eslint": "^7.13.1",
"vite": "^5.2.13",
"vite-tsconfig-paths": "^4.3.2"
}
}
+8
View File
@@ -0,0 +1,8 @@
/** @type {import("postcss-load-config").Config} */
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<TileColor>#da532c</TileColor>
</tile>
</msapplication>
</browserconfig>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1017 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

+3
View File
@@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:
+154
View File
@@ -0,0 +1,154 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="850.000000pt" height="850.000000pt" viewBox="0 0 850.000000 850.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.14, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,850.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M4838 8495 c-2 -2 -24 -5 -49 -8 -54 -6 -182 -48 -242 -78 -193 -98
-347 -291 -430 -539 -32 -95 -38 -121 -52 -210 -2 -14 -7 -45 -11 -70 -4 -25
-6 -115 -5 -200 5 -279 4 -424 -3 -460 -20 -98 -32 -132 -72 -216 -48 -98
-116 -178 -194 -230 -52 -34 -116 -65 -122 -58 -3 2 1 30 8 61 13 65 10 244
-6 273 -5 10 -10 27 -10 36 0 23 -79 184 -91 184 -5 0 -9 6 -9 13 0 8 -29 40
-64 73 -78 73 -81 74 -136 104 -25 14 -46 28 -48 33 -2 4 -9 7 -15 7 -6 0 -39
12 -75 26 -35 14 -66 24 -68 21 -2 -2 5 -15 16 -29 40 -51 92 -175 104 -248 3
-14 5 -25 6 -25 1 0 3 -21 4 -48 2 -26 5 -50 8 -53 4 -3 2 -19 -2 -35 -5 -17
-5 -29 0 -29 5 0 7 -6 5 -12 -2 -7 -6 -38 -9 -68 -9 -109 -57 -294 -103 -400
-24 -57 -143 -291 -154 -303 -28 -34 -155 -240 -180 -292 -16 -33 -36 -89 -45
-125 -17 -65 -22 -199 -10 -238 9 -26 3 -29 -64 -36 -30 -4 -71 -9 -90 -11
-19 -2 -60 -7 -90 -10 -30 -4 -66 -8 -80 -10 -14 -2 -54 -7 -90 -10 -36 -4
-78 -9 -95 -11 -16 -2 -52 -6 -80 -9 -27 -3 -66 -7 -85 -10 -19 -2 -60 -7 -90
-10 -30 -4 -66 -8 -80 -10 -14 -2 -52 -7 -85 -10 -33 -3 -71 -7 -85 -9 -66 -9
-139 -17 -180 -21 -25 -2 -63 -6 -85 -9 -22 -3 -64 -8 -93 -10 -60 -5 -81 -15
-36 -18 28 -1 40 -3 57 -8 13 -4 21 -6 77 -14 30 -4 62 -9 70 -11 8 -1 33 -6
55 -9 38 -6 87 -14 130 -22 11 -2 40 -7 65 -10 25 -3 54 -8 65 -10 11 -3 36
-7 55 -9 19 -3 51 -8 70 -11 19 -3 46 -8 60 -10 32 -5 89 -15 117 -20 13 -3
35 -6 50 -8 16 -2 44 -6 63 -10 19 -3 51 -8 70 -10 19 -3 107 -17 195 -31 88
-14 171 -28 185 -30 14 -2 41 -7 60 -10 19 -4 46 -8 60 -10 14 -2 41 -6 60
-10 19 -4 44 -8 55 -9 11 -2 34 -6 50 -9 17 -3 46 -9 65 -11 19 -3 45 -8 56
-10 12 -2 39 -7 60 -10 45 -8 57 -16 23 -17 -13 0 -33 -2 -44 -4 -11 -2 -47
-7 -80 -10 -33 -4 -71 -8 -85 -10 -14 -2 -52 -6 -85 -10 -33 -3 -71 -8 -85
-11 -14 -2 -50 -6 -80 -9 -30 -3 -71 -8 -90 -11 -77 -10 -107 -14 -155 -19
-102 -12 -121 -14 -165 -20 -25 -4 -65 -8 -90 -11 -25 -2 -61 -7 -80 -9 -19
-3 -51 -8 -70 -10 -56 -6 -152 -17 -185 -21 -16 -2 -55 -6 -85 -8 -30 -3 -66
-8 -80 -11 -14 -3 -45 -7 -70 -10 -25 -3 -63 -8 -85 -11 -22 -3 -56 -8 -75
-10 -47 -5 -131 -15 -152 -18 -10 -1 -21 -6 -25 -10 -5 -4 -3 -6 2 -5 6 2 33
-1 60 -5 28 -5 59 -10 70 -11 11 -2 47 -8 80 -14 76 -14 100 -18 150 -26 22
-3 94 -15 160 -26 66 -11 134 -22 150 -25 17 -2 44 -7 60 -10 17 -4 44 -9 60
-11 17 -1 57 -8 90 -13 33 -6 78 -13 100 -15 22 -3 46 -8 54 -11 8 -2 30 -7
50 -10 20 -3 74 -12 121 -19 47 -8 103 -17 125 -20 22 -3 51 -8 65 -12 14 -3
36 -7 50 -9 14 -2 36 -5 50 -8 14 -2 43 -7 65 -11 22 -3 78 -13 125 -22 102
-18 118 -20 149 -22 13 0 22 -4 19 -7 -6 -5 -38 -11 -113 -19 -22 -2 -49 -6
-60 -8 -17 -4 -71 -11 -175 -23 -14 -1 -41 -5 -60 -7 -19 -3 -60 -8 -90 -12
-30 -3 -66 -8 -80 -10 -31 -5 -124 -16 -170 -21 -19 -2 -48 -5 -65 -7 -16 -3
-57 -8 -90 -12 -32 -4 -66 -8 -75 -10 -14 -2 -90 -12 -165 -20 -76 -9 -140
-17 -157 -20 -11 -2 -46 -7 -79 -10 -33 -4 -69 -8 -79 -10 -10 -2 -46 -6 -79
-10 -33 -3 -70 -8 -83 -10 -13 -3 -45 -7 -73 -10 -27 -3 -59 -8 -70 -10 -11
-2 -31 -4 -44 -4 -32 -1 -20 -13 19 -17 16 -2 42 -6 58 -9 15 -3 77 -14 137
-25 61 -10 121 -21 135 -24 14 -3 43 -8 64 -11 21 -3 48 -7 60 -10 12 -2 37
-7 56 -10 37 -5 73 -11 130 -21 36 -7 52 -9 105 -18 33 -5 76 -13 115 -21 14
-3 43 -8 65 -11 22 -2 54 -7 70 -10 17 -4 39 -8 50 -9 11 -2 90 -16 175 -30
85 -15 164 -29 175 -30 11 -2 34 -6 50 -9 48 -9 120 -22 232 -41 17 -3 42 -9
55 -14 22 -9 22 -10 -7 -11 -42 -2 -85 -7 -131 -15 -40 -7 -67 -10 -142 -20
-105 -13 -138 -18 -157 -22 -11 -2 -42 -6 -70 -8 -27 -3 -59 -7 -70 -9 -11 -2
-49 -7 -85 -11 -36 -4 -73 -9 -84 -11 -10 -2 -44 -6 -75 -9 -31 -4 -67 -8 -81
-10 -35 -6 -120 -17 -150 -20 -14 -2 -45 -6 -70 -9 -48 -7 -89 -12 -160 -21
-25 -3 -56 -7 -70 -10 -14 -3 -45 -7 -70 -10 -64 -7 -121 -15 -150 -20 -14 -2
-52 -7 -85 -11 -53 -5 -97 -20 -63 -21 7 0 103 -17 213 -38 110 -20 209 -38
220 -40 11 -1 48 -8 83 -14 34 -6 90 -16 125 -22 34 -6 71 -13 82 -14 22 -3
124 -21 168 -30 15 -3 37 -7 50 -9 12 -3 38 -7 57 -10 19 -3 46 -8 60 -11 28
-6 181 -34 220 -40 54 -9 194 -35 209 -39 9 -3 32 -7 51 -10 19 -3 56 -9 82
-14 26 -5 50 -7 54 -3 4 3 5 0 2 -8 -2 -8 -13 -16 -24 -17 -10 -2 -39 -6 -64
-9 -25 -3 -58 -8 -75 -10 -16 -2 -50 -7 -75 -10 -25 -3 -54 -7 -66 -9 -12 -2
-45 -7 -75 -11 -30 -3 -61 -8 -69 -10 -8 -2 -40 -7 -70 -10 -51 -6 -82 -10
-150 -20 -45 -7 -254 -36 -296 -41 -23 -3 -53 -7 -65 -9 -13 -3 -47 -8 -75
-10 -28 -3 -60 -7 -71 -9 -11 -3 -42 -7 -69 -11 -53 -6 -89 -13 -89 -15 0 -1
-16 -3 -35 -4 -19 -2 -73 -9 -120 -16 -77 -11 -128 -18 -154 -19 -24 -2 8 -13
80 -27 125 -25 226 -44 259 -49 16 -3 64 -11 105 -19 118 -23 143 -27 175 -32
17 -3 64 -12 105 -20 41 -8 113 -22 160 -30 47 -8 96 -17 110 -20 14 -2 61
-11 105 -19 44 -8 91 -17 105 -20 14 -3 86 -17 161 -30 75 -14 150 -30 167
-34 17 -5 33 -7 36 -3 3 3 6 -2 6 -11 0 -10 -3 -17 -7 -18 -5 0 -15 -2 -23 -4
-8 -1 -35 -6 -60 -9 -40 -6 -116 -18 -130 -21 -3 -1 -32 -5 -65 -9 -32 -4 -66
-9 -75 -11 -8 -1 -42 -6 -75 -10 -32 -3 -62 -8 -65 -10 -3 -1 -30 -6 -61 -9
-31 -4 -67 -9 -80 -11 -13 -3 -42 -7 -64 -10 -22 -2 -51 -6 -65 -9 -24 -4
-101 -15 -145 -21 -11 -2 -40 -6 -65 -10 -25 -3 -56 -8 -70 -10 -73 -10 -118
-17 -145 -21 -16 -3 -41 -7 -55 -9 -27 -4 -90 -14 -129 -20 -23 -4 -86 -14
-123 -19 -23 -3 -35 -16 -17 -17 8 0 21 -2 29 -4 8 -2 33 -6 55 -10 22 -3 48
-8 57 -11 9 -3 25 -6 35 -8 21 -4 94 -18 108 -21 6 -2 26 -5 45 -9 43 -7 76
-14 115 -23 17 -3 39 -7 50 -9 11 -1 56 -9 100 -19 44 -9 87 -18 95 -20 37 -7
97 -17 120 -21 14 -2 45 -9 70 -14 25 -5 56 -12 70 -14 40 -8 80 -16 155 -31
39 -8 81 -16 95 -18 14 -3 61 -13 105 -22 44 -9 91 -19 104 -21 14 -3 28 -7
33 -10 9 -6 -9 -45 -20 -42 -7 2 -93 -9 -137 -18 -11 -2 -40 -6 -65 -10 -25
-3 -52 -8 -62 -9 -9 -2 -38 -7 -65 -11 -26 -3 -57 -8 -68 -11 -28 -6 -74 -13
-115 -18 -31 -3 -122 -17 -190 -29 -54 -10 -106 -18 -135 -21 -16 -2 -43 -6
-60 -10 -30 -6 -68 -12 -127 -19 -18 -2 -44 -7 -58 -10 -14 -3 -41 -8 -60 -11
-89 -13 -112 -17 -128 -20 -9 -2 -39 -7 -65 -11 -26 -3 -45 -9 -42 -13 7 -6
110 -31 135 -32 8 0 29 -5 45 -9 17 -5 44 -11 60 -14 55 -9 136 -26 143 -30 4
-2 26 -7 48 -10 22 -4 105 -20 184 -37 80 -16 156 -32 170 -35 46 -9 175 -36
195 -40 11 -3 34 -7 50 -10 17 -3 46 -9 65 -14 35 -9 182 -40 210 -45 14 -2
15 -8 11 -48 0 -7 -9 -13 -18 -14 -17 -1 -183 -29 -233 -39 -14 -3 -41 -7 -60
-10 -19 -2 -46 -6 -60 -9 -14 -3 -36 -7 -50 -10 -14 -2 -68 -11 -120 -20 -52
-9 -108 -19 -125 -21 -16 -2 -41 -6 -55 -9 -14 -3 -41 -8 -60 -10 -19 -3 -46
-8 -60 -11 -13 -3 -38 -7 -55 -10 -16 -2 -41 -6 -55 -9 -14 -3 -50 -9 -80 -15
-30 -6 -66 -12 -80 -15 -34 -7 -112 -18 -127 -18 -7 0 -13 -4 -13 -8 0 -8 27
-15 86 -25 21 -3 42 -8 45 -10 3 -2 19 -6 35 -8 51 -10 198 -41 257 -55 20 -5
37 -7 37 -5 0 3 8 1 17 -5 10 -5 36 -11 58 -14 22 -3 47 -8 55 -11 8 -3 26 -8
40 -10 20 -4 145 -33 265 -62 34 -8 109 -25 130 -29 11 -2 51 -11 88 -21 67
-17 68 -18 64 -48 -3 -28 -8 -32 -58 -43 -30 -7 -70 -15 -89 -17 -19 -3 -66
-11 -105 -20 -38 -8 -88 -17 -110 -20 -39 -6 -55 -9 -107 -21 -13 -3 -34 -7
-48 -10 -39 -8 -71 -14 -126 -25 -28 -6 -61 -13 -75 -15 -118 -22 -374 -77
-378 -81 -7 -7 3 -13 29 -17 14 -3 57 -13 95 -22 39 -9 79 -18 90 -21 11 -2
29 -6 40 -8 11 -2 70 -16 130 -31 121 -29 136 -33 163 -39 10 -2 63 -16 118
-30 54 -15 108 -28 119 -30 11 -3 47 -12 80 -21 33 -9 78 -21 100 -26 53 -13
62 -23 57 -59 -5 -34 -20 -45 -72 -54 -19 -3 -45 -8 -57 -11 -13 -3 -33 -7
-45 -10 -13 -3 -39 -8 -58 -11 -46 -8 -64 -12 -67 -14 -4 -3 -13 -6 -58 -14
-22 -5 -87 -19 -145 -33 -58 -14 -115 -27 -127 -29 -12 -2 -34 -9 -48 -14 -14
-5 -25 -8 -25 -5 0 2 -15 -1 -32 -6 -18 -6 -42 -12 -53 -14 -68 -14 -155 -38
-152 -41 2 -2 33 -6 68 -9 35 -3 75 -8 89 -10 14 -2 48 -7 75 -10 107 -12 141
-16 165 -20 51 -9 96 -16 120 -20 52 -7 230 -46 296 -65 64 -19 102 -20 566
-20 435 0 498 2 499 15 1 8 2 18 3 23 1 4 6 36 10 72 11 89 13 110 20 145 5
30 14 97 21 165 2 19 7 48 10 65 3 16 8 47 10 70 2 22 9 74 14 115 6 41 13 91
16 110 9 68 15 116 19 135 2 11 7 49 11 85 4 36 9 74 11 85 2 10 6 37 9 60 3
22 8 56 10 75 3 19 7 51 10 70 2 19 6 51 9 70 8 51 27 199 32 240 2 19 6 44 8
56 4 21 16 107 21 154 3 26 23 178 30 220 7 47 15 105 20 145 2 22 7 54 9 70
3 17 10 66 16 110 6 44 13 96 16 115 3 19 7 51 9 70 6 59 15 124 20 140 2 8 7
40 10 70 3 30 8 66 11 80 2 14 6 36 9 49 2 14 7 45 10 70 3 25 7 62 10 81 2
19 7 64 10 100 15 184 22 240 29 247 1 2 28 -68 60 -155 31 -86 61 -166 66
-177 5 -11 48 -126 96 -255 47 -129 100 -271 116 -315 16 -44 41 -111 55 -150
13 -38 29 -79 34 -90 9 -20 58 -151 63 -170 2 -5 8 -23 14 -38 7 -16 12 -33
12 -38 0 -5 4 -17 10 -27 5 -9 23 -53 39 -97 16 -44 32 -89 37 -100 4 -11 8
-22 8 -25 1 -3 9 -25 19 -50 83 -221 119 -317 121 -325 1 -5 11 -35 23 -65 12
-30 54 -143 93 -250 39 -107 75 -204 80 -215 4 -11 18 -47 30 -80 12 -33 25
-69 30 -80 24 -63 91 -242 170 -460 10 -27 22 -59 26 -70 4 -11 17 -47 29 -80
l22 -60 506 -3 c279 -1 507 1 508 5 1 9 3 22 13 98 15 113 19 141 22 157 3 21
15 104 29 208 10 73 15 106 20 130 2 14 7 46 10 72 5 46 12 99 20 148 3 14 10
61 16 105 6 44 13 94 15 110 3 17 7 48 9 70 7 53 14 102 21 145 3 19 7 49 9
65 2 17 4 30 5 30 1 0 3 11 4 25 10 93 18 155 21 160 2 3 7 33 10 65 4 33 9
67 10 77 2 9 6 38 10 65 4 26 8 59 10 73 9 57 18 127 20 150 2 14 4 25 5 25 0
0 3 18 5 40 3 21 7 55 10 75 3 19 7 46 10 60 2 14 6 48 10 75 12 92 21 153 28
200 3 17 8 53 12 80 7 55 12 90 25 180 5 33 12 83 15 110 3 28 8 57 10 65 2 8
7 40 10 70 3 30 10 80 15 110 5 30 12 78 15 105 10 86 13 108 24 175 6 36 13
88 16 115 4 28 8 61 11 75 2 14 6 45 10 70 3 25 7 52 9 60 5 17 18 123 19 158
1 12 3 22 6 22 3 0 5 10 6 23 0 26 13 122 19 151 3 12 7 41 10 66 3 25 8 59
10 75 3 17 7 48 9 70 3 22 7 49 10 61 2 11 7 45 10 75 3 30 8 63 10 74 2 11 7
43 10 70 4 28 11 77 16 110 11 75 20 134 25 177 2 18 7 49 10 68 3 19 7 53 10
75 6 55 14 115 20 145 2 14 7 48 10 75 4 28 8 57 10 65 5 17 18 125 19 155 1
19 -6 20 -109 21 -60 1 -117 2 -126 3 -18 1 -153 266 -210 409 -91 228 -116
499 -68 712 6 25 13 56 15 70 3 14 21 78 40 142 31 101 43 157 46 218 5 75
-46 252 -84 295 -7 8 -26 32 -43 54 -40 53 -59 61 -50 21 7 -31 8 -102 2 -130
-6 -31 -52 -111 -89 -157 -45 -54 -145 -169 -169 -192 -8 -9 -33 -38 -55 -66
-21 -27 -45 -57 -53 -65 -39 -40 -128 -198 -136 -239 -2 -9 -4 -17 -5 -18 -2
-2 -4 -7 -5 -13 -1 -5 -3 -11 -5 -12 -2 -4 -7 -23 -19 -83 -13 -69 -11 -230 5
-290 20 -73 19 -74 -37 -20 -91 89 -175 232 -199 340 -21 94 -24 123 -23 225
2 134 7 174 38 290 14 52 27 102 29 110 2 8 20 58 40 110 21 52 39 103 41 112
2 9 9 26 15 38 12 22 14 30 29 108 11 54 5 196 -9 221 -5 11 -10 29 -10 40 0
12 -4 21 -10 21 -5 0 -9 3 -8 8 2 10 -34 82 -42 82 -3 0 -6 -17 -7 -37 0 -119
-46 -217 -147 -323 -132 -137 -337 -212 -511 -186 -165 24 -341 146 -454 314
-13 20 -27 39 -31 42 -18 14 -92 185 -109 250 -41 155 -14 328 71 469 21 34
38 65 38 68 0 3 38 43 84 89 l84 84 -44 -2 c-24 0 -45 -2 -46 -3z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

+20
View File
@@ -0,0 +1,20 @@
{
"start_url": "/",
"name": "Nitro",
"short_name": "Nitro",
"icons": [
{
"src": "android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}
+99
View File
@@ -0,0 +1,99 @@
import { GetAssetManager, GetAvatarRenderManager, GetCommunication, GetConfiguration, GetLocalizationManager, GetRoomEngine, GetRoomSessionManager, GetSessionDataManager, GetSoundManager, GetStage, GetTexturePool, GetTicker, HabboWebTools, LegacyExternalInterface, LoadGameUrlEvent, NitroLogger, NitroVersion, PrepareRenderer } from '@nitrots/nitro-renderer';
import { FC, useEffect, useState } from 'react';
import { GetUIVersion } from './api';
import { Base } from './common';
import { LoadingView } from './components/loading/LoadingView';
import { MainView } from './components/MainView';
import { useMessageEvent } from './hooks';
NitroVersion.UI_VERSION = GetUIVersion();
export const App: FC<{}> = props =>
{
const [ isReady, setIsReady ] = useState(false);
useMessageEvent<LoadGameUrlEvent>(LoadGameUrlEvent, event =>
{
const parser = event.getParser();
if(!parser) return;
LegacyExternalInterface.callGame('showGame', parser.url);
});
useEffect(() =>
{
const prepare = async (width: number, height: number) =>
{
try
{
if(!window.NitroConfig) throw new Error('NitroConfig is not defined!');
const renderer = await PrepareRenderer({
width: Math.floor(width),
height: Math.floor(height),
resolution: window.devicePixelRatio,
autoDensity: true,
backgroundAlpha: 0,
preference: 'webgl',
eventMode: 'none',
failIfMajorPerformanceCaveat: false,
roundPixels: true,
useBackBuffer: true // Enable back buffer for blend filters
});
await GetConfiguration().init();
GetTicker().maxFPS = GetConfiguration().getValue<number>('system.fps.max', 24);
NitroLogger.LOG_DEBUG = GetConfiguration().getValue<boolean>('system.log.debug', true);
NitroLogger.LOG_WARN = GetConfiguration().getValue<boolean>('system.log.warn', false);
NitroLogger.LOG_ERROR = GetConfiguration().getValue<boolean>('system.log.error', false);
NitroLogger.LOG_EVENTS = GetConfiguration().getValue<boolean>('system.log.events', false);
NitroLogger.LOG_PACKETS = GetConfiguration().getValue<boolean>('system.log.packets', false);
const assetUrls = GetConfiguration().getValue<string[]>('preload.assets.urls').map(url => GetConfiguration().interpolate(url)) ?? [];
await Promise.all(
[
GetAssetManager().downloadAssets(assetUrls),
GetLocalizationManager().init(),
GetAvatarRenderManager().init(),
GetSoundManager().init(),
GetSessionDataManager().init(),
GetRoomSessionManager().init()
]
);
await GetRoomEngine().init();
await GetCommunication().init();
if(LegacyExternalInterface.available) LegacyExternalInterface.call('legacyTrack', 'authentication', 'authok', []);
HabboWebTools.sendHeartBeat();
setInterval(() => HabboWebTools.sendHeartBeat(), 10000);
GetTicker().add(ticker => GetRoomEngine().update(ticker));
GetTicker().add(ticker => renderer.render(GetStage()));
GetTicker().add(ticker => GetTexturePool().run());
setIsReady(true);
}
catch(err)
{
NitroLogger.error(err);
}
};
prepare(window.innerWidth, window.innerHeight);
}, []);
return (
<Base fit overflow="hidden" className={ !(window.devicePixelRatio % 1) && 'image-rendering-pixelated' }>
{ !isReady &&
<LoadingView /> }
{ isReady && <MainView /> }
<Base id="draggable-windows-container" />
</Base>
);
};
@@ -0,0 +1,3 @@
import { NitroVersion } from '@nitrots/nitro-renderer';
export const GetRendererVersion = () => NitroVersion.RENDERER_VERSION;
+1
View File
@@ -0,0 +1 @@
export const GetUIVersion = () => '2.2.0';
@@ -0,0 +1,40 @@
import { AchievementData } from '@nitrots/nitro-renderer';
import { AchievementUtilities } from './AchievementUtilities';
import { IAchievementCategory } from './IAchievementCategory';
export class AchievementCategory implements IAchievementCategory
{
private _code: string;
private _achievements: AchievementData[];
constructor(code: string)
{
this._code = code;
this._achievements = [];
}
public getProgress(): number
{
return AchievementUtilities.getAchievementCategoryProgress(this);
}
public getMaxProgress(): number
{
return AchievementUtilities.getAchievementCategoryMaxProgress(this);
}
public get code(): string
{
return this._code;
}
public get achievements(): AchievementData[]
{
return this._achievements;
}
public set achievements(achievements: AchievementData[])
{
this._achievements = achievements;
}
}
@@ -0,0 +1,97 @@
import { AchievementData, GetLocalizationManager } from '@nitrots/nitro-renderer';
import { GetConfigurationValue } from '../nitro';
import { IAchievementCategory } from './IAchievementCategory';
export class AchievementUtilities
{
public static getAchievementBadgeCode(achievement: AchievementData): string
{
if(!achievement) return null;
let badgeId = achievement.badgeId;
if(!achievement.finalLevel) badgeId = GetLocalizationManager().getPreviousLevelBadgeId(badgeId);
return badgeId;
}
public static getAchievementCategoryImageUrl(category: IAchievementCategory, progress: number = null, icon: boolean = false): string
{
const imageUrl = GetConfigurationValue<string>('achievements.images.url');
let imageName = icon ? 'achicon_' : 'achcategory_';
imageName += category.code;
if(progress !== null) imageName += `_${ ((progress > 0) ? 'active' : 'inactive') }`;
return imageUrl.replace('%image%', imageName);
}
public static getAchievementCategoryMaxProgress(category: IAchievementCategory): number
{
if(!category) return 0;
let progress = 0;
for(const achievement of category.achievements)
{
progress += achievement.levelCount;
}
return progress;
}
public static getAchievementCategoryProgress(category: IAchievementCategory): number
{
if(!category) return 0;
let progress = 0;
for(const achievement of category.achievements) progress += (achievement.finalLevel ? achievement.level : (achievement.level - 1));
return progress;
}
public static getAchievementCategoryTotalUnseen(category: IAchievementCategory): number
{
if(!category) return 0;
let unseen = 0;
for(const achievement of category.achievements) ((achievement.unseen > 0) && unseen++);
return unseen;
}
public static getAchievementHasStarted(achievement: AchievementData): boolean
{
if(!achievement) return false;
if(achievement.finalLevel || ((achievement.level - 1) > 0)) return true;
return false;
}
public static getAchievementIsIgnored(achievement: AchievementData): boolean
{
if(!achievement) return false;
const ignored = GetConfigurationValue<string[]>('achievements.unseen.ignored');
const value = achievement.badgeId.replace(/[0-9]/g, '');
const index = ignored.indexOf(value);
if(index >= 0) return true;
return false;
}
public static getAchievementLevel(achievement: AchievementData): number
{
if(!achievement) return 0;
if(achievement.finalLevel) return achievement.level;
return (achievement.level - 1);
}
}
@@ -0,0 +1,7 @@
import { AchievementData } from '@nitrots/nitro-renderer';
export interface IAchievementCategory
{
code: string;
achievements: AchievementData[];
}
@@ -0,0 +1,3 @@
export * from './AchievementCategory';
export * from './AchievementUtilities';
export * from './IAchievementCategory';
@@ -0,0 +1,7 @@
export class AvatarEditorAction
{
public static ACTION_SAVE: string = 'AEA_ACTION_SAVE';
public static ACTION_CLEAR: string = 'AEA_ACTION_CLEAR';
public static ACTION_RESET: string = 'AEA_ACTION_RESET';
public static ACTION_RANDOMIZE: string = 'AEA_ACTION_RANDOMIZE';
}
@@ -0,0 +1,17 @@
import { IPartColor } from '@nitrots/nitro-renderer';
export const AvatarEditorColorSorter = (a: IPartColor, b: IPartColor) =>
{
const clubLevelA = (!a ? -1 : a.clubLevel);
const clubLevelB = (!b ? -1 : b.clubLevel);
if(clubLevelA < clubLevelB) return -1;
if(clubLevelA > clubLevelB) return 1;
if(a.index < b.index) return -1;
if(a.index > b.index) return 1;
return 0;
};
@@ -0,0 +1,35 @@
import { IFigurePartSet } from '@nitrots/nitro-renderer';
export const AvatarEditorPartSorter = (hcFirst: boolean) =>
{
return (a: { partSet: IFigurePartSet, usesColor: boolean, isClear?: boolean }, b: { partSet: IFigurePartSet, usesColor: boolean, isClear?: boolean }) =>
{
const clubLevelA = (!a.partSet ? -1 : a.partSet.clubLevel);
const clubLevelB = (!b.partSet ? -1 : b.partSet.clubLevel);
const isSellableA = (!a.partSet ? false : a.partSet.isSellable);
const isSellableB = (!b.partSet ? false : b.partSet.isSellable);
if(isSellableA && !isSellableB) return 1;
if(isSellableB && !isSellableA) return -1;
if(hcFirst)
{
if(clubLevelA > clubLevelB) return -1;
if(clubLevelA < clubLevelB) return 1;
}
else
{
if(clubLevelA < clubLevelB) return -1;
if(clubLevelA > clubLevelB) return 1;
}
if(a.partSet.id < b.partSet.id) return -1;
if(a.partSet.id > b.partSet.id) return 1;
return 0;
};
};
@@ -0,0 +1,196 @@
import { AvatarFigurePartType, AvatarScaleType, AvatarSetType, GetAssetManager, GetAvatarRenderManager, IFigurePart, IGraphicAsset, IPartColor, NitroAlphaFilter, NitroContainer, NitroRectangle, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer';
import { IAvatarEditorCategoryPartItem } from './IAvatarEditorCategoryPartItem';
export class AvatarEditorThumbnailsHelper
{
private static THUMBNAIL_CACHE: Map<string, string> = new Map();
private static THUMB_DIRECTIONS: number[] = [ 2, 6, 0, 4, 3, 1 ];
private static ALPHA_FILTER: NitroAlphaFilter = new NitroAlphaFilter({ alpha: 0.2 });
private static DRAW_ORDER: string[] = [
AvatarFigurePartType.LEFT_HAND_ITEM,
AvatarFigurePartType.LEFT_HAND,
AvatarFigurePartType.LEFT_SLEEVE,
AvatarFigurePartType.LEFT_COAT_SLEEVE,
AvatarFigurePartType.BODY,
AvatarFigurePartType.SHOES,
AvatarFigurePartType.LEGS,
AvatarFigurePartType.CHEST,
AvatarFigurePartType.CHEST_ACCESSORY,
AvatarFigurePartType.COAT_CHEST,
AvatarFigurePartType.CHEST_PRINT,
AvatarFigurePartType.WAIST_ACCESSORY,
AvatarFigurePartType.RIGHT_HAND,
AvatarFigurePartType.RIGHT_SLEEVE,
AvatarFigurePartType.RIGHT_COAT_SLEEVE,
AvatarFigurePartType.HEAD,
AvatarFigurePartType.FACE,
AvatarFigurePartType.EYES,
AvatarFigurePartType.HAIR,
AvatarFigurePartType.HAIR_BIG,
AvatarFigurePartType.FACE_ACCESSORY,
AvatarFigurePartType.EYE_ACCESSORY,
AvatarFigurePartType.HEAD_ACCESSORY,
AvatarFigurePartType.HEAD_ACCESSORY_EXTRA,
AvatarFigurePartType.RIGHT_HAND_ITEM,
];
private static getThumbnailKey(setType: string, part: IAvatarEditorCategoryPartItem): string
{
return `${ setType }-${ part.partSet.id }`;
}
public static clearCache(): void
{
this.THUMBNAIL_CACHE.clear();
}
public static async build(setType: string, part: IAvatarEditorCategoryPartItem, useColors: boolean, partColors: IPartColor[], isDisabled: boolean = false): Promise<string>
{
if(!setType || !setType.length || !part || !part.partSet || !part.partSet.parts || !part.partSet.parts.length) return null;
const thumbnailKey = this.getThumbnailKey(setType, part);
const cached = this.THUMBNAIL_CACHE.get(thumbnailKey);
if(cached) return cached;
const buildContainer = (part: IAvatarEditorCategoryPartItem, useColors: boolean, partColors: IPartColor[], isDisabled: boolean = false) =>
{
const container = new NitroContainer();
const parts = part.partSet.parts.concat().sort(this.sortByDrawOrder);
for(const part of parts)
{
if(!part) continue;
let asset: IGraphicAsset = null;
let direction = 0;
let hasAsset = false;
while(!hasAsset && (direction < AvatarEditorThumbnailsHelper.THUMB_DIRECTIONS.length))
{
const assetName = `${ AvatarFigurePartType.SCALE }_${ AvatarFigurePartType.STD }_${ part.type }_${ part.id }_${ AvatarEditorThumbnailsHelper.THUMB_DIRECTIONS[direction] }_${ AvatarFigurePartType.DEFAULT_FRAME }`;
asset = GetAssetManager().getAsset(assetName);
if(asset && asset.texture)
{
hasAsset = true;
}
else
{
direction++;
}
}
if(!hasAsset)
{
console.log(`${ AvatarFigurePartType.SCALE }_${ AvatarFigurePartType.STD }_${ part.type }_${ part.id }`);
continue;
}
const x = asset.offsetX;
const y = asset.offsetY;
const sprite = new NitroSprite(asset.texture);
sprite.position.set(x, y);
if(useColors && (part.colorLayerIndex > 0) && partColors && partColors.length)
{
const color = partColors[(part.colorLayerIndex - 1)];
if(color) sprite.tint = color.rgb;
}
if(isDisabled) container.filters = [ AvatarEditorThumbnailsHelper.ALPHA_FILTER ];
container.addChild(sprite);
}
return container;
};
return new Promise(async (resolve, reject) =>
{
const resetFigure = async (figure: string) =>
{
const container = buildContainer(part, useColors, partColors, isDisabled);
const imageUrl = await TextureUtils.generateImageUrl(container);
AvatarEditorThumbnailsHelper.THUMBNAIL_CACHE.set(thumbnailKey, imageUrl);
resolve(imageUrl);
};
const figureContainer = GetAvatarRenderManager().createFigureContainer(`${ setType }-${ part.partSet.id }`);
if(!GetAvatarRenderManager().isFigureContainerReady(figureContainer))
{
GetAvatarRenderManager().downloadAvatarFigure(figureContainer, {
resetFigure,
dispose: null,
disposed: false
});
}
else
{
resetFigure(null);
}
});
}
public static async buildForFace(figureString: string, isDisabled: boolean = false): Promise<string>
{
if(!figureString || !figureString.length) return null;
const thumbnailKey = figureString;
const cached = this.THUMBNAIL_CACHE.get(thumbnailKey);
if(cached) return cached;
return new Promise(async (resolve, reject) =>
{
const resetFigure = async (figure: string) =>
{
const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, null, { resetFigure, dispose: null, disposed: false });
if(avatarImage.isPlaceholder()) return;
const texture = avatarImage.processAsTexture(AvatarSetType.HEAD, false);
const sprite = new NitroSprite(texture);
if(isDisabled) sprite.filters = [ AvatarEditorThumbnailsHelper.ALPHA_FILTER ];
const imageUrl = await TextureUtils.generateImageUrl({
target: sprite,
frame: new NitroRectangle(0, 0, texture.width, texture.height)
});
sprite.destroy();
avatarImage.dispose();
AvatarEditorThumbnailsHelper.THUMBNAIL_CACHE.set(thumbnailKey, imageUrl);
resolve(imageUrl);
};
resetFigure(figureString);
});
}
private static sortByDrawOrder(a: IFigurePart, b: IFigurePart): number
{
const indexA = AvatarEditorThumbnailsHelper.DRAW_ORDER.indexOf(a.type);
const indexB = AvatarEditorThumbnailsHelper.DRAW_ORDER.indexOf(b.type);
if(indexA < indexB) return -1;
if(indexA > indexB) return 1;
if(a.index < b.index) return -1;
if(a.index > b.index) return 1;
return 0;
}
}
@@ -0,0 +1,9 @@
import { IPartColor } from '@nitrots/nitro-renderer';
import { IAvatarEditorCategoryPartItem } from './IAvatarEditorCategoryPartItem';
export interface IAvatarEditorCategory
{
setType: string;
partItems: IAvatarEditorCategoryPartItem[];
colorItems: IPartColor[][];
}
@@ -0,0 +1,10 @@
import { IFigurePartSet } from '@nitrots/nitro-renderer';
export interface IAvatarEditorCategoryPartItem
{
id?: number;
partSet?: IFigurePartSet;
usesColor?: boolean;
maxPaletteCount?: number;
isClear?: boolean;
}
+6
View File
@@ -0,0 +1,6 @@
export * from './AvatarEditorAction';
export * from './AvatarEditorColorSorter';
export * from './AvatarEditorPartSorter';
export * from './AvatarEditorThumbnailsHelper';
export * from './IAvatarEditorCategory';
export * from './IAvatarEditorCategoryPartItem';
@@ -0,0 +1,5 @@
export class CameraEditorTabs
{
public static readonly COLORMATRIX: string = 'colormatrix';
public static readonly COMPOSITE: string = 'composite';
}
@@ -0,0 +1,9 @@
import { NitroTexture } from '@nitrots/nitro-renderer';
export class CameraPicture
{
constructor(
public texture: NitroTexture,
public imageUrl: string)
{}
}
@@ -0,0 +1,7 @@
export class CameraPictureThumbnail
{
constructor(
public effectName: string,
public thumbnailUrl: string)
{}
}
+3
View File
@@ -0,0 +1,3 @@
export * from './CameraEditorTabs';
export * from './CameraPicture';
export * from './CameraPictureThumbnail';
@@ -0,0 +1,30 @@
import { ICalendarItem } from './ICalendarItem';
export class CalendarItem implements ICalendarItem
{
private _productName: string;
private _customImage: string;
private _furnitureClassName: string;
constructor(productName: string, customImage: string, furnitureClassName: string)
{
this._productName = productName;
this._customImage = customImage;
this._furnitureClassName = furnitureClassName;
}
public get productName(): string
{
return this._productName;
}
public get customImage(): string
{
return this._customImage;
}
public get furnitureClassName(): string
{
return this._furnitureClassName;
}
}
@@ -0,0 +1,7 @@
export class CalendarItemState
{
public static readonly STATE_UNLOCKED = 1;
public static readonly STATE_LOCKED_AVAILABLE = 2;
public static readonly STATE_LOCKED_EXPIRED = 3;
public static readonly STATE_LOCKED_FUTURE = 4;
}
@@ -0,0 +1,6 @@
export interface ICalendarItem
{
readonly productName: string;
readonly customImage: string;
readonly furnitureClassName: string;
}
+3
View File
@@ -0,0 +1,3 @@
export * from './CalendarItem';
export * from './CalendarItemState';
export * from './ICalendarItem';
@@ -0,0 +1,10 @@
export class BuilderFurniPlaceableStatus
{
public static OKAY: number = 0;
public static MISSING_OFFER: number = 1;
public static FURNI_LIMIT_REACHED: number = 2;
public static NOT_IN_ROOM: number = 3;
public static NOT_ROOM_OWNER: number = 4;
public static GUILD_ROOM: number = 5;
public static VISITORS_IN_ROOM: number = 6;
}
@@ -0,0 +1,124 @@
import { NodeData } from '@nitrots/nitro-renderer';
import { ICatalogNode } from './ICatalogNode';
export class CatalogNode implements ICatalogNode
{
private _depth: number = 0;
private _localization: string = '';
private _pageId: number = -1;
private _pageName: string = '';
private _iconId: number = 0;
private _children: ICatalogNode[];
private _offerIds: number[];
private _parent: ICatalogNode;
private _isVisible: boolean;
private _isActive: boolean;
private _isOpen: boolean;
constructor(node: NodeData, depth: number, parent: ICatalogNode)
{
this._depth = depth;
this._parent = parent;
this._localization = node.localization;
this._pageId = node.pageId;
this._pageName = node.pageName;
this._iconId = node.icon;
this._children = [];
this._offerIds = node.offerIds;
this._isVisible = node.visible;
this._isActive = false;
this._isOpen = false;
}
public activate(): void
{
this._isActive = true;
}
public deactivate(): void
{
this._isActive = false;
}
public open(): void
{
this._isOpen = true;
}
public close(): void
{
this._isOpen = false;
}
public addChild(child: ICatalogNode):void
{
if(!child) return;
this._children.push(child);
}
public get depth(): number
{
return this._depth;
}
public get isBranch(): boolean
{
return (this._children.length > 0);
}
public get isLeaf(): boolean
{
return (this._children.length === 0);
}
public get localization(): string
{
return this._localization;
}
public get pageId(): number
{
return this._pageId;
}
public get pageName(): string
{
return this._pageName;
}
public get iconId(): number
{
return this._iconId;
}
public get children(): ICatalogNode[]
{
return this._children;
}
public get offerIds(): number[]
{
return this._offerIds;
}
public get parent(): ICatalogNode
{
return this._parent;
}
public get isVisible(): boolean
{
return this._isVisible;
}
public get isActive(): boolean
{
return this._isActive;
}
public get isOpen(): boolean
{
return this._isOpen;
}
}
@@ -0,0 +1,59 @@
import { ICatalogPage } from './ICatalogPage';
import { IPageLocalization } from './IPageLocalization';
import { IPurchasableOffer } from './IPurchasableOffer';
export class CatalogPage implements ICatalogPage
{
public static MODE_NORMAL: number = 0;
private _pageId: number;
private _layoutCode: string;
private _localization: IPageLocalization;
private _offers: IPurchasableOffer[];
private _acceptSeasonCurrencyAsCredits: boolean;
private _mode: number;
constructor(pageId: number, layoutCode: string, localization: IPageLocalization, offers: IPurchasableOffer[], acceptSeasonCurrencyAsCredits: boolean, mode: number = -1)
{
this._pageId = pageId;
this._layoutCode = layoutCode;
this._localization = localization;
this._offers = offers;
this._acceptSeasonCurrencyAsCredits = acceptSeasonCurrencyAsCredits;
for(const offer of offers) (offer.page = this);
if(mode === -1) this._mode = CatalogPage.MODE_NORMAL;
else this._mode = mode;
}
public get pageId(): number
{
return this._pageId;
}
public get layoutCode(): string
{
return this._layoutCode;
}
public get localization(): IPageLocalization
{
return this._localization;
}
public get offers(): IPurchasableOffer[]
{
return this._offers;
}
public get acceptSeasonCurrencyAsCredits(): boolean
{
return this._acceptSeasonCurrencyAsCredits;
}
public get mode(): number
{
return this._mode;
}
}
@@ -0,0 +1,26 @@
export class CatalogPageName
{
public static DUCKET_INFO: string = 'ducket_info';
public static CREDITS: string = 'credits';
public static AVATAR_EFFECTS: string = 'avatar_effects';
public static HC_MEMBERSHIP: string = 'hc_membership';
public static CLUB_GIFTS: string = 'club_gifts';
public static LIMITED_SOLD: string = 'limited_sold';
public static PET_ACCESSORIES: string = 'pet_accessories';
public static TRAX_SONGS: string = 'trax_songs';
public static NEW_ADDITIONS: string = 'new_additions';
public static QUEST_SHELL: string = 'quest_shell';
public static QUEST_SNOWFLAKES: string = 'quest_snowflakes';
public static VAL_QUESTS: string = 'val_quests';
public static GUILD_CUSTOM_FURNI: string = 'guild_custom_furni';
public static GIFT_SHOP: string = 'gift_shop';
public static HORSE_STYLES: string = 'horse_styles';
public static HORSE_SHOE: string = 'horse_shoe';
public static SET_EASTER: string = 'set_easter';
public static ECOTRON_TRANSFORM: string = 'ecotron_transform';
public static LOYALTY_INFO: string = 'loyalty_info';
public static ROOM_BUNDLES: string = 'room_bundles';
public static ROOM_BUNDLES_MOBILE: string = 'room_bundles_mobile';
public static HABBO_CLUB_DESKTOP: string = 'habbo_club_desktop';
public static MOBILE_SUBSCRIPTIONS: string = 'mobile_subscriptions';
}
@@ -0,0 +1,10 @@
import { SellablePetPaletteData } from '@nitrots/nitro-renderer';
export class CatalogPetPalette
{
constructor(
public readonly breed: string,
public readonly palettes: SellablePetPaletteData[]
)
{}
}
@@ -0,0 +1,10 @@
export class CatalogPurchaseState
{
public static NONE = 0;
public static CONFIRM = 1;
public static PURCHASE = 2;
public static NO_CREDITS = 3;
public static NO_POINTS = 4;
public static SOLD_OUT = 5;
public static FAILED = 6;
}
@@ -0,0 +1,5 @@
export class CatalogType
{
public static NORMAL: string = 'NORMAL';
public static BUILDER: string = 'BUILDERS_CLUB';
}
@@ -0,0 +1,124 @@
import { GetRoomEngine, SellablePetPaletteData } from '@nitrots/nitro-renderer';
import { ICatalogNode } from './ICatalogNode';
export const GetPixelEffectIcon = (id: number) =>
{
return '';
};
export const GetSubscriptionProductIcon = (id: number) =>
{
return '';
};
export const GetOfferNodes = (offerNodes: Map<number, ICatalogNode[]>, offerId: number) =>
{
const nodes = offerNodes.get(offerId);
const allowedNodes: ICatalogNode[] = [];
if(nodes && nodes.length)
{
for(const node of nodes)
{
if(!node.isVisible) continue;
allowedNodes.push(node);
}
}
return allowedNodes;
};
export const FilterCatalogNode = (search: string, furniLines: string[], node: ICatalogNode, nodes: ICatalogNode[]) =>
{
if(node.isVisible && (node.pageId > 0))
{
let nodeAdded = false;
const hayStack = [ node.pageName, node.localization ].join(' ').toLowerCase().replace(/ /gi, '');
if(hayStack.indexOf(search) > -1)
{
nodes.push(node);
nodeAdded = true;
}
if(!nodeAdded)
{
for(const furniLine of furniLines)
{
if(hayStack.indexOf(furniLine) >= 0)
{
nodes.push(node);
break;
}
}
}
}
for(const child of node.children) FilterCatalogNode(search, furniLines, child, nodes);
};
export function GetPetIndexFromLocalization(localization: string)
{
if(!localization.length) return 0;
let index = (localization.length - 1);
while(index >= 0)
{
if(isNaN(parseInt(localization.charAt(index)))) break;
index--;
}
if(index > 0) return parseInt(localization.substring(index + 1));
return -1;
}
export function GetPetAvailableColors(petIndex: number, palettes: SellablePetPaletteData[]): number[][]
{
switch(petIndex)
{
case 0:
return [ [ 16743226 ], [ 16750435 ], [ 16764339 ], [ 0xF59500 ], [ 16498012 ], [ 16704690 ], [ 0xEDD400 ], [ 16115545 ], [ 16513201 ], [ 8694111 ], [ 11585939 ], [ 14413767 ], [ 6664599 ], [ 9553845 ], [ 12971486 ], [ 8358322 ], [ 10002885 ], [ 13292268 ], [ 10780600 ], [ 12623573 ], [ 14403561 ], [ 12418717 ], [ 14327229 ], [ 15517403 ], [ 14515069 ], [ 15764368 ], [ 16366271 ], [ 0xABABAB ], [ 0xD4D4D4 ], [ 0xFFFFFF ], [ 14256481 ], [ 14656129 ], [ 15848130 ], [ 14005087 ], [ 14337152 ], [ 15918540 ], [ 15118118 ], [ 15531929 ], [ 9764857 ], [ 11258085 ] ];
case 1:
return [ [ 16743226 ], [ 16750435 ], [ 16764339 ], [ 0xF59500 ], [ 16498012 ], [ 16704690 ], [ 0xEDD400 ], [ 16115545 ], [ 16513201 ], [ 8694111 ], [ 11585939 ], [ 14413767 ], [ 6664599 ], [ 9553845 ], [ 12971486 ], [ 8358322 ], [ 10002885 ], [ 13292268 ], [ 10780600 ], [ 12623573 ], [ 14403561 ], [ 12418717 ], [ 14327229 ], [ 15517403 ], [ 14515069 ], [ 15764368 ], [ 16366271 ], [ 0xABABAB ], [ 0xD4D4D4 ], [ 0xFFFFFF ], [ 14256481 ], [ 14656129 ], [ 15848130 ], [ 14005087 ], [ 14337152 ], [ 15918540 ], [ 15118118 ], [ 15531929 ], [ 9764857 ], [ 11258085 ] ];
case 2:
return [ [ 16579283 ], [ 15378351 ], [ 8830016 ], [ 15257125 ], [ 9340985 ], [ 8949607 ], [ 6198292 ], [ 8703620 ], [ 9889626 ], [ 8972045 ], [ 12161285 ], [ 13162269 ], [ 8620113 ], [ 12616503 ], [ 8628101 ], [ 0xD2FF00 ], [ 9764857 ] ];
case 3:
return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ] ];
case 4:
return [ [ 0xFFFFFF ], [ 16053490 ], [ 15464440 ], [ 16248792 ], [ 15396319 ], [ 15007487 ] ];
case 5:
return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ] ];
case 6:
return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ], [ 16767177 ], [ 16770205 ], [ 16751331 ] ];
case 7:
return [ [ 0xCCCCCC ], [ 0xAEAEAE ], [ 16751331 ], [ 10149119 ], [ 16763290 ], [ 16743786 ] ];
default: {
const colors: number[][] = [];
for(const palette of palettes)
{
const petColorResult = GetRoomEngine().getPetColorResult(petIndex, palette.paletteId);
if(!petColorResult) continue;
if(petColorResult.primaryColor === petColorResult.secondaryColor)
{
colors.push([ petColorResult.primaryColor ]);
}
else
{
colors.push([ petColorResult.primaryColor, petColorResult.secondaryColor ]);
}
}
return colors;
}
}
}
@@ -0,0 +1,120 @@
import { GetProductOfferComposer, IFurnitureData } from '@nitrots/nitro-renderer';
import { GetProductDataForLocalization, SendMessageComposer } from '../nitro';
import { ICatalogPage } from './ICatalogPage';
import { IProduct } from './IProduct';
import { IPurchasableOffer } from './IPurchasableOffer';
import { Offer } from './Offer';
import { Product } from './Product';
export class FurnitureOffer implements IPurchasableOffer
{
private _furniData:IFurnitureData;
private _page: ICatalogPage;
private _product: IProduct;
constructor(furniData: IFurnitureData)
{
this._furniData = furniData;
this._product = (new Product(this._furniData.type, this._furniData.id, this._furniData.customParams, 1, GetProductDataForLocalization(this._furniData.className), this._furniData) as IProduct);
}
public activate(): void
{
SendMessageComposer(new GetProductOfferComposer((this._furniData.rentOfferId > -1) ? this._furniData.rentOfferId : this._furniData.purchaseOfferId));
}
public get offerId(): number
{
return (this.isRentOffer) ? this._furniData.rentOfferId : this._furniData.purchaseOfferId;
}
public get priceInActivityPoints(): number
{
return 0;
}
public get activityPointType(): number
{
return 0;
}
public get priceInCredits(): number
{
return 0;
}
public get page(): ICatalogPage
{
return this._page;
}
public set page(page: ICatalogPage)
{
this._page = page;
}
public get priceType(): string
{
return '';
}
public get product(): IProduct
{
return this._product;
}
public get products(): IProduct[]
{
return [ this._product ];
}
public get localizationId(): string
{
return 'roomItem.name.' + this._furniData.id;
}
public get bundlePurchaseAllowed(): boolean
{
return false;
}
public get isRentOffer(): boolean
{
return (this._furniData.rentOfferId > -1);
}
public get giftable(): boolean
{
return false;
}
public get pricingModel(): string
{
return Offer.PRICING_MODEL_FURNITURE;
}
public get clubLevel(): number
{
return 0;
}
public get badgeCode(): string
{
return '';
}
public get localizationName(): string
{
return this._furniData.name;
}
public get localizationDescription(): string
{
return this._furniData.description;
}
public get isLazy(): boolean
{
return true;
}
}
@@ -0,0 +1,19 @@
import { GetRoomEngine } from '@nitrots/nitro-renderer';
import { ProductTypeEnum } from './ProductTypeEnum';
export const GetImageIconUrlForProduct = (productType: string, productClassId: number, extraData: string = null) =>
{
let imageUrl: string = null;
switch(productType.toLocaleLowerCase())
{
case ProductTypeEnum.FLOOR:
imageUrl = GetRoomEngine().getFurnitureFloorIconUrl(productClassId);
break;
case ProductTypeEnum.WALL:
imageUrl = GetRoomEngine().getFurnitureWallIconUrl(productClassId, extraData);
break;
}
return imageUrl;
};
@@ -0,0 +1,51 @@
import { GiftWrappingConfigurationParser } from '@nitrots/nitro-renderer';
export class GiftWrappingConfiguration
{
private _isEnabled: boolean = false;
private _price: number = null;
private _stuffTypes: number[] = null;
private _boxTypes: number[] = null;
private _ribbonTypes: number[] = null;
private _defaultStuffTypes: number[] = null;
constructor(parser: GiftWrappingConfigurationParser)
{
this._isEnabled = parser.isEnabled;
this._price = parser.price;
this._boxTypes = parser.boxTypes;
this._ribbonTypes = parser.ribbonTypes;
this._stuffTypes = parser.giftWrappers;
this._defaultStuffTypes = parser.giftFurnis;
}
public get isEnabled(): boolean
{
return this._isEnabled;
}
public get price(): number
{
return this._price;
}
public get stuffTypes(): number[]
{
return this._stuffTypes;
}
public get boxTypes(): number[]
{
return this._boxTypes;
}
public get ribbonTypes(): number[]
{
return this._ribbonTypes;
}
public get defaultStuffTypes(): number[]
{
return this._defaultStuffTypes;
}
}
@@ -0,0 +1,21 @@
export interface ICatalogNode
{
activate(): void;
deactivate(): void;
open(): void;
close(): void;
addChild(node: ICatalogNode): void;
readonly depth: number;
readonly isBranch: boolean;
readonly isLeaf: boolean;
readonly localization: string;
readonly pageId: number;
readonly pageName: string;
readonly iconId: number;
readonly children: ICatalogNode[];
readonly offerIds: number[];
readonly parent: ICatalogNode;
readonly isVisible: boolean;
readonly isActive: boolean;
readonly isOpen: boolean;
}
@@ -0,0 +1,13 @@
import { ClubGiftInfoParser, ClubOfferData, HabboGroupEntryData, MarketplaceConfigurationMessageParser } from '@nitrots/nitro-renderer';
import { CatalogPetPalette } from './CatalogPetPalette';
import { GiftWrappingConfiguration } from './GiftWrappingConfiguration';
export interface ICatalogOptions
{
groups?: HabboGroupEntryData[];
petPalettes?: CatalogPetPalette[];
clubOffers?: ClubOfferData[];
clubGifts?: ClubGiftInfoParser;
giftConfiguration?: GiftWrappingConfiguration;
marketplaceConfiguration?: MarketplaceConfigurationMessageParser;
}
@@ -0,0 +1,12 @@
import { IPageLocalization } from './IPageLocalization';
import { IPurchasableOffer } from './IPurchasableOffer';
export interface ICatalogPage
{
readonly pageId: number;
readonly layoutCode: string;
readonly localization: IPageLocalization;
readonly offers: IPurchasableOffer[];
readonly acceptSeasonCurrencyAsCredits: boolean;
readonly mode: number;
}
@@ -0,0 +1,7 @@
export interface IMarketplaceSearchOptions
{
query: string;
type: number;
minPrice: number;
maxPrice: number;
}
@@ -0,0 +1,5 @@
export interface IPageLocalization
{
getText(index: number): string
getImage(index: number): string
}
@@ -0,0 +1,16 @@
import { IFurnitureData, IProductData } from '@nitrots/nitro-renderer';
import { IPurchasableOffer } from './IPurchasableOffer';
export interface IProduct
{
getIconUrl(offer?: IPurchasableOffer): string;
productType: string;
productClassId: number;
extraParam: string;
productCount: number;
productData: IProductData;
furnitureData: IFurnitureData;
isUniqueLimitedItem: boolean;
uniqueLimitedItemSeriesSize: number;
uniqueLimitedItemsLeft: number;
}
@@ -0,0 +1,25 @@
import { ICatalogPage } from './ICatalogPage';
import { IProduct } from './IProduct';
export interface IPurchasableOffer
{
activate(): void;
clubLevel: number;
page: ICatalogPage;
offerId: number;
localizationId: string;
priceInCredits: number;
priceInActivityPoints: number;
activityPointType: number;
giftable: boolean;
product: IProduct;
pricingModel: string;
priceType: string;
bundlePurchaseAllowed: boolean;
isRentOffer: boolean;
badgeCode: string;
localizationName: string;
localizationDescription: string;
isLazy: boolean;
products: IProduct[];
}
@@ -0,0 +1,9 @@
import { IObjectData } from '@nitrots/nitro-renderer';
export interface IPurchaseOptions
{
quantity?: number;
extraData?: string;
extraParamRequired?: boolean;
previewStuffData?: IObjectData;
}
@@ -0,0 +1,128 @@
import { IObjectData } from '@nitrots/nitro-renderer';
export class MarketplaceOfferData
{
public static readonly TYPE_FLOOR: number = 1;
public static readonly TYPE_WALL: number = 2;
private _offerId: number;
private _furniId: number;
private _furniType: number;
private _extraData: string;
private _stuffData: IObjectData;
private _price: number;
private _averagePrice: number;
private _imageCallback: number;
private _status: number;
private _timeLeftMinutes: number = -1;
private _offerCount: number;
private _image: string;
constructor(offerId: number, furniId: number, furniType: number, extraData: string, stuffData: IObjectData, price: number, status: number, averagePrice: number, offerCount: number = -1)
{
this._offerId = offerId;
this._furniId = furniId;
this._furniType = furniType;
this._extraData = extraData;
this._stuffData = stuffData;
this._price = price;
this._status = status;
this._averagePrice = averagePrice;
this._offerCount = offerCount;
}
public get offerId(): number
{
return this._offerId;
}
public set offerId(offerId: number)
{
this._offerId = offerId;
}
public get furniId(): number
{
return this._furniId;
}
public get furniType(): number
{
return this._furniType;
}
public get extraData(): string
{
return this._extraData;
}
public get stuffData(): IObjectData
{
return this._stuffData;
}
public get price(): number
{
return this._price;
}
public set price(price: number)
{
this._price = price;
}
public get averagePrice(): number
{
return this._averagePrice;
}
public get image(): string
{
return this._image;
}
public set image(image: string)
{
this._image = image;
}
public get imageCallback(): number
{
return this._imageCallback;
}
public set imageCallback(callback: number)
{
this._imageCallback = callback;
}
public get status(): number
{
return this._status;
}
public get timeLeftMinutes(): number
{
return this._timeLeftMinutes;
}
public set timeLeftMinutes(minutes: number)
{
this._timeLeftMinutes = minutes;
}
public get offerCount(): number
{
return this._offerCount;
}
public set offerCount(count: number)
{
this._offerCount = count;
}
public get isUniqueLimitedItem(): boolean
{
return (this.stuffData && (this.stuffData.uniqueSeries > 0));
}
}
@@ -0,0 +1,7 @@
export class MarketPlaceOfferState
{
public static readonly ONGOING = 1;
public static readonly ONGOING_OWN = 1;
public static readonly SOLD = 2;
public static readonly EXPIRED = 3;
}
@@ -0,0 +1,6 @@
export class MarketplaceSearchType
{
public static readonly BY_ACTIVITY = 1;
public static readonly BY_VALUE = 2;
public static readonly ADVANCED = 3;
}
+245
View File
@@ -0,0 +1,245 @@
import { GetFurnitureData, GetProductDataForLocalization, LocalizeText, ProductTypeEnum } from '..';
import { ICatalogPage } from './ICatalogPage';
import { IProduct } from './IProduct';
import { IPurchasableOffer } from './IPurchasableOffer';
import { Product } from './Product';
export class Offer implements IPurchasableOffer
{
public static PRICING_MODEL_UNKNOWN: string = 'pricing_model_unknown';
public static PRICING_MODEL_SINGLE: string = 'pricing_model_single';
public static PRICING_MODEL_MULTI: string = 'pricing_model_multi';
public static PRICING_MODEL_BUNDLE: string = 'pricing_model_bundle';
public static PRICING_MODEL_FURNITURE: string = 'pricing_model_furniture';
public static PRICE_TYPE_NONE: string = 'price_type_none';
public static PRICE_TYPE_CREDITS: string = 'price_type_credits';
public static PRICE_TYPE_ACTIVITYPOINTS: string = 'price_type_activitypoints';
public static PRICE_TYPE_CREDITS_ACTIVITYPOINTS: string = 'price_type_credits_and_activitypoints';
private _pricingModel: string;
private _priceType: string;
private _offerId: number;
private _localizationId: string;
private _priceInCredits: number;
private _priceInActivityPoints: number;
private _activityPointType: number;
private _giftable: boolean;
private _isRentOffer: boolean;
private _page: ICatalogPage;
private _clubLevel: number = 0;
private _products: IProduct[];
private _badgeCode: string;
private _bundlePurchaseAllowed: boolean = false;
constructor(offerId: number, localizationId: string, isRentOffer: boolean, priceInCredits: number, priceInActivityPoints: number, activityPointType: number, giftable: boolean, clubLevel: number, products: IProduct[], bundlePurchaseAllowed: boolean)
{
this._offerId = offerId;
this._localizationId = localizationId;
this._isRentOffer = isRentOffer;
this._priceInCredits = priceInCredits;
this._priceInActivityPoints = priceInActivityPoints;
this._activityPointType = activityPointType;
this._giftable = giftable;
this._clubLevel = clubLevel;
this._products = products;
this._bundlePurchaseAllowed = bundlePurchaseAllowed;
this.setPricingModelForProducts();
this.setPricingType();
for(const product of products)
{
if(product.productType === ProductTypeEnum.BADGE)
{
this._badgeCode = product.extraParam;
break;
}
}
}
public activate(): void
{
}
public get clubLevel(): number
{
return this._clubLevel;
}
public get page(): ICatalogPage
{
return this._page;
}
public set page(k: ICatalogPage)
{
this._page = k;
}
public get offerId(): number
{
return this._offerId;
}
public get localizationId(): string
{
return this._localizationId;
}
public get priceInCredits(): number
{
return this._priceInCredits;
}
public get priceInActivityPoints(): number
{
return this._priceInActivityPoints;
}
public get activityPointType(): number
{
return this._activityPointType;
}
public get giftable(): boolean
{
return this._giftable;
}
public get product(): IProduct
{
if(!this._products || !this._products.length) return null;
if(this._products.length === 1) return this._products[0];
const products = Product.stripAddonProducts(this._products);
if(products.length) return products[0];
return null;
}
public get pricingModel(): string
{
return this._pricingModel;
}
public get priceType(): string
{
return this._priceType;
}
public get bundlePurchaseAllowed(): boolean
{
return this._bundlePurchaseAllowed;
}
public get isRentOffer(): boolean
{
return this._isRentOffer;
}
public get badgeCode(): string
{
return this._badgeCode;
}
public get localizationName(): string
{
const productData = GetProductDataForLocalization(this._localizationId);
if(productData) return productData.name;
return LocalizeText(this._localizationId);
}
public get localizationDescription(): string
{
const productData = GetProductDataForLocalization(this._localizationId);
if(productData) return productData.description;
return LocalizeText(this._localizationId);
}
public get isLazy(): boolean
{
return false;
}
public get products(): IProduct[]
{
return this._products;
}
private setPricingModelForProducts(): void
{
const products = Product.stripAddonProducts(this._products);
if(products.length === 1)
{
if(products[0].productCount === 1)
{
this._pricingModel = Offer.PRICING_MODEL_SINGLE;
}
else
{
this._pricingModel = Offer.PRICING_MODEL_MULTI;
}
}
else if(products.length > 1)
{
this._pricingModel = Offer.PRICING_MODEL_BUNDLE;
}
else
{
this._pricingModel = Offer.PRICING_MODEL_UNKNOWN;
}
}
private setPricingType(): void
{
if((this._priceInCredits > 0) && (this._priceInActivityPoints > 0))
{
this._priceType = Offer.PRICE_TYPE_CREDITS_ACTIVITYPOINTS;
}
else if(this._priceInCredits > 0)
{
this._priceType = Offer.PRICE_TYPE_CREDITS;
}
else if(this._priceInActivityPoints > 0)
{
this._priceType = Offer.PRICE_TYPE_ACTIVITYPOINTS;
}
else
{
this._priceType = Offer.PRICE_TYPE_NONE;
}
}
public clone(): IPurchasableOffer
{
const products: IProduct[] = [];
const productData = GetProductDataForLocalization(this.localizationId);
for(const product of this._products)
{
const furnitureData = GetFurnitureData(product.productClassId, product.productType);
products.push(new Product(product.productType, product.productClassId, product.extraParam, product.productCount, productData, furnitureData));
}
const offer = new Offer(this.offerId, this.localizationId, this.isRentOffer, this.priceInCredits, this.priceInActivityPoints, this.activityPointType, this.giftable, this.clubLevel, products, this.bundlePurchaseAllowed);
offer.page = this.page;
return offer;
}
}
@@ -0,0 +1,36 @@
import { GetConfigurationValue } from '../nitro';
import { IPageLocalization } from './IPageLocalization';
export class PageLocalization implements IPageLocalization
{
private _images: string[];
private _texts: string[];
constructor(images: string[], texts: string[])
{
this._images = images;
this._texts = texts;
}
public getText(index: number): string
{
let message = (this._texts[index] || '');
if(message && message.length) message = message.replace(/\r\n|\r|\n/g, '<br />');
return message;
}
public getImage(index: number): string
{
const imageName = (this._images[index] || '');
if(!imageName || !imageName.length) return null;
let assetUrl = GetConfigurationValue<string>('catalog.asset.image.url');
assetUrl = assetUrl.replace('%name%', imageName);
return assetUrl;
}
}
@@ -0,0 +1,41 @@
import { IFurnitureData, IProductData } from '@nitrots/nitro-renderer';
import { IPurchasableOffer } from './IPurchasableOffer';
export class PlacedObjectPurchaseData
{
constructor(
public readonly roomId: number,
public readonly objectId: number,
public readonly category: number,
public readonly wallLocation: string,
public readonly x: number,
public readonly y: number,
public readonly direction: number,
public readonly offer: IPurchasableOffer)
{}
public get offerId(): number
{
return this.offer.offerId;
}
public get productClassId(): number
{
return this.offer.product.productClassId;
}
public get productData(): IProductData
{
return this.offer.product.productData;
}
public get furniData(): IFurnitureData
{
return this.offer.product.furnitureData;
}
public get extraParam(): string
{
return this.offer.product.extraParam;
}
}
+143
View File
@@ -0,0 +1,143 @@
import { GetRoomEngine, GetSessionDataManager, IFurnitureData, IObjectData, IProductData } from '@nitrots/nitro-renderer';
import { GetConfigurationValue } from '../nitro';
import { GetPixelEffectIcon, GetSubscriptionProductIcon } from './CatalogUtilities';
import { IProduct } from './IProduct';
import { IPurchasableOffer } from './IPurchasableOffer';
import { ProductTypeEnum } from './ProductTypeEnum';
export class Product implements IProduct
{
public static EFFECT_CLASSID_NINJA_DISAPPEAR: number = 108;
private _productType: string;
private _productClassId: number;
private _extraParam: string;
private _productCount: number;
private _productData: IProductData;
private _furnitureData: IFurnitureData;
private _isUniqueLimitedItem: boolean;
private _uniqueLimitedItemSeriesSize: number;
private _uniqueLimitedItemsLeft: number;
constructor(productType: string, productClassId: number, extraParam: string, productCount: number, productData: IProductData, furnitureData: IFurnitureData, isUniqueLimitedItem: boolean = false, uniqueLimitedItemSeriesSize: number = 0, uniqueLimitedItemsLeft: number = 0)
{
this._productType = productType.toLowerCase();
this._productClassId = productClassId;
this._extraParam = extraParam;
this._productCount = productCount;
this._productData = productData;
this._furnitureData = furnitureData;
this._isUniqueLimitedItem = isUniqueLimitedItem;
this._uniqueLimitedItemSeriesSize = uniqueLimitedItemSeriesSize;
this._uniqueLimitedItemsLeft = uniqueLimitedItemsLeft;
}
public static stripAddonProducts(products: IProduct[]): IProduct[]
{
if(products.length === 1) return products;
return products.filter(product => ((product.productType !== ProductTypeEnum.BADGE) && (product.productType !== ProductTypeEnum.EFFECT) && (product.productClassId !== Product.EFFECT_CLASSID_NINJA_DISAPPEAR)));
}
public getIconUrl(offer: IPurchasableOffer = null, stuffData: IObjectData = null): string
{
switch(this._productType)
{
case ProductTypeEnum.FLOOR:
return GetRoomEngine().getFurnitureFloorIconUrl(this.productClassId);
case ProductTypeEnum.WALL: {
if(offer && this._furnitureData)
{
let iconName = '';
switch(this._furnitureData.className)
{
case 'floor':
iconName = [ 'th', this._furnitureData.className, offer.product.extraParam ].join('_');
break;
case 'wallpaper':
iconName = [ 'th', 'wall', offer.product.extraParam ].join('_');
break;
case 'landscape':
iconName = [ 'th', this._furnitureData.className, (offer.product.extraParam || '').replace('.', '_'), '001' ].join('_');
break;
}
if(iconName !== '')
{
const assetUrl = GetConfigurationValue<string>('catalog.asset.url');
return `${ assetUrl }/${ iconName }.png`;
}
}
return GetRoomEngine().getFurnitureWallIconUrl(this.productClassId, this._extraParam);
}
case ProductTypeEnum.EFFECT:
return GetPixelEffectIcon(this.productClassId);
case ProductTypeEnum.HABBO_CLUB:
return GetSubscriptionProductIcon(this.productClassId);
case ProductTypeEnum.BADGE:
return GetSessionDataManager().getBadgeUrl(this._extraParam);
case ProductTypeEnum.ROBOT:
return null;
}
return null;
}
public get productType(): string
{
return this._productType;
}
public get productClassId(): number
{
return this._productClassId;
}
public get extraParam(): string
{
return this._extraParam;
}
public set extraParam(extraParam: string)
{
this._extraParam = extraParam;
}
public get productCount(): number
{
return this._productCount;
}
public get productData(): IProductData
{
return this._productData;
}
public get furnitureData(): IFurnitureData
{
return this._furnitureData;
}
public get isUniqueLimitedItem(): boolean
{
return this._isUniqueLimitedItem;
}
public get uniqueLimitedItemSeriesSize(): number
{
return this._uniqueLimitedItemSeriesSize;
}
public get uniqueLimitedItemsLeft(): number
{
return this._uniqueLimitedItemsLeft;
}
public set uniqueLimitedItemsLeft(uniqueLimitedItemsLeft: number)
{
this._uniqueLimitedItemsLeft = uniqueLimitedItemsLeft;
}
}
@@ -0,0 +1,11 @@
export class ProductTypeEnum
{
public static WALL: string = 'i';
public static FLOOR: string = 's';
public static EFFECT: string = 'e';
public static HABBO_CLUB: string = 'h';
public static BADGE: string = 'b';
public static GAME_TOKEN: string = 'GAME_TOKEN';
public static PET: string = 'p';
public static ROBOT: string = 'r';
}
@@ -0,0 +1,63 @@
export class RequestedPage
{
public static REQUEST_TYPE_NONE: number = 0;
public static REQUEST_TYPE_ID: number = 1;
public static REQUEST_TYPE_OFFER: number = 2;
public static REQUEST_TYPE_NAME: number = 3;
private _requestType: number;
private _requestById: number;
private _requestedByOfferId: number;
private _requestByName: string;
constructor()
{
this._requestType = RequestedPage.REQUEST_TYPE_NONE;
}
public resetRequest():void
{
this._requestType = RequestedPage.REQUEST_TYPE_NONE;
this._requestById = -1;
this._requestedByOfferId = -1;
this._requestByName = null;
}
public get requestType(): number
{
return this._requestType;
}
public get requestById(): number
{
return this._requestById;
}
public set requestById(id: number)
{
this._requestType = RequestedPage.REQUEST_TYPE_ID;
this._requestById = id;
}
public get requestedByOfferId(): number
{
return this._requestedByOfferId;
}
public set requestedByOfferId(offerId: number)
{
this._requestType = RequestedPage.REQUEST_TYPE_OFFER;
this._requestedByOfferId = offerId;
}
public get requestByName(): string
{
return this._requestByName;
}
public set requestByName(name: string)
{
this._requestType = RequestedPage.REQUEST_TYPE_NAME;
this._requestByName = name;
}
}
@@ -0,0 +1,11 @@
import { ICatalogNode } from './ICatalogNode';
import { IPurchasableOffer } from './IPurchasableOffer';
export class SearchResult
{
constructor(
public readonly searchValue: string,
public readonly offers: IPurchasableOffer[],
public readonly filteredNodes: ICatalogNode[])
{}
}
+29
View File
@@ -0,0 +1,29 @@
export * from './BuilderFurniPlaceableStatus';
export * from './CatalogNode';
export * from './CatalogPage';
export * from './CatalogPageName';
export * from './CatalogPetPalette';
export * from './CatalogPurchaseState';
export * from './CatalogType';
export * from './CatalogUtilities';
export * from './FurnitureOffer';
export * from './GetImageIconUrlForProduct';
export * from './GiftWrappingConfiguration';
export * from './ICatalogNode';
export * from './ICatalogOptions';
export * from './ICatalogPage';
export * from './IMarketplaceSearchOptions';
export * from './IPageLocalization';
export * from './IProduct';
export * from './IPurchasableOffer';
export * from './IPurchaseOptions';
export * from './MarketplaceOfferData';
export * from './MarketplaceOfferState';
export * from './MarketplaceSearchType';
export * from './Offer';
export * from './PageLocalization';
export * from './PlacedObjectPurchaseData';
export * from './Product';
export * from './ProductTypeEnum';
export * from './RequestedPage';
export * from './SearchResult';
@@ -0,0 +1,6 @@
export class ChatEntryType
{
public static TYPE_CHAT = 1;
public static TYPE_ROOM_INFO = 2;
public static TYPE_IM = 3;
}
@@ -0,0 +1,6 @@
export const ChatHistoryCurrentDate = () =>
{
const currentTime = new Date();
return `${ currentTime.getHours().toString().padStart(2, '0') }:${ currentTime.getMinutes().toString().padStart(2, '0') }`;
};
@@ -0,0 +1,17 @@
export interface IChatEntry
{
id: number;
webId: number;
entityId: number;
name: string;
look?: string;
message?: string;
entityType?: number;
style?: number;
chatType?: number;
imageUrl?: string;
color?: string;
roomId: number;
timestamp: string;
type: number;
}
@@ -0,0 +1,5 @@
export interface IRoomHistoryEntry
{
id: number;
name: string;
}
@@ -0,0 +1,6 @@
export const MessengerHistoryCurrentDate = (secondsSinceNow: number = 0) =>
{
const currentTime = secondsSinceNow ? new Date(Date.now() - secondsSinceNow * 1000) : new Date();
return `${ currentTime.getHours().toString().padStart(2, '0') }:${ currentTime.getMinutes().toString().padStart(2, '0') }`;
};
@@ -0,0 +1,5 @@
export * from './ChatEntryType';
export * from './ChatHistoryCurrentDate';
export * from './IChatEntry';
export * from './IRoomHistoryEntry';
export * from './MessengerHistoryCurrentDate';
@@ -0,0 +1,3 @@
import { IEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer';
export const DispatchEvent = (eventDispatcher: IEventDispatcher, event: NitroEvent) => eventDispatcher.dispatchEvent(event);
@@ -0,0 +1,4 @@
import { GetEventDispatcher, NitroEvent } from '@nitrots/nitro-renderer';
import { DispatchEvent } from './DispatchEvent';
export const DispatchMainEvent = (event: NitroEvent) => DispatchEvent(GetEventDispatcher(), event);
@@ -0,0 +1,5 @@
import { NitroEvent } from '@nitrots/nitro-renderer';
import { DispatchEvent } from './DispatchEvent';
import { UI_EVENT_DISPATCHER } from './UI_EVENT_DISPATCHER';
export const DispatchUiEvent = (event: NitroEvent) => DispatchEvent(UI_EVENT_DISPATCHER, event);
@@ -0,0 +1,3 @@
import { EventDispatcher, IEventDispatcher } from '@nitrots/nitro-renderer';
export const UI_EVENT_DISPATCHER: IEventDispatcher = new EventDispatcher();
+4
View File
@@ -0,0 +1,4 @@
export * from './DispatchEvent';
export * from './DispatchMainEvent';
export * from './DispatchUiEvent';
export * from './UI_EVENT_DISPATCHER';
@@ -0,0 +1,13 @@
import { IGroupChatData } from './IGroupChatData';
export const GetGroupChatData = (extraData: string) =>
{
if(!extraData || !extraData.length) return null;
const splitData = extraData.split('/');
const username = splitData[0];
const figure = splitData[1];
const userId = parseInt(splitData[2]);
return ({ username: username, figure: figure, userId: userId } as IGroupChatData);
};
@@ -0,0 +1,6 @@
export interface IGroupChatData
{
username: string;
figure: string;
userId: number;
}
@@ -0,0 +1,43 @@
import { FriendParser } from '@nitrots/nitro-renderer';
export class MessengerFriend
{
public static RELATIONSHIP_NONE: number = 0;
public static RELATIONSHIP_HEART: number = 1;
public static RELATIONSHIP_SMILE: number = 2;
public static RELATIONSHIP_BOBBA: number = 3;
public id: number = -1;
public name: string = null;
public gender: number = 0;
public online: boolean = false;
public followingAllowed: boolean = false;
public figure: string = null;
public categoryId: number = 0;
public motto: string = null;
public realName: string = null;
public lastAccess: string = null;
public persistedMessageUser: boolean = false;
public vipMember: boolean = false;
public pocketHabboUser: boolean = false;
public relationshipStatus: number = -1;
public unread: number = 0;
public populate(parser: FriendParser): void
{
this.id = parser.id;
this.name = parser.name;
this.gender = parser.gender;
this.online = parser.online;
this.followingAllowed = parser.followingAllowed;
this.figure = parser.figure;
this.categoryId = parser.categoryId;
this.motto = parser.motto;
this.realName = parser.realName;
this.lastAccess = parser.lastAccess;
this.persistedMessageUser = parser.persistedMessageUser;
this.vipMember = parser.vipMember;
this.pocketHabboUser = parser.pocketHabboUser;
this.relationshipStatus = parser.relationshipStatus;
}
}
@@ -0,0 +1,5 @@
export class MessengerGroupType
{
public static readonly GROUP_CHAT = 0;
public static readonly PRIVATE_CHAT = 1;
}
@@ -0,0 +1,6 @@
export class MessengerIconState
{
public static HIDDEN: number = 0;
public static SHOW: number = 1;
public static UNREAD: number = 2;
}
@@ -0,0 +1,41 @@
import { FriendRequestData } from '@nitrots/nitro-renderer';
export class MessengerRequest
{
private _id: number;
private _name: string;
private _requesterUserId: number;
private _figureString: string;
public populate(data: FriendRequestData): boolean
{
if(!data) return false;
this._id = data.requestId;
this._name = data.requesterName;
this._figureString = data.figureString;
this._requesterUserId = data.requesterUserId;
return true;
}
public get id(): number
{
return this._id;
}
public get name(): string
{
return this._name;
}
public get requesterUserId(): number
{
return this._requesterUserId;
}
public get figureString(): string
{
return this._figureString;
}
}
@@ -0,0 +1,11 @@
import { FriendCategoryData } from '@nitrots/nitro-renderer';
export class MessengerSettings
{
constructor(
public userFriendLimit: number = 0,
public normalFriendLimit: number = 0,
public extendedFriendLimit: number = 0,
public categories: FriendCategoryData[] = [])
{}
}
@@ -0,0 +1,96 @@
import { GetGroupChatData } from './GetGroupChatData';
import { MessengerFriend } from './MessengerFriend';
import { MessengerGroupType } from './MessengerGroupType';
import { MessengerThreadChat } from './MessengerThreadChat';
import { MessengerThreadChatGroup } from './MessengerThreadChatGroup';
export class MessengerThread
{
public static MESSAGE_RECEIVED: string = 'MT_MESSAGE_RECEIVED';
public static THREAD_ID: number = 0;
private _threadId: number;
private _participant: MessengerFriend;
private _groups: MessengerThreadChatGroup[];
private _lastUpdated: Date;
private _unreadCount: number;
constructor(participant: MessengerFriend)
{
this._threadId = ++MessengerThread.THREAD_ID;
this._participant = participant;
this._groups = [];
this._lastUpdated = new Date();
this._unreadCount = 0;
}
public addMessage(senderId: number, message: string, secondsSinceSent: number = 0, extraData: string = null, type: number = 0): MessengerThreadChat
{
const isGroupChat = (senderId < 0 && extraData);
const userId = isGroupChat ? GetGroupChatData(extraData).userId : senderId;
const group = this.getLastGroup(userId);
if(!group) return;
if(isGroupChat) group.type = MessengerGroupType.GROUP_CHAT;
const chat = new MessengerThreadChat(senderId, message, secondsSinceSent, extraData, type);
group.addChat(chat);
this._lastUpdated = new Date();
this._unreadCount++;
return chat;
}
private getLastGroup(userId: number): MessengerThreadChatGroup
{
let group = this._groups[(this._groups.length - 1)];
if(group && (group.userId === userId)) return group;
group = new MessengerThreadChatGroup(userId);
this._groups.push(group);
return group;
}
public setRead(): void
{
this._unreadCount = 0;
}
public get threadId(): number
{
return this._threadId;
}
public get participant(): MessengerFriend
{
return this._participant;
}
public get groups(): MessengerThreadChatGroup[]
{
return this._groups;
}
public get lastUpdated(): Date
{
return this._lastUpdated;
}
public get unreadCount(): number
{
return this._unreadCount;
}
public get unread(): boolean
{
return (this._unreadCount > 0);
}
}
@@ -0,0 +1,54 @@
export class MessengerThreadChat
{
public static CHAT: number = 0;
public static ROOM_INVITE: number = 1;
public static STATUS_NOTIFICATION: number = 2;
public static SECURITY_NOTIFICATION: number = 3;
private _type: number;
private _senderId: number;
private _message: string;
private _secondsSinceSent: number;
private _extraData: string;
private _date: Date;
constructor(senderId: number, message: string, secondsSinceSent: number = 0, extraData: string = null, type: number = 0)
{
this._type = type;
this._senderId = senderId;
this._message = message;
this._secondsSinceSent = secondsSinceSent;
this._extraData = extraData;
this._date = new Date();
}
public get type(): number
{
return this._type;
}
public get senderId(): number
{
return this._senderId;
}
public get message(): string
{
return this._message;
}
public get secondsSinceSent(): number
{
return this._secondsSinceSent;
}
public get extraData(): string
{
return this._extraData;
}
public get date(): Date
{
return this._date;
}
}
@@ -0,0 +1,41 @@
import { MessengerGroupType } from './MessengerGroupType';
import { MessengerThreadChat } from './MessengerThreadChat';
export class MessengerThreadChatGroup
{
private _userId: number;
private _chats: MessengerThreadChat[];
private _type: number;
constructor(userId: number, type = MessengerGroupType.PRIVATE_CHAT)
{
this._userId = userId;
this._chats = [];
this._type = type;
}
public addChat(message: MessengerThreadChat): void
{
this._chats.push(message);
}
public get userId(): number
{
return this._userId;
}
public get chats(): MessengerThreadChat[]
{
return this._chats;
}
public get type(): number
{
return this._type;
}
public set type(type: number)
{
this._type = type;
}
}
@@ -0,0 +1,7 @@
import { CreateLinkEvent } from '@nitrots/nitro-renderer';
export function OpenMessengerChat(friendId: number = 0): void
{
if(friendId === 0) CreateLinkEvent('friends-messenger/toggle');
else CreateLinkEvent(`friends-messenger/${ friendId }`);
}
+11
View File
@@ -0,0 +1,11 @@
export * from './GetGroupChatData';
export * from './IGroupChatData';
export * from './MessengerFriend';
export * from './MessengerGroupType';
export * from './MessengerIconState';
export * from './MessengerRequest';
export * from './MessengerSettings';
export * from './MessengerThread';
export * from './MessengerThreadChat';
export * from './MessengerThreadChatGroup';
export * from './OpenMessengerChat';
@@ -0,0 +1,7 @@
import { GroupInformationComposer } from '@nitrots/nitro-renderer';
import { SendMessageComposer } from '../nitro';
export function GetGroupInformation(groupId: number): void
{
SendMessageComposer(new GroupInformationComposer(groupId, true));
}
@@ -0,0 +1,6 @@
import { CreateLinkEvent } from '@nitrots/nitro-renderer';
export function GetGroupManager(groupId: number): void
{
CreateLinkEvent(`groups/manage/${ groupId }`);
}
@@ -0,0 +1,7 @@
import { CreateLinkEvent } from '@nitrots/nitro-renderer';
export function GetGroupMembers(groupId: number, levelId?: number): void
{
if(!levelId) CreateLinkEvent(`group-members/${ groupId }`);
else CreateLinkEvent(`group-members/${ groupId }/${ levelId }`);
}
@@ -0,0 +1,30 @@
export class GroupBadgePart
{
public static BASE: string = 'b';
public static SYMBOL: string = 's';
public type: string;
public key: number;
public color: number;
public position: number;
constructor(type: string, key?: number, color?: number, position?: number)
{
this.type = type;
this.key = key ? key : 0;
this.color = color ? color : 0;
this.position = position ? position : 4;
}
public get code(): string
{
if((this.key === 0) && (this.type !== GroupBadgePart.BASE)) return null;
return GroupBadgePart.getCode(this.type, this.key, this.color, this.position);
}
public static getCode(type: string, key: number, color: number, position: number): string
{
return type + (key < 10 ? '0' : '') + key + (color < 10 ? '0' : '') + color + position;
}
}
@@ -0,0 +1,6 @@
export class GroupMembershipType
{
public static NOT_MEMBER: number = 0;
public static MEMBER: number = 1;
public static REQUEST_PENDING: number = 2;
}

Some files were not shown because too many files have changed in this diff Show More