@vlydev/cs2-masked-inspect-ts 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/cjs/GenCode.d.ts +49 -0
- package/dist/cjs/GenCode.d.ts.map +1 -0
- package/dist/cjs/GenCode.js +141 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +7 -1
- package/dist/esm/GenCode.d.ts +49 -0
- package/dist/esm/GenCode.d.ts.map +1 -0
- package/dist/esm/GenCode.js +134 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -45,6 +45,31 @@ InspectLink.isMasked('steam://...csgo_econ_action_preview%20A0011...'); // true
|
|
|
45
45
|
InspectLink.isClassic('steam://...csgo_econ_action_preview%20S123A456D789'); // true — classic S/A/D format
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
+
## Gen codes
|
|
49
|
+
|
|
50
|
+
Generate a Steam inspect URL from item parameters (defindex, paintindex, paintseed, paintwear):
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { generate, toGenCode, parseGenCode, ItemPreviewData } from '@vlydev/cs2-masked-inspect-ts';
|
|
54
|
+
|
|
55
|
+
// Generate a Steam inspect URL from item parameters
|
|
56
|
+
const url = generate(7, 474, 306, 0.22540508);
|
|
57
|
+
// steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20...
|
|
58
|
+
|
|
59
|
+
// Convert ItemPreviewData to a gen code string
|
|
60
|
+
const item = new ItemPreviewData({ defIndex: 7, paintIndex: 474, paintSeed: 306, paintWear: 0.22540508 });
|
|
61
|
+
toGenCode(item); // "!gen 7 474 306 0.22540508"
|
|
62
|
+
toGenCode(item, '!g'); // "!g 7 474 306 0.22540508"
|
|
63
|
+
|
|
64
|
+
// Parse a gen code back to ItemPreviewData
|
|
65
|
+
parseGenCode('!gen 7 474 306 0.22540508');
|
|
66
|
+
|
|
67
|
+
// Convert an existing inspect link directly to a gen code
|
|
68
|
+
import { genCodeFromLink } from '@vlydev/cs2-masked-inspect-ts';
|
|
69
|
+
const code = genCodeFromLink('steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20001A...');
|
|
70
|
+
// "!gen 7 474 306 0.22540508"
|
|
71
|
+
```
|
|
72
|
+
|
|
48
73
|
## API
|
|
49
74
|
|
|
50
75
|
### `InspectLink`
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gen code utilities for CS2 inspect links.
|
|
3
|
+
*
|
|
4
|
+
* Gen codes are space-separated command strings used on community servers:
|
|
5
|
+
* !gen {defindex} {paintindex} {paintseed} {paintwear}
|
|
6
|
+
* !gen ... {s0_id} {s0_wear} {s1_id} {s1_wear} {s2_id} {s2_wear} {s3_id} {s3_wear} {s4_id} {s4_wear} [{kc_id} {kc_wear} ...]
|
|
7
|
+
*
|
|
8
|
+
* Stickers are always padded to 5 slot pairs. Keychains follow without padding.
|
|
9
|
+
*/
|
|
10
|
+
import { ItemPreviewData } from './ItemPreviewData.ts';
|
|
11
|
+
import { Sticker } from './Sticker.ts';
|
|
12
|
+
export declare const INSPECT_BASE = "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20";
|
|
13
|
+
/**
|
|
14
|
+
* Convert an ItemPreviewData to a gen code string.
|
|
15
|
+
* @param item - The item to convert.
|
|
16
|
+
* @param prefix - The command prefix, defaults to `"!gen"`.
|
|
17
|
+
* @returns A gen code like `"!gen 7 474 306 0.22540508"`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function toGenCode(item: ItemPreviewData, prefix?: string): string;
|
|
20
|
+
export interface GenerateOptions {
|
|
21
|
+
rarity?: number;
|
|
22
|
+
quality?: number;
|
|
23
|
+
stickers?: Sticker[];
|
|
24
|
+
keychains?: Sticker[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generate a full Steam inspect URL from item parameters.
|
|
28
|
+
* @param defIndex - Weapon definition ID (e.g. 7 = AK-47)
|
|
29
|
+
* @param paintIndex - Skin/paint ID
|
|
30
|
+
* @param paintSeed - Pattern index (0-1000)
|
|
31
|
+
* @param paintWear - Float value (0.0-1.0)
|
|
32
|
+
* @param opts - Optional item properties
|
|
33
|
+
* @returns Full `steam://rungame/...` inspect URL
|
|
34
|
+
*/
|
|
35
|
+
export declare function generate(defIndex: number, paintIndex: number, paintSeed: number, paintWear: number, opts?: GenerateOptions): string;
|
|
36
|
+
/**
|
|
37
|
+
* Parse a gen code string into an ItemPreviewData.
|
|
38
|
+
* @param genCode - A gen code string like `"!gen 7 474 306 0.22540508"`
|
|
39
|
+
* @returns Parsed ItemPreviewData
|
|
40
|
+
* @throws {Error} If the code has fewer than 4 tokens.
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* Generate a gen code string from an existing CS2 inspect link.
|
|
44
|
+
* @param hexOrUrl - A hex payload or full steam:// inspect URL.
|
|
45
|
+
* @param prefix - The command prefix (default "!gen").
|
|
46
|
+
*/
|
|
47
|
+
export declare function genCodeFromLink(hexOrUrl: string, prefix?: string): string;
|
|
48
|
+
export declare function parseGenCode(genCode: string): ItemPreviewData;
|
|
49
|
+
//# sourceMappingURL=GenCode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenCode.d.ts","sourceRoot":"","sources":["../../src/GenCode.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,eAAO,MAAM,YAAY,uEAAuE,CAAC;AAkCjG;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,GAAE,MAAe,GAAG,MAAM,CAmBhF;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,eAAoB,GACzB,MAAM,CAQR;AAED;;;;;GAKG;AACH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAe,GAAG,MAAM,CAGjF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAwC7D"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Gen code utilities for CS2 inspect links.
|
|
4
|
+
*
|
|
5
|
+
* Gen codes are space-separated command strings used on community servers:
|
|
6
|
+
* !gen {defindex} {paintindex} {paintseed} {paintwear}
|
|
7
|
+
* !gen ... {s0_id} {s0_wear} {s1_id} {s1_wear} {s2_id} {s2_wear} {s3_id} {s3_wear} {s4_id} {s4_wear} [{kc_id} {kc_wear} ...]
|
|
8
|
+
*
|
|
9
|
+
* Stickers are always padded to 5 slot pairs. Keychains follow without padding.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.INSPECT_BASE = void 0;
|
|
13
|
+
exports.toGenCode = toGenCode;
|
|
14
|
+
exports.generate = generate;
|
|
15
|
+
exports.genCodeFromLink = genCodeFromLink;
|
|
16
|
+
exports.parseGenCode = parseGenCode;
|
|
17
|
+
const ItemPreviewData_ts_1 = require("./ItemPreviewData.js");
|
|
18
|
+
const Sticker_ts_1 = require("./Sticker.js");
|
|
19
|
+
const InspectLink_ts_1 = require("./InspectLink.js");
|
|
20
|
+
exports.INSPECT_BASE = 'steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20';
|
|
21
|
+
/** Format a float, stripping trailing zeros (max 8 decimal places). */
|
|
22
|
+
function formatFloat(value) {
|
|
23
|
+
let s = value.toFixed(8).replace(/0+$/, '').replace(/\.$/, '');
|
|
24
|
+
return s || '0';
|
|
25
|
+
}
|
|
26
|
+
function serializeStickerPairs(stickers, padTo) {
|
|
27
|
+
const result = [];
|
|
28
|
+
const filtered = stickers.filter(s => s.stickerId !== 0);
|
|
29
|
+
if (padTo !== undefined) {
|
|
30
|
+
const slotMap = new Map(filtered.map(s => [s.slot, s]));
|
|
31
|
+
for (let slot = 0; slot < padTo; slot++) {
|
|
32
|
+
const s = slotMap.get(slot);
|
|
33
|
+
if (s) {
|
|
34
|
+
result.push(String(s.stickerId));
|
|
35
|
+
result.push(formatFloat(s.wear !== null ? s.wear : 0));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
result.push('0', '0');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const sorted = [...filtered].sort((a, b) => a.slot - b.slot);
|
|
44
|
+
for (const s of sorted) {
|
|
45
|
+
result.push(String(s.stickerId));
|
|
46
|
+
result.push(formatFloat(s.wear !== null ? s.wear : 0));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convert an ItemPreviewData to a gen code string.
|
|
53
|
+
* @param item - The item to convert.
|
|
54
|
+
* @param prefix - The command prefix, defaults to `"!gen"`.
|
|
55
|
+
* @returns A gen code like `"!gen 7 474 306 0.22540508"`.
|
|
56
|
+
*/
|
|
57
|
+
function toGenCode(item, prefix = '!gen') {
|
|
58
|
+
const wearStr = item.paintWear !== null ? formatFloat(item.paintWear) : '0';
|
|
59
|
+
const parts = [
|
|
60
|
+
String(item.defIndex),
|
|
61
|
+
String(item.paintIndex),
|
|
62
|
+
String(item.paintSeed),
|
|
63
|
+
wearStr,
|
|
64
|
+
];
|
|
65
|
+
const hasStickers = item.stickers.some(s => s.stickerId !== 0);
|
|
66
|
+
const hasKeychains = item.keychains.some(s => s.stickerId !== 0);
|
|
67
|
+
if (hasStickers || hasKeychains) {
|
|
68
|
+
parts.push(...serializeStickerPairs(item.stickers, 5));
|
|
69
|
+
parts.push(...serializeStickerPairs(item.keychains));
|
|
70
|
+
}
|
|
71
|
+
const payload = parts.join(' ');
|
|
72
|
+
return prefix ? `${prefix} ${payload}` : payload;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate a full Steam inspect URL from item parameters.
|
|
76
|
+
* @param defIndex - Weapon definition ID (e.g. 7 = AK-47)
|
|
77
|
+
* @param paintIndex - Skin/paint ID
|
|
78
|
+
* @param paintSeed - Pattern index (0-1000)
|
|
79
|
+
* @param paintWear - Float value (0.0-1.0)
|
|
80
|
+
* @param opts - Optional item properties
|
|
81
|
+
* @returns Full `steam://rungame/...` inspect URL
|
|
82
|
+
*/
|
|
83
|
+
function generate(defIndex, paintIndex, paintSeed, paintWear, opts = {}) {
|
|
84
|
+
const { rarity = 0, quality = 0, stickers = [], keychains = [] } = opts;
|
|
85
|
+
const data = new ItemPreviewData_ts_1.ItemPreviewData({
|
|
86
|
+
defIndex, paintIndex, paintSeed, paintWear,
|
|
87
|
+
rarity, quality, stickers, keychains,
|
|
88
|
+
});
|
|
89
|
+
const hex = InspectLink_ts_1.InspectLink.serialize(data);
|
|
90
|
+
return `${exports.INSPECT_BASE}${hex}`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Parse a gen code string into an ItemPreviewData.
|
|
94
|
+
* @param genCode - A gen code string like `"!gen 7 474 306 0.22540508"`
|
|
95
|
+
* @returns Parsed ItemPreviewData
|
|
96
|
+
* @throws {Error} If the code has fewer than 4 tokens.
|
|
97
|
+
*/
|
|
98
|
+
/**
|
|
99
|
+
* Generate a gen code string from an existing CS2 inspect link.
|
|
100
|
+
* @param hexOrUrl - A hex payload or full steam:// inspect URL.
|
|
101
|
+
* @param prefix - The command prefix (default "!gen").
|
|
102
|
+
*/
|
|
103
|
+
function genCodeFromLink(hexOrUrl, prefix = '!gen') {
|
|
104
|
+
const item = InspectLink_ts_1.InspectLink.deserialize(hexOrUrl);
|
|
105
|
+
return toGenCode(item, prefix);
|
|
106
|
+
}
|
|
107
|
+
function parseGenCode(genCode) {
|
|
108
|
+
let tokens = genCode.trim().split(/\s+/);
|
|
109
|
+
if (tokens[0] && tokens[0].startsWith('!')) {
|
|
110
|
+
tokens = tokens.slice(1);
|
|
111
|
+
}
|
|
112
|
+
if (tokens.length < 4) {
|
|
113
|
+
throw new Error(`Gen code must have at least 4 tokens, got: "${genCode}"`);
|
|
114
|
+
}
|
|
115
|
+
const defIndex = parseInt(tokens[0], 10);
|
|
116
|
+
const paintIndex = parseInt(tokens[1], 10);
|
|
117
|
+
const paintSeed = parseInt(tokens[2], 10);
|
|
118
|
+
const paintWear = parseFloat(tokens[3]);
|
|
119
|
+
let rest = tokens.slice(4);
|
|
120
|
+
const stickers = [];
|
|
121
|
+
const keychains = [];
|
|
122
|
+
if (rest.length >= 10) {
|
|
123
|
+
const stickerTokens = rest.slice(0, 10);
|
|
124
|
+
for (let slot = 0; slot < 5; slot++) {
|
|
125
|
+
const sid = parseInt(stickerTokens[slot * 2], 10);
|
|
126
|
+
const wear = parseFloat(stickerTokens[slot * 2 + 1]);
|
|
127
|
+
if (sid !== 0) {
|
|
128
|
+
stickers.push(new Sticker_ts_1.Sticker({ slot, stickerId: sid, wear }));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
rest = rest.slice(10);
|
|
132
|
+
}
|
|
133
|
+
for (let i = 0; i + 1 < rest.length; i += 2) {
|
|
134
|
+
const sid = parseInt(rest[i], 10);
|
|
135
|
+
const wear = parseFloat(rest[i + 1]);
|
|
136
|
+
if (sid !== 0) {
|
|
137
|
+
keychains.push(new Sticker_ts_1.Sticker({ slot: i / 2, stickerId: sid, wear }));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return new ItemPreviewData_ts_1.ItemPreviewData({ defIndex, paintIndex, paintSeed, paintWear, stickers, keychains });
|
|
141
|
+
}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -7,4 +7,6 @@ export { crc32 } from './crc32.ts';
|
|
|
7
7
|
export { ProtoReader } from './proto/reader.ts';
|
|
8
8
|
export type { ProtoField } from './proto/reader.ts';
|
|
9
9
|
export { ProtoWriter } from './proto/writer.ts';
|
|
10
|
+
export { toGenCode, generate, parseGenCode, genCodeFromLink, INSPECT_BASE } from './GenCode.ts';
|
|
11
|
+
export type { GenerateOptions } from './GenCode.ts';
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChG,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ProtoWriter = exports.ProtoReader = exports.crc32 = exports.Sticker = exports.ItemPreviewData = exports.InspectLink = void 0;
|
|
3
|
+
exports.INSPECT_BASE = exports.genCodeFromLink = exports.parseGenCode = exports.generate = exports.toGenCode = exports.ProtoWriter = exports.ProtoReader = exports.crc32 = exports.Sticker = exports.ItemPreviewData = exports.InspectLink = void 0;
|
|
4
4
|
var InspectLink_ts_1 = require("./InspectLink.js");
|
|
5
5
|
Object.defineProperty(exports, "InspectLink", { enumerable: true, get: function () { return InspectLink_ts_1.InspectLink; } });
|
|
6
6
|
var ItemPreviewData_ts_1 = require("./ItemPreviewData.js");
|
|
@@ -13,3 +13,9 @@ var reader_ts_1 = require("./proto/reader.js");
|
|
|
13
13
|
Object.defineProperty(exports, "ProtoReader", { enumerable: true, get: function () { return reader_ts_1.ProtoReader; } });
|
|
14
14
|
var writer_ts_1 = require("./proto/writer.js");
|
|
15
15
|
Object.defineProperty(exports, "ProtoWriter", { enumerable: true, get: function () { return writer_ts_1.ProtoWriter; } });
|
|
16
|
+
var GenCode_ts_1 = require("./GenCode.js");
|
|
17
|
+
Object.defineProperty(exports, "toGenCode", { enumerable: true, get: function () { return GenCode_ts_1.toGenCode; } });
|
|
18
|
+
Object.defineProperty(exports, "generate", { enumerable: true, get: function () { return GenCode_ts_1.generate; } });
|
|
19
|
+
Object.defineProperty(exports, "parseGenCode", { enumerable: true, get: function () { return GenCode_ts_1.parseGenCode; } });
|
|
20
|
+
Object.defineProperty(exports, "genCodeFromLink", { enumerable: true, get: function () { return GenCode_ts_1.genCodeFromLink; } });
|
|
21
|
+
Object.defineProperty(exports, "INSPECT_BASE", { enumerable: true, get: function () { return GenCode_ts_1.INSPECT_BASE; } });
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gen code utilities for CS2 inspect links.
|
|
3
|
+
*
|
|
4
|
+
* Gen codes are space-separated command strings used on community servers:
|
|
5
|
+
* !gen {defindex} {paintindex} {paintseed} {paintwear}
|
|
6
|
+
* !gen ... {s0_id} {s0_wear} {s1_id} {s1_wear} {s2_id} {s2_wear} {s3_id} {s3_wear} {s4_id} {s4_wear} [{kc_id} {kc_wear} ...]
|
|
7
|
+
*
|
|
8
|
+
* Stickers are always padded to 5 slot pairs. Keychains follow without padding.
|
|
9
|
+
*/
|
|
10
|
+
import { ItemPreviewData } from './ItemPreviewData.ts';
|
|
11
|
+
import { Sticker } from './Sticker.ts';
|
|
12
|
+
export declare const INSPECT_BASE = "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20";
|
|
13
|
+
/**
|
|
14
|
+
* Convert an ItemPreviewData to a gen code string.
|
|
15
|
+
* @param item - The item to convert.
|
|
16
|
+
* @param prefix - The command prefix, defaults to `"!gen"`.
|
|
17
|
+
* @returns A gen code like `"!gen 7 474 306 0.22540508"`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function toGenCode(item: ItemPreviewData, prefix?: string): string;
|
|
20
|
+
export interface GenerateOptions {
|
|
21
|
+
rarity?: number;
|
|
22
|
+
quality?: number;
|
|
23
|
+
stickers?: Sticker[];
|
|
24
|
+
keychains?: Sticker[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generate a full Steam inspect URL from item parameters.
|
|
28
|
+
* @param defIndex - Weapon definition ID (e.g. 7 = AK-47)
|
|
29
|
+
* @param paintIndex - Skin/paint ID
|
|
30
|
+
* @param paintSeed - Pattern index (0-1000)
|
|
31
|
+
* @param paintWear - Float value (0.0-1.0)
|
|
32
|
+
* @param opts - Optional item properties
|
|
33
|
+
* @returns Full `steam://rungame/...` inspect URL
|
|
34
|
+
*/
|
|
35
|
+
export declare function generate(defIndex: number, paintIndex: number, paintSeed: number, paintWear: number, opts?: GenerateOptions): string;
|
|
36
|
+
/**
|
|
37
|
+
* Parse a gen code string into an ItemPreviewData.
|
|
38
|
+
* @param genCode - A gen code string like `"!gen 7 474 306 0.22540508"`
|
|
39
|
+
* @returns Parsed ItemPreviewData
|
|
40
|
+
* @throws {Error} If the code has fewer than 4 tokens.
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* Generate a gen code string from an existing CS2 inspect link.
|
|
44
|
+
* @param hexOrUrl - A hex payload or full steam:// inspect URL.
|
|
45
|
+
* @param prefix - The command prefix (default "!gen").
|
|
46
|
+
*/
|
|
47
|
+
export declare function genCodeFromLink(hexOrUrl: string, prefix?: string): string;
|
|
48
|
+
export declare function parseGenCode(genCode: string): ItemPreviewData;
|
|
49
|
+
//# sourceMappingURL=GenCode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenCode.d.ts","sourceRoot":"","sources":["../../src/GenCode.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,eAAO,MAAM,YAAY,uEAAuE,CAAC;AAkCjG;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,GAAE,MAAe,GAAG,MAAM,CAmBhF;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,eAAoB,GACzB,MAAM,CAQR;AAED;;;;;GAKG;AACH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAe,GAAG,MAAM,CAGjF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAwC7D"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gen code utilities for CS2 inspect links.
|
|
3
|
+
*
|
|
4
|
+
* Gen codes are space-separated command strings used on community servers:
|
|
5
|
+
* !gen {defindex} {paintindex} {paintseed} {paintwear}
|
|
6
|
+
* !gen ... {s0_id} {s0_wear} {s1_id} {s1_wear} {s2_id} {s2_wear} {s3_id} {s3_wear} {s4_id} {s4_wear} [{kc_id} {kc_wear} ...]
|
|
7
|
+
*
|
|
8
|
+
* Stickers are always padded to 5 slot pairs. Keychains follow without padding.
|
|
9
|
+
*/
|
|
10
|
+
import { ItemPreviewData } from "./ItemPreviewData.js";
|
|
11
|
+
import { Sticker } from "./Sticker.js";
|
|
12
|
+
import { InspectLink } from "./InspectLink.js";
|
|
13
|
+
export const INSPECT_BASE = 'steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20';
|
|
14
|
+
/** Format a float, stripping trailing zeros (max 8 decimal places). */
|
|
15
|
+
function formatFloat(value) {
|
|
16
|
+
let s = value.toFixed(8).replace(/0+$/, '').replace(/\.$/, '');
|
|
17
|
+
return s || '0';
|
|
18
|
+
}
|
|
19
|
+
function serializeStickerPairs(stickers, padTo) {
|
|
20
|
+
const result = [];
|
|
21
|
+
const filtered = stickers.filter(s => s.stickerId !== 0);
|
|
22
|
+
if (padTo !== undefined) {
|
|
23
|
+
const slotMap = new Map(filtered.map(s => [s.slot, s]));
|
|
24
|
+
for (let slot = 0; slot < padTo; slot++) {
|
|
25
|
+
const s = slotMap.get(slot);
|
|
26
|
+
if (s) {
|
|
27
|
+
result.push(String(s.stickerId));
|
|
28
|
+
result.push(formatFloat(s.wear !== null ? s.wear : 0));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
result.push('0', '0');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const sorted = [...filtered].sort((a, b) => a.slot - b.slot);
|
|
37
|
+
for (const s of sorted) {
|
|
38
|
+
result.push(String(s.stickerId));
|
|
39
|
+
result.push(formatFloat(s.wear !== null ? s.wear : 0));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Convert an ItemPreviewData to a gen code string.
|
|
46
|
+
* @param item - The item to convert.
|
|
47
|
+
* @param prefix - The command prefix, defaults to `"!gen"`.
|
|
48
|
+
* @returns A gen code like `"!gen 7 474 306 0.22540508"`.
|
|
49
|
+
*/
|
|
50
|
+
export function toGenCode(item, prefix = '!gen') {
|
|
51
|
+
const wearStr = item.paintWear !== null ? formatFloat(item.paintWear) : '0';
|
|
52
|
+
const parts = [
|
|
53
|
+
String(item.defIndex),
|
|
54
|
+
String(item.paintIndex),
|
|
55
|
+
String(item.paintSeed),
|
|
56
|
+
wearStr,
|
|
57
|
+
];
|
|
58
|
+
const hasStickers = item.stickers.some(s => s.stickerId !== 0);
|
|
59
|
+
const hasKeychains = item.keychains.some(s => s.stickerId !== 0);
|
|
60
|
+
if (hasStickers || hasKeychains) {
|
|
61
|
+
parts.push(...serializeStickerPairs(item.stickers, 5));
|
|
62
|
+
parts.push(...serializeStickerPairs(item.keychains));
|
|
63
|
+
}
|
|
64
|
+
const payload = parts.join(' ');
|
|
65
|
+
return prefix ? `${prefix} ${payload}` : payload;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Generate a full Steam inspect URL from item parameters.
|
|
69
|
+
* @param defIndex - Weapon definition ID (e.g. 7 = AK-47)
|
|
70
|
+
* @param paintIndex - Skin/paint ID
|
|
71
|
+
* @param paintSeed - Pattern index (0-1000)
|
|
72
|
+
* @param paintWear - Float value (0.0-1.0)
|
|
73
|
+
* @param opts - Optional item properties
|
|
74
|
+
* @returns Full `steam://rungame/...` inspect URL
|
|
75
|
+
*/
|
|
76
|
+
export function generate(defIndex, paintIndex, paintSeed, paintWear, opts = {}) {
|
|
77
|
+
const { rarity = 0, quality = 0, stickers = [], keychains = [] } = opts;
|
|
78
|
+
const data = new ItemPreviewData({
|
|
79
|
+
defIndex, paintIndex, paintSeed, paintWear,
|
|
80
|
+
rarity, quality, stickers, keychains,
|
|
81
|
+
});
|
|
82
|
+
const hex = InspectLink.serialize(data);
|
|
83
|
+
return `${INSPECT_BASE}${hex}`;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse a gen code string into an ItemPreviewData.
|
|
87
|
+
* @param genCode - A gen code string like `"!gen 7 474 306 0.22540508"`
|
|
88
|
+
* @returns Parsed ItemPreviewData
|
|
89
|
+
* @throws {Error} If the code has fewer than 4 tokens.
|
|
90
|
+
*/
|
|
91
|
+
/**
|
|
92
|
+
* Generate a gen code string from an existing CS2 inspect link.
|
|
93
|
+
* @param hexOrUrl - A hex payload or full steam:// inspect URL.
|
|
94
|
+
* @param prefix - The command prefix (default "!gen").
|
|
95
|
+
*/
|
|
96
|
+
export function genCodeFromLink(hexOrUrl, prefix = '!gen') {
|
|
97
|
+
const item = InspectLink.deserialize(hexOrUrl);
|
|
98
|
+
return toGenCode(item, prefix);
|
|
99
|
+
}
|
|
100
|
+
export function parseGenCode(genCode) {
|
|
101
|
+
let tokens = genCode.trim().split(/\s+/);
|
|
102
|
+
if (tokens[0] && tokens[0].startsWith('!')) {
|
|
103
|
+
tokens = tokens.slice(1);
|
|
104
|
+
}
|
|
105
|
+
if (tokens.length < 4) {
|
|
106
|
+
throw new Error(`Gen code must have at least 4 tokens, got: "${genCode}"`);
|
|
107
|
+
}
|
|
108
|
+
const defIndex = parseInt(tokens[0], 10);
|
|
109
|
+
const paintIndex = parseInt(tokens[1], 10);
|
|
110
|
+
const paintSeed = parseInt(tokens[2], 10);
|
|
111
|
+
const paintWear = parseFloat(tokens[3]);
|
|
112
|
+
let rest = tokens.slice(4);
|
|
113
|
+
const stickers = [];
|
|
114
|
+
const keychains = [];
|
|
115
|
+
if (rest.length >= 10) {
|
|
116
|
+
const stickerTokens = rest.slice(0, 10);
|
|
117
|
+
for (let slot = 0; slot < 5; slot++) {
|
|
118
|
+
const sid = parseInt(stickerTokens[slot * 2], 10);
|
|
119
|
+
const wear = parseFloat(stickerTokens[slot * 2 + 1]);
|
|
120
|
+
if (sid !== 0) {
|
|
121
|
+
stickers.push(new Sticker({ slot, stickerId: sid, wear }));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
rest = rest.slice(10);
|
|
125
|
+
}
|
|
126
|
+
for (let i = 0; i + 1 < rest.length; i += 2) {
|
|
127
|
+
const sid = parseInt(rest[i], 10);
|
|
128
|
+
const wear = parseFloat(rest[i + 1]);
|
|
129
|
+
if (sid !== 0) {
|
|
130
|
+
keychains.push(new Sticker({ slot: i / 2, stickerId: sid, wear }));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return new ItemPreviewData({ defIndex, paintIndex, paintSeed, paintWear, stickers, keychains });
|
|
134
|
+
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -7,4 +7,6 @@ export { crc32 } from './crc32.ts';
|
|
|
7
7
|
export { ProtoReader } from './proto/reader.ts';
|
|
8
8
|
export type { ProtoField } from './proto/reader.ts';
|
|
9
9
|
export { ProtoWriter } from './proto/writer.ts';
|
|
10
|
+
export { toGenCode, generate, parseGenCode, genCodeFromLink, INSPECT_BASE } from './GenCode.ts';
|
|
11
|
+
export type { GenerateOptions } from './GenCode.ts';
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChG,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -4,3 +4,4 @@ export { Sticker } from "./Sticker.js";
|
|
|
4
4
|
export { crc32 } from "./crc32.js";
|
|
5
5
|
export { ProtoReader } from "./proto/reader.js";
|
|
6
6
|
export { ProtoWriter } from "./proto/writer.js";
|
|
7
|
+
export { toGenCode, generate, parseGenCode, genCodeFromLink, INSPECT_BASE } from "./GenCode.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vlydev/cs2-masked-inspect-ts",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Offline encoder/decoder for CS2 masked inspect URLs — TypeScript, fully typed, no dependencies",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
22
|
"build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json",
|
|
23
|
-
"test": "node --experimental-strip-types --test tests
|
|
23
|
+
"test": "node --experimental-strip-types --test tests/*.test.ts",
|
|
24
24
|
"prepublishOnly": "npm run build"
|
|
25
25
|
},
|
|
26
26
|
"keywords": [
|