Commit edaf7474 authored by nanahira's avatar nanahira

add version polyfill hints

parent ec31d004
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ClientVersionBlocker = void 0;
const aragami_1 = require("aragami");
let ClientVersionBlocker = class ClientVersionBlocker {
clientKey;
};
exports.ClientVersionBlocker = ClientVersionBlocker;
__decorate([
(0, aragami_1.CacheKey)(),
__metadata("design:type", String)
], ClientVersionBlocker.prototype, "clientKey", void 0);
exports.ClientVersionBlocker = ClientVersionBlocker = __decorate([
(0, aragami_1.CacheTTL)(60000)
], ClientVersionBlocker);
import { CacheKey, CacheTTL } from "aragami";
@CacheTTL(60000)
export class ClientVersionBlocker {
@CacheKey()
clientKey: string;
}
......@@ -10,6 +10,7 @@ const ygopro_deck_encode_1 = __importDefault(require("ygopro-deck-encode"));
function encodeDeck(deck) {
const pdeck = new ygopro_deck_encode_1.default();
pdeck.main = deck.main;
pdeck.extra = [];
pdeck.side = deck.side;
return Buffer.from(pdeck.toUpdateDeckPayload());
}
......
......@@ -179,6 +179,8 @@
"banned_athletic_deck_part1": "Entertainment Mode does not allow top ",
"banned_athletic_deck_part2": " popular meta decks. Please change your deck.",
"chat_disabled": "Chat is disabled in this room.",
"version_to_polyfill": "Your client version is not fully supported. Please rejoin to enable temporary compatibility mode. For the best experience, we recommend updating your game to the latest version.",
"version_polyfilled": "Temporary compatibility mode has been enabled for your version. We recommend updating your game to avoid potential compatibility issues in the future.",
"using_athletic_deck": " is using a competitive deck."
},
"es-es": {
......@@ -507,6 +509,8 @@
"banned_athletic_deck_part1": "娱乐匹配中禁止使用使用数前",
"banned_athletic_deck_part2": "的竞技卡组。请更换卡组。",
"chat_disabled": "本房间禁止聊天。",
"version_to_polyfill": "当前客户端版本暂未完全支持。请重新加入以启用临时兼容模式。为获得更佳体验,建议尽快更新游戏版本。",
"version_polyfilled": "已为当前版本启用临时兼容模式。建议尽快更新游戏,以避免后续兼容性问题。",
"using_athletic_deck": " 正在使用竞技卡组。"
},
"ko-kr": {
......
This diff is collapsed.
......@@ -11,6 +11,7 @@
],
"author": "zh99998 <zh99998@gmail.com>, mercury233 <me@mercury233.me>, Nanahira <78877@qq.com>",
"dependencies": {
"aragami": "^1.2.5",
"async": "^3.2.0",
"axios": "^0.19.2",
"bunyan": "^1.8.14",
......
......@@ -77,7 +77,8 @@ import_datas = global.import_datas = [
"ready_trap",
"join_time",
"arena_quit_free",
"replays_sent"
"replays_sent",
"actual_version",
]
merge = require 'deepmerge'
......@@ -92,6 +93,12 @@ Q = require("q")
YGOProDeck = require('ygopro-deck-encode').default
Aragami = require('aragami').Aragami
aragami = global.aragami = new Aragami() # we use memory mode only
aragami_classes = global.aragami_classes = require('./aragami-classes.js')
#heapdump = require 'heapdump'
checkFileExists = (path) =>
......@@ -2131,16 +2138,31 @@ ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server, datas)->
ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
check_version = () ->
if info.version != settings.version and !settings.alternative_versions.includes(info.version)
ygopro.stoc_send_chat(client, (if info.version < settings.version then settings.modules.update else settings.modules.wait_update), ygopro.constants.COLORS.RED)
bad_version = (msg) ->
ygopro.stoc_send_chat(client, msg, ygopro.constants.COLORS.RED)
ygopro.stoc_send client, 'ERROR_MSG', {
msg: 4
code: settings.version
}
CLIENT_kick(client)
return false
return true
if info.version == settings.version
return true
if settings.alternative_versions.includes(info.version)
client_key = CLIENT_get_authorize_key(client)
if !await aragami.has(aragami_classes.ClientVersionBlocker, client_key)
blocker_obj = new aragami_classes.ClientVersionBlocker()
blocker_obj.clientKey = client_key
await aragami.set(blocker_obj)
return bad_version("${version_to_polyfill}")
else
await aragami.del(aragami_classes.ClientVersionBlocker, client_key)
return true
return bad_version(if info.version < settings.version then settings.modules.update else settings.modules.wait_update)
polyfill_version = () ->
if client.actual_version
# already polyfilled
return
client.actual_version = info.version
if info.version != settings.version and settings.alternative_versions.includes(info.version)
info.version = settings.version
......@@ -2148,13 +2170,12 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
struct._setBuff(buffer)
struct.set("version", info.version)
buffer = struct.buffer
ygopro.stoc_send_chat(client, "${version_polyfilled}", ygopro.constants.COLORS.BABYBLUE)
await return
#log.info info
info.pass=info.pass.trim()
client.pass = info.pass
if CLIENT_is_able_to_reconnect(client) or CLIENT_is_able_to_kick_reconnect(client)
if !check_version()
return
polyfill_version()
CLIENT_pre_reconnect(client)
return
else if settings.modules.stop
......@@ -2194,7 +2215,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
replay = await dataManager.getRandomCloudReplay()
await client.open_cloud_replay(replay)
return
else if !check_version()
else if !await check_version()
return
else if !info.pass.length and !settings.modules.random_duel.enabled and !settings.modules.windbot.enabled and !settings.modules.challonge.enabled
ygopro.stoc_die(client, "${blank_room_name}")
......@@ -2216,7 +2237,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
if info.pass.length <= 8
ygopro.stoc_die(client, '${invalid_password_length}')
return
polyfill_version()
await polyfill_version()
buffer = Buffer.from(info.pass[0...8], 'base64')
......@@ -2472,7 +2493,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
ygopro.stoc_die(client, "${invalid_password_room}")
return
else
polyfill_version()
await polyfill_version()
#log.info 'join_game',info.pass, client.name
room = await ROOM_find_or_create_by_name(info.pass, client.ip)
......
// Generated by CoffeeScript 2.7.0
(function() {
// 标准库
var CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, CLIENT_send_replays_and_kick, CLIENT_set_ip, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, YGOProDeck, _, _async, addCallback, athleticChecker, auth, axios, badwordR, badwords, ban_user, bunyan, challonge, checkFileExists, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, extra_mode_list, fs, geoip, getDuelLogQueryFromQs, getRealIp, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, ip6addr, isTrustedProxy, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_tips, log, long_resolve_cards, memory_usage, merge, moment, moment_long_ago_string, moment_now, moment_now_string, neosRequestListener, net, netRequestHandler, os, osu, path, qs, real_windbot_server_ip, release_disconnect, report_to_big_brother, request, roomlist, rooms_count, setting_change, setting_get, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, toIpv4, toIpv6, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib;
var Aragami, CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, CLIENT_send_replays_and_kick, CLIENT_set_ip, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, YGOProDeck, _, _async, addCallback, aragami, aragami_classes, athleticChecker, auth, axios, badwordR, badwords, ban_user, bunyan, challonge, checkFileExists, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, extra_mode_list, fs, geoip, getDuelLogQueryFromQs, getRealIp, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, ip6addr, isTrustedProxy, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_tips, log, long_resolve_cards, memory_usage, merge, moment, moment_long_ago_string, moment_now, moment_now_string, neosRequestListener, net, netRequestHandler, os, osu, path, qs, real_windbot_server_ip, release_disconnect, report_to_big_brother, request, roomlist, rooms_count, setting_change, setting_get, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, toIpv4, toIpv6, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib;
net = require('net');
......@@ -70,7 +70,7 @@
}
});
import_datas = global.import_datas = ["abuse_count", "ban_mc", "vpass", "rag", "rid", "is_post_watcher", "retry_count", "name", "pass", "name_vpass", "is_first", "lp", "card_count", "is_host", "pos", "surrend_confirm", "kick_count", "deck_saved", "main", "side", "side_interval", "side_tcount", "selected_preduel", "last_game_msg", "last_game_msg_title", "last_hint_msg", "start_deckbuf", "challonge_info", "ready_trap", "join_time", "arena_quit_free", "replays_sent"];
import_datas = global.import_datas = ["abuse_count", "ban_mc", "vpass", "rag", "rid", "is_post_watcher", "retry_count", "name", "pass", "name_vpass", "is_first", "lp", "card_count", "is_host", "pos", "surrend_confirm", "kick_count", "deck_saved", "main", "side", "side_interval", "side_tcount", "selected_preduel", "last_game_msg", "last_game_msg_title", "last_hint_msg", "start_deckbuf", "challonge_info", "ready_trap", "join_time", "arena_quit_free", "replays_sent", "actual_version"];
merge = require('deepmerge');
......@@ -84,6 +84,12 @@
YGOProDeck = require('ygopro-deck-encode').default;
Aragami = require('aragami').Aragami;
aragami = global.aragami = new Aragami(); // we use memory mode only
aragami_classes = global.aragami_classes = require('./aragami-classes.js');
//heapdump = require 'heapdump'
checkFileExists = async(path) => {
var e;
......@@ -2843,37 +2849,54 @@
ygopro.ctos_follow('JOIN_GAME', true, async function(buffer, info, client, server, datas) {
var available_logs, check_buffer_indentity, check_version, create_room_name, create_room_with_action, decrypted_buffer, duelLog, e, exactBan, i, id, index, j, l, len, len1, len2, len3, m, matching_match, matching_participant, n, polyfill_version, pre_room, recover_match, ref, ref1, replay, replay_id, replays, room, secret, struct, tournament_data, userData, userDataRes, userUrl;
check_version = function() {
if (info.version !== settings.version && !settings.alternative_versions.includes(info.version)) {
ygopro.stoc_send_chat(client, (info.version < settings.version ? settings.modules.update : settings.modules.wait_update), ygopro.constants.COLORS.RED);
check_version = async function() {
var bad_version, blocker_obj, client_key;
bad_version = function(msg) {
ygopro.stoc_send_chat(client, msg, ygopro.constants.COLORS.RED);
ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 4,
code: settings.version
});
CLIENT_kick(client);
return false;
};
if (info.version === settings.version) {
return true;
}
return true;
if (settings.alternative_versions.includes(info.version)) {
client_key = CLIENT_get_authorize_key(client);
if (!(await aragami.has(aragami_classes.ClientVersionBlocker, client_key))) {
blocker_obj = new aragami_classes.ClientVersionBlocker();
blocker_obj.clientKey = client_key;
await aragami.set(blocker_obj);
return bad_version("${version_to_polyfill}");
} else {
await aragami.del(aragami_classes.ClientVersionBlocker, client_key);
return true;
}
}
return bad_version(info.version < settings.version ? settings.modules.update : settings.modules.wait_update);
};
polyfill_version = function() {
polyfill_version = async function() {
var struct;
if (client.actual_version) {
return;
}
// already polyfilled
client.actual_version = info.version;
if (info.version !== settings.version && settings.alternative_versions.includes(info.version)) {
info.version = settings.version;
struct = ygopro.structs.get("CTOS_JoinGame");
struct._setBuff(buffer);
struct.set("version", info.version);
return buffer = struct.buffer;
buffer = struct.buffer;
ygopro.stoc_send_chat(client, "${version_polyfilled}", ygopro.constants.COLORS.BABYBLUE);
}
};
//log.info info
info.pass = info.pass.trim();
client.pass = info.pass;
if (CLIENT_is_able_to_reconnect(client) || CLIENT_is_able_to_kick_reconnect(client)) {
if (!check_version()) {
return;
}
polyfill_version();
CLIENT_pre_reconnect(client);
return;
} else if (settings.modules.stop) {
......@@ -2917,7 +2940,7 @@
replay = (await dataManager.getRandomCloudReplay());
await client.open_cloud_replay(replay);
return;
} else if (!check_version()) {
} else if (!(await check_version())) {
return;
} else if (!info.pass.length && !settings.modules.random_duel.enabled && !settings.modules.windbot.enabled && !settings.modules.challonge.enabled) {
ygopro.stoc_die(client, "${blank_room_name}");
......@@ -2941,7 +2964,7 @@
ygopro.stoc_die(client, '${invalid_password_length}');
return;
}
polyfill_version();
await polyfill_version();
buffer = Buffer.from(info.pass.slice(0, 8), 'base64');
if (buffer.length !== 6) {
ygopro.stoc_die(client, '${invalid_password_payload}');
......@@ -3257,7 +3280,7 @@
ygopro.stoc_die(client, "${invalid_password_room}");
return;
} else {
polyfill_version();
await polyfill_version();
//log.info 'join_game',info.pass, client.name
room = (await ROOM_find_or_create_by_name(info.pass, client.ip));
if (!room) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment