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")); ...@@ -10,6 +10,7 @@ const ygopro_deck_encode_1 = __importDefault(require("ygopro-deck-encode"));
function encodeDeck(deck) { function encodeDeck(deck) {
const pdeck = new ygopro_deck_encode_1.default(); const pdeck = new ygopro_deck_encode_1.default();
pdeck.main = deck.main; pdeck.main = deck.main;
pdeck.extra = [];
pdeck.side = deck.side; pdeck.side = deck.side;
return Buffer.from(pdeck.toUpdateDeckPayload()); return Buffer.from(pdeck.toUpdateDeckPayload());
} }
......
...@@ -179,6 +179,8 @@ ...@@ -179,6 +179,8 @@
"banned_athletic_deck_part1": "Entertainment Mode does not allow top ", "banned_athletic_deck_part1": "Entertainment Mode does not allow top ",
"banned_athletic_deck_part2": " popular meta decks. Please change your deck.", "banned_athletic_deck_part2": " popular meta decks. Please change your deck.",
"chat_disabled": "Chat is disabled in this room.", "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." "using_athletic_deck": " is using a competitive deck."
}, },
"es-es": { "es-es": {
...@@ -507,6 +509,8 @@ ...@@ -507,6 +509,8 @@
"banned_athletic_deck_part1": "娱乐匹配中禁止使用使用数前", "banned_athletic_deck_part1": "娱乐匹配中禁止使用使用数前",
"banned_athletic_deck_part2": "的竞技卡组。请更换卡组。", "banned_athletic_deck_part2": "的竞技卡组。请更换卡组。",
"chat_disabled": "本房间禁止聊天。", "chat_disabled": "本房间禁止聊天。",
"version_to_polyfill": "当前客户端版本暂未完全支持。请重新加入以启用临时兼容模式。为获得更佳体验,建议尽快更新游戏版本。",
"version_polyfilled": "已为当前版本启用临时兼容模式。建议尽快更新游戏,以避免后续兼容性问题。",
"using_athletic_deck": " 正在使用竞技卡组。" "using_athletic_deck": " 正在使用竞技卡组。"
}, },
"ko-kr": { "ko-kr": {
......
This diff is collapsed.
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
], ],
"author": "zh99998 <zh99998@gmail.com>, mercury233 <me@mercury233.me>, Nanahira <78877@qq.com>", "author": "zh99998 <zh99998@gmail.com>, mercury233 <me@mercury233.me>, Nanahira <78877@qq.com>",
"dependencies": { "dependencies": {
"aragami": "^1.2.5",
"async": "^3.2.0", "async": "^3.2.0",
"axios": "^0.19.2", "axios": "^0.19.2",
"bunyan": "^1.8.14", "bunyan": "^1.8.14",
......
...@@ -77,7 +77,8 @@ import_datas = global.import_datas = [ ...@@ -77,7 +77,8 @@ import_datas = global.import_datas = [
"ready_trap", "ready_trap",
"join_time", "join_time",
"arena_quit_free", "arena_quit_free",
"replays_sent" "replays_sent",
"actual_version",
] ]
merge = require 'deepmerge' merge = require 'deepmerge'
...@@ -92,6 +93,12 @@ Q = require("q") ...@@ -92,6 +93,12 @@ Q = require("q")
YGOProDeck = require('ygopro-deck-encode').default 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' #heapdump = require 'heapdump'
checkFileExists = (path) => checkFileExists = (path) =>
...@@ -2131,16 +2138,31 @@ ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server, datas)-> ...@@ -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)-> ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
check_version = () -> check_version = () ->
if info.version != settings.version and !settings.alternative_versions.includes(info.version) bad_version = (msg) ->
ygopro.stoc_send_chat(client, (if info.version < settings.version then settings.modules.update else settings.modules.wait_update), ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, msg, ygopro.constants.COLORS.RED)
ygopro.stoc_send client, 'ERROR_MSG', { ygopro.stoc_send client, 'ERROR_MSG', {
msg: 4 msg: 4
code: settings.version code: settings.version
} }
CLIENT_kick(client) CLIENT_kick(client)
return false 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 = () -> polyfill_version = () ->
if client.actual_version
# already polyfilled
return
client.actual_version = info.version client.actual_version = info.version
if info.version != settings.version and settings.alternative_versions.includes(info.version) if info.version != settings.version and settings.alternative_versions.includes(info.version)
info.version = settings.version info.version = settings.version
...@@ -2148,13 +2170,12 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2148,13 +2170,12 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
struct._setBuff(buffer) struct._setBuff(buffer)
struct.set("version", info.version) struct.set("version", info.version)
buffer = struct.buffer buffer = struct.buffer
ygopro.stoc_send_chat(client, "${version_polyfilled}", ygopro.constants.COLORS.BABYBLUE)
await return
#log.info info #log.info info
info.pass=info.pass.trim() info.pass=info.pass.trim()
client.pass = info.pass client.pass = info.pass
if CLIENT_is_able_to_reconnect(client) or CLIENT_is_able_to_kick_reconnect(client) 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) CLIENT_pre_reconnect(client)
return return
else if settings.modules.stop else if settings.modules.stop
...@@ -2194,7 +2215,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2194,7 +2215,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
replay = await dataManager.getRandomCloudReplay() replay = await dataManager.getRandomCloudReplay()
await client.open_cloud_replay(replay) await client.open_cloud_replay(replay)
return return
else if !check_version() else if !await check_version()
return return
else if !info.pass.length and !settings.modules.random_duel.enabled and !settings.modules.windbot.enabled and !settings.modules.challonge.enabled 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}") ygopro.stoc_die(client, "${blank_room_name}")
...@@ -2216,7 +2237,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2216,7 +2237,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
if info.pass.length <= 8 if info.pass.length <= 8
ygopro.stoc_die(client, '${invalid_password_length}') ygopro.stoc_die(client, '${invalid_password_length}')
return return
polyfill_version() await polyfill_version()
buffer = Buffer.from(info.pass[0...8], 'base64') buffer = Buffer.from(info.pass[0...8], 'base64')
...@@ -2472,7 +2493,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2472,7 +2493,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
ygopro.stoc_die(client, "${invalid_password_room}") ygopro.stoc_die(client, "${invalid_password_room}")
return return
else else
polyfill_version() await polyfill_version()
#log.info 'join_game',info.pass, client.name #log.info 'join_game',info.pass, client.name
room = await ROOM_find_or_create_by_name(info.pass, client.ip) room = await ROOM_find_or_create_by_name(info.pass, client.ip)
......
// Generated by CoffeeScript 2.7.0 // Generated by CoffeeScript 2.7.0
(function() { (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'); net = require('net');
...@@ -70,7 +70,7 @@ ...@@ -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'); merge = require('deepmerge');
...@@ -84,6 +84,12 @@ ...@@ -84,6 +84,12 @@
YGOProDeck = require('ygopro-deck-encode').default; 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' //heapdump = require 'heapdump'
checkFileExists = async(path) => { checkFileExists = async(path) => {
var e; var e;
...@@ -2843,37 +2849,54 @@ ...@@ -2843,37 +2849,54 @@
ygopro.ctos_follow('JOIN_GAME', true, async function(buffer, info, client, server, datas) { 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; 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() { check_version = async function() {
if (info.version !== settings.version && !settings.alternative_versions.includes(info.version)) { var bad_version, blocker_obj, client_key;
ygopro.stoc_send_chat(client, (info.version < settings.version ? settings.modules.update : settings.modules.wait_update), ygopro.constants.COLORS.RED); bad_version = function(msg) {
ygopro.stoc_send_chat(client, msg, ygopro.constants.COLORS.RED);
ygopro.stoc_send(client, 'ERROR_MSG', { ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 4, msg: 4,
code: settings.version code: settings.version
}); });
CLIENT_kick(client); CLIENT_kick(client);
return false; 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; var struct;
if (client.actual_version) {
return;
}
// already polyfilled
client.actual_version = info.version; client.actual_version = info.version;
if (info.version !== settings.version && settings.alternative_versions.includes(info.version)) { if (info.version !== settings.version && settings.alternative_versions.includes(info.version)) {
info.version = settings.version; info.version = settings.version;
struct = ygopro.structs.get("CTOS_JoinGame"); struct = ygopro.structs.get("CTOS_JoinGame");
struct._setBuff(buffer); struct._setBuff(buffer);
struct.set("version", info.version); 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 //log.info info
info.pass = info.pass.trim(); info.pass = info.pass.trim();
client.pass = info.pass; client.pass = info.pass;
if (CLIENT_is_able_to_reconnect(client) || CLIENT_is_able_to_kick_reconnect(client)) { if (CLIENT_is_able_to_reconnect(client) || CLIENT_is_able_to_kick_reconnect(client)) {
if (!check_version()) {
return;
}
polyfill_version();
CLIENT_pre_reconnect(client); CLIENT_pre_reconnect(client);
return; return;
} else if (settings.modules.stop) { } else if (settings.modules.stop) {
...@@ -2917,7 +2940,7 @@ ...@@ -2917,7 +2940,7 @@
replay = (await dataManager.getRandomCloudReplay()); replay = (await dataManager.getRandomCloudReplay());
await client.open_cloud_replay(replay); await client.open_cloud_replay(replay);
return; return;
} else if (!check_version()) { } else if (!(await check_version())) {
return; return;
} else if (!info.pass.length && !settings.modules.random_duel.enabled && !settings.modules.windbot.enabled && !settings.modules.challonge.enabled) { } 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}"); ygopro.stoc_die(client, "${blank_room_name}");
...@@ -2941,7 +2964,7 @@ ...@@ -2941,7 +2964,7 @@
ygopro.stoc_die(client, '${invalid_password_length}'); ygopro.stoc_die(client, '${invalid_password_length}');
return; return;
} }
polyfill_version(); await polyfill_version();
buffer = Buffer.from(info.pass.slice(0, 8), 'base64'); buffer = Buffer.from(info.pass.slice(0, 8), 'base64');
if (buffer.length !== 6) { if (buffer.length !== 6) {
ygopro.stoc_die(client, '${invalid_password_payload}'); ygopro.stoc_die(client, '${invalid_password_payload}');
...@@ -3257,7 +3280,7 @@ ...@@ -3257,7 +3280,7 @@
ygopro.stoc_die(client, "${invalid_password_room}"); ygopro.stoc_die(client, "${invalid_password_room}");
return; return;
} else { } else {
polyfill_version(); await polyfill_version();
//log.info 'join_game',info.pass, client.name //log.info 'join_game',info.pass, client.name
room = (await ROOM_find_or_create_by_name(info.pass, client.ip)); room = (await ROOM_find_or_create_by_name(info.pass, client.ip));
if (!room) { 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