Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
S
srvpro
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
srvpro
Commits
456fb764
Commit
456fb764
authored
Jul 08, 2019
by
nanahira
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into tcg_random
parents
168eac34
b8fa792d
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
147 additions
and
39 deletions
+147
-39
.dockerignore
.dockerignore
+7
-0
Dockerfile
Dockerfile
+9
-11
Dockerfile.lite
Dockerfile.lite
+45
-0
README.md
README.md
+17
-5
data/i18n.json
data/i18n.json
+4
-2
ygopro-auth.coffee
ygopro-auth.coffee
+5
-2
ygopro-auth.js
ygopro-auth.js
+9
-3
ygopro-server.coffee
ygopro-server.coffee
+15
-5
ygopro-server.js
ygopro-server.js
+18
-6
ygopro-webhook.js
ygopro-webhook.js
+18
-5
No files found.
.dockerignore
0 → 100644
View file @
456fb764
.git*
.dockerignore
Dockerfile*
/docs
/README.md
/*.coffee
/LICENSE
Dockerfile
View file @
456fb764
# Dockerfile for SRVPro
# Dockerfile for SRVPro
FROM
node:12-stretch
FROM
node:12-stretch
-slim
# apt
# apt
RUN
apt update
&&
\
RUN
apt update
&&
\
env
DEBIAN_FRONTEND
=
noninteractive apt
install
-y
curl wget vim
sudo
git build-essential libssl1.0-dev libsqlite3-dev sqlite3
mono-complete p7zip-full redis-server
env
DEBIAN_FRONTEND
=
noninteractive apt
install
-y
wget git build-essential libssl1.0-dev libsqlite3-dev
mono-complete p7zip-full redis-server
RUN
npm
install
-g
pm2
RUN
npm
install
-g
pm2
...
@@ -16,17 +16,17 @@ RUN wget 'https://github.com/libevent/libevent/releases/download/release-2.0.22-
...
@@ -16,17 +16,17 @@ RUN wget 'https://github.com/libevent/libevent/releases/download/release-2.0.22-
make
&&
\
make
&&
\
make
install
&&
\
make
install
&&
\
cd
..
&&
\
cd
..
&&
\
bash
-c
'ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5;ln -s /usr/local/lib/libevent_pthreads-2.0.so.5 /usr/lib/libevent_pthreads-2.0.so.5;ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5;ln -s /usr/local/lib/libevent_pthreads-2.0.so.5 /usr/lib64/libevent_pthreads-2.0.so.5;exit 0'
bash
-c
'ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5;ln -s /usr/local/lib/libevent_pthreads-2.0.so.5 /usr/lib/libevent_pthreads-2.0.so.5;ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5;ln -s /usr/local/lib/libevent_pthreads-2.0.so.5 /usr/lib64/libevent_pthreads-2.0.so.5;exit 0'
&&
\
rm
-rf
/libevent-2.0.22-stable.tar.gz /libevent-2.0.22-stable
# srvpro
# srvpro
COPY
. /ygopro-server
COPY
. /ygopro-server
WORKDIR
/ygopro-server
WORKDIR
/ygopro-server
RUN
npm ci
&&
\
RUN
npm ci
&&
\
mkdir
config decks replays logs
&&
\
mkdir
config decks replays logs /redis
cp
data/default_config.json config/config.json
# ygopro
# ygopro
RUN
git clone
--branch
=
server
--recursive
https://github.com/purerosefallen/ygopro /ygopro-server/ygopro
RUN
git clone
--branch
=
server
--recursive
--depth
=
1
https://github.com/purerosefallen/ygopro /ygopro-server/ygopro
WORKDIR
/ygopro-server/ygopro
WORKDIR
/ygopro-server/ygopro
RUN
git submodule foreach git checkout master
&&
\
RUN
git submodule foreach git checkout master
&&
\
wget
-O
- https://github.com/premake/premake-core/releases/download/v5.0.0-alpha13/premake-5.0.0-alpha13-linux.tar.gz |
tar
zfx -
&&
\
wget
-O
- https://github.com/premake/premake-core/releases/download/v5.0.0-alpha13/premake-5.0.0-alpha13-linux.tar.gz |
tar
zfx -
&&
\
...
@@ -39,18 +39,16 @@ RUN git submodule foreach git checkout master && \
...
@@ -39,18 +39,16 @@ RUN git submodule foreach git checkout master && \
mkdir
replay expansions
mkdir
replay expansions
# windbot
# windbot
RUN
git clone
https://github.com/purerosefallen/windbot
/ygopro-server/windbot
RUN
git clone
--depth
=
1 https://github.com/purerosefallen/windbot
/ygopro-server/windbot
WORKDIR
/ygopro-server/windbot
WORKDIR
/ygopro-server/windbot
RUN
xbuild /property:Configuration
=
Release /property:TargetFrameworkVersion
=
"v4.5"
&&
\
RUN
xbuild /property:Configuration
=
Release /property:TargetFrameworkVersion
=
"v4.5"
&&
\
ln
-s
./bin/Release/WindBot.exe
.
&&
\
ln
-s
./bin/Release/WindBot.exe
.
&&
\
ln
-s
/ygopro-server/ygopro/cards.cdb .
ln
-s
/ygopro-server/ygopro/cards.cdb .
# infos
# infos
WORKDIR
/
WORKDIR
/ygopro-server
RUN
mkdir
/redis
EXPOSE
7911
EXPOSE
7911
EXPOSE
7922
EXPOSE
7922
VOLUME
/ygopro-server/config
VOLUME
[ /ygopro-server/config, /ygopro-server/decks, /ygopro-server/replays, /redis ]
VOLUME
/ygopro-server/ygopro/expansions
CMD
[ "pm2-docker", "start", "/ygopro-server/data/pm2-docker.json" ]
CMD
[ "pm2-docker", "start", "/ygopro-server/data/pm2-docker.json" ]
Dockerfile.lite
0 → 100644
View file @
456fb764
# Dockerfile for SRVPro Lite
FROM node:12-stretch-slim
# apt
RUN apt update && \
env DEBIAN_FRONTEND=noninteractive apt install -y wget git build-essential libssl1.0-dev libsqlite3-dev p7zip-full
# libevent
WORKDIR /
RUN wget 'https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz' -O libevent-2.0.22-stable.tar.gz --no-check-certificate && \
tar xf libevent-2.0.22-stable.tar.gz && \
cd libevent-2.0.22-stable/ && \
./configure && \
make && \
make install && \
cd .. && \
bash -c 'ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5;ln -s /usr/local/lib/libevent_pthreads-2.0.so.5 /usr/lib/libevent_pthreads-2.0.so.5;ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5;ln -s /usr/local/lib/libevent_pthreads-2.0.so.5 /usr/lib64/libevent_pthreads-2.0.so.5;exit 0' && \
rm -rf /libevent-2.0.22-stable.tar.gz /libevent-2.0.22-stable
# srvpro
COPY . /ygopro-server
WORKDIR /ygopro-server
RUN npm ci && \
mkdir config decks replays logs
# ygopro
RUN git clone --branch=server --recursive --depth=1 https://github.com/purerosefallen/ygopro /ygopro-server/ygopro
WORKDIR /ygopro-server/ygopro
RUN git submodule foreach git checkout master && \
wget -O - https://github.com/premake/premake-core/releases/download/v5.0.0-alpha13/premake-5.0.0-alpha13-linux.tar.gz | tar zfx - && \
./premake5 gmake && \
cd build && \
make config=release && \
cd .. && \
ln -s ./bin/release/ygopro . && \
strip ygopro && \
mkdir replay expansions
# infos
WORKDIR /ygopro-server
EXPOSE 7911
EXPOSE 7922
VOLUME [ /ygopro-server/config, /ygopro-server/decks, /ygopro-server/replays ]
CMD [ "node", "ygopro-server.js" ]
README.md
View file @
456fb764
...
@@ -35,11 +35,23 @@
...
@@ -35,11 +35,23 @@
*
安装修改后的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/
*
使用本项目的Docker镜像: https://hub.docker.com/r/nanahira/ygopro-server/
*
镜像标签
*
`nanahira/ygopro-server:latest`
: 完整镜像
*
`nanahira/ygopro-server:lite`
: 基本镜像,云录像和人机对战功能需要配合
`redis`
和
`nanahira/windbot`
这两个镜像使用。
*
端口
*
`7911`
: YGOPro端口
*
`7911`
: YGOPro端口
*
`7922`
: 管理后台端口
*
`7922`
: 管理后台端口
*
数据卷
*
`/ygopro-server/config`
: SRVPro配置文件数据卷
*
`/ygopro-server/config`
: SRVPro配置文件数据卷
*
`/ygopro-server/ygopro/expansions`
: YGOPro额外卡片数据卷
*
`/ygopro-server/ygopro/expansions`
: YGOPro额外卡片数据卷
*
`/ygopro-server/decks`
: 竞赛模式卡组数据卷
*
`/ygopro-server/replays`
: 竞赛模式录像数据卷
*
若使用竞赛模式启动服务器,建议把启动命令修改为
`pm2-docker start /ygopro-server/data/pm2-docker-tournament.js`
。
### 高级功能
### 高级功能
*
待补充说明
*
待补充说明
...
...
data/i18n.json
View file @
456fb764
...
@@ -194,7 +194,8 @@
...
@@ -194,7 +194,8 @@
"arena_wait_timeout"
:
"Your opponent did not appear, you may quit without any penalty."
,
"arena_wait_timeout"
:
"Your opponent did not appear, you may quit without any penalty."
,
"auto_death_part1"
:
"This room is an auto-extra-duel room. The Extra Duel will begin after "
,
"auto_death_part1"
:
"This room is an auto-extra-duel room. The Extra Duel will begin after "
,
"auto_death_part2"
:
" minutes."
,
"auto_death_part2"
:
" minutes."
,
"athletic_arena_tip"
:
"During an athletic match, a game quit behavior is regarded as a surrender."
"athletic_arena_tip"
:
"During an athletic match, a game quit behavior is regarded as a surrender."
,
"windbot_disable_random_room"
:
"By adding the AI, this random game won't get any new player unless they enter the room name:"
},
},
"es-es"
:
{
"es-es"
:
{
"random_duel_enter_room_waiting"
:
"Tu oponente esta listo, Iniciar!"
,
"random_duel_enter_room_waiting"
:
"Tu oponente esta listo, Iniciar!"
,
...
@@ -535,7 +536,8 @@
...
@@ -535,7 +536,8 @@
"arena_wait_timeout"
:
"由于对手未能在30秒内进入游戏,此时您退出游戏不会扣分。"
,
"arena_wait_timeout"
:
"由于对手未能在30秒内进入游戏,此时您退出游戏不会扣分。"
,
"auto_death_part1"
:
"本房间为自动加时赛房间。比赛开始"
,
"auto_death_part1"
:
"本房间为自动加时赛房间。比赛开始"
,
"auto_death_part2"
:
"分钟后,将自动进入加时赛。"
,
"auto_death_part2"
:
"分钟后,将自动进入加时赛。"
,
"athletic_arena_tip"
:
"在竞技匹配中,比赛开始前退出游戏也会视为投降。"
"athletic_arena_tip"
:
"在竞技匹配中,比赛开始前退出游戏也会视为投降。"
,
"windbot_disable_random_room"
:
"因为添加了AI,本随机对战房间将只能通过房间名加入:"
},
},
"ko-kr"
:
{
"ko-kr"
:
{
"random_duel_enter_room_waiting"
:
"땅콩: 게임을 진행하게 준비 또는 시작을 하십시오."
,
"random_duel_enter_room_waiting"
:
"땅콩: 게임을 진행하게 준비 또는 시작을 하십시오."
,
...
...
ygopro-auth.coffee
View file @
456fb764
...
@@ -27,7 +27,7 @@ or as follows, to use a specific set of permissions.
...
@@ -27,7 +27,7 @@ or as follows, to use a specific set of permissions.
fs
=
require
'fs'
fs
=
require
'fs'
loadJSON
=
require
(
'load-json-file'
).
sync
loadJSON
=
require
(
'load-json-file'
).
sync
moment
=
require
'moment'
moment
=
require
'moment'
moment
.
l
ocale
(
'zh-cn'
,
{
moment
.
updateL
ocale
(
'zh-cn'
,
{
relativeTime
:
{
relativeTime
:
{
future
:
'%s内'
,
future
:
'%s内'
,
past
:
'%s前'
,
past
:
'%s前'
,
...
@@ -45,13 +45,16 @@ moment.locale('zh-cn', {
...
@@ -45,13 +45,16 @@ moment.locale('zh-cn', {
}
}
})
})
bunyan
=
require
'bunyan'
log
=
bunyan
.
createLogger
name
:
"auth"
if
not
fs
.
existsSync
(
'./logs'
)
if
not
fs
.
existsSync
(
'./logs'
)
fs
.
mkdirSync
(
'./logs'
)
fs
.
mkdirSync
(
'./logs'
)
add_log
=
(
message
)
->
add_log
=
(
message
)
->
mt
=
moment
()
mt
=
moment
()
log
.
info
(
message
)
text
=
mt
.
format
(
'YYYY-MM-DD HH:mm:ss'
)
+
" --> "
+
message
+
"
\n
"
text
=
mt
.
format
(
'YYYY-MM-DD HH:mm:ss'
)
+
" --> "
+
message
+
"
\n
"
console
.
log
(
text
)
res
=
false
res
=
false
try
try
fs
.
appendFileSync
(
"./logs/"
+
mt
.
format
(
'YYYY-MM-DD'
)
+
".log"
,
text
)
fs
.
appendFileSync
(
"./logs/"
+
mt
.
format
(
'YYYY-MM-DD'
)
+
".log"
,
text
)
...
...
ygopro-auth.js
View file @
456fb764
...
@@ -28,7 +28,7 @@ or as follows, to use a specific set of permissions.
...
@@ -28,7 +28,7 @@ or as follows, to use a specific set of permissions.
*/
*/
(
function
()
{
(
function
()
{
var
add_log
,
check_permission
,
default_data
,
fs
,
loadJSON
,
moment
,
reload
,
save
,
setting_save
,
users
;
var
add_log
,
bunyan
,
check_permission
,
default_data
,
fs
,
loadJSON
,
log
,
moment
,
reload
,
save
,
setting_save
,
users
;
fs
=
require
(
'
fs
'
);
fs
=
require
(
'
fs
'
);
...
@@ -36,7 +36,7 @@ or as follows, to use a specific set of permissions.
...
@@ -36,7 +36,7 @@ or as follows, to use a specific set of permissions.
moment
=
require
(
'
moment
'
);
moment
=
require
(
'
moment
'
);
moment
.
l
ocale
(
'
zh-cn
'
,
{
moment
.
updateL
ocale
(
'
zh-cn
'
,
{
relativeTime
:
{
relativeTime
:
{
future
:
'
%s内
'
,
future
:
'
%s内
'
,
past
:
'
%s前
'
,
past
:
'
%s前
'
,
...
@@ -54,6 +54,12 @@ or as follows, to use a specific set of permissions.
...
@@ -54,6 +54,12 @@ or as follows, to use a specific set of permissions.
}
}
});
});
bunyan
=
require
(
'
bunyan
'
);
log
=
bunyan
.
createLogger
({
name
:
"
auth
"
});
if
(
!
fs
.
existsSync
(
'
./logs
'
))
{
if
(
!
fs
.
existsSync
(
'
./logs
'
))
{
fs
.
mkdirSync
(
'
./logs
'
);
fs
.
mkdirSync
(
'
./logs
'
);
}
}
...
@@ -61,8 +67,8 @@ or as follows, to use a specific set of permissions.
...
@@ -61,8 +67,8 @@ or as follows, to use a specific set of permissions.
add_log
=
function
(
message
)
{
add_log
=
function
(
message
)
{
var
mt
,
res
,
text
;
var
mt
,
res
,
text
;
mt
=
moment
();
mt
=
moment
();
log
.
info
(
message
);
text
=
mt
.
format
(
'
YYYY-MM-DD HH:mm:ss
'
)
+
"
-->
"
+
message
+
"
\n
"
;
text
=
mt
.
format
(
'
YYYY-MM-DD HH:mm:ss
'
)
+
"
-->
"
+
message
+
"
\n
"
;
console
.
log
(
text
);
res
=
false
;
res
=
false
;
try
{
try
{
fs
.
appendFileSync
(
"
./logs/
"
+
mt
.
format
(
'
YYYY-MM-DD
'
)
+
"
.log
"
,
text
);
fs
.
appendFileSync
(
"
./logs/
"
+
mt
.
format
(
'
YYYY-MM-DD
'
)
+
"
.log
"
,
text
);
...
...
ygopro-server.coffee
View file @
456fb764
...
@@ -22,7 +22,7 @@ bunyan = require 'bunyan'
...
@@ -22,7 +22,7 @@ bunyan = require 'bunyan'
log
=
bunyan
.
createLogger
name
:
"mycard"
log
=
bunyan
.
createLogger
name
:
"mycard"
moment
=
require
'moment'
moment
=
require
'moment'
moment
.
l
ocale
(
'zh-cn'
,
{
moment
.
updateL
ocale
(
'zh-cn'
,
{
relativeTime
:
{
relativeTime
:
{
future
:
'%s内'
,
future
:
'%s内'
,
past
:
'%s前'
,
past
:
'%s前'
,
...
@@ -378,6 +378,14 @@ if settings.modules.cloud_replay.enabled
...
@@ -378,6 +378,14 @@ if settings.modules.cloud_replay.enabled
if
settings
.
modules
.
windbot
.
enabled
if
settings
.
modules
.
windbot
.
enabled
windbots
=
loadJSON
(
settings
.
modules
.
windbot
.
botlist
).
windbots
windbots
=
loadJSON
(
settings
.
modules
.
windbot
.
botlist
).
windbots
real_windbot_server_ip
=
settings
.
modules
.
windbot
.
server_ip
if
!
settings
.
modules
.
windbot
.
server_ip
.
includes
(
"127.0.0.1"
)
dns
=
require
(
'dns'
)
dns
.
lookup
(
settings
.
modules
.
windbot
.
server_ip
,(
err
,
addr
)
->
if
(
!
err
)
real_windbot_server_ip
=
addr
)
if
settings
.
modules
.
heartbeat_detection
.
enabled
if
settings
.
modules
.
heartbeat_detection
.
enabled
long_resolve_cards
=
loadJSON
(
'./data/long_resolve_cards.json'
)
long_resolve_cards
=
loadJSON
(
'./data/long_resolve_cards.json'
)
...
@@ -664,7 +672,7 @@ ROOM_find_or_create_random = (type, player_ip)->
...
@@ -664,7 +672,7 @@ ROOM_find_or_create_random = (type, player_ip)->
max_player
=
if
type
==
'T'
then
4
else
2
max_player
=
if
type
==
'T'
then
4
else
2
playerbanned
=
(
bannedplayer
and
bannedplayer
.
count
>
3
and
moment
()
<
bannedplayer
.
time
)
playerbanned
=
(
bannedplayer
and
bannedplayer
.
count
>
3
and
moment
()
<
bannedplayer
.
time
)
result
=
_
.
find
ROOM_all
,
(
room
)
->
result
=
_
.
find
ROOM_all
,
(
room
)
->
return
room
and
room
.
random_type
!=
''
and
!
room
.
started
and
return
room
and
room
.
random_type
!=
''
and
!
room
.
started
and
!
room
.
windbot
and
((
type
==
''
and
room
.
random_type
!=
'T'
and
((
!
_
.
endsWith
(
room
.
random_type
,
"MR"
)
and
room
.
random_type
!=
'M'
)
or
(
settings
.
modules
.
random_duel
.
blank_pass_match
and
room
.
random_type
!=
'T'
)))
or
room
.
random_type
==
type
)
and
((
type
==
''
and
room
.
random_type
!=
'T'
and
((
!
_
.
endsWith
(
room
.
random_type
,
"MR"
)
and
room
.
random_type
!=
'M'
)
or
(
settings
.
modules
.
random_duel
.
blank_pass_match
and
room
.
random_type
!=
'T'
)))
or
room
.
random_type
==
type
)
and
room
.
get_playing_player
().
length
<
max_player
and
room
.
get_playing_player
().
length
<
max_player
and
(
settings
.
modules
.
random_duel
.
no_rematch_check
or
room
.
get_host
()
==
null
or
(
settings
.
modules
.
random_duel
.
no_rematch_check
or
room
.
get_host
()
==
null
or
...
@@ -1649,7 +1657,7 @@ class Room
...
@@ -1649,7 +1657,7 @@ class Room
# 网络连接
# 网络连接
net
.
createServer
(
client
)
->
net
.
createServer
(
client
)
->
client
.
ip
=
client
.
remoteAddress
client
.
ip
=
client
.
remoteAddress
client
.
is_local
=
client
.
ip
and
(
client
.
ip
.
includes
(
'127.0.0.1'
)
or
client
.
ip
.
includes
(
settings
.
modules
.
windbot
.
server_ip
))
client
.
is_local
=
client
.
ip
and
(
client
.
ip
.
includes
(
'127.0.0.1'
)
or
client
.
ip
.
includes
(
real_windbot_
server_ip
))
connect_count
=
ROOM_connected_ip
[
client
.
ip
]
or
0
connect_count
=
ROOM_connected_ip
[
client
.
ip
]
or
0
if
!
settings
.
modules
.
test_mode
.
no_connect_count_limit
and
!
client
.
is_local
if
!
settings
.
modules
.
test_mode
.
no_connect_count_limit
and
!
client
.
is_local
...
@@ -3258,6 +3266,8 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
...
@@ -3258,6 +3266,8 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
return
return
else
else
windbot
=
_
.
sample
windbots
windbot
=
_
.
sample
windbots
if
room
.
random_type
ygopro
.
stoc_send_chat
(
client
,
"${windbot_disable_random_room} "
+
room
.
name
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
room
.
add_windbot
(
windbot
)
room
.
add_windbot
(
windbot
)
when
'/roomname'
when
'/roomname'
...
@@ -3394,7 +3404,7 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
...
@@ -3394,7 +3404,7 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
return
cancel
return
cancel
if
client
.
abuse_count
>=
5
or
CLIENT_is_banned_by_mc
(
client
)
if
client
.
abuse_count
>=
5
or
CLIENT_is_banned_by_mc
(
client
)
log
.
warn
"BANNED CHAT"
,
client
.
name
,
client
.
ip
,
msg
log
.
warn
"BANNED CHAT"
,
client
.
name
,
client
.
ip
,
msg
ygopro
.
stoc_send_chat
(
client
,
"${banned_chat_tip}"
,
ygopro
.
constants
.
COLORS
.
RED
)
ygopro
.
stoc_send_chat
(
client
,
"${banned_chat_tip}"
+
(
if
client
.
ban_mc
and
client
.
ban_mc
.
message
then
(
": "
+
client
.
ban_mc
.
message
)
else
""
)
,
ygopro
.
constants
.
COLORS
.
RED
)
return
true
return
true
oldmsg
=
msg
oldmsg
=
msg
if
(
_
.
any
(
badwords
.
level3
,
(
badword
)
->
if
(
_
.
any
(
badwords
.
level3
,
(
badword
)
->
...
@@ -4056,7 +4066,7 @@ if settings.modules.http
...
@@ -4056,7 +4066,7 @@ if settings.modules.http
return
return
else
else
getpath
=
u
.
pathname
.
split
(
"/"
)
getpath
=
u
.
pathname
.
split
(
"/"
)
filename
=
decodeURIComponent
(
getpath
.
pop
(
))
filename
=
path
.
basename
(
decodeURIComponent
(
getpath
.
pop
()
))
fs
.
readFile
(
settings
.
modules
.
tournament_mode
.
replay_path
+
filename
,
(
error
,
buffer
)
->
fs
.
readFile
(
settings
.
modules
.
tournament_mode
.
replay_path
+
filename
,
(
error
,
buffer
)
->
if
error
if
error
response
.
writeHead
(
404
)
response
.
writeHead
(
404
)
...
...
ygopro-server.js
View file @
456fb764
// Generated by CoffeeScript 1.12.7
// Generated by CoffeeScript 1.12.7
(
function
()
{
(
function
()
{
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
,
d
uel_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
,
rebooted
,
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
,
windbot_process
,
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
,
d
ns
,
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
,
real_windbot_server_ip
,
rebooted
,
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
,
windbot_process
,
windbots
,
words
,
ygopro
,
zlib
;
net
=
require
(
'
net
'
);
net
=
require
(
'
net
'
);
...
@@ -40,7 +40,7 @@
...
@@ -40,7 +40,7 @@
moment
=
require
(
'
moment
'
);
moment
=
require
(
'
moment
'
);
moment
.
l
ocale
(
'
zh-cn
'
,
{
moment
.
updateL
ocale
(
'
zh-cn
'
,
{
relativeTime
:
{
relativeTime
:
{
future
:
'
%s内
'
,
future
:
'
%s内
'
,
past
:
'
%s前
'
,
past
:
'
%s前
'
,
...
@@ -467,6 +467,15 @@
...
@@ -467,6 +467,15 @@
if
(
settings
.
modules
.
windbot
.
enabled
)
{
if
(
settings
.
modules
.
windbot
.
enabled
)
{
windbots
=
loadJSON
(
settings
.
modules
.
windbot
.
botlist
).
windbots
;
windbots
=
loadJSON
(
settings
.
modules
.
windbot
.
botlist
).
windbots
;
real_windbot_server_ip
=
settings
.
modules
.
windbot
.
server_ip
;
if
(
!
settings
.
modules
.
windbot
.
server_ip
.
includes
(
"
127.0.0.1
"
))
{
dns
=
require
(
'
dns
'
);
dns
.
lookup
(
settings
.
modules
.
windbot
.
server_ip
,
function
(
err
,
addr
)
{
if
(
!
err
)
{
return
real_windbot_server_ip
=
addr
;
}
});
}
}
}
if
(
settings
.
modules
.
heartbeat_detection
.
enabled
)
{
if
(
settings
.
modules
.
heartbeat_detection
.
enabled
)
{
...
@@ -856,7 +865,7 @@
...
@@ -856,7 +865,7 @@
max_player
=
type
===
'
T
'
?
4
:
2
;
max_player
=
type
===
'
T
'
?
4
:
2
;
playerbanned
=
bannedplayer
&&
bannedplayer
.
count
>
3
&&
moment
()
<
bannedplayer
.
time
;
playerbanned
=
bannedplayer
&&
bannedplayer
.
count
>
3
&&
moment
()
<
bannedplayer
.
time
;
result
=
_
.
find
(
ROOM_all
,
function
(
room
)
{
result
=
_
.
find
(
ROOM_all
,
function
(
room
)
{
return
room
&&
room
.
random_type
!==
''
&&
!
room
.
started
&&
((
type
===
''
&&
room
.
random_type
!==
'
T
'
&&
((
!
_
.
endsWith
(
room
.
random_type
,
"
MR
"
)
&&
room
.
random_type
!==
'
M
'
)
||
(
settings
.
modules
.
random_duel
.
blank_pass_match
&&
room
.
random_type
!==
'
T
'
)))
||
room
.
random_type
===
type
)
&&
room
.
get_playing_player
().
length
<
max_player
&&
(
settings
.
modules
.
random_duel
.
no_rematch_check
||
room
.
get_host
()
===
null
||
room
.
get_host
().
ip
!==
ROOM_players_oppentlist
[
player_ip
])
&&
(
playerbanned
===
room
.
deprecated
||
type
===
'
T
'
);
return
room
&&
room
.
random_type
!==
''
&&
!
room
.
started
&&
!
room
.
windbot
&&
((
type
===
''
&&
room
.
random_type
!==
'
T
'
&&
((
!
_
.
endsWith
(
room
.
random_type
,
"
MR
"
)
&&
room
.
random_type
!==
'
M
'
)
||
(
settings
.
modules
.
random_duel
.
blank_pass_match
&&
room
.
random_type
!==
'
T
'
)))
||
room
.
random_type
===
type
)
&&
room
.
get_playing_player
().
length
<
max_player
&&
(
settings
.
modules
.
random_duel
.
no_rematch_check
||
room
.
get_host
()
===
null
||
room
.
get_host
().
ip
!==
ROOM_players_oppentlist
[
player_ip
])
&&
(
playerbanned
===
room
.
deprecated
||
type
===
'
T
'
);
});
});
if
(
result
)
{
if
(
result
)
{
result
.
welcome
=
'
${random_duel_enter_room_waiting}
'
;
result
.
welcome
=
'
${random_duel_enter_room_waiting}
'
;
...
@@ -2166,7 +2175,7 @@
...
@@ -2166,7 +2175,7 @@
net
.
createServer
(
function
(
client
)
{
net
.
createServer
(
function
(
client
)
{
var
connect_count
,
server
;
var
connect_count
,
server
;
client
.
ip
=
client
.
remoteAddress
;
client
.
ip
=
client
.
remoteAddress
;
client
.
is_local
=
client
.
ip
&&
(
client
.
ip
.
includes
(
'
127.0.0.1
'
)
||
client
.
ip
.
includes
(
settings
.
modules
.
windbot
.
server_ip
));
client
.
is_local
=
client
.
ip
&&
(
client
.
ip
.
includes
(
'
127.0.0.1
'
)
||
client
.
ip
.
includes
(
real_windbot_
server_ip
));
connect_count
=
ROOM_connected_ip
[
client
.
ip
]
||
0
;
connect_count
=
ROOM_connected_ip
[
client
.
ip
]
||
0
;
if
(
!
settings
.
modules
.
test_mode
.
no_connect_count_limit
&&
!
client
.
is_local
)
{
if
(
!
settings
.
modules
.
test_mode
.
no_connect_count_limit
&&
!
client
.
is_local
)
{
connect_count
++
;
connect_count
++
;
...
@@ -4192,6 +4201,9 @@
...
@@ -4192,6 +4201,9 @@
}
else
{
}
else
{
windbot
=
_
.
sample
(
windbots
);
windbot
=
_
.
sample
(
windbots
);
}
}
if
(
room
.
random_type
)
{
ygopro
.
stoc_send_chat
(
client
,
"
${windbot_disable_random_room}
"
+
room
.
name
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
room
.
add_windbot
(
windbot
);
room
.
add_windbot
(
windbot
);
}
}
break
;
break
;
...
@@ -4367,7 +4379,7 @@
...
@@ -4367,7 +4379,7 @@
}
}
if
(
client
.
abuse_count
>=
5
||
CLIENT_is_banned_by_mc
(
client
))
{
if
(
client
.
abuse_count
>=
5
||
CLIENT_is_banned_by_mc
(
client
))
{
log
.
warn
(
"
BANNED CHAT
"
,
client
.
name
,
client
.
ip
,
msg
);
log
.
warn
(
"
BANNED CHAT
"
,
client
.
name
,
client
.
ip
,
msg
);
ygopro
.
stoc_send_chat
(
client
,
"
${banned_chat_tip}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
ygopro
.
stoc_send_chat
(
client
,
"
${banned_chat_tip}
"
+
(
client
.
ban_mc
&&
client
.
ban_mc
.
message
?
"
:
"
+
client
.
ban_mc
.
message
:
""
)
,
ygopro
.
constants
.
COLORS
.
RED
);
return
true
;
return
true
;
}
}
oldmsg
=
msg
;
oldmsg
=
msg
;
...
@@ -5279,7 +5291,7 @@
...
@@ -5279,7 +5291,7 @@
return
;
return
;
}
else
{
}
else
{
getpath
=
u
.
pathname
.
split
(
"
/
"
);
getpath
=
u
.
pathname
.
split
(
"
/
"
);
filename
=
decodeURIComponent
(
getpath
.
pop
(
));
filename
=
path
.
basename
(
decodeURIComponent
(
getpath
.
pop
()
));
fs
.
readFile
(
settings
.
modules
.
tournament_mode
.
replay_path
+
filename
,
function
(
error
,
buffer
)
{
fs
.
readFile
(
settings
.
modules
.
tournament_mode
.
replay_path
+
filename
,
function
(
error
,
buffer
)
{
if
(
error
)
{
if
(
error
)
{
response
.
writeHead
(
404
);
response
.
writeHead
(
404
);
...
...
ygopro-webhook.js
View file @
456fb764
...
@@ -10,6 +10,7 @@
...
@@ -10,6 +10,7 @@
*/
*/
var
http
=
require
(
'
http
'
);
var
http
=
require
(
'
http
'
);
var
https
=
require
(
'
https
'
);
var
fs
=
require
(
'
fs
'
);
var
fs
=
require
(
'
fs
'
);
var
execSync
=
require
(
'
child_process
'
).
execSync
;
var
execSync
=
require
(
'
child_process
'
).
execSync
;
var
spawn
=
require
(
'
child_process
'
).
spawn
;
var
spawn
=
require
(
'
child_process
'
).
spawn
;
...
@@ -19,10 +20,11 @@ var moment = require('moment');
...
@@ -19,10 +20,11 @@ var moment = require('moment');
moment
.
locale
(
'
zh-cn
'
);
moment
.
locale
(
'
zh-cn
'
);
var
loadJSON
=
require
(
'
load-json-file
'
).
sync
;
var
loadJSON
=
require
(
'
load-json-file
'
).
sync
;
var
constants
=
loadJSON
(
'
./data/constants.json
'
);
//
var constants = loadJSON('./data/constants.json');
var
settings
=
loadJSON
(
'
./config/config.json
'
);
var
settings
=
loadJSON
(
'
./config/config.json
'
);
config
=
settings
.
modules
.
webhook
;
config
=
settings
.
modules
.
webhook
;
ssl_config
=
settings
.
modules
.
http
.
ssl
;
var
status
=
{};
var
status
=
{};
...
@@ -174,8 +176,7 @@ var return_success = function(res, msg) {
...
@@ -174,8 +176,7 @@ var return_success = function(res, msg) {
return
;
return
;
}
}
//will create an http server to receive apis
var
requestListener
=
function
(
req
,
res
)
{
http
.
createServer
(
function
(
req
,
res
)
{
var
u
=
url
.
parse
(
req
.
url
,
true
);
var
u
=
url
.
parse
(
req
.
url
,
true
);
var
data
=
u
.
pathname
.
split
(
"
/
"
);
var
data
=
u
.
pathname
.
split
(
"
/
"
);
if
(
data
[
0
]
!==
""
||
data
[
1
]
!==
"
api
"
)
{
if
(
data
[
0
]
!==
""
||
data
[
1
]
!==
"
api
"
)
{
...
@@ -219,5 +220,17 @@ http.createServer(function (req, res) {
...
@@ -219,5 +220,17 @@ http.createServer(function (req, res) {
}
}
});
});
return
;
return
;
}
).
listen
(
config
.
port
);
}
//will create an http server to receive apis
if
(
ssl_config
.
enabled
)
{
const
ssl_cert
=
fs
.
readFileSync
(
ssl_config
.
cert
);
const
ssl_key
=
fs
.
readFileSync
(
ssl_config
.
key
);
const
options
=
{
cert
:
ssl_cert
,
key
:
ssl_key
}
https
.
createServer
(
options
,
requestListener
).
listen
(
config
.
port
);
}
else
{
http
.
createServer
(
requestListener
).
listen
(
config
.
port
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment