├── .editorconfig
├── .github
├── FUNDING.yml
└── stale.yml
├── .gitignore
├── .ncurc.js
├── EncryptedStorage.js
├── LICENSE
├── README.md
├── build
├── icon.ico
├── icon.png
└── icons
│ └── 256x256.png
├── changelog.md
├── dev-app-update.yml
├── helpers
├── protos.js
└── util.js
├── html
├── css
│ ├── bootstrap.min.css
│ ├── bootstrap.min.css.map
│ ├── main.css
│ └── material-icons.css
├── encryption_setup.html
├── font
│ └── MaterialIcons-Regular.woff2
├── img
│ ├── prime.svg
│ └── skillgroups
│ │ ├── dangerzone0.svg
│ │ ├── dangerzone1.svg
│ │ ├── dangerzone10.svg
│ │ ├── dangerzone11.svg
│ │ ├── dangerzone12.svg
│ │ ├── dangerzone13.svg
│ │ ├── dangerzone14.svg
│ │ ├── dangerzone15.svg
│ │ ├── dangerzone2.svg
│ │ ├── dangerzone3.svg
│ │ ├── dangerzone4.svg
│ │ ├── dangerzone5.svg
│ │ ├── dangerzone6.svg
│ │ ├── dangerzone7.svg
│ │ ├── dangerzone8.svg
│ │ ├── dangerzone9.svg
│ │ ├── dangerzone_expired.svg
│ │ ├── dangerzone_none.svg
│ │ ├── skillgroup0.svg
│ │ ├── skillgroup1.svg
│ │ ├── skillgroup10.svg
│ │ ├── skillgroup11.svg
│ │ ├── skillgroup12.svg
│ │ ├── skillgroup13.svg
│ │ ├── skillgroup14.svg
│ │ ├── skillgroup15.svg
│ │ ├── skillgroup16.svg
│ │ ├── skillgroup17.svg
│ │ ├── skillgroup18.svg
│ │ ├── skillgroup2.svg
│ │ ├── skillgroup3.svg
│ │ ├── skillgroup4.svg
│ │ ├── skillgroup5.svg
│ │ ├── skillgroup6.svg
│ │ ├── skillgroup7.svg
│ │ ├── skillgroup8.svg
│ │ ├── skillgroup9.svg
│ │ ├── skillgroup_expired.svg
│ │ ├── skillgroup_none.svg
│ │ ├── wingman0.svg
│ │ ├── wingman1.svg
│ │ ├── wingman10.svg
│ │ ├── wingman11.svg
│ │ ├── wingman12.svg
│ │ ├── wingman13.svg
│ │ ├── wingman14.svg
│ │ ├── wingman15.svg
│ │ ├── wingman16.svg
│ │ ├── wingman17.svg
│ │ ├── wingman18.svg
│ │ ├── wingman2.svg
│ │ ├── wingman3.svg
│ │ ├── wingman4.svg
│ │ ├── wingman5.svg
│ │ ├── wingman6.svg
│ │ ├── wingman7.svg
│ │ ├── wingman8.svg
│ │ ├── wingman9.svg
│ │ ├── wingman_expired.svg
│ │ └── wingman_none.svg
├── index.html
├── js
│ ├── bootstrap.bundle.min.js
│ ├── bootstrap.bundle.min.js.map
│ └── front.js
└── password.html
├── icons
└── icon.png
├── main.js
├── package-lock.json
├── package.json
├── preload.js
└── protos
├── base_gcmessages.proto
├── cstrike15_gcmessages.proto
└── gcsdk_gcmessages.proto
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig is awesome: https://EditorConfig.org
2 |
3 | root = true
4 |
5 | [*]
6 | end_of_line = lf
7 | charset = utf-8
8 |
9 | [*.js]
10 | indent_size = 2
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | ko_fi: nezu_
4 |
--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | # Number of days of inactivity before an issue becomes stale
2 | daysUntilStale: 60
3 | # Number of days of inactivity before a stale issue is closed
4 | daysUntilClose: 7
5 | # Issues with these labels will never be considered stale
6 | exemptLabels:
7 | - pinned
8 | - security
9 | - enhancement
10 | # Label to use when marking an issue as stale
11 | staleLabel: wontfix
12 | # Comment to post when marking an issue as stale. Set to `false` to disable
13 | markComment: >
14 | This issue has been automatically marked as stale because it has not had
15 | recent activity. It will be closed if no further activity occurs. Thank you
16 | for your contributions.
17 | # Comment to post when closing a stale issue. Set to `false` to disable
18 | closeComment: false
19 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | out/
3 | dist/
4 | publish.sh
--------------------------------------------------------------------------------
/.ncurc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | target: (dependencyName, parsedVersion) => {
3 | return dependencyName === 'protobufjs' ? 'minor' : 'latest'
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/EncryptedStorage.js:
--------------------------------------------------------------------------------
1 | let JSONdb = require('simple-json-db');
2 | let crypto = require('crypto');
3 | const { pbkdf2: deriveKey } = require("pbkdf2");
4 | const events = require('events');
5 | const util = require('util');
6 | const fs = require("fs");
7 |
8 | const DERIVATION_ROUNDS = 200000;
9 | const HMAC_KEY_SIZE = 32;
10 | const PASSWORD_KEY_SIZE = 32;
11 |
12 | const defaultOptions = {
13 | asyncWrite: false,
14 | syncOnWrite: true,
15 | jsonSpaces: 4,
16 | stringify: JSON.stringify,
17 | parse: JSON.parse
18 | };
19 |
20 | function pbkdf2(password, salt, rounds, bits) {
21 | return new Promise((resolve, reject) => {
22 | deriveKey(password, salt, rounds, bits / 8, "sha256", (err, key) => {
23 | if (err) {
24 | return reject(err);
25 | }
26 | return resolve(key);
27 | });
28 | });
29 | }
30 |
31 | async function deriveFromPassword(password, salt, rounds) {
32 | if (!password) {
33 | throw new Error("Failed deriving key: Password must be provided");
34 | }
35 | if (!salt) {
36 | throw new Error("Failed deriving key: Salt must be provided");
37 | }
38 | if (!rounds || rounds <= 0 || typeof rounds !== "number") {
39 | throw new Error("Failed deriving key: Rounds must be greater than 0");
40 | }
41 | const bits = (PASSWORD_KEY_SIZE + HMAC_KEY_SIZE) * 8;
42 | const derivedKeyData = await pbkdf2(password, salt, rounds, bits);
43 | const derivedKeyHex = derivedKeyData.toString("hex");
44 | return Buffer.from(derivedKeyHex.substr(0, derivedKeyHex.length / 2), "hex");
45 | }
46 |
47 | function generateSalt(length) {
48 | if (length <= 0) {
49 | throw new Error(`Failed generating salt: Invalid length supplied: ${length}`);
50 | }
51 | let output = "";
52 | while (output.length < length) {
53 | output += crypto.randomBytes(3).toString("base64");
54 | if (output.length > length) {
55 | output = output.substr(0, length);
56 | }
57 | }
58 | return output;
59 | }
60 |
61 | function validateJSON(fileContent) {
62 | try {
63 | JSON.parse(fileContent);
64 | } catch (e) {
65 | throw new Error('Given filePath is not empty and its content is not valid JSON.');
66 | }
67 | return true;
68 | };
69 |
70 | class EncryptedStorage {
71 |
72 | /**
73 | * Main constructor, manages existing storage file and parses options against default ones.
74 | * @param {string} filePath The path of the file to use as storage.
75 | * @param {string} iv Encryption initialization vector
76 | * @param {string} salt Password salt used to derive the key
77 | * @param {string} password Encryption password
78 | * @param {object} [options] Configuration options.
79 | * @param {boolean} [options.asyncWrite] Enables the storage to be asynchronously written to disk. Disabled by default (synchronous behaviour).
80 | * @param {boolean} [options.syncOnWrite] Makes the storage be written to disk after every modification. Enabled by default.
81 | * @param {boolean} [options.syncOnWrite] Makes the storage be written to disk after every modification. Enabled by default.
82 | * @param {number} [options.jsonSpaces] How many spaces to use for indentation in the output json files. Default = 4
83 | * @param {object} [options.newData] Data that will be encrypted for the first time
84 | * @constructor
85 | */
86 | constructor(filePath, password, options) {
87 | // Mandatory arguments check
88 | if (!filePath || !filePath.length) {
89 | throw new Error('Missing file path argument.');
90 | } else {
91 | this.filePath = filePath;
92 | }
93 |
94 | // Options parsing
95 | if (options) {
96 | for (let key in defaultOptions) {
97 | if (!options.hasOwnProperty(key)) options[key] = defaultOptions[key];
98 | }
99 | this.options = options;
100 | } else {
101 | this.options = defaultOptions;
102 | }
103 |
104 | this.storage = {};
105 |
106 | if (!this.options.newData) {
107 | // File existence check
108 | let stats;
109 | try {
110 | stats = fs.statSync(filePath);
111 | } catch (err) {
112 | if (err.code === 'ENOENT') {
113 | /* File doesn't exist */
114 | this.iv = crypto.randomBytes(16).toString('hex');
115 | this.salt = generateSalt(12);
116 |
117 | deriveFromPassword(password, this.salt, DERIVATION_ROUNDS).then(derivedKey => {
118 | try {
119 | this.derivedKey = derivedKey;
120 | this.sync();
121 | this.emit('loaded');
122 | } catch (error) {
123 | this.emit('error', error);
124 | }
125 | });
126 | return;
127 | } else if (err.code === 'EACCES') {
128 | throw new Error(`Cannot access path "${filePath}".`);
129 | } else {
130 | // Other error
131 | throw new Error(`Error while checking for existence of path "${filePath}": ${err}`);
132 | }
133 | }
134 | /* File exists */
135 | try {
136 | fs.accessSync(filePath, fs.constants.R_OK | fs.constants.W_OK);
137 | } catch (err) {
138 | throw new Error(`Cannot read & write on path "${filePath}". Check permissions!`);
139 | }
140 | if (stats.size > 0) {
141 | let data;
142 | try {
143 | data = fs.readFileSync(filePath);
144 | } catch (err) {
145 | throw err;
146 | }
147 | if (validateJSON(data)) {
148 | const input_data = JSON.parse(data);
149 |
150 | if (!input_data.iv || !input_data.salt || !input_data.data) {
151 | throw new Error('Invalid file');
152 | }
153 |
154 | this.iv = input_data.iv;
155 | this.salt = input_data.salt;
156 |
157 | deriveFromPassword(password, this.salt, DERIVATION_ROUNDS).then(derivedKey => {
158 | try {
159 | this.derivedKey = derivedKey;
160 |
161 | const decryptTool = crypto.createDecipheriv("aes-256-cbc", this.derivedKey, Buffer.from(this.iv, 'hex'));
162 | let decryptedData = decryptTool.update(input_data.data, "base64", "utf8");
163 | decryptedData += decryptTool.final("utf8");
164 |
165 | if (validateJSON(decryptedData)) {
166 | this.storage = JSON.parse(decryptedData);
167 | }
168 | this.emit('loaded');
169 | } catch (error) {
170 | this.emit('error', error);
171 | }
172 | });
173 | }
174 | }
175 | }
176 | else {
177 | this.iv = crypto.randomBytes(16).toString('hex');
178 | this.salt = generateSalt(12);
179 |
180 | deriveFromPassword(password, this.salt, DERIVATION_ROUNDS).then(derivedKey => {
181 | try {
182 | this.derivedKey = derivedKey;
183 | this.storage = options.newData;
184 | this.sync();
185 | this.emit('loaded');
186 | } catch (error) {
187 | this.emit('error', error);
188 | }
189 | });
190 | }
191 |
192 | }
193 |
194 | sync() {
195 | const json = JSON.stringify(this.storage, null, this.options.jsonSpaces);
196 |
197 | const encryptTool = crypto.createCipheriv("aes-256-cbc", this.derivedKey, Buffer.from(this.iv, 'hex'));
198 |
199 | let encryptedData = encryptTool.update(json, "utf8", "base64");
200 | encryptedData += encryptTool.final("base64");
201 |
202 | const finalJson = JSON.stringify({
203 | iv: this.iv,
204 | salt: this.salt,
205 | data: encryptedData
206 | })
207 |
208 | if (this.options && this.options.asyncWrite) {
209 | fs.writeFile(this.filePath, finalJson, (err) => {
210 | if (err) throw err;
211 | });
212 | } else {
213 | try {
214 | fs.writeFileSync(this.filePath, finalJson);
215 | } catch (err) {
216 | if (err.code === 'EACCES') {
217 | throw new Error(`Cannot access path "${this.filePath}".`);
218 | } else {
219 | throw new Error(`Error while writing to path "${this.filePath}": ${err}`);
220 | }
221 | }
222 | }
223 | }
224 | }
225 |
226 | util.inherits(JSONdb, events.EventEmitter);
227 | util.inherits(EncryptedStorage, JSONdb);
228 |
229 | module.exports = EncryptedStorage;
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # CS:GO account checker
2 |
3 | > [!WARNING]
4 | > Currently broken due to missing cs2 support!
5 |
6 | [](https://github.com/dumbasPL/csgo-checker/releases/latest)
7 |
8 | ## Checks CS:GO accounts for:
9 | - bans (vac/overwatch/untrusted)
10 | - cooldowns (abandon, team damage, etc)
11 | - matchmaking rank/wins/rank expiration time (competitive, wingman and dangerzone)
12 | - CS:GO profile rank
13 | - prime status
14 | - steam profile name
15 |
16 | ## Additional features:
17 | - import/export form/to `user:pass` combo file
18 | - steam guard mobile authenticator shared secrets supported
19 | - mass refresh
20 | - copy password to clipboard
21 | - copy CS:GO friend code to clipboard
22 | - copy mobile steam 2fa code to clipboard (requires shared secret to be set)
23 | - search bar
24 | - tags
25 | - sorting
26 | - steam guard protected accounts supported
27 |
28 | ## screenshots
29 | 
30 |
--------------------------------------------------------------------------------
/build/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dumbasPL/csgo-checker/731232d0e443070440522eebfa0fa636f5d91f63/build/icon.ico
--------------------------------------------------------------------------------
/build/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dumbasPL/csgo-checker/731232d0e443070440522eebfa0fa636f5d91f63/build/icon.png
--------------------------------------------------------------------------------
/build/icons/256x256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dumbasPL/csgo-checker/731232d0e443070440522eebfa0fa636f5d91f63/build/icons/256x256.png
--------------------------------------------------------------------------------
/changelog.md:
--------------------------------------------------------------------------------
1 | # 1.4.4
2 | - bug fixes
3 |
4 | # 1.4.3
5 | - updated to the new steam authentication method (this fixes [#30](https://github.com/dumbasPL/csgo-checker/issues/30))
6 | - updated to electron 25
7 | - dropped Windows 7/8/8.1 support
8 |
9 | # 1.4.2
10 | - fix accounts failing to load when using encryption
11 |
12 | # 1.4.1
13 | - updated to electron 22
14 | - updated dependencies
15 |
16 | # 1.4.0
17 | - added linux support
18 |
19 | # 1.3.1
20 | - fixed danger zone rank names (thanks @TheEnderOfficial)
21 |
22 | # 1.3.0
23 | - added copy steam guard code button (thanks @TheEnderOfficial)
24 |
25 | # 1.2.0
26 | - updated to electron 16
27 | - updated dependencies
28 | - added portable version
29 |
30 | # 1.1.2
31 | - fixed auto updater
32 |
33 | # 1.1.1
34 | - fixed sorting algorithm causing changes to account data
35 |
36 | # 1.1.0
37 | - added support for shared secrets ([#5](https://github.com/dumbasPL/csgo-checker/issues/5))
38 | - added new cooldown reason `Reports (Grief)`
39 | - added encryption (can be enabled in settings)
40 | - search and sorting now updates correctly when account data changes ([#6](https://github.com/dumbasPL/csgo-checker/issues/6))
41 | - fixed tooltips not disappearing after deleting account without confirmation
42 |
43 | # 1.0.2
44 | - fixed tags not being saved when adding new account
45 | - fixed some action buttons not working on newly added accounts
46 | - fixed accounts not automatically refreshing after being added
47 |
48 | # 1.0.1
49 | - fixed overwatch bans showing remaining time
50 | - updated checker logic to latest game update
51 |
52 | # 1.0.0
53 |
54 | **⚠️ Data storage format changed, please refresh all accounts for ranks to display correctly ⚠️**
55 |
56 | - ui overhaul
57 | - migrated ui from materializecss to bootstrap
58 | - added changelog
59 | - added dangerzone ranks
60 | - added rank icons
61 | - added rank expiration time
62 | - added search bar
63 | - added ability to sort accounts by `login`, `name`, `lvl`, `prime starts`, `rank`, `ban status`
64 | - added option to export all accounts as `user:pass` combo list
65 | - added tags
66 | - added option to edit accounts
67 | - added settings
68 | - added `delete all accounts` button in settings
69 | - updated icon to match the new theme
70 | - changed minimum window width to `1100px`
71 | - changed minimum window height to `625px`
72 | - ranks are now saved as numbers instead of names
73 |
74 | # 0.1.8
75 | - fixed autoupdater
76 |
77 | # 0.1.7
78 | - fixed missing `open in browser` button accidentally deleted in last release
79 |
80 | # 0.1.6
81 | - errors no longer reset account info
82 | - set minimum window width to 960px
83 | - added copy friend code button
84 |
85 | # 0.1.5
86 | - renamed to CS:GO account checker to more accurately represent the main task of this software
87 | - added checking for prime
88 | - added icon
89 | - added installer
90 | - added auto-updater
91 | - minor bug fixes
92 |
93 | # 0.1.4
94 | - fixed overwatch bans appearing as VAC bans
95 | - added Steam Guard support
96 |
97 | # 0.1.3
98 | - added wingman ranks
99 | - added import from combo list (`user:pass` format, one per line)
100 | - added delete confirmation(ctrl + click to delete without confirmation)
101 | - added option to open steam profile in the browser for account
102 | - made navbar and table header sticky
103 | - changed icon for "copy password"
104 | - fixed some bugs
105 |
106 | # 0.1.2
107 | - added private levels
108 | - added community ban detection
109 |
110 | # 0.1.1
111 | - first release
112 |
113 | # 0.1.0
114 | - initial pre-release
--------------------------------------------------------------------------------
/dev-app-update.yml:
--------------------------------------------------------------------------------
1 | owner: dumbasPL
2 | repo: csgo-checker
3 | provider: github
4 | updaterCacheDirName: csgo-checker-updater
5 |
--------------------------------------------------------------------------------
/helpers/protos.js:
--------------------------------------------------------------------------------
1 | const Protobuf = require("protobufjs");
2 | const fs = require("fs");
3 | const path = require("path");
4 |
5 | module.exports = Protos;
6 |
7 | function Protos(protos, ignoreErrors = true) {
8 | const protobufs = {};
9 |
10 | for (let proto of protos) {
11 | let root = new Protobuf.Root();
12 | let files = Array.isArray(proto.protos) ? proto.protos : fs.readdirSync(proto.protos).map(file => path.join(proto.protos, file));
13 |
14 | for (let file of files) {
15 | if (!file.endsWith(".proto") || !fs.existsSync(file)) {
16 | continue;
17 | }
18 |
19 | try {
20 | root = root.loadSync(file, {
21 | keepCase: true
22 | });
23 | } catch (err) {
24 | if (!ignoreErrors) {
25 | throw err;
26 | }
27 | };
28 | }
29 |
30 | protobufs[proto.name] = root;
31 | }
32 |
33 | return protobufs;
34 | }
--------------------------------------------------------------------------------
/helpers/util.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | penalty_reason_string,
3 | penalty_reason_permanent,
4 | protoDecode,
5 | protoEncode
6 | }
7 |
8 | function penalty_reason_string(id) {
9 | switch (id)
10 | {
11 | case 0: return 0;
12 | case 1: return "Kicked";
13 | case 2: return "TK Limit";
14 | case 3: return "TK Spawn";
15 | case 4: return "Disconnected Too Long";
16 | case 5: return "Abandon";
17 | case 6: return "TD Limit";
18 | case 7: return "TD Spawn";
19 | case 8:
20 | case 14: return "Untrusted";
21 | case 9: return "Kicked Too Much";
22 | case 10: return "Overwatch (Cheat)";
23 | case 11: return "Overwatch (Grief)";
24 | case 16: return "Failed To Connect";
25 | case 17: return "Kick Abuse";
26 | case 18:
27 | case 19:
28 | case 20: return "Rank Calibration";
29 | case 21: return "Reports (Grief)"
30 | default: return `Unknown(${id})`;
31 | }
32 | }
33 |
34 | function penalty_reason_permanent(id) {
35 | switch (id)
36 | {
37 | case 8:
38 | case 14:
39 | case 10:
40 | return true;
41 | default:
42 | return false;
43 | }
44 | }
45 |
46 | function protoDecode(proto, obj) {
47 | return proto.toObject(proto.decode(obj), { defaults: true });
48 | }
49 |
50 | function protoEncode(proto, obj) {
51 | return proto.encode(proto.create(obj)).finish();
52 | }
--------------------------------------------------------------------------------
/html/css/main.css:
--------------------------------------------------------------------------------
1 | body {
2 | background: #222;
3 | overflow: hidden;
4 | }
5 |
6 | main::-webkit-scrollbar {
7 | width: 6px;
8 | }
9 |
10 | main::-webkit-scrollbar-track {
11 | background-color: #222;
12 | }
13 |
14 | main::-webkit-scrollbar-thumb {
15 | background: #555;
16 | border-radius: 10px;
17 | }
18 |
19 | main::-webkit-scrollbar-thumb:hover {
20 | background: #999;
21 | }
22 |
23 | main {
24 | position: fixed;
25 | top: 3.5em;
26 | bottom: 0;
27 | right: 0;
28 | left: 0;
29 | overflow-y: scroll;
30 | }
31 |
32 | .material-icons {
33 | vertical-align: middle;
34 | }
35 |
36 | .prime-green {
37 | filter: brightness(0) saturate(100%) invert(32%) sepia(100%) saturate(1307%) hue-rotate(93deg) brightness(98%) contrast(105%);
38 | }
39 |
40 | .prime-red {
41 | filter: brightness(0) saturate(100%) invert(16%) sepia(42%) saturate(6385%) hue-rotate(355deg) brightness(100%) contrast(100%);
42 | }
43 |
44 | .rank-image {
45 | height: 26px;
46 | }
47 |
48 | #main-table tr td:last-child, .prime, .level, .login, .steam_name, .rank {
49 | white-space: nowrap;
50 | width: 1%;
51 | }
52 |
53 | .rank {
54 | padding-left: 0 !important;
55 | padding-right: 0 !important;
56 | }
57 |
58 | .actions {
59 | text-align: right;
60 | }
61 |
62 | #main-table th {
63 | border-bottom: 0;
64 | position: sticky;
65 | top: 0;
66 | z-index: 1;
67 | }
68 |
69 | .prime img {
70 | height: 26px;
71 | }
72 |
73 | .form-control-color {
74 | width: 40px;
75 | }
76 |
77 | table tr td.preloader {
78 | display: none;
79 | }
80 |
81 | table tr.pending td.preloader {
82 | display: table-cell;
83 | }
84 |
85 | table tr.pending td:not(.login):not(.preloader) {
86 | display: none;
87 | }
88 |
89 | .preloader .progress {
90 | margin: 5.5px;
91 | }
92 |
93 | th {
94 | box-shadow: inset 0 -1px var(--bs-danger) !important;
95 | user-select: none;
96 | }
97 |
98 | .tooltip-inner {
99 | max-width: 500px !important;
100 | }
101 |
102 | th > .material-icons {
103 | font-size: 1.3em;
104 | }
105 |
106 | th {
107 | white-space: nowrap;
108 | }
109 |
110 | .sortable {
111 | cursor: pointer;
112 | }
113 |
114 | .sort-asc, .sort-desc {
115 | display: none;
116 | }
117 |
118 | th.sortable[data-sort-dir="ASC"] .sort-asc, th.sortable[data-sort-dir="DESC"] .sort-desc {
119 | display: inline-block;
120 | }
121 |
122 | .setup-encryption .btn-success {
123 | display: initial;
124 | }
125 |
126 | #setup-encryption.encrypted .btn-success {
127 | display: none;
128 | }
129 |
130 | #setup-encryption .btn-danger {
131 | display: none;
132 | }
133 |
134 | #setup-encryption.encrypted .btn-danger {
135 | display: initial;
136 | }
137 |
--------------------------------------------------------------------------------
/html/css/material-icons.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'Material Icons';
3 | font-style: normal;
4 | font-weight: 400;
5 | src: url(../font/MaterialIcons-Regular.woff2) format('woff2');
6 | }
7 |
8 | .material-icons {
9 | font-family: 'Material Icons';
10 | font-weight: normal;
11 | font-style: normal;
12 | font-size: 24px;
13 | line-height: 1;
14 | letter-spacing: normal;
15 | text-transform: none;
16 | display: inline-block;
17 | white-space: nowrap;
18 | word-wrap: normal;
19 | direction: ltr;
20 | -webkit-font-feature-settings: 'liga';
21 | font-feature-settings: 'liga';
22 | -webkit-font-smoothing: antialiased;
23 | }
--------------------------------------------------------------------------------
/html/encryption_setup.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | CS:GO account checker
8 |
9 |
10 |
11 |
12 |
13 |
32 |
55 |
56 |
--------------------------------------------------------------------------------
/html/font/MaterialIcons-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dumbasPL/csgo-checker/731232d0e443070440522eebfa0fa636f5d91f63/html/font/MaterialIcons-Regular.woff2
--------------------------------------------------------------------------------
/html/img/prime.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
94 |
--------------------------------------------------------------------------------
/html/img/skillgroups/dangerzone0.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
71 |
--------------------------------------------------------------------------------
/html/img/skillgroups/dangerzone2.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
178 |
--------------------------------------------------------------------------------
/html/img/skillgroups/dangerzone3.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
198 |
--------------------------------------------------------------------------------
/html/img/skillgroups/dangerzone5.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
228 |
--------------------------------------------------------------------------------
/html/img/skillgroups/dangerzone_expired.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
56 |
--------------------------------------------------------------------------------
/html/img/skillgroups/dangerzone_none.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
71 |
--------------------------------------------------------------------------------
/html/img/skillgroups/skillgroup0.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
58 |
--------------------------------------------------------------------------------
/html/img/skillgroups/skillgroup_expired.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
49 |
--------------------------------------------------------------------------------
/html/img/skillgroups/skillgroup_none.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
57 |
--------------------------------------------------------------------------------
/html/img/skillgroups/wingman0.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
68 |
--------------------------------------------------------------------------------
/html/img/skillgroups/wingman1.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
146 |
--------------------------------------------------------------------------------
/html/img/skillgroups/wingman14.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
219 |
--------------------------------------------------------------------------------
/html/img/skillgroups/wingman2.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
147 |
--------------------------------------------------------------------------------
/html/img/skillgroups/wingman3.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
168 |
--------------------------------------------------------------------------------
/html/img/skillgroups/wingman5.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
304 |
--------------------------------------------------------------------------------
/html/img/skillgroups/wingman_expired.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
59 |
--------------------------------------------------------------------------------
/html/img/skillgroups/wingman_none.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
66 |
--------------------------------------------------------------------------------
/html/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | CS:GO account checker
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
46 |
47 |
48 |
49 |
50 |
51 |
52 | login
53 | arrow_drop_up
54 | arrow_drop_down
55 | |
56 |
57 | name
58 | arrow_drop_up
59 | arrow_drop_down
60 | |
61 |
62 | tags
63 | |
64 |
65 | lvl
66 | arrow_drop_up
67 | arrow_drop_down
68 | |
69 |
70 |
71 | arrow_drop_up
72 | arrow_drop_down
73 | |
74 |
75 | comp
76 | arrow_drop_up
77 | arrow_drop_down
78 | |
79 |
80 | wm
81 | arrow_drop_up
82 | arrow_drop_down
83 | |
84 |
85 | dz
86 | arrow_drop_up
87 | arrow_drop_down
88 | |
89 |
90 | ban/error
91 | arrow_drop_up
92 | arrow_drop_down
93 | |
94 |
95 | action
96 | |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 | |
109 |
110 |
113 | |
114 | |
115 | |
116 | |
117 |
118 |
119 | |
120 |
121 |
122 | |
123 |
124 |
125 | |
126 |
127 |
128 | |
129 | |
130 |
131 |
132 | people
133 |
134 |
135 | password
136 |
137 |
138 | vpn_key
139 |
140 |
141 | launch
142 |
143 |
144 | refresh
145 |
146 |
147 | delete
148 |
149 |
150 | edit
151 |
152 | |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
167 |
168 |
169 |
170 |
181 |
182 |
183 |
188 |
189 |
190 |
191 |
192 |
193 |
196 |
197 | Are you sure you want to delete the account?
198 |
199 |
203 |
204 |
205 |
206 |
207 |
247 |
248 |
269 |
270 |
307 |
308 |
309 |
310 |
311 |
314 |
315 | Are you sure you want to delete all accounts?
316 | This can not be undone!
317 |
318 |
322 |
323 |
324 |
325 |
326 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
--------------------------------------------------------------------------------
/html/password.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | CS:GO account checker
8 |
9 |
10 |
11 |
12 |
13 |
27 |
45 |
46 |
--------------------------------------------------------------------------------
/icons/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dumbasPL/csgo-checker/731232d0e443070440522eebfa0fa636f5d91f63/icons/icon.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "csgo-checker",
3 | "version": "1.4.4",
4 | "description": "Check CS:GO accounts for bans/cooldowns/wins/ranks",
5 | "main": "main.js",
6 | "scripts": {
7 | "start": "electron .",
8 | "build": "electron-builder --win --linux",
9 | "build:windows": "electron-builder --win",
10 | "build:linux": "electron-builder --linux",
11 | "publish": "electron-builder --win --linux --publish always"
12 | },
13 | "author": "dumbasPL",
14 | "license": "GPL-3.0-or-later",
15 | "dependencies": {
16 | "axios": "^1.4.0",
17 | "csgo-friendcode": "^3.0.3",
18 | "electron-is-dev": "^2.0.0",
19 | "electron-reload": "^1.5.0",
20 | "electron-updater": "^6.1.1",
21 | "fast-deep-equal": "^3.1.3",
22 | "pbkdf2": "^3.1.2",
23 | "protobufjs": "^6.11.4",
24 | "showdown": "^2.1.0",
25 | "simple-json-db": "^2.0.0",
26 | "steam-totp": "^2.1.2",
27 | "steam-user": "^4.29.1"
28 | },
29 | "devDependencies": {
30 | "electron": "^25.8.4",
31 | "electron-builder": "^24.13.3"
32 | },
33 | "build": {
34 | "appId": "cc.nezu.csgochecker",
35 | "productName": "CSGO account checker",
36 | "win": {
37 | "artifactName": "CSGO Checker installer.${ext}",
38 | "target": [
39 | "nsis",
40 | "portable"
41 | ]
42 | },
43 | "portable": {
44 | "artifactName": "csgo-checker_portable.${ext}"
45 | },
46 | "linux": {
47 | "artifactName": "${name}_${arch}-${version}.${ext}",
48 | "synopsis": "CS:GO account checker",
49 | "category": "Utility",
50 | "maintainer": "nezu ",
51 | "target": [
52 | "AppImage",
53 | "flatpak",
54 | "tar.gz",
55 | "deb"
56 | ]
57 | },
58 | "publish": [
59 | {
60 | "provider": "github",
61 | "owner": "dumbasPL",
62 | "repo": "csgo-checker"
63 | }
64 | ]
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/preload.js:
--------------------------------------------------------------------------------
1 | const { contextBridge, ipcRenderer, clipboard, shell } = require("electron");
2 | const equal = require('fast-deep-equal');
3 | const friendCode = require("csgo-friendcode");
4 | var showdown = require('showdown');
5 | const md_converter = new showdown.Converter();
6 |
7 | contextBridge.exposeInMainWorld("ipcRenderer", {
8 | send: (channel, data) => {
9 | ipcRenderer.send(channel, data);
10 | },
11 | on: (channel, func) => {
12 | ipcRenderer.on(channel, (...args) => func(...args));
13 | },
14 | invoke: (chanel, ...args) => {
15 | return ipcRenderer.invoke(chanel, ...args);
16 | }
17 | });
18 |
19 | contextBridge.exposeInMainWorld('fastEqual', {
20 | equal: (...args) => equal(...args)
21 | });
22 |
23 | contextBridge.exposeInMainWorld('friendCode', {
24 | encode: (steamId) => friendCode.encode(steamId)
25 | });
26 |
27 | contextBridge.exposeInMainWorld('clipboard', {
28 | writeText: (text, type) => clipboard.writeText(text, type)
29 | });
30 |
31 | contextBridge.exposeInMainWorld('shell', {
32 | openExternal: (url, options) => shell.openExternal(url, options)
33 | });
34 |
35 | contextBridge.exposeInMainWorld('md_converter', {
36 | makeHtml: (markdown) => md_converter.makeHtml(markdown)
37 | });
--------------------------------------------------------------------------------
/protos/base_gcmessages.proto:
--------------------------------------------------------------------------------
1 | import "steammessages.proto";
2 |
3 | option optimize_for = SPEED;
4 | option cc_generic_services = false;
5 |
6 | enum EGCBaseMsg {
7 | k_EMsgGCSystemMessage = 4001;
8 | k_EMsgGCReplicateConVars = 4002;
9 | k_EMsgGCConVarUpdated = 4003;
10 | k_EMsgGCInQueue = 4008;
11 | k_EMsgGCInviteToParty = 4501;
12 | k_EMsgGCInvitationCreated = 4502;
13 | k_EMsgGCPartyInviteResponse = 4503;
14 | k_EMsgGCKickFromParty = 4504;
15 | k_EMsgGCLeaveParty = 4505;
16 | k_EMsgGCServerAvailable = 4506;
17 | k_EMsgGCClientConnectToServer = 4507;
18 | k_EMsgGCGameServerInfo = 4508;
19 | k_EMsgGCError = 4509;
20 | k_EMsgGCReplay_UploadedToYouTube = 4510;
21 | k_EMsgGCLANServerAvailable = 4511;
22 | }
23 |
24 | enum EGCBaseProtoObjectTypes {
25 | k_EProtoObjectPartyInvite = 1001;
26 | k_EProtoObjectLobbyInvite = 1002;
27 | }
28 |
29 | enum GC_BannedWordType {
30 | GC_BANNED_WORD_DISABLE_WORD = 0;
31 | GC_BANNED_WORD_ENABLE_WORD = 1;
32 | }
33 |
34 | message CGCStorePurchaseInit_LineItem {
35 | optional uint32 item_def_id = 1;
36 | optional uint32 quantity = 2;
37 | optional uint32 cost_in_local_currency = 3;
38 | optional uint32 purchase_type = 4;
39 | }
40 |
41 | message CMsgGCStorePurchaseInit {
42 | optional string country = 1;
43 | optional int32 language = 2;
44 | optional int32 currency = 3;
45 | repeated .CGCStorePurchaseInit_LineItem line_items = 4;
46 | }
47 |
48 | message CMsgGCStorePurchaseInitResponse {
49 | optional int32 result = 1;
50 | optional uint64 txn_id = 2;
51 | optional string url = 3;
52 | repeated uint64 item_ids = 4;
53 | }
54 |
55 | message CSOPartyInvite {
56 | optional uint64 group_id = 1 [(key_field) = true];
57 | optional fixed64 sender_id = 2;
58 | optional string sender_name = 3;
59 | }
60 |
61 | message CSOLobbyInvite {
62 | optional uint64 group_id = 1 [(key_field) = true];
63 | optional fixed64 sender_id = 2;
64 | optional string sender_name = 3;
65 | }
66 |
67 | message CMsgSystemBroadcast {
68 | optional string message = 1;
69 | }
70 |
71 | message CMsgInviteToParty {
72 | optional fixed64 steam_id = 1;
73 | optional uint32 client_version = 2;
74 | optional uint32 team_invite = 3;
75 | }
76 |
77 | message CMsgInvitationCreated {
78 | optional uint64 group_id = 1;
79 | optional fixed64 steam_id = 2;
80 | }
81 |
82 | message CMsgPartyInviteResponse {
83 | optional uint64 party_id = 1;
84 | optional bool accept = 2;
85 | optional uint32 client_version = 3;
86 | optional uint32 team_invite = 4;
87 | }
88 |
89 | message CMsgKickFromParty {
90 | optional fixed64 steam_id = 1;
91 | }
92 |
93 | message CMsgLeaveParty {
94 | }
95 |
96 | message CMsgServerAvailable {
97 | }
98 |
99 | message CMsgLANServerAvailable {
100 | optional fixed64 lobby_id = 1;
101 | }
102 |
103 | message CSOEconGameAccountClient {
104 | optional uint32 additional_backpack_slots = 1 [default = 0];
105 | optional fixed32 bonus_xp_timestamp_refresh = 12;
106 | optional uint32 bonus_xp_usedflags = 13;
107 | optional uint32 elevated_state = 14;
108 | optional uint32 elevated_timestamp = 15;
109 | }
110 |
111 | message CSOItemCriteriaCondition {
112 | optional int32 op = 1;
113 | optional string field = 2;
114 | optional bool required = 3;
115 | optional float float_value = 4;
116 | optional string string_value = 5;
117 | }
118 |
119 | message CSOItemCriteria {
120 | optional uint32 item_level = 1;
121 | optional int32 item_quality = 2;
122 | optional bool item_level_set = 3;
123 | optional bool item_quality_set = 4;
124 | optional uint32 initial_inventory = 5;
125 | optional uint32 initial_quantity = 6;
126 | optional bool ignore_enabled_flag = 8;
127 | repeated .CSOItemCriteriaCondition conditions = 9;
128 | optional int32 item_rarity = 10;
129 | optional bool item_rarity_set = 11;
130 | optional bool recent_only = 12;
131 | }
132 |
133 | message CSOItemRecipe {
134 | optional uint32 def_index = 1;
135 | optional string name = 2;
136 | optional string n_a = 3;
137 | optional string desc_inputs = 4;
138 | optional string desc_outputs = 5;
139 | optional string di_a = 6;
140 | optional string di_b = 7;
141 | optional string di_c = 8;
142 | optional string do_a = 9;
143 | optional string do_b = 10;
144 | optional string do_c = 11;
145 | optional bool requires_all_same_class = 12;
146 | optional bool requires_all_same_slot = 13;
147 | optional int32 class_usage_for_output = 14;
148 | optional int32 slot_usage_for_output = 15;
149 | optional int32 set_for_output = 16;
150 | repeated .CSOItemCriteria input_items_criteria = 20;
151 | repeated .CSOItemCriteria output_items_criteria = 21;
152 | repeated uint32 input_item_dupe_counts = 22;
153 | }
154 |
155 | message CMsgDevNewItemRequest {
156 | optional fixed64 receiver = 1;
157 | optional .CSOItemCriteria criteria = 2;
158 | }
159 |
160 | message CMsgIncrementKillCountAttribute {
161 | optional fixed32 killer_account_id = 1;
162 | optional fixed32 victim_account_id = 2;
163 | optional uint64 item_id = 3;
164 | optional uint32 event_type = 4;
165 | optional uint32 amount = 5;
166 | }
167 |
168 | message CMsgApplySticker {
169 | optional uint64 sticker_item_id = 1;
170 | optional uint64 item_item_id = 2;
171 | optional uint32 sticker_slot = 3;
172 | optional uint32 baseitem_defidx = 4;
173 | optional float sticker_wear = 5;
174 | }
175 |
176 | message CMsgModifyItemAttribute {
177 | optional uint64 item_id = 1;
178 | optional uint32 attr_defidx = 2;
179 | optional uint32 attr_value = 3;
180 | }
181 |
182 | message CMsgApplyStatTrakSwap {
183 | optional uint64 tool_item_id = 1;
184 | optional uint64 item_1_item_id = 2;
185 | optional uint64 item_2_item_id = 3;
186 | }
187 |
188 | message CMsgApplyStrangePart {
189 | optional uint64 strange_part_item_id = 1;
190 | optional uint64 item_item_id = 2;
191 | }
192 |
193 | message CMsgApplyPennantUpgrade {
194 | optional uint64 upgrade_item_id = 1;
195 | optional uint64 pennant_item_id = 2;
196 | }
197 |
198 | message CMsgApplyEggEssence {
199 | optional uint64 essence_item_id = 1;
200 | optional uint64 egg_item_id = 2;
201 | }
202 |
203 | message CSOEconItemAttribute {
204 | optional uint32 def_index = 1;
205 | optional uint32 value = 2;
206 | optional bytes value_bytes = 3;
207 | }
208 |
209 | message CSOEconItemEquipped {
210 | optional uint32 new_class = 1;
211 | optional uint32 new_slot = 2;
212 | }
213 |
214 | message CSOEconItem {
215 | optional uint64 id = 1;
216 | optional uint32 account_id = 2;
217 | optional uint32 inventory = 3;
218 | optional uint32 def_index = 4;
219 | optional uint32 quantity = 5;
220 | optional uint32 level = 6;
221 | optional uint32 quality = 7;
222 | optional uint32 flags = 8 [default = 0];
223 | optional uint32 origin = 9;
224 | optional string custom_name = 10;
225 | optional string custom_desc = 11;
226 | repeated .CSOEconItemAttribute attribute = 12;
227 | optional .CSOEconItem interior_item = 13;
228 | optional bool in_use = 14 [default = false];
229 | optional uint32 style = 15 [default = 0];
230 | optional uint64 original_id = 16 [default = 0];
231 | repeated .CSOEconItemEquipped equipped_state = 18;
232 | optional uint32 rarity = 19;
233 | }
234 |
235 | message CMsgAdjustItemEquippedState {
236 | optional uint64 item_id = 1;
237 | optional uint32 new_class = 2;
238 | optional uint32 new_slot = 3;
239 | optional bool swap = 4;
240 | }
241 |
242 | message CMsgAdjustItemEquippedStateMulti {
243 | repeated uint64 t_equips = 1;
244 | repeated uint64 ct_equips = 2;
245 | repeated uint64 noteam_equips = 3;
246 | }
247 |
248 | message CMsgSortItems {
249 | optional uint32 sort_type = 1;
250 | }
251 |
252 | message CSOEconClaimCode {
253 | optional uint32 account_id = 1;
254 | optional uint32 code_type = 2;
255 | optional uint32 time_acquired = 3;
256 | optional string code = 4;
257 | }
258 |
259 | message CMsgStoreGetUserData {
260 | optional fixed32 price_sheet_version = 1;
261 | optional int32 currency = 2;
262 | }
263 |
264 | message CMsgStoreGetUserDataResponse {
265 | optional int32 result = 1;
266 | optional int32 currency_deprecated = 2;
267 | optional string country_deprecated = 3;
268 | optional fixed32 price_sheet_version = 4;
269 | optional bytes price_sheet = 8;
270 | }
271 |
272 | message CMsgUpdateItemSchema {
273 | optional bytes items_game = 1;
274 | optional fixed32 item_schema_version = 2;
275 | optional string items_game_url_DEPRECATED2013 = 3;
276 | optional string items_game_url = 4;
277 | }
278 |
279 | message CMsgGCError {
280 | optional string error_text = 1;
281 | }
282 |
283 | message CMsgRequestInventoryRefresh {
284 | }
285 |
286 | message CMsgConVarValue {
287 | optional string name = 1;
288 | optional string value = 2;
289 | }
290 |
291 | message CMsgReplicateConVars {
292 | repeated .CMsgConVarValue convars = 1;
293 | }
294 |
295 | message CMsgUseItem {
296 | optional uint64 item_id = 1;
297 | optional fixed64 target_steam_id = 2;
298 | repeated uint32 gift__potential_targets = 3;
299 | optional uint32 duel__class_lock = 4;
300 | optional fixed64 initiator_steam_id = 5;
301 | }
302 |
303 | message CMsgReplayUploadedToYouTube {
304 | optional string youtube_url = 1;
305 | optional string youtube_account_name = 2;
306 | optional uint64 session_id = 3;
307 | }
308 |
309 | message CMsgConsumableExhausted {
310 | optional int32 item_def_id = 1;
311 | }
312 |
313 | message CMsgItemAcknowledged__DEPRECATED {
314 | optional uint32 account_id = 1;
315 | optional uint32 inventory = 2;
316 | optional uint32 def_index = 3;
317 | optional uint32 quality = 4;
318 | optional uint32 rarity = 5;
319 | optional uint32 origin = 6;
320 | optional uint64 item_id = 7;
321 | }
322 |
323 | message CMsgSetItemPositions {
324 | message ItemPosition {
325 | optional uint32 legacy_item_id = 1;
326 | optional uint32 position = 2;
327 | optional uint64 item_id = 3;
328 | }
329 |
330 | repeated .CMsgSetItemPositions.ItemPosition item_positions = 1;
331 | }
332 |
333 | message CMsgGCReportAbuse {
334 | optional fixed64 target_steam_id = 1;
335 | optional string description = 4;
336 | optional uint64 gid = 5;
337 | optional uint32 abuse_type = 2;
338 | optional uint32 content_type = 3;
339 | optional fixed32 target_game_server_ip = 6;
340 | optional uint32 target_game_server_port = 7;
341 | }
342 |
343 | message CMsgGCReportAbuseResponse {
344 | optional fixed64 target_steam_id = 1;
345 | optional uint32 result = 2;
346 | optional string error_message = 3;
347 | }
348 |
349 | message CMsgGCNameItemNotification {
350 | optional fixed64 player_steamid = 1;
351 | optional uint32 item_def_index = 2;
352 | optional string item_name_custom = 3;
353 | }
354 |
355 | message CMsgGCClientDisplayNotification {
356 | optional string notification_title_localization_key = 1;
357 | optional string notification_body_localization_key = 2;
358 | repeated string body_substring_keys = 3;
359 | repeated string body_substring_values = 4;
360 | }
361 |
362 | message CMsgGCShowItemsPickedUp {
363 | optional fixed64 player_steamid = 1;
364 | }
365 |
366 | message CMsgGCIncrementKillCountResponse {
367 | optional uint32 killer_account_id = 1 [(key_field) = true];
368 | optional uint32 num_kills = 2;
369 | optional uint32 item_def = 3;
370 | optional uint32 level_type = 4;
371 | }
372 |
373 | message CSOEconItemDropRateBonus {
374 | optional uint32 account_id = 1;
375 | optional fixed32 expiration_date = 2;
376 | optional float bonus = 3;
377 | optional uint32 bonus_count = 4;
378 | optional uint64 item_id = 5;
379 | optional uint32 def_index = 6;
380 | }
381 |
382 | message CSOEconItemLeagueViewPass {
383 | optional uint32 account_id = 1 [(key_field) = true];
384 | optional uint32 league_id = 2 [(key_field) = true];
385 | optional uint32 admin = 3;
386 | optional uint32 itemindex = 4;
387 | }
388 |
389 | message CSOEconItemEventTicket {
390 | optional uint32 account_id = 1;
391 | optional uint32 event_id = 2;
392 | optional uint64 item_id = 3;
393 | }
394 |
395 | message CMsgGCItemPreviewItemBoughtNotification {
396 | optional uint32 item_def_index = 1;
397 | }
398 |
399 | message CMsgGCStorePurchaseCancel {
400 | optional uint64 txn_id = 1;
401 | }
402 |
403 | message CMsgGCStorePurchaseCancelResponse {
404 | optional uint32 result = 1;
405 | }
406 |
407 | message CMsgGCStorePurchaseFinalize {
408 | optional uint64 txn_id = 1;
409 | }
410 |
411 | message CMsgGCStorePurchaseFinalizeResponse {
412 | optional uint32 result = 1;
413 | repeated uint64 item_ids = 2;
414 | }
415 |
416 | message CMsgGCBannedWordListRequest {
417 | optional uint32 ban_list_group_id = 1;
418 | optional uint32 word_id = 2;
419 | }
420 |
421 | message CMsgGCRequestAnnouncements {
422 | }
423 |
424 | message CMsgGCRequestAnnouncementsResponse {
425 | optional string announcement_title = 1;
426 | optional string announcement = 2;
427 | optional string nextmatch_title = 3;
428 | optional string nextmatch = 4;
429 | }
430 |
431 | message CMsgGCBannedWord {
432 | optional uint32 word_id = 1;
433 | optional .GC_BannedWordType word_type = 2 [default = GC_BANNED_WORD_DISABLE_WORD];
434 | optional string word = 3;
435 | }
436 |
437 | message CMsgGCBannedWordListResponse {
438 | optional uint32 ban_list_group_id = 1;
439 | repeated .CMsgGCBannedWord word_list = 2;
440 | }
441 |
442 | message CMsgGCToGCBannedWordListBroadcast {
443 | optional .CMsgGCBannedWordListResponse broadcast = 1;
444 | }
445 |
446 | message CMsgGCToGCBannedWordListUpdated {
447 | optional uint32 group_id = 1;
448 | }
449 |
450 | message CSOEconDefaultEquippedDefinitionInstanceClient {
451 | optional uint32 account_id = 1 [(key_field) = true];
452 | optional uint32 item_definition = 2;
453 | optional uint32 class_id = 3 [(key_field) = true];
454 | optional uint32 slot_id = 4 [(key_field) = true];
455 | }
456 |
457 | message CMsgGCToGCDirtySDOCache {
458 | optional uint32 sdo_type = 1;
459 | optional uint64 key_uint64 = 2;
460 | }
461 |
462 | message CMsgGCToGCDirtyMultipleSDOCache {
463 | optional uint32 sdo_type = 1;
464 | repeated uint64 key_uint64 = 2;
465 | }
466 |
467 | message CMsgGCCollectItem {
468 | optional uint64 collection_item_id = 1;
469 | optional uint64 subject_item_id = 2;
470 | }
471 |
472 | message CMsgSDONoMemcached {
473 | }
474 |
475 | message CMsgGCToGCUpdateSQLKeyValue {
476 | optional string key_name = 1;
477 | }
478 |
479 | message CMsgGCToGCIsTrustedServer {
480 | optional fixed64 steam_id = 1;
481 | }
482 |
483 | message CMsgGCToGCIsTrustedServerResponse {
484 | optional bool is_trusted = 1;
485 | }
486 |
487 | message CMsgGCToGCBroadcastConsoleCommand {
488 | optional string con_command = 1;
489 | }
490 |
491 | message CMsgGCServerVersionUpdated {
492 | optional uint32 server_version = 1;
493 | }
494 |
495 | message CMsgGCClientVersionUpdated {
496 | optional uint32 client_version = 1;
497 | }
498 |
499 | message CMsgGCToGCWebAPIAccountChanged {
500 | }
501 |
502 | message CMsgGCToGCRequestPassportItemGrant {
503 | optional fixed64 steam_id = 1;
504 | optional uint32 league_id = 2;
505 | optional int32 reward_flag = 3;
506 | }
507 |
508 | message CMsgGameServerInfo {
509 | enum ServerType {
510 | UNSPECIFIED = 0;
511 | GAME = 1;
512 | PROXY = 2;
513 | }
514 |
515 | optional fixed32 server_public_ip_addr = 1;
516 | optional fixed32 server_private_ip_addr = 2;
517 | optional uint32 server_port = 3;
518 | optional uint32 server_tv_port = 4;
519 | optional string server_key = 5;
520 | optional bool server_hibernation = 6;
521 | optional .CMsgGameServerInfo.ServerType server_type = 7 [default = UNSPECIFIED];
522 | optional uint32 server_region = 8;
523 | optional float server_loadavg = 9;
524 | optional float server_tv_broadcast_time = 10;
525 | optional float server_game_time = 11;
526 | optional fixed64 server_relay_connected_steam_id = 12;
527 | optional uint32 relay_slots_max = 13;
528 | optional int32 relays_connected = 14;
529 | optional int32 relay_clients_connected = 15;
530 | optional fixed64 relayed_game_server_steam_id = 16;
531 | optional uint32 parent_relay_count = 17;
532 | optional fixed64 tv_secret_code = 18;
533 | }
534 |
--------------------------------------------------------------------------------
/protos/gcsdk_gcmessages.proto:
--------------------------------------------------------------------------------
1 | import "steammessages.proto";
2 |
3 | option optimize_for = SPEED;
4 | option cc_generic_services = false;
5 |
6 | enum GCClientLauncherType {
7 | GCClientLauncherType_DEFAULT = 0;
8 | GCClientLauncherType_PERFECTWORLD = 1;
9 | GCClientLauncherType_STEAMCHINA = 2;
10 | }
11 |
12 | enum GCConnectionStatus {
13 | GCConnectionStatus_HAVE_SESSION = 0;
14 | GCConnectionStatus_GC_GOING_DOWN = 1;
15 | GCConnectionStatus_NO_SESSION = 2;
16 | GCConnectionStatus_NO_SESSION_IN_LOGON_QUEUE = 3;
17 | GCConnectionStatus_NO_STEAM = 4;
18 | }
19 |
20 | message CMsgSOIDOwner {
21 | optional uint32 type = 1;
22 | optional uint64 id = 2;
23 | }
24 |
25 | message CMsgSOSingleObject {
26 | optional int32 type_id = 2;
27 | optional bytes object_data = 3;
28 | optional fixed64 version = 4;
29 | optional .CMsgSOIDOwner owner_soid = 5;
30 | }
31 |
32 | message CMsgSOMultipleObjects {
33 | message SingleObject {
34 | option (msgpool_soft_limit) = 256;
35 | option (msgpool_hard_limit) = 1024;
36 |
37 | optional int32 type_id = 1;
38 | optional bytes object_data = 2;
39 | }
40 |
41 | repeated .CMsgSOMultipleObjects.SingleObject objects_modified = 2;
42 | optional fixed64 version = 3;
43 | optional .CMsgSOIDOwner owner_soid = 6;
44 | }
45 |
46 | message CMsgSOCacheSubscribed {
47 | message SubscribedType {
48 | optional int32 type_id = 1;
49 | repeated bytes object_data = 2;
50 | }
51 |
52 | repeated .CMsgSOCacheSubscribed.SubscribedType objects = 2;
53 | optional fixed64 version = 3;
54 | optional .CMsgSOIDOwner owner_soid = 4;
55 | }
56 |
57 | message CMsgSOCacheUnsubscribed {
58 | optional .CMsgSOIDOwner owner_soid = 2;
59 | }
60 |
61 | message CMsgSOCacheSubscriptionCheck {
62 | optional fixed64 version = 2;
63 | optional .CMsgSOIDOwner owner_soid = 3;
64 | }
65 |
66 | message CMsgSOCacheSubscriptionRefresh {
67 | optional .CMsgSOIDOwner owner_soid = 2;
68 | }
69 |
70 | message CMsgSOCacheVersion {
71 | optional fixed64 version = 1;
72 | }
73 |
74 | message CMsgAccountDetails {
75 | optional bool valid = 1;
76 | optional string account_name = 2;
77 | optional bool public_profile = 4;
78 | optional bool public_inventory = 5;
79 | optional bool vac_banned = 6;
80 | optional bool cyber_cafe = 7;
81 | optional bool school_account = 8;
82 | optional bool free_trial_account = 9;
83 | optional bool subscribed = 10;
84 | optional bool low_violence = 11;
85 | optional bool limited = 12;
86 | optional bool trusted = 13;
87 | optional uint32 package = 14;
88 | optional fixed32 time_cached = 15;
89 | optional bool account_locked = 16;
90 | optional bool community_banned = 17;
91 | optional bool trade_banned = 18;
92 | optional bool eligible_for_community_market = 19;
93 | }
94 |
95 | message CMsgGCMultiplexMessage {
96 | optional uint32 msgtype = 1;
97 | optional bytes payload = 2;
98 | repeated fixed64 steamids = 3;
99 | optional bool replytogc = 4;
100 | }
101 |
102 | message CMsgGCMultiplexMessage_Response {
103 | optional uint32 msgtype = 1;
104 | }
105 |
106 | message CGCToGCMsgMasterAck {
107 | optional uint32 dir_index = 1;
108 | optional uint32 gc_type = 2;
109 | }
110 |
111 | message CGCToGCMsgMasterAck_Response {
112 | optional int32 eresult = 1 [default = 2];
113 | }
114 |
115 | message CGCToGCMsgMasterStartupComplete {
116 | }
117 |
118 | message CGCToGCMsgRouted {
119 | optional uint32 msg_type = 1;
120 | optional fixed64 sender_id = 2;
121 | optional bytes net_message = 3;
122 | optional uint32 ip = 4;
123 | }
124 |
125 | message CGCToGCMsgRoutedReply {
126 | optional uint32 msg_type = 1;
127 | optional bytes net_message = 2;
128 | }
129 |
130 | message CMsgGCUpdateSessionIP {
131 | optional fixed64 steamid = 1;
132 | optional fixed32 ip = 2;
133 | }
134 |
135 | message CMsgGCRequestSessionIP {
136 | optional fixed64 steamid = 1;
137 | }
138 |
139 | message CMsgGCRequestSessionIPResponse {
140 | optional fixed32 ip = 1;
141 | }
142 |
143 | message CMsgSOCacheHaveVersion {
144 | optional .CMsgSOIDOwner soid = 1;
145 | optional fixed64 version = 2;
146 | }
147 |
148 | message CMsgClientHello {
149 | optional uint32 version = 1;
150 | repeated .CMsgSOCacheHaveVersion socache_have_versions = 2;
151 | optional uint32 client_session_need = 3;
152 | optional uint32 client_launcher = 4;
153 | optional uint32 partner_srcid = 5;
154 | optional uint32 partner_accountid = 6;
155 | optional uint32 partner_accountflags = 7;
156 | optional uint32 partner_accountbalance = 8;
157 | optional uint32 steam_launcher = 9;
158 | }
159 |
160 | message CMsgServerHello {
161 | optional uint32 version = 1;
162 | repeated .CMsgSOCacheHaveVersion socache_have_versions = 2;
163 | optional uint32 legacy_client_session_need = 3;
164 | optional uint32 client_launcher = 4;
165 | optional bytes legacy_steamdatagram_routing = 6;
166 | optional uint32 required_internal_addr = 7;
167 | optional bytes steamdatagram_login = 8;
168 | }
169 |
170 | message CMsgClientWelcome {
171 | message Location {
172 | optional float latitude = 1;
173 | optional float longitude = 2;
174 | optional string country = 3;
175 | }
176 |
177 | optional uint32 version = 1;
178 | optional bytes game_data = 2;
179 | repeated .CMsgSOCacheSubscribed outofdate_subscribed_caches = 3;
180 | repeated .CMsgSOCacheSubscriptionCheck uptodate_subscribed_caches = 4;
181 | optional .CMsgClientWelcome.Location location = 5;
182 | optional bytes game_data2 = 6;
183 | optional uint32 rtime32_gc_welcome_timestamp = 7;
184 | optional uint32 currency = 8;
185 | optional uint32 balance = 9;
186 | optional string balance_url = 10;
187 | optional string txn_country_code = 11;
188 | }
189 |
190 | message CMsgConnectionStatus {
191 | optional .GCConnectionStatus status = 1 [default = GCConnectionStatus_HAVE_SESSION];
192 | optional uint32 client_session_need = 2;
193 | optional int32 queue_position = 3;
194 | optional int32 queue_size = 4;
195 | optional int32 wait_seconds = 5;
196 | optional int32 estimated_wait_seconds_remaining = 6;
197 | }
198 |
199 | message CWorkshop_PopulateItemDescriptions_Request {
200 | message SingleItemDescription {
201 | optional uint32 gameitemid = 1;
202 | optional string item_description = 2;
203 | optional bool one_per_account = 3;
204 | }
205 |
206 | message ItemDescriptionsLanguageBlock {
207 | optional string language = 1;
208 | repeated .CWorkshop_PopulateItemDescriptions_Request.SingleItemDescription descriptions = 2;
209 | }
210 |
211 | optional uint32 appid = 1;
212 | repeated .CWorkshop_PopulateItemDescriptions_Request.ItemDescriptionsLanguageBlock languages = 2;
213 | }
214 |
215 | message CWorkshop_GetContributors_Request {
216 | optional uint32 appid = 1;
217 | optional uint32 gameitemid = 2;
218 | }
219 |
220 | message CWorkshop_GetContributors_Response {
221 | repeated fixed64 contributors = 1;
222 | }
223 |
224 | message CWorkshop_SetItemPaymentRules_Request {
225 | message WorkshopItemPaymentRule {
226 | optional uint64 workshop_file_id = 1;
227 | optional float revenue_percentage = 2;
228 | optional string rule_description = 3;
229 | optional uint32 rule_type = 4 [default = 1];
230 | }
231 |
232 | message WorkshopDirectPaymentRule {
233 | optional uint64 workshop_file_id = 1;
234 | optional string rule_description = 2;
235 | }
236 |
237 | message PartnerItemPaymentRule {
238 | optional uint32 account_id = 1;
239 | optional float revenue_percentage = 2;
240 | optional string rule_description = 3;
241 | }
242 |
243 | optional uint32 appid = 1;
244 | optional uint32 gameitemid = 2;
245 | repeated .CWorkshop_SetItemPaymentRules_Request.WorkshopItemPaymentRule associated_workshop_files = 3;
246 | repeated .CWorkshop_SetItemPaymentRules_Request.PartnerItemPaymentRule partner_accounts = 4;
247 | optional bool validate_only = 5;
248 | optional bool make_workshop_files_subscribable = 6;
249 | optional .CWorkshop_SetItemPaymentRules_Request.WorkshopDirectPaymentRule associated_workshop_file_for_direct_payments = 7;
250 | }
251 |
252 | message CWorkshop_SetItemPaymentRules_Response {
253 | }
254 |
255 | message CGameServers_AggregationQuery_Request {
256 | optional string filter = 1;
257 | repeated string group_fields = 3;
258 | }
259 |
260 | message CGameServers_AggregationQuery_Response {
261 | message Group {
262 | repeated string group_values = 1;
263 | optional uint32 servers_empty = 2;
264 | optional uint32 servers_full = 3;
265 | optional uint32 servers_total = 4;
266 | optional uint32 players_humans = 5;
267 | optional uint32 players_bots = 6;
268 | optional uint32 player_capacity = 7;
269 | }
270 |
271 | repeated .CGameServers_AggregationQuery_Response.Group groups = 1;
272 | }
273 |
274 | message CWorkshop_AddSpecialPayment_Request {
275 | optional uint32 appid = 1;
276 | optional uint32 gameitemid = 2;
277 | optional string date = 3;
278 | optional uint64 payment_us_usd = 4;
279 | optional uint64 payment_row_usd = 5;
280 | }
281 |
282 | message CWorkshop_AddSpecialPayment_Response {
283 | }
284 |
285 | message CProductInfo_SetRichPresenceLocalization_Request {
286 | message Token {
287 | optional string token = 1;
288 | optional string value = 2;
289 | }
290 |
291 | message LanguageSection {
292 | optional string language = 1;
293 | repeated .CProductInfo_SetRichPresenceLocalization_Request.Token tokens = 2;
294 | }
295 |
296 | optional uint32 appid = 1;
297 | repeated .CProductInfo_SetRichPresenceLocalization_Request.LanguageSection languages = 2;
298 | optional uint64 steamid = 3;
299 | }
300 |
301 | message CProductInfo_SetRichPresenceLocalization_Response {
302 | }
303 |
--------------------------------------------------------------------------------