Commit 474f36fb authored by nanahira's avatar nanahira

Merge branch 'master' into tcg_random

parents 8e699948 1c96596f
# Dockerfile for SRVPro # Dockerfile for SRVPro
FROM node:stretch FROM node:12-stretch
# apt # apt
RUN apt update && \ RUN apt update && \
......
...@@ -28,13 +28,6 @@ ...@@ -28,13 +28,6 @@
### 使用方法 ### 使用方法
* 可参考[wiki](https://github.com/moecube/srvpro/wiki)安装 * 可参考[wiki](https://github.com/moecube/srvpro/wiki)安装
* 一键安装:
* CentOS 7 `curl -sL https://purerosefallen.github.io/ygopro-server/install_centos_7.sh | bash -`
* CentOS 6 `curl -sL https://purerosefallen.github.io/ygopro-server/install_centos_6.sh | bash -`
* Ubnutu 18 `curl -sL https://purerosefallen.github.io/ygopro-server/install_ubuntu_18.sh | bash -`
* Ubnutu 16 `curl -sL https://purerosefallen.github.io/ygopro-server/install_ubuntu_16.sh | bash -`
* Ubnutu 14 `curl -sL https://purerosefallen.github.io/ygopro-server/install_ubuntu_14.sh | bash -`
* 更新数据 `curl -sL https://purerosefallen.github.io/ygopro-server/update.sh | bash -`
* 手动安装: * 手动安装:
* `git clone https://github.com/moecube/srvpro.git` * `git clone https://github.com/moecube/srvpro.git`
* `cd srvpro` * `cd srvpro`
...@@ -42,6 +35,11 @@ ...@@ -42,6 +35,11 @@
* 安装修改后的YGOPro服务端:https://github.com/moecube/ygopro/tree/server * 安装修改后的YGOPro服务端:https://github.com/moecube/ygopro/tree/server
* `node ygopro-server.js`即可运行 * `node ygopro-server.js`即可运行
* 简易的控制台在 http://srvpro.ygo233.com/dashboard.html 或 http://srvpro-cn.ygo233.com/dashboard.html * 简易的控制台在 http://srvpro.ygo233.com/dashboard.html 或 http://srvpro-cn.ygo233.com/dashboard.html
* 使用本项目的Docker镜像: https://hub.docker.com/r/mycard/ygopro-server/
* `7911`: YGOPro端口
* `7922`: 管理后台端口
* `/ygopro-server/config`: SRVPro配置文件数据卷
* `/ygopro-server/ygopro/expansions`: YGOPro额外卡片数据卷
### 高级功能 ### 高级功能
* 待补充说明 * 待补充说明
......
...@@ -167,6 +167,7 @@ ...@@ -167,6 +167,7 @@
"check_permit": "https://api.mycard.moe/ygopro/match/permit", "check_permit": "https://api.mycard.moe/ygopro/match/permit",
"post_score": false, "post_score": false,
"get_score": false, "get_score": false,
"punish_quit_before_match": false,
"init_post": { "init_post": {
"enabled": false, "enabled": false,
"url": "https://api.mycard.moe/ygopro/match/clear", "url": "https://api.mycard.moe/ygopro/match/clear",
......
{
"apps": [
{
"name": "ygopro-server",
"script": "/ygopro-server/ygopro-server.js",
"cwd": "/ygopro-server"
},
{
"name": "ygopro-tournament",
"script": "/ygopro-server/ygopro-tournament.js",
"cwd": "/ygopro-server"
},
{
"name": "redis-server",
"script": "/usr/bin/redis-server",
"cwd": "/redis"
}
]
}
...@@ -158,9 +158,9 @@ ...@@ -158,9 +158,9 @@
"integrity": "sha1-bbtozri8YPKzE9zFzhWZ8G0Z5no=" "integrity": "sha1-bbtozri8YPKzE9zFzhWZ8G0Z5no="
}, },
"combined-stream": { "combined-stream": {
"version": "1.0.7", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": { "requires": {
"delayed-stream": "~1.0.0" "delayed-stream": "~1.0.0"
} }
...@@ -189,9 +189,9 @@ ...@@ -189,9 +189,9 @@
} }
}, },
"debug": { "debug": {
"version": "4.1.1", "version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"requires": { "requires": {
"ms": "^2.1.1" "ms": "^2.1.1"
} }
...@@ -293,9 +293,9 @@ ...@@ -293,9 +293,9 @@
"integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg=="
}, },
"fs-minipass": { "fs-minipass": {
"version": "1.2.5", "version": "1.2.6",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz",
"integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==",
"requires": { "requires": {
"minipass": "^2.2.1" "minipass": "^2.2.1"
} }
...@@ -553,14 +553,14 @@ ...@@ -553,14 +553,14 @@
"integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=" "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA="
}, },
"load-json-file": { "load-json-file": {
"version": "6.0.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.0.0.tgz", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.1.0.tgz",
"integrity": "sha512-3/eL1P4bnmFo3iQUGcDs9V+7IKUmwq//lcgRcduRsCf3AUe7NYFHkRIUUjbzOj3jpr0HIWfkZYUKrCdwLcMU/w==", "integrity": "sha512-Oxzrf5BMvKyMOwuAXwDUdTO1kBo646k1rc644wfr2xZWqXHKj70DHtLeU1COKFqPX0aUGflj2mOUMTJZfSMMyg==",
"requires": { "requires": {
"graceful-fs": "^4.1.15", "graceful-fs": "^4.1.15",
"parse-json": "^4.0.0", "parse-json": "^4.0.0",
"strip-bom": "^3.0.0", "strip-bom": "^4.0.0",
"type-fest": "^0.4.1" "type-fest": "^0.5.2"
}, },
"dependencies": { "dependencies": {
"graceful-fs": { "graceful-fs": {
...@@ -632,9 +632,9 @@ ...@@ -632,9 +632,9 @@
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
}, },
"ms": { "ms": {
"version": "2.1.1", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}, },
"mv": { "mv": {
"version": "2.1.1", "version": "2.1.1",
...@@ -648,10 +648,9 @@ ...@@ -648,10 +648,9 @@
} }
}, },
"nan": { "nan": {
"version": "2.13.2", "version": "2.14.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
"integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg=="
"optional": true
}, },
"natives": { "natives": {
"version": "1.1.6", "version": "1.1.6",
...@@ -665,11 +664,11 @@ ...@@ -665,11 +664,11 @@
"optional": true "optional": true
}, },
"needle": { "needle": {
"version": "2.3.1", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.3.1.tgz", "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz",
"integrity": "sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg==", "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==",
"requires": { "requires": {
"debug": "^4.1.0", "debug": "^3.2.6",
"iconv-lite": "^0.4.4", "iconv-lite": "^0.4.4",
"sax": "^1.2.4" "sax": "^1.2.4"
} }
...@@ -692,9 +691,9 @@ ...@@ -692,9 +691,9 @@
}, },
"dependencies": { "dependencies": {
"glob": { "glob": {
"version": "7.1.3", "version": "7.1.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
"requires": { "requires": {
"fs.realpath": "^1.0.0", "fs.realpath": "^1.0.0",
"inflight": "^1.0.4", "inflight": "^1.0.4",
...@@ -921,9 +920,9 @@ ...@@ -921,9 +920,9 @@
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
}, },
"psl": { "psl": {
"version": "1.1.31", "version": "1.1.32",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz",
"integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g=="
}, },
"pullstream": { "pullstream": {
"version": "0.0.4", "version": "0.0.4",
...@@ -987,9 +986,9 @@ ...@@ -987,9 +986,9 @@
} }
}, },
"redis-commands": { "redis-commands": {
"version": "1.4.0", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.4.0.tgz", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz",
"integrity": "sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw==" "integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg=="
}, },
"redis-parser": { "redis-parser": {
"version": "2.6.0", "version": "2.6.0",
...@@ -1086,20 +1085,13 @@ ...@@ -1086,20 +1085,13 @@
"integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
}, },
"sqlite3": { "sqlite3": {
"version": "4.0.6", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.6.tgz", "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.8.tgz",
"integrity": "sha512-EqBXxHdKiwvNMRCgml86VTL5TK1i0IKiumnfxykX0gh6H6jaKijAXvE9O1N7+omfNSawR2fOmIyJZcfe8HYWpw==", "integrity": "sha512-kgwHu4j10KhpCHtx//dejd/tVQot7jc3sw+Sn0vMuKOw0X00Ckyg9VceKgzPyGmmz+zEoYue9tOLriWTvYy0ww==",
"requires": { "requires": {
"nan": "~2.10.0", "nan": "^2.12.1",
"node-pre-gyp": "^0.11.0", "node-pre-gyp": "^0.11.0",
"request": "^2.87.0" "request": "^2.87.0"
},
"dependencies": {
"nan": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
"integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
}
} }
}, },
"sshpk": { "sshpk": {
...@@ -1150,9 +1142,9 @@ ...@@ -1150,9 +1142,9 @@
} }
}, },
"strip-bom": { "strip-bom": {
"version": "3.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
"integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
}, },
"strip-json-comments": { "strip-json-comments": {
"version": "2.0.1", "version": "2.0.1",
...@@ -1160,17 +1152,17 @@ ...@@ -1160,17 +1152,17 @@
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
}, },
"tar": { "tar": {
"version": "4.4.8", "version": "4.4.10",
"resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz",
"integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==",
"requires": { "requires": {
"chownr": "^1.1.1", "chownr": "^1.1.1",
"fs-minipass": "^1.2.5", "fs-minipass": "^1.2.5",
"minipass": "^2.3.4", "minipass": "^2.3.5",
"minizlib": "^1.1.1", "minizlib": "^1.2.1",
"mkdirp": "^0.5.0", "mkdirp": "^0.5.0",
"safe-buffer": "^5.1.2", "safe-buffer": "^5.1.2",
"yallist": "^3.0.2" "yallist": "^3.0.3"
} }
}, },
"through": { "through": {
...@@ -1213,9 +1205,9 @@ ...@@ -1213,9 +1205,9 @@
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
}, },
"type-fest": { "type-fest": {
"version": "0.4.1", "version": "0.5.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz",
"integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==" "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw=="
}, },
"ultron": { "ultron": {
"version": "1.0.2", "version": "1.0.2",
......
...@@ -1567,10 +1567,13 @@ class Room ...@@ -1567,10 +1567,13 @@ class Room
else else
#log.info(client.name, @started, @disconnector, @random_type, @players.length) #log.info(client.name, @started, @disconnector, @random_type, @players.length)
if @arena and !@started and @disconnector != 'server' and !@arena_score_handled if @arena and !@started and @disconnector != 'server' and !@arena_score_handled
for player in @players when player.pos != 7 if settings.modules.arena_mode.punish_quit_before_match and @players.length == 2 and !client.arena_quit_free
@scores[player.name_vpass] = 0 for player in @players when player.pos != 7
if @players.length == 2 and !client.arena_quit_free @scores[player.name_vpass] = 0
@scores[client.name_vpass] = -9 @scores[client.name_vpass] = -9
else
for player in @players when player.pos != 7
@scores[player.name_vpass] = -5
@arena_score_handled = true @arena_score_handled = true
index = _.indexOf(@players, client) index = _.indexOf(@players, client)
@players.splice(index, 1) unless index == -1 @players.splice(index, 1) unless index == -1
...@@ -2718,6 +2721,9 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)-> ...@@ -2718,6 +2721,9 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)->
room.winner_name = room.dueling_players[pos].name_vpass room.winner_name = room.dueling_players[pos].name_vpass
#log.info room.dueling_players, pos #log.info room.dueling_players, pos
room.scores[room.winner_name] = room.scores[room.winner_name] + 1 room.scores[room.winner_name] = room.scores[room.winner_name] + 1
if room.match_kill
room.match_kill = false
room.scores[room.winner_name] = 99
if settings.modules.vip.enabled and room.dueling_players[pos].vip and vip_info.players[room.dueling_players[pos].name].victory if settings.modules.vip.enabled and room.dueling_players[pos].vip and vip_info.players[room.dueling_players[pos].name].victory
for line in _.lines vip_info.players[room.dueling_players[pos].name].victory for line in _.lines vip_info.players[room.dueling_players[pos].name].victory
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK) ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK)
...@@ -2730,6 +2736,9 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)-> ...@@ -2730,6 +2736,9 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)->
else else
room.death = 5 room.death = 5
if ygopro.constants.MSG[msg] == 'MATCH_KILL' and client.pos == 0
room.match_kill = true
#lp跟踪 #lp跟踪
if ygopro.constants.MSG[msg] == 'DAMAGE' and client.pos == 0 if ygopro.constants.MSG[msg] == 'DAMAGE' and client.pos == 0
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
...@@ -3846,15 +3855,16 @@ if settings.modules.mycard.enabled ...@@ -3846,15 +3855,16 @@ if settings.modules.mycard.enabled
CLIENT_kick(room.waiting_for_player) CLIENT_kick(room.waiting_for_player)
else if time_passed >= (settings.modules.random_duel.hang_timeout - 20) and not (time_passed % 10) else if time_passed >= (settings.modules.random_duel.hang_timeout - 20) and not (time_passed % 10)
ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${afk_warn_part1}#{settings.modules.random_duel.hang_timeout - time_passed}${afk_warn_part2}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${afk_warn_part1}#{settings.modules.random_duel.hang_timeout - time_passed}${afk_warn_part2}", ygopro.constants.COLORS.RED)
for room in ROOM_all when room and room.arena and !room.started and room.get_playing_player().length < 2 if settings.modules.arena_mode.punish_quit_before_match
player = room.get_playing_player()[0] for room in ROOM_all when room and room.arena and !room.started and room.get_playing_player().length < 2
if player and player.join_time and !player.arena_quit_free player = room.get_playing_player()[0]
waited_time = moment() - player.join_time if player and player.join_time and !player.arena_quit_free
if waited_time >= 30000 waited_time = moment() - player.join_time
ygopro.stoc_send_chat(player, "${arena_wait_timeout}", ygopro.constants.COLORS.BABYBLUE) if waited_time >= 30000
player.arena_quit_free = true ygopro.stoc_send_chat(player, "${arena_wait_timeout}", ygopro.constants.COLORS.BABYBLUE)
else if waited_time >= 5000 and waited_time < 6000 player.arena_quit_free = true
ygopro.stoc_send_chat(player, "${arena_wait_hint}", ygopro.constants.COLORS.BABYBLUE) else if waited_time >= 5000 and waited_time < 6000
ygopro.stoc_send_chat(player, "${arena_wait_hint}", ygopro.constants.COLORS.BABYBLUE)
return return
, 1000 , 1000
...@@ -3876,6 +3886,7 @@ setInterval ()-> ...@@ -3876,6 +3886,7 @@ setInterval ()->
# spawn windbot # spawn windbot
windbot_looplimit = 0 windbot_looplimit = 0
windbot_process = null
spawn_windbot = () -> spawn_windbot = () ->
if /^win/.test(process.platform) if /^win/.test(process.platform)
...@@ -3889,13 +3900,13 @@ spawn_windbot = () -> ...@@ -3889,13 +3900,13 @@ spawn_windbot = () ->
windbot_process = spawn windbot_bin, windbot_parameters, {cwd: 'windbot'} windbot_process = spawn windbot_bin, windbot_parameters, {cwd: 'windbot'}
windbot_process.on 'error', (err)-> windbot_process.on 'error', (err)->
log.warn 'WindBot ERROR', err log.warn 'WindBot ERROR', err
if windbot_looplimit < 1000 if windbot_looplimit < 1000 and !rebooted
windbot_looplimit++ windbot_looplimit++
spawn_windbot() spawn_windbot()
return return
windbot_process.on 'exit', (code)-> windbot_process.on 'exit', (code)->
log.warn 'WindBot EXIT', code log.warn 'WindBot EXIT', code
if windbot_looplimit < 1000 if windbot_looplimit < 1000 and !rebooted
windbot_looplimit++ windbot_looplimit++
spawn_windbot() spawn_windbot()
return return
...@@ -3912,6 +3923,7 @@ spawn_windbot = () -> ...@@ -3912,6 +3923,7 @@ spawn_windbot = () ->
if settings.modules.windbot.enabled and settings.modules.windbot.spawn if settings.modules.windbot.enabled and settings.modules.windbot.spawn
spawn_windbot() spawn_windbot()
rebooted = false
#http #http
if settings.modules.http if settings.modules.http
...@@ -4186,6 +4198,26 @@ if settings.modules.http ...@@ -4186,6 +4198,26 @@ if settings.modules.http
else else
response.end(addCallback(u.query.callback, "['room not found', '" + u.query.deathcancel + "']")) response.end(addCallback(u.query.callback, "['room not found', '" + u.query.deathcancel + "']"))
else if u.query.reboot
if !auth.auth(u.query.username, u.query.pass, "stop", "reboot")
response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return
for room in ROOM_all when room
if room.started
room.scores[room.dueling_players[0].name_vpass] = 0
room.scores[room.dueling_players[1].name_vpass] = 0
room.kicked = true
room.send_replays()
room.process.kill()
room.delete()
rebooted = true
if windbot_process
windbot_process.kill()
response.writeHead(200)
response.end(addCallback(u.query.callback, "['reboot ok', '" + u.query.reboot + "']"))
throw "rebooted"
else if u.query.generatekey and settings.modules.vip.enabled else if u.query.generatekey and settings.modules.vip.enabled
if !auth.auth(u.query.username, u.query.pass, "vip", "generate_keys") if !auth.auth(u.query.username, u.query.pass, "vip", "generate_keys")
response.writeHead(200) response.writeHead(200)
......
// Generated by CoffeeScript 1.12.7 // Generated by CoffeeScript 1.12.7
(function() { (function() {
<<<<<<< HEAD
var CLIENT_check_vip, 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_vip_status, CLIENT_use_cdkey, Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, 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_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_banned, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, SOCKET_flush_data, VIP_generate_cdkeys, _, addCallback, auth, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, chat_color, concat_name, config, cppversion, crypto, date, default_config, default_data, dialogues, disconnect_list, duel_log, e, exec, execFile, fs, geoip, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_requesting, j, k, l, len1, len2, lflists, list, loadJSON, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, oldwords, options, os, path, pgClient, pg_client, pg_query, redis, redisdb, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, replace_buffer, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, sqlite3, tips, url, users_cache, v, vip_info, wait_room_start, wait_room_start_arena, windbot_looplimit, windbots, words, ygopro, zlib; var CLIENT_check_vip, 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_vip_status, CLIENT_use_cdkey, Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, 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_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_banned, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, SOCKET_flush_data, VIP_generate_cdkeys, _, addCallback, auth, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, chat_color, concat_name, config, cppversion, crypto, date, default_config, default_data, dialogues, disconnect_list, duel_log, e, exec, execFile, fs, geoip, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_requesting, j, k, l, len1, len2, lflists, list, loadJSON, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, oldwords, options, os, path, pgClient, pg_client, pg_query, redis, redisdb, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, replace_buffer, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, sqlite3, tips, url, users_cache, v, vip_info, wait_room_start, wait_room_start_arena, windbot_looplimit, windbots, words, ygopro, zlib;
=======
var CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, 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, Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, 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_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_banned, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, SOCKET_flush_data, _, addCallback, auth, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, chat_color, config, cppversion, crypto, date, default_config, default_data, dialogues, disconnect_list, duel_log, e, exec, execFile, fs, geoip, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_requesting, j, l, len, len1, lflists, list, loadJSON, load_dialogues, load_tips, log, long_resolve_cards, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, options, os, path, pgClient, pg_client, pg_query, rebooted, redis, redisdb, ref, ref1, refresh_challonge_cache, release_disconnect, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib;
>>>>>>> mc
net = require('net'); net = require('net');
...@@ -2026,7 +2030,7 @@ ...@@ -2026,7 +2030,7 @@
}; };
Room.prototype.disconnect = function(client, error) { Room.prototype.disconnect = function(client, error) {
var index, left_name, len3, m, player, ref3; var index, left_name, len3, len4, m, n, player, ref3, ref4;
if (client.had_new_reconnection) { if (client.had_new_reconnection) {
return; return;
} }
...@@ -2039,15 +2043,23 @@ ...@@ -2039,15 +2043,23 @@
client.server.destroy(); client.server.destroy();
} else { } else {
if (this.arena && !this.started && this.disconnector !== 'server' && !this.arena_score_handled) { if (this.arena && !this.started && this.disconnector !== 'server' && !this.arena_score_handled) {
ref3 = this.players; if (settings.modules.arena_mode.punish_quit_before_match && this.players.length === 2 && !client.arena_quit_free) {
for (m = 0, len3 = ref3.length; m < len3; m++) { ref3 = this.players;
player = ref3[m]; for (m = 0, len3 = ref3.length; m < len3; m++) {
if (player.pos !== 7) { player = ref3[m];
this.scores[player.name_vpass] = 0; if (player.pos !== 7) {
this.scores[player.name_vpass] = 0;
}
} }
}
if (this.players.length === 2 && !client.arena_quit_free) {
this.scores[client.name_vpass] = -9; this.scores[client.name_vpass] = -9;
} else {
ref4 = this.players;
for (n = 0, len4 = ref4.length; n < len4; n++) {
player = ref4[n];
if (player.pos !== 7) {
this.scores[player.name_vpass] = -5;
}
}
} }
this.arena_score_handled = true; this.arena_score_handled = true;
} }
...@@ -3387,6 +3399,10 @@ ...@@ -3387,6 +3399,10 @@
if (room && !room.finished && room.dueling_players[pos]) { if (room && !room.finished && room.dueling_players[pos]) {
room.winner_name = room.dueling_players[pos].name_vpass; room.winner_name = room.dueling_players[pos].name_vpass;
room.scores[room.winner_name] = room.scores[room.winner_name] + 1; room.scores[room.winner_name] = room.scores[room.winner_name] + 1;
if (room.match_kill) {
room.match_kill = false;
room.scores[room.winner_name] = 99;
}
if (settings.modules.vip.enabled && room.dueling_players[pos].vip && vip_info.players[room.dueling_players[pos].name].victory) { if (settings.modules.vip.enabled && room.dueling_players[pos].vip && vip_info.players[room.dueling_players[pos].name].victory) {
ref4 = _.lines(vip_info.players[room.dueling_players[pos].name].victory); ref4 = _.lines(vip_info.players[room.dueling_players[pos].name].victory);
for (n = 0, len4 = ref4.length; n < len4; n++) { for (n = 0, len4 = ref4.length; n < len4; n++) {
...@@ -3409,6 +3425,9 @@ ...@@ -3409,6 +3425,9 @@
} }
} }
} }
if (ygopro.constants.MSG[msg] === 'MATCH_KILL' && client.pos === 0) {
room.match_kill = true;
}
if (ygopro.constants.MSG[msg] === 'DAMAGE' && client.pos === 0) { if (ygopro.constants.MSG[msg] === 'DAMAGE' && client.pos === 0) {
pos = buffer.readUInt8(1); pos = buffer.readUInt8(1);
if (!client.is_first) { if (!client.is_first) {
...@@ -4983,19 +5002,21 @@ ...@@ -4983,19 +5002,21 @@
ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${afk_warn_part1}" + (settings.modules.random_duel.hang_timeout - time_passed) + "${afk_warn_part2}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${afk_warn_part1}" + (settings.modules.random_duel.hang_timeout - time_passed) + "${afk_warn_part2}", ygopro.constants.COLORS.RED);
} }
} }
for (n = 0, len4 = ROOM_all.length; n < len4; n++) { if (settings.modules.arena_mode.punish_quit_before_match) {
room = ROOM_all[n]; for (n = 0, len4 = ROOM_all.length; n < len4; n++) {
if (!(room && room.arena && !room.started && room.get_playing_player().length < 2)) { room = ROOM_all[n];
continue; if (!(room && room.arena && !room.started && room.get_playing_player().length < 2)) {
} continue;
player = room.get_playing_player()[0]; }
if (player && player.join_time && !player.arena_quit_free) { player = room.get_playing_player()[0];
waited_time = moment() - player.join_time; if (player && player.join_time && !player.arena_quit_free) {
if (waited_time >= 30000) { waited_time = moment() - player.join_time;
ygopro.stoc_send_chat(player, "${arena_wait_timeout}", ygopro.constants.COLORS.BABYBLUE); if (waited_time >= 30000) {
player.arena_quit_free = true; ygopro.stoc_send_chat(player, "${arena_wait_timeout}", ygopro.constants.COLORS.BABYBLUE);
} else if (waited_time >= 5000 && waited_time < 6000) { player.arena_quit_free = true;
ygopro.stoc_send_chat(player, "${arena_wait_hint}", ygopro.constants.COLORS.BABYBLUE); } else if (waited_time >= 5000 && waited_time < 6000) {
ygopro.stoc_send_chat(player, "${arena_wait_hint}", ygopro.constants.COLORS.BABYBLUE);
}
} }
} }
} }
...@@ -5037,8 +5058,10 @@ ...@@ -5037,8 +5058,10 @@
windbot_looplimit = 0; windbot_looplimit = 0;
windbot_process = null;
spawn_windbot = function() { spawn_windbot = function() {
var windbot_bin, windbot_parameters, windbot_process; var windbot_bin, windbot_parameters;
if (/^win/.test(process.platform)) { if (/^win/.test(process.platform)) {
windbot_bin = 'WindBot.exe'; windbot_bin = 'WindBot.exe';
windbot_parameters = []; windbot_parameters = [];
...@@ -5053,14 +5076,14 @@ ...@@ -5053,14 +5076,14 @@
}); });
windbot_process.on('error', function(err) { windbot_process.on('error', function(err) {
log.warn('WindBot ERROR', err); log.warn('WindBot ERROR', err);
if (windbot_looplimit < 1000) { if (windbot_looplimit < 1000 && !rebooted) {
windbot_looplimit++; windbot_looplimit++;
spawn_windbot(); spawn_windbot();
} }
}); });
windbot_process.on('exit', function(code) { windbot_process.on('exit', function(code) {
log.warn('WindBot EXIT', code); log.warn('WindBot EXIT', code);
if (windbot_looplimit < 1000) { if (windbot_looplimit < 1000 && !rebooted) {
windbot_looplimit++; windbot_looplimit++;
spawn_windbot(); spawn_windbot();
} }
...@@ -5079,6 +5102,8 @@ ...@@ -5079,6 +5102,8 @@
spawn_windbot(); spawn_windbot();
} }
rebooted = false;
if (settings.modules.http) { if (settings.modules.http) {
addCallback = function(callback, text) { addCallback = function(callback, text) {
if (!callback) { if (!callback) {
...@@ -5087,7 +5112,11 @@ ...@@ -5087,7 +5112,11 @@
return callback + "( " + text + " );"; return callback + "( " + text + " );";
}; };
requestListener = function(request, response) { requestListener = function(request, response) {
<<<<<<< HEAD
var archive_args, archive_name, archive_process, check, death_room_found, duellog, error, filename, getpath, key, kick_room_found, len3, len4, len5, len6, len7, len8, m, n, o, p, parseQueryString, pass_validated, player, q, r, ref3, ref4, replay, ret_keys, room, roomsjson, u; var archive_args, archive_name, archive_process, check, death_room_found, duellog, error, filename, getpath, key, kick_room_found, len3, len4, len5, len6, len7, len8, m, n, o, p, parseQueryString, pass_validated, player, q, r, ref3, ref4, replay, ret_keys, room, roomsjson, u;
=======
var archive_args, archive_name, archive_process, check, death_room_found, duellog, error, filename, getpath, kick_room_found, len2, len3, len4, len5, len6, len7, m, n, o, p, parseQueryString, pass_validated, player, q, r, ref2, replay, room, roomsjson, u;
>>>>>>> mc
parseQueryString = true; parseQueryString = true;
u = url.parse(request.url, parseQueryString); u = url.parse(request.url, parseQueryString);
if (u.pathname === '/api/getrooms') { if (u.pathname === '/api/getrooms') {
...@@ -5423,15 +5452,44 @@ ...@@ -5423,15 +5452,44 @@
} else { } else {
response.end(addCallback(u.query.callback, "['room not found', '" + u.query.deathcancel + "']")); response.end(addCallback(u.query.callback, "['room not found', '" + u.query.deathcancel + "']"));
} }
<<<<<<< HEAD
} else if (u.query.generatekey && settings.modules.vip.enabled) { } else if (u.query.generatekey && settings.modules.vip.enabled) {
if (!auth.auth(u.query.username, u.query.pass, "vip", "generate_keys")) { if (!auth.auth(u.query.username, u.query.pass, "vip", "generate_keys")) {
=======
} else if (u.query.reboot) {
if (!auth.auth(u.query.username, u.query.pass, "stop", "reboot")) {
>>>>>>> mc
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
} }
<<<<<<< HEAD
VIP_generate_cdkeys(u.query.generatekey, settings.modules.vip.generate_count); VIP_generate_cdkeys(u.query.generatekey, settings.modules.vip.generate_count);
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['Keys generated', '" + u.query.generatekey + "']")); response.end(addCallback(u.query.callback, "['Keys generated', '" + u.query.generatekey + "']"));
=======
for (r = 0, len7 = ROOM_all.length; r < len7; r++) {
room = ROOM_all[r];
if (!(room)) {
continue;
}
if (room.started) {
room.scores[room.dueling_players[0].name_vpass] = 0;
room.scores[room.dueling_players[1].name_vpass] = 0;
}
room.kicked = true;
room.send_replays();
room.process.kill();
room["delete"]();
}
rebooted = true;
if (windbot_process) {
windbot_process.kill();
}
response.writeHead(200);
response.end(addCallback(u.query.callback, "['reboot ok', '" + u.query.reboot + "']"));
throw "rebooted";
>>>>>>> mc
} else { } else {
response.writeHead(400); response.writeHead(400);
response.end(); response.end();
......
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