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
bcfe4525
Commit
bcfe4525
authored
Mar 29, 2016
by
mercury233
Browse files
Options
Browse Files
Download
Plain Diff
Merge
https://github.com/mycard/ygopro-server
into lite
parents
3b8b6594
947de68d
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
276 additions
and
225 deletions
+276
-225
.dockerignore
.dockerignore
+7
-0
Dockerfile
Dockerfile
+13
-2
config.json
config.json
+0
-1
room.coffee
room.coffee
+80
-74
room.js
room.js
+12
-4
ygopro-server.coffee
ygopro-server.coffee
+145
-142
ygopro-server.js
ygopro-server.js
+19
-2
No files found.
.dockerignore
0 → 100644
View file @
bcfe4525
Dockerfile
.git
.gitattributes
.gitignore
.gitmodules
.gitkeep
.dockerignore
Dockerfile
View file @
bcfe4525
FROM
node
FROM
node
RUN
apt-get update
RUN
apt-get update
RUN
apt-get
install
-y
git build-essential premake4 libfreetype6-dev libevent-dev libsqlite3-dev liblua5.2-dev mono-complete
RUN
apt-get
install
-y
git build-essential premake4 libfreetype6-dev libevent-dev libsqlite3-dev liblua5.2-dev mono-complete
cmake
RUN
mkdir
-p
/usr/src/app
RUN
mkdir
-p
/usr/src/app
WORKDIR
/usr/src/app
WORKDIR
/usr/src/app
...
@@ -17,11 +17,22 @@ WORKDIR /usr/src/app/ygopro
...
@@ -17,11 +17,22 @@ WORKDIR /usr/src/app/ygopro
RUN
ln
-s
bin/release/ygopro ygopro
RUN
ln
-s
bin/release/ygopro ygopro
RUN
strip ygopro
RUN
strip ygopro
WORKDIR
/usr/src/app/ygosharp
RUN
xbuild /property:Configuration
=
Release /property:OutDir
=
/usr/src/app/windbot/
RUN
mv
/usr/src/app/windbot /usr/src/app/windbot-source
RUN
mv
/usr/src/app/windbot /usr/src/app/windbot-source
WORKDIR
/usr/src/app/windbot-source/NLua/Core/KeraLua
ENV
CFLAGS=-m64 CXXFLAGS=-m64 LDFLAGS=-m64
RUN
make
-f
Makefile.Linux
RUN
xbuild KeraLua.Net45.sln /p:Configuration
=
Release
WORKDIR
/usr/src/app/windbot-source/NLua
RUN
xbuild NLua.Net45.sln /p:Configuration
=
Release
RUN
mv
/usr/src/app/windbot-source/NLua/Run/Release/net45/
*
.dll /usr/src/app/windbot-source/
WORKDIR
/usr/src/app/windbot-source
WORKDIR
/usr/src/app/windbot-source
RUN
xbuild /property:Configuration
=
Release /property:OutDir
=
/usr/src/app/windbot/
RUN
xbuild /property:Configuration
=
Release /property:OutDir
=
/usr/src/app/windbot/
RUN
mv
/usr/src/app/windbot-source/NLua/Core/KeraLua/external/lua/linux/lib64/liblua52.so /usr/src/app/windbot/
WORKDIR
/usr/src/app
WORKDIR
/usr/src/app
RUN
rm
-rf
/usr/src/app/windbot-source
#
RUN rm -rf /usr/src/app/windbot-source
RUN
ln
-s
/usr/src/app/ygopro/cards.cdb /usr/src/app/windbot/cards.cdb
RUN
ln
-s
/usr/src/app/ygopro/cards.cdb /usr/src/app/windbot/cards.cdb
WORKDIR
/usr/src/app
WORKDIR
/usr/src/app
...
...
config.json
View file @
bcfe4525
...
@@ -12,7 +12,6 @@
...
@@ -12,7 +12,6 @@
"enable_random_duel"
:
false
,
"enable_random_duel"
:
false
,
"mycard_auth"
:
false
,
"mycard_auth"
:
false
,
"post_start_watching"
:
true
,
"post_start_watching"
:
true
,
"TCG_banlist_id"
:
8
,
"enable_TCG_as_default"
:
false
,
"enable_TCG_as_default"
:
false
,
"http"
:
{
"http"
:
{
"port"
:
7922
,
"port"
:
7922
,
...
...
room.coffee
View file @
bcfe4525
...
@@ -9,21 +9,23 @@ roomlist = require './roomlist' if settings.modules.enable_websocket_roomlist
...
@@ -9,21 +9,23 @@ roomlist = require './roomlist' if settings.modules.enable_websocket_roomlist
bunyan
=
require
'bunyan'
bunyan
=
require
'bunyan'
moment
=
require
'moment'
moment
=
require
'moment'
#redis = require 'redis'
#redis = require 'redis'
moment
.
locale
(
'zh-cn'
,
{
relativeTime
:
{
moment
.
locale
(
'zh-cn'
,
{
future
:
'%s内'
,
relativeTime
:
{
past
:
'%s前'
,
future
:
'%s内'
,
s
:
'%d秒'
,
past
:
'%s前'
,
m
:
'1分钟'
,
s
:
'%d秒'
,
mm
:
'%d分钟'
,
m
:
'1分钟'
,
h
:
'1小时'
,
mm
:
'%d分钟'
,
hh
:
'%d小时'
,
h
:
'1小时'
,
d
:
'1天'
,
hh
:
'%d小时'
,
dd
:
'%d天'
,
d
:
'1天'
,
M
:
'1个月'
,
dd
:
'%d天'
,
MM
:
'%d个月'
,
M
:
'1个月'
,
y
:
'1年'
,
MM
:
'%d个月'
,
yy
:
'%d年'
y
:
'1年'
,
}})
yy
:
'%d年'
}
})
log
=
bunyan
.
createLogger
name
:
"mycard-room"
log
=
bunyan
.
createLogger
name
:
"mycard-room"
#redisdb = redis.createClient host: "127.0.0.1", port: settings.modules.redis_port
#redisdb = redis.createClient host: "127.0.0.1", port: settings.modules.redis_port
...
@@ -58,16 +60,16 @@ class Room
...
@@ -58,16 +60,16 @@ class Room
@
ban_player
:
(
name
,
ip
,
reason
)
->
@
ban_player
:
(
name
,
ip
,
reason
)
->
bannedplayer
=
_
.
find
Room
.
players_banned
,
(
bannedplayer
)
->
bannedplayer
=
_
.
find
Room
.
players_banned
,
(
bannedplayer
)
->
ip
==
bannedplayer
.
ip
ip
==
bannedplayer
.
ip
if
bannedplayer
if
bannedplayer
bannedplayer
.
count
=
bannedplayer
.
count
+
1
bannedplayer
.
count
=
bannedplayer
.
count
+
1
bantime
=
if
bannedplayer
.
count
>
3
then
Math
.
pow
(
2
,
bannedplayer
.
count
-
3
)
*
2
else
0
bantime
=
if
bannedplayer
.
count
>
3
then
Math
.
pow
(
2
,
bannedplayer
.
count
-
3
)
*
2
else
0
bannedplayer
.
time
=
if
moment
()
<
bannedplayer
.
time
then
moment
(
bannedplayer
.
time
).
add
(
bantime
,
'm'
)
else
moment
().
add
(
bantime
,
'm'
)
bannedplayer
.
time
=
if
moment
()
<
bannedplayer
.
time
then
moment
(
bannedplayer
.
time
).
add
(
bantime
,
'm'
)
else
moment
().
add
(
bantime
,
'm'
)
bannedplayer
.
reasons
.
push
(
reason
)
if
not
_
.
find
bannedplayer
.
reasons
,
(
bannedreason
)
->
bannedplayer
.
reasons
.
push
(
reason
)
if
not
_
.
find
bannedplayer
.
reasons
,
(
bannedreason
)
->
bannedreason
==
reason
bannedreason
==
reason
bannedplayer
.
need_tip
=
true
;
bannedplayer
.
need_tip
=
true
;
else
else
bannedplayer
=
{
"ip"
:
ip
,
"time"
:
moment
(),
"count"
:
1
,
"reasons"
:
[
reason
],
"need_tip"
:
true
}
bannedplayer
=
{
"ip"
:
ip
,
"time"
:
moment
(),
"count"
:
1
,
"reasons"
:
[
reason
],
"need_tip"
:
true
}
Room
.
players_banned
.
push
(
bannedplayer
)
Room
.
players_banned
.
push
(
bannedplayer
)
log
.
info
(
"banned"
,
name
,
ip
,
reason
,
bannedplayer
.
count
)
log
.
info
(
"banned"
,
name
,
ip
,
reason
,
bannedplayer
.
count
)
return
return
...
@@ -77,40 +79,40 @@ class Room
...
@@ -77,40 +79,40 @@ class Room
return
@
find_or_create_random
(
name
.
toUpperCase
(),
player_ip
)
return
@
find_or_create_random
(
name
.
toUpperCase
(),
player_ip
)
if
room
=
@
find_by_name
(
name
)
if
room
=
@
find_by_name
(
name
)
return
room
return
room
else
if
get_memory_usage
()
>=
90
else
if
get_memory_usage
()
>=
90
return
null
return
null
else
else
return
new
Room
(
name
)
return
new
Room
(
name
)
@
find_or_create_random
:
(
type
,
player_ip
)
->
@
find_or_create_random
:
(
type
,
player_ip
)
->
bannedplayer
=
_
.
find
Room
.
players_banned
,
(
bannedplayer
)
->
bannedplayer
=
_
.
find
Room
.
players_banned
,
(
bannedplayer
)
->
return
player_ip
==
bannedplayer
.
ip
return
player_ip
==
bannedplayer
.
ip
if
bannedplayer
if
bannedplayer
if
bannedplayer
.
count
>
6
and
moment
()
<
bannedplayer
.
time
if
bannedplayer
.
count
>
6
and
moment
()
<
bannedplayer
.
time
return
{
"error"
:
"因为您近期在游戏中多次
#{
bannedplayer
.
reasons
.
join
(
'、'
)
}
,您已被禁止使用随机对战功能,将在
#{
moment
(
bannedplayer
.
time
).
fromNow
(
true
)
}
后解封"
}
return
{
"error"
:
"因为您近期在游戏中多次
#{
bannedplayer
.
reasons
.
join
(
'、'
)
}
,您已被禁止使用随机对战功能,将在
#{
moment
(
bannedplayer
.
time
).
fromNow
(
true
)
}
后解封"
}
if
bannedplayer
.
count
>
3
and
moment
()
<
bannedplayer
.
time
and
bannedplayer
.
need_tip
if
bannedplayer
.
count
>
3
and
moment
()
<
bannedplayer
.
time
and
bannedplayer
.
need_tip
bannedplayer
.
need_tip
=
false
bannedplayer
.
need_tip
=
false
return
{
"error"
:
"因为您近期在游戏中
#{
bannedplayer
.
reasons
.
join
(
'、'
)
}
,在
#{
moment
(
bannedplayer
.
time
).
fromNow
(
true
)
}
内您随机对战时只能遇到其他违规玩家"
}
return
{
"error"
:
"因为您近期在游戏中
#{
bannedplayer
.
reasons
.
join
(
'、'
)
}
,在
#{
moment
(
bannedplayer
.
time
).
fromNow
(
true
)
}
内您随机对战时只能遇到其他违规玩家"
}
else
if
bannedplayer
.
need_tip
else
if
bannedplayer
.
need_tip
bannedplayer
.
need_tip
=
false
bannedplayer
.
need_tip
=
false
return
{
"error"
:
"系统检测到您近期在游戏中
#{
bannedplayer
.
reasons
.
join
(
'、'
)
}
,若您违规超过3次,将受到惩罚"
}
return
{
"error"
:
"系统检测到您近期在游戏中
#{
bannedplayer
.
reasons
.
join
(
'、'
)
}
,若您违规超过3次,将受到惩罚"
}
else
if
bannedplayer
.
count
>
2
else
if
bannedplayer
.
count
>
2
bannedplayer
.
need_tip
=
true
bannedplayer
.
need_tip
=
true
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
@
all
,
(
room
)
->
result
=
_
.
find
@
all
,
(
room
)
->
return
room
.
random_type
!=
''
and
!
room
.
started
and
((
type
==
''
and
room
.
random_type
!=
'T'
)
or
room
.
random_type
==
type
)
and
room
.
get_playing_player
().
length
<
max_player
and
(
room
.
get_host
()
==
null
or
room
.
get_host
().
remoteAddress
!=
Room
.
players_oppentlist
[
player_ip
])
and
(
playerbanned
==
room
.
deprecated
)
return
room
.
random_type
!=
''
and
!
room
.
started
and
((
type
==
''
and
room
.
random_type
!=
'T'
)
or
room
.
random_type
==
type
)
and
room
.
get_playing_player
().
length
<
max_player
and
(
room
.
get_host
()
==
null
or
room
.
get_host
().
remoteAddress
!=
Room
.
players_oppentlist
[
player_ip
])
and
(
playerbanned
==
room
.
deprecated
)
if
result
if
result
result
.
welcome
=
'对手已经在等你了,开始决斗吧!'
result
.
welcome
=
'对手已经在等你了,开始决斗吧!'
#log.info 'found room', player_name
#log.info 'found room', player_name
else
else
type
=
if
type
then
type
else
'S'
type
=
if
type
then
type
else
'S'
name
=
type
+
',RANDOM#'
+
Math
.
floor
(
Math
.
random
()
*
100000
)
name
=
type
+
',RANDOM#'
+
Math
.
floor
(
Math
.
random
()
*
100000
)
result
=
new
Room
(
name
)
result
=
new
Room
(
name
)
result
.
random_type
=
type
result
.
random_type
=
type
result
.
max_player
=
max_player
result
.
max_player
=
max_player
result
.
welcome
=
'已建立随机对战房间,正在等待对手!'
result
.
welcome
=
'已建立随机对战房间,正在等待对手!'
result
.
deprecated
=
playerbanned
result
.
deprecated
=
playerbanned
#log.info 'create room', player_name, name
#log.info 'create room', player_name, name
return
result
return
result
...
@@ -125,12 +127,12 @@ class Room
...
@@ -125,12 +127,12 @@ class Room
room
.
port
==
port
room
.
port
==
port
@
validate
:
(
name
)
->
@
validate
:
(
name
)
->
client_name_and_pass
=
name
.
split
(
'$'
,
2
)
client_name_and_pass
=
name
.
split
(
'$'
,
2
)
client_name
=
client_name_and_pass
[
0
]
client_name
=
client_name_and_pass
[
0
]
client_pass
=
client_name_and_pass
[
1
]
client_pass
=
client_name_and_pass
[
1
]
return
true
if
!
client_pass
return
true
if
!
client_pass
!
_
.
find
Room
.
all
,
(
room
)
->
!
_
.
find
Room
.
all
,
(
room
)
->
room_name_and_pass
=
room
.
name
.
split
(
'$'
,
2
)
room_name_and_pass
=
room
.
name
.
split
(
'$'
,
2
)
room_name
=
room_name_and_pass
[
0
]
room_name
=
room_name_and_pass
[
0
]
room_pass
=
room_name_and_pass
[
1
]
room_pass
=
room_name_and_pass
[
1
]
client_name
==
room_name
and
client_pass
!=
room_pass
client_name
==
room_name
and
client_pass
!=
room_pass
...
@@ -150,7 +152,7 @@ class Room
...
@@ -150,7 +152,7 @@ class Room
Room
.
all
.
push
this
Room
.
all
.
push
this
@
hostinfo
||=
@
hostinfo
||=
lflist
:
0
lflist
:
(
list
)
->
!
list
.
tcg
and
list
.
date
.
isBefore
()
rule
:
if
settings
.
modules
.
enable_TCG_as_default
then
2
else
0
rule
:
if
settings
.
modules
.
enable_TCG_as_default
then
2
else
0
mode
:
0
mode
:
0
enable_priority
:
false
enable_priority
:
false
...
@@ -177,8 +179,8 @@ class Room
...
@@ -177,8 +179,8 @@ class Room
@
hostinfo
.
start_hand
=
parseInt
(
param
[
7
])
@
hostinfo
.
start_hand
=
parseInt
(
param
[
7
])
@
hostinfo
.
draw_count
=
parseInt
(
param
[
8
])
@
hostinfo
.
draw_count
=
parseInt
(
param
[
8
])
else
if
(((
param
=
name
.
match
/(.+)#/
)
!=
null
)
and
(
(
param
[
1
].
length
<=
2
and
param
[
1
].
match
(
/(S|N|M|T)(0|1|2|T|A)/i
))
or
(
param
[
1
].
match
(
/^(S|N|M|T)(0|1|2|O|T|A)(0|1|O|T)/i
))
)
)
else
if
(((
param
=
name
.
match
/(.+)#/
)
!=
null
)
and
(
(
param
[
1
].
length
<=
2
and
param
[
1
].
match
(
/(S|N|M|T)(0|1|2|T|A)/i
))
or
(
param
[
1
].
match
(
/^(S|N|M|T)(0|1|2|O|T|A)(0|1|O|T)/i
))
)
)
rule
=
param
[
1
].
toUpperCase
()
rule
=
param
[
1
].
toUpperCase
()
#log.info "C", rule
#log.info "C", rule
switch
rule
.
charAt
(
0
)
switch
rule
.
charAt
(
0
)
...
@@ -200,12 +202,12 @@ class Room
...
@@ -200,12 +202,12 @@ class Room
switch
rule
.
charAt
(
2
)
switch
rule
.
charAt
(
2
)
when
"1"
,
"T"
when
"1"
,
"T"
@
hostinfo
.
lflist
=
settings
.
modules
.
TCG_banlist_id
@
hostinfo
.
lflist
=
_
.
findIndex
settings
.
lflist
,
(
list
)
->
list
.
tcg
and
list
.
date
.
isBefore
()
else
else
@
hostinfo
.
lflist
=
0
@
hostinfo
.
lflist
=
_
.
findIndex
settings
.
lflist
,
(
list
)
->
!
list
.
tcg
and
list
.
date
.
isBefore
()
if
((
param
=
parseInt
(
rule
.
charAt
(
3
).
match
(
/\d/
)))
>=
0
)
if
((
param
=
parseInt
(
rule
.
charAt
(
3
).
match
(
/\d/
)))
>=
0
)
@
hostinfo
.
time_limit
=
param
*
60
@
hostinfo
.
time_limit
=
param
*
60
switch
rule
.
charAt
(
4
)
switch
rule
.
charAt
(
4
)
when
"T"
,
"1"
when
"T"
,
"1"
...
@@ -226,16 +228,16 @@ class Room
...
@@ -226,16 +228,16 @@ class Room
@
hostinfo
.
no_shuffle_deck
=
false
@
hostinfo
.
no_shuffle_deck
=
false
if
((
param
=
parseInt
(
rule
.
charAt
(
7
).
match
(
/\d/
)))
>
0
)
if
((
param
=
parseInt
(
rule
.
charAt
(
7
).
match
(
/\d/
)))
>
0
)
@
hostinfo
.
start_lp
=
param
*
4000
@
hostinfo
.
start_lp
=
param
*
4000
if
((
param
=
parseInt
(
rule
.
charAt
(
8
).
match
(
/\d/
)))
>
0
)
if
((
param
=
parseInt
(
rule
.
charAt
(
8
).
match
(
/\d/
)))
>
0
)
@
hostinfo
.
start_hand
=
param
@
hostinfo
.
start_hand
=
param
if
((
param
=
parseInt
(
rule
.
charAt
(
9
).
match
(
/\d/
)))
>=
0
)
if
((
param
=
parseInt
(
rule
.
charAt
(
9
).
match
(
/\d/
)))
>=
0
)
@
hostinfo
.
draw_count
=
param
@
hostinfo
.
draw_count
=
param
else
if
((
param
=
name
.
match
/(.+)#/
)
!=
null
)
else
if
((
param
=
name
.
match
/(.+)#/
)
!=
null
)
rule
=
param
[
1
].
toUpperCase
()
rule
=
param
[
1
].
toUpperCase
()
#log.info "233", rule
#log.info "233", rule
if
(
rule
.
match
/(^|,|,)(M|MATCH)(,|,|$)/
)
if
(
rule
.
match
/(^|,|,)(M|MATCH)(,|,|$)/
)
...
@@ -247,7 +249,7 @@ class Room
...
@@ -247,7 +249,7 @@ class Room
if
(
rule
.
match
/(^|,|,)(TCGONLY|TO)(,|,|$)/
)
if
(
rule
.
match
/(^|,|,)(TCGONLY|TO)(,|,|$)/
)
@
hostinfo
.
rule
=
1
@
hostinfo
.
rule
=
1
@
hostinfo
.
lflist
=
settings
.
modules
.
TCG_banlist_id
@
hostinfo
.
lflist
=
_
.
findIndex
settings
.
lflist
,
(
list
)
->
list
.
tcg
and
list
.
date
.
isBefore
()
if
(
rule
.
match
/(^|,|,)(OCGONLY|OO)(,|,|$)/
)
if
(
rule
.
match
/(^|,|,)(OCGONLY|OO)(,|,|$)/
)
@
hostinfo
.
rule
=
0
@
hostinfo
.
rule
=
0
...
@@ -264,7 +266,7 @@ class Room
...
@@ -264,7 +266,7 @@ class Room
if
(
param
=
rule
.
match
/(^|,|,)(TIME|TM|TI)(\d+)(,|,|$)/
)
if
(
param
=
rule
.
match
/(^|,|,)(TIME|TM|TI)(\d+)(,|,|$)/
)
time_limit
=
parseInt
(
param
[
3
])
time_limit
=
parseInt
(
param
[
3
])
if
(
time_limit
<
0
)
then
time_limit
=
180
if
(
time_limit
<
0
)
then
time_limit
=
180
if
(
time_limit
>=
1
and
time_limit
<=
60
)
then
time_limit
=
time_limit
*
60
if
(
time_limit
>=
1
and
time_limit
<=
60
)
then
time_limit
=
time_limit
*
60
if
(
time_limit
>=
999
)
then
time_limit
=
999
if
(
time_limit
>=
999
)
then
time_limit
=
999
@
hostinfo
.
time_limit
=
time_limit
@
hostinfo
.
time_limit
=
time_limit
...
@@ -280,7 +282,7 @@ class Room
...
@@ -280,7 +282,7 @@ class Room
@
hostinfo
.
draw_count
=
draw_count
@
hostinfo
.
draw_count
=
draw_count
if
(
param
=
rule
.
match
/(^|,|,)(LFLIST|LF)(\d+)(,|,|$)/
)
if
(
param
=
rule
.
match
/(^|,|,)(LFLIST|LF)(\d+)(,|,|$)/
)
lflist
=
parseInt
(
param
[
3
])
-
1
lflist
=
parseInt
(
param
[
3
])
-
1
@
hostinfo
.
lflist
=
lflist
@
hostinfo
.
lflist
=
lflist
if
(
rule
.
match
/(^|,|,)(NOLFLIST|NF)(,|,|$)/
)
if
(
rule
.
match
/(^|,|,)(NOLFLIST|NF)(,|,|$)/
)
...
@@ -298,7 +300,9 @@ class Room
...
@@ -298,7 +300,9 @@ class Room
if
(
rule
.
match
/(^|,|,)(IGPRIORITY|PR)(,|,|$)/
)
if
(
rule
.
match
/(^|,|,)(IGPRIORITY|PR)(,|,|$)/
)
@
hostinfo
.
enable_priority
=
true
@
hostinfo
.
enable_priority
=
true
param
=
[
0
,
@
hostinfo
.
lflist
,
@
hostinfo
.
rule
,
@
hostinfo
.
mode
,
(
if
@
hostinfo
.
enable_priority
then
'T'
else
'F'
),
(
if
@
hostinfo
.
no_check_deck
then
'T'
else
'F'
),
(
if
@
hostinfo
.
no_shuffle_deck
then
'T'
else
'F'
),
@
hostinfo
.
start_lp
,
@
hostinfo
.
start_hand
,
@
hostinfo
.
draw_count
,
@
hostinfo
.
time_limit
]
param
=
[
0
,
@
hostinfo
.
lflist
,
@
hostinfo
.
rule
,
@
hostinfo
.
mode
,
(
if
@
hostinfo
.
enable_priority
then
'T'
else
'F'
),
(
if
@
hostinfo
.
no_check_deck
then
'T'
else
'F'
),
(
if
@
hostinfo
.
no_shuffle_deck
then
'T'
else
'F'
),
@
hostinfo
.
start_lp
,
@
hostinfo
.
start_hand
,
@
hostinfo
.
draw_count
,
@
hostinfo
.
time_limit
]
try
try
@
process
=
spawn
'./ygopro'
,
param
,
{
cwd
:
settings
.
ygopro_path
}
@
process
=
spawn
'./ygopro'
,
param
,
{
cwd
:
settings
.
ygopro_path
}
...
@@ -312,7 +316,7 @@ class Room
...
@@ -312,7 +316,7 @@ class Room
roomlist
.
create
(
this
)
if
!
@
private
and
settings
.
modules
.
enable_websocket_roomlist
roomlist
.
create
(
this
)
if
!
@
private
and
settings
.
modules
.
enable_websocket_roomlist
@
port
=
parseInt
data
@
port
=
parseInt
data
_
.
each
@
players
,
(
player
)
=>
_
.
each
@
players
,
(
player
)
=>
player
.
server
.
connect
@
port
,
'127.0.0.1'
,
=>
player
.
server
.
connect
@
port
,
'127.0.0.1'
,
=>
player
.
server
.
write
buffer
for
buffer
in
player
.
pre_establish_buffers
player
.
server
.
write
buffer
for
buffer
in
player
.
pre_establish_buffers
player
.
established
=
true
player
.
established
=
true
player
.
pre_establish_buffers
=
[]
player
.
pre_establish_buffers
=
[]
...
@@ -320,19 +324,21 @@ class Room
...
@@ -320,19 +324,21 @@ class Room
return
return
console
.
log
@
windbot
console
.
log
@
windbot
if
@
windbot
if
@
windbot
spawn
'mono'
,
[
'WindBot.exe'
],
{
cwd
:
'windbot'
,
env
:
{
spawn
'mono'
,
[
'WindBot.exe'
],
{
cwd
:
'windbot'
,
env
:
{
YGOPRO_VERSION
:
settings
.
version
YGOPRO_VERSION
:
settings
.
version
YGOPRO_HOST
:
'127.0.0.1'
YGOPRO_HOST
:
'127.0.0.1'
YGOPRO_PORT
:
@
port
YGOPRO_PORT
:
@
port
YGOPRO_NAME
:
@
windbot
.
name
YGOPRO_NAME
:
@
windbot
.
name
YGOPRO_DECK
:
@
windbot
.
deck
YGOPRO_DECK
:
@
windbot
.
deck
YGOPRO_DIALOG
:
@
windbot
.
dialog
YGOPRO_DIALOG
:
@
windbot
.
dialog
}}
}
}
return
return
catch
catch
@
error
=
"建立房间失败,请重试"
@
error
=
"建立房间失败,请重试"
delete
:
->
delete
:
->
#积分
#积分
return
if
@
deleted
return
if
@
deleted
#log.info 'room-delete', this.name, Room.all.length
#log.info 'room-delete', this.name, Room.all.length
###
###
...
@@ -366,30 +372,30 @@ class Room
...
@@ -366,30 +372,30 @@ class Room
return
return
get_playing_player
:
->
get_playing_player
:
->
playing_player
=
[]
playing_player
=
[]
_
.
each
@
players
,
(
player
)
=>
_
.
each
@
players
,
(
player
)
=>
if
player
.
pos
<
4
then
playing_player
.
push
player
if
player
.
pos
<
4
then
playing_player
.
push
player
return
return
return
playing_player
return
playing_player
get_host
:
->
get_host
:
->
host_player
=
null
host_player
=
null
_
.
each
@
players
,
(
player
)
=>
_
.
each
@
players
,
(
player
)
=>
if
player
.
is_host
then
host_player
=
player
if
player
.
is_host
then
host_player
=
player
return
return
return
host_player
return
host_player
connect
:
(
client
)
->
connect
:
(
client
)
->
@
players
.
push
client
@
players
.
push
client
client
.
ip
=
client
.
remoteAddress
client
.
ip
=
client
.
remoteAddress
if
@
random_type
if
@
random_type
host_player
=
@
get_host
()
host_player
=
@
get_host
()
if
host_player
&&
(
host_player
!=
client
)
if
host_player
&&
(
host_player
!=
client
)
#进来时已经有人在等待了,互相记录为匹配过
#进来时已经有人在等待了,互相记录为匹配过
Room
.
players_oppentlist
[
host_player
.
remoteAddress
]
=
client
.
remoteAddress
Room
.
players_oppentlist
[
host_player
.
remoteAddress
]
=
client
.
remoteAddress
Room
.
players_oppentlist
[
client
.
remoteAddress
]
=
host_player
.
remoteAddress
Room
.
players_oppentlist
[
client
.
remoteAddress
]
=
host_player
.
remoteAddress
else
else
#第一个玩家刚进来,还没就位
#第一个玩家刚进来,还没就位
Room
.
players_oppentlist
[
client
.
remoteAddress
]
=
null
Room
.
players_oppentlist
[
client
.
remoteAddress
]
=
null
if
@
established
if
@
established
...
@@ -406,17 +412,17 @@ class Room
...
@@ -406,17 +412,17 @@ class Room
ygopro
.
stoc_send_chat_to_room
this
,
"
#{
client
.
name
}
#{
'退出了观战'
}#{
if
error
then
":
#{
error
}
"
else
''
}
"
ygopro
.
stoc_send_chat_to_room
this
,
"
#{
client
.
name
}
#{
'退出了观战'
}#{
if
error
then
":
#{
error
}
"
else
''
}
"
index
=
_
.
indexOf
(
@
watchers
,
client
)
index
=
_
.
indexOf
(
@
watchers
,
client
)
@
watchers
.
splice
(
index
,
1
)
unless
index
==
-
1
@
watchers
.
splice
(
index
,
1
)
unless
index
==
-
1
#client.room = null
#client.room = null
else
else
index
=
_
.
indexOf
(
@
players
,
client
)
index
=
_
.
indexOf
(
@
players
,
client
)
@
players
.
splice
(
index
,
1
)
unless
index
==
-
1
@
players
.
splice
(
index
,
1
)
unless
index
==
-
1
#log.info(@started,@disconnector,client.room.random_type)
#log.info(@started,@disconnector,client.room.random_type)
if
@
started
and
@
disconnector
!=
'server'
and
client
.
room
.
random_type
if
@
started
and
@
disconnector
!=
'server'
and
client
.
room
.
random_type
Room
.
ban_player
(
client
.
name
,
client
.
ip
,
"强退"
)
Room
.
ban_player
(
client
.
name
,
client
.
ip
,
"强退"
)
if
@
players
.
length
if
@
players
.
length
ygopro
.
stoc_send_chat_to_room
this
,
"
#{
client
.
name
}
#{
'离开了游戏'
}#{
if
error
then
":
#{
error
}
"
else
''
}
"
ygopro
.
stoc_send_chat_to_room
this
,
"
#{
client
.
name
}
#{
'离开了游戏'
}#{
if
error
then
":
#{
error
}
"
else
''
}
"
roomlist
.
update
(
this
)
if
!
@
private
and
!
@
started
and
settings
.
modules
.
enable_websocket_roomlist
roomlist
.
update
(
this
)
if
!
@
private
and
!
@
started
and
settings
.
modules
.
enable_websocket_roomlist
#client.room = null
#client.room = null
else
else
@
process
.
kill
()
@
process
.
kill
()
#client.room = null
#client.room = null
...
...
room.js
View file @
bcfe4525
...
@@ -204,7 +204,9 @@
...
@@ -204,7 +204,9 @@
this
.
welcome
=
''
;
this
.
welcome
=
''
;
Room
.
all
.
push
(
this
);
Room
.
all
.
push
(
this
);
this
.
hostinfo
||
(
this
.
hostinfo
=
{
this
.
hostinfo
||
(
this
.
hostinfo
=
{
lflist
:
0
,
lflist
:
function
(
list
)
{
return
!
list
.
tcg
&&
list
.
date
.
isBefore
();
},
rule
:
settings
.
modules
.
enable_TCG_as_default
?
2
:
0
,
rule
:
settings
.
modules
.
enable_TCG_as_default
?
2
:
0
,
mode
:
0
,
mode
:
0
,
enable_priority
:
false
,
enable_priority
:
false
,
...
@@ -259,10 +261,14 @@
...
@@ -259,10 +261,14 @@
switch
(
rule
.
charAt
(
2
))
{
switch
(
rule
.
charAt
(
2
))
{
case
"
1
"
:
case
"
1
"
:
case
"
T
"
:
case
"
T
"
:
this
.
hostinfo
.
lflist
=
settings
.
modules
.
TCG_banlist_id
;
this
.
hostinfo
.
lflist
=
_
.
findIndex
(
settings
.
lflist
,
function
(
list
)
{
return
list
.
tcg
&&
list
.
date
.
isBefore
();
});
break
;
break
;
default
:
default
:
this
.
hostinfo
.
lflist
=
0
;
this
.
hostinfo
.
lflist
=
_
.
findIndex
(
settings
.
lflist
,
function
(
list
)
{
return
!
list
.
tcg
&&
list
.
date
.
isBefore
();
});
}
}
if
((
param
=
parseInt
(
rule
.
charAt
(
3
).
match
(
/
\d
/
)))
>=
0
)
{
if
((
param
=
parseInt
(
rule
.
charAt
(
3
).
match
(
/
\d
/
)))
>=
0
)
{
this
.
hostinfo
.
time_limit
=
param
*
60
;
this
.
hostinfo
.
time_limit
=
param
*
60
;
...
@@ -311,7 +317,9 @@
...
@@ -311,7 +317,9 @@
}
}
if
(
rule
.
match
(
/
(
^|,|,
)(
TCGONLY|TO
)(
,|,|$
)
/
))
{
if
(
rule
.
match
(
/
(
^|,|,
)(
TCGONLY|TO
)(
,|,|$
)
/
))
{
this
.
hostinfo
.
rule
=
1
;
this
.
hostinfo
.
rule
=
1
;
this
.
hostinfo
.
lflist
=
settings
.
modules
.
TCG_banlist_id
;
this
.
hostinfo
.
lflist
=
_
.
findIndex
(
settings
.
lflist
,
function
(
list
)
{
return
list
.
tcg
&&
list
.
date
.
isBefore
();
});
}
}
if
(
rule
.
match
(
/
(
^|,|,
)(
OCGONLY|OO
)(
,|,|$
)
/
))
{
if
(
rule
.
match
(
/
(
^|,|,
)(
OCGONLY|OO
)(
,|,|$
)
/
))
{
this
.
hostinfo
.
rule
=
0
;
this
.
hostinfo
.
rule
=
0
;
...
...
ygopro-server.coffee
View file @
bcfe4525
...
@@ -28,8 +28,10 @@ moment = require 'moment'
...
@@ -28,8 +28,10 @@ moment = require 'moment'
settings
=
require
'./config.json'
settings
=
require
'./config.json'
settings
.
BANNED_user
=
[]
settings
.
BANNED_user
=
[]
settings
.
BANNED_IP
=
[]
settings
.
BANNED_IP
=
[]
settings
.
modules
.
hang_timeout
=
90
settings
.
modules
.
hang_timeout
=
90
settings
.
version
=
parseInt
(
fs
.
readFileSync
(
'ygopro/gframe/game.cpp'
,
'utf8'
).
match
(
/PRO_VERSION = ([x\d]+)/
)[
1
],
'16'
)
settings
.
version
=
parseInt
(
fs
.
readFileSync
(
'ygopro/gframe/game.cpp'
,
'utf8'
).
match
(
/PRO_VERSION = ([x\d]+)/
)[
1
],
'16'
)
settings
.
lflist
=
(
for
list
in
fs
.
readFileSync
(
'ygopro/lflist.conf'
,
'utf8'
).
match
(
/!.*/g
)
{
date
:
moment
(
list
.
match
(
/!([\d\.]+)/
)[
1
],
'YYYY.MM.DD'
),
tcg
:
list
.
indexOf
(
'TCG'
)
!=
-
1
})
#组件
#组件
ygopro
=
require
'./ygopro.js'
ygopro
=
require
'./ygopro.js'
...
@@ -74,7 +76,7 @@ net.createServer (client) ->
...
@@ -74,7 +76,7 @@ net.createServer (client) ->
#释放处理
#释放处理
client
.
on
'close'
,
(
had_error
)
->
client
.
on
'close'
,
(
had_error
)
->
#log.info "client closed", client.name, had_error
#log.info "client closed", client.name, had_error
tribute
(
client
)
tribute
(
client
)
unless
client
.
closed
unless
client
.
closed
client
.
closed
=
true
client
.
closed
=
true
...
@@ -83,7 +85,7 @@ net.createServer (client) ->
...
@@ -83,7 +85,7 @@ net.createServer (client) ->
return
return
client
.
on
'error'
,
(
error
)
->
client
.
on
'error'
,
(
error
)
->
#log.info "client error", client.name, error
#log.info "client error", client.name, error
tribute
(
client
)
tribute
(
client
)
unless
client
.
closed
unless
client
.
closed
client
.
closed
=
error
client
.
closed
=
error
...
@@ -96,7 +98,7 @@ net.createServer (client) ->
...
@@ -96,7 +98,7 @@ net.createServer (client) ->
return
return
server
.
on
'close'
,
(
had_error
)
->
server
.
on
'close'
,
(
had_error
)
->
#log.info "server closed", client.name, had_error
#log.info "server closed", client.name, had_error
tribute
(
server
)
tribute
(
server
)
client
.
room
.
disconnector
=
'server'
client
.
room
.
disconnector
=
'server'
server
.
closed
=
true
unless
server
.
closed
server
.
closed
=
true
unless
server
.
closed
...
@@ -106,7 +108,7 @@ net.createServer (client) ->
...
@@ -106,7 +108,7 @@ net.createServer (client) ->
return
return
server
.
on
'error'
,
(
error
)
->
server
.
on
'error'
,
(
error
)
->
#log.info "server error", client.name, error
#log.info "server error", client.name, error
tribute
(
server
)
tribute
(
server
)
client
.
room
.
disconnector
=
'server'
client
.
room
.
disconnector
=
'server'
server
.
closed
=
error
server
.
closed
=
error
...
@@ -161,10 +163,10 @@ net.createServer (client) ->
...
@@ -161,10 +163,10 @@ net.createServer (client) ->
break
break
else
else
if
ctos_buffer
.
length
>=
2
+
ctos_message_length
if
ctos_buffer
.
length
>=
2
+
ctos_message_length
#console.log "CTOS", ygopro.constants.CTOS[ctos_proto]
#console.log "CTOS", ygopro.constants.CTOS[ctos_proto]
cancel
=
false
cancel
=
false
if
ygopro
.
ctos_follows
[
ctos_proto
]
if
ygopro
.
ctos_follows
[
ctos_proto
]
b
=
ctos_buffer
.
slice
(
3
,
ctos_message_length
-
1
+
3
)
b
=
ctos_buffer
.
slice
(
3
,
ctos_message_length
-
1
+
3
)
if
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
CTOS
[
ygopro
.
constants
.
CTOS
[
ctos_proto
]]]
if
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
CTOS
[
ygopro
.
constants
.
CTOS
[
ctos_proto
]]]
struct
.
_setBuff
(
b
)
struct
.
_setBuff
(
b
)
if
ygopro
.
ctos_follows
[
ctos_proto
].
synchronous
if
ygopro
.
ctos_follows
[
ctos_proto
].
synchronous
...
@@ -182,8 +184,8 @@ net.createServer (client) ->
...
@@ -182,8 +184,8 @@ net.createServer (client) ->
looplimit
++
looplimit
++
#log.info(looplimit)
#log.info(looplimit)
if
looplimit
>
800
if
looplimit
>
800
log
.
info
(
"error ctos"
,
client
.
name
)
log
.
info
(
"error ctos"
,
client
.
name
)
server
.
end
()
server
.
end
()
break
break
...
@@ -220,7 +222,7 @@ net.createServer (client) ->
...
@@ -220,7 +222,7 @@ net.createServer (client) ->
break
break
else
else
if
stoc_buffer
.
length
>=
2
+
stoc_message_length
if
stoc_buffer
.
length
>=
2
+
stoc_message_length
#console.log "STOC", ygopro.constants.STOC[stoc_proto]
#console.log "STOC", ygopro.constants.STOC[stoc_proto]
stanzas
=
stoc_proto
stanzas
=
stoc_proto
if
ygopro
.
stoc_follows
[
stoc_proto
]
if
ygopro
.
stoc_follows
[
stoc_proto
]
b
=
stoc_buffer
.
slice
(
3
,
stoc_message_length
-
1
+
3
)
b
=
stoc_buffer
.
slice
(
3
,
stoc_message_length
-
1
+
3
)
...
@@ -238,8 +240,8 @@ net.createServer (client) ->
...
@@ -238,8 +240,8 @@ net.createServer (client) ->
looplimit
++
looplimit
++
#log.info(looplimit)
#log.info(looplimit)
if
looplimit
>
800
if
looplimit
>
800
log
.
info
(
"error stoc"
,
client
.
name
)
log
.
info
(
"error stoc"
,
client
.
name
)
server
.
end
()
server
.
end
()
break
break
return
return
...
@@ -251,19 +253,19 @@ net.createServer (client) ->
...
@@ -251,19 +253,19 @@ net.createServer (client) ->
#功能模块
#功能模块
ygopro
.
ctos_follow
'PLAYER_INFO'
,
true
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
ctos_follow
'PLAYER_INFO'
,
true
,
(
buffer
,
info
,
client
,
server
)
->
name
=
info
.
name
.
split
(
"$"
)[
0
];
name
=
info
.
name
.
split
(
"$"
)[
0
];
struct
=
ygopro
.
structs
[
"CTOS_PlayerInfo"
]
struct
=
ygopro
.
structs
[
"CTOS_PlayerInfo"
]
struct
.
_setBuff
(
buffer
)
struct
.
_setBuff
(
buffer
)
struct
.
set
(
"name"
,
name
)
struct
.
set
(
"name"
,
name
)
buffer
=
struct
.
buffer
buffer
=
struct
.
buffer
client
.
name
=
name
client
.
name
=
name
return
false
return
false
ygopro
.
ctos_follow
'JOIN_GAME'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
ctos_follow
'JOIN_GAME'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
#log.info info
#log.info info
if
settings
.
modules
.
stop
if
settings
.
modules
.
stop
ygopro
.
stoc_send_chat
(
client
,
settings
.
modules
.
stop
,
11
)
ygopro
.
stoc_send_chat
(
client
,
settings
.
modules
.
stop
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -305,16 +307,16 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -305,16 +307,16 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
###
###
else
if
info
.
version
!=
settings
.
version
else
if
info
.
version
!=
settings
.
version
ygopro
.
stoc_send_chat
(
client
,
settings
.
modules
.
update
,
11
)
ygopro
.
stoc_send_chat
(
client
,
settings
.
modules
.
update
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
4
msg
:
4
code
:
settings
.
version
code
:
settings
.
version
}
}
client
.
end
()
client
.
end
()
else
if
!
info
.
pass
.
length
and
!
settings
.
modules
.
enable_random_duel
else
if
!
info
.
pass
.
length
and
!
settings
.
modules
.
enable_random_duel
ygopro
.
stoc_send_chat
(
client
,
"房间名为空,请填写主机密码"
,
11
)
ygopro
.
stoc_send_chat
(
client
,
"房间名为空,请填写主机密码"
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -322,13 +324,13 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -322,13 +324,13 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else
if
settings
.
modules
.
windbot
and
info
.
pass
[
0
...
2
]
==
'AI'
else
if
settings
.
modules
.
windbot
and
info
.
pass
[
0
...
2
]
==
'AI'
if
info
.
pass
.
length
>
3
and
info
.
pass
[
0
...
3
]
==
'AI#'
if
info
.
pass
.
length
>
3
and
info
.
pass
[
0
...
3
]
==
'AI#'
or
info
.
pass
[
0
...
3
]
==
'AI_'
name
=
info
.
pass
.
slice
(
3
)
name
=
info
.
pass
.
slice
(
3
)
windbot
=
_
.
sample
_
.
filter
settings
.
modules
.
windbot
,
(
w
)
->
windbot
=
_
.
sample
_
.
filter
settings
.
modules
.
windbot
,
(
w
)
->
w
.
name
==
name
or
w
.
deck
==
name
w
.
name
==
name
or
w
.
deck
==
name
if
!
windbot
if
!
windbot
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Invalid Windbot Name)'
,
11
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Invalid Windbot Name)'
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -344,10 +346,10 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -344,10 +346,10 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
client
.
room
.
connect
(
client
)
client
.
room
.
connect
(
client
)
else
if
info
.
pass
.
length
and
settings
.
modules
.
mycard_auth
else
if
info
.
pass
.
length
and
settings
.
modules
.
mycard_auth
ygopro
.
stoc_send_chat
(
client
,
'正在读取用户信息...'
,
11
)
ygopro
.
stoc_send_chat
(
client
,
'正在读取用户信息...'
,
11
)
if
info
.
pass
.
length
<=
8
if
info
.
pass
.
length
<=
8
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Invalid Length)'
,
11
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Invalid Length)'
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -357,8 +359,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -357,8 +359,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
buffer
=
new
Buffer
(
info
.
pass
[
0
...
8
],
'base64'
)
buffer
=
new
Buffer
(
info
.
pass
[
0
...
8
],
'base64'
)
if
buffer
.
length
!=
6
if
buffer
.
length
!=
6
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Invalid Payload Length)'
,
11
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Invalid Payload Length)'
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -373,9 +375,9 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -373,9 +375,9 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
finish
=
(
buffer
)
->
finish
=
(
buffer
)
->
action
=
buffer
.
readUInt8
(
1
)
>>
4
action
=
buffer
.
readUInt8
(
1
)
>>
4
if
buffer
!=
decrypted_buffer
and
action
in
[
1
,
2
,
4
]
if
buffer
!=
decrypted_buffer
and
action
in
[
1
,
2
,
4
]
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Unauthorized)'
,
11
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Unauthorized)'
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -388,10 +390,10 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -388,10 +390,10 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
# 4 join match
# 4 join match
switch
action
switch
action
when
1
,
2
when
1
,
2
name
=
crypto
.
createHash
(
'md5'
).
update
(
info
.
pass
+
client
.
name
).
digest
(
'base64'
)[
0
...
10
].
replace
(
'+'
,
'-'
).
replace
(
'/'
,
'_'
);
name
=
crypto
.
createHash
(
'md5'
).
update
(
info
.
pass
+
client
.
name
).
digest
(
'base64'
)[
0
...
10
].
replace
(
'+'
,
'-'
).
replace
(
'/'
,
'_'
);
if
Room
.
find_by_name
(
name
)
if
Room
.
find_by_name
(
name
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Already Existed)'
,
11
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Already Existed)'
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -413,6 +415,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -413,6 +415,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
start_hand
:
opt3
>>
4
start_hand
:
opt3
>>
4
draw_count
:
opt3
&
0xF
draw_count
:
opt3
&
0xF
}
}
options
.
lflist
=
_
.
findIndex
settings
.
lflist
,
(
list
)
->
((
options
.
rule
==
1
)
==
list
.
tcg
)
and
list
.
date
.
isBefore
()
room
=
new
Room
(
name
,
options
)
room
=
new
Room
(
name
,
options
)
room
.
title
=
info
.
pass
.
slice
(
8
).
replace
(
String
.
fromCharCode
(
0xFEFF
),
' '
)
room
.
title
=
info
.
pass
.
slice
(
8
).
replace
(
String
.
fromCharCode
(
0xFEFF
),
' '
)
room
.
private
=
action
==
2
room
.
private
=
action
==
2
...
@@ -420,8 +423,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -420,8 +423,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
name
=
info
.
pass
.
slice
(
8
)
name
=
info
.
pass
.
slice
(
8
)
room
=
Room
.
find_by_name
(
name
)
room
=
Room
.
find_by_name
(
name
)
if
(
!
room
)
if
(
!
room
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Not Found)'
,
11
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Not Found)'
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -431,8 +434,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -431,8 +434,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
room
=
Room
.
find_or_create_by_name
(
'M#'
+
info
.
pass
.
slice
(
8
))
room
=
Room
.
find_or_create_by_name
(
'M#'
+
info
.
pass
.
slice
(
8
))
room
.
private
=
true
room
.
private
=
true
else
else
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Invalid Action)'
,
11
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Invalid Action)'
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -444,7 +447,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -444,7 +447,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
if
id
=
users_cache
[
client
.
name
]
if
id
=
users_cache
[
client
.
name
]
secret
=
id
%
65535
+
1
;
secret
=
id
%
65535
+
1
;
decrypted_buffer
=
new
Buffer
(
6
)
decrypted_buffer
=
new
Buffer
(
6
)
for
i
in
[
0
,
2
,
4
]
for
i
in
[
0
,
2
,
4
]
decrypted_buffer
.
writeUInt16LE
(
buffer
.
readUInt16LE
(
i
)
^
secret
,
i
)
decrypted_buffer
.
writeUInt16LE
(
buffer
.
readUInt16LE
(
i
)
^
secret
,
i
)
if
check
(
decrypted_buffer
)
if
check
(
decrypted_buffer
)
return
finish
(
decrypted_buffer
)
return
finish
(
decrypted_buffer
)
...
@@ -462,7 +465,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -462,7 +465,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
if
body
and
body
.
user
if
body
and
body
.
user
secret
=
body
.
user
.
id
%
65535
+
1
;
secret
=
body
.
user
.
id
%
65535
+
1
;
decrypted_buffer
=
new
Buffer
(
6
)
decrypted_buffer
=
new
Buffer
(
6
)
for
i
in
[
0
,
2
,
4
]
for
i
in
[
0
,
2
,
4
]
decrypted_buffer
.
writeUInt16LE
(
buffer
.
readUInt16LE
(
i
)
^
secret
,
i
)
decrypted_buffer
.
writeUInt16LE
(
buffer
.
readUInt16LE
(
i
)
^
secret
,
i
)
if
check
(
decrypted_buffer
)
if
check
(
decrypted_buffer
)
buffer
=
decrypted_buffer
buffer
=
decrypted_buffer
...
@@ -470,8 +473,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -470,8 +473,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
# buffer != decrypted_buffer ==> auth failed
# buffer != decrypted_buffer ==> auth failed
if
!
check
(
buffer
)
if
!
check
(
buffer
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Checksum Failed)'
,
11
)
ygopro
.
stoc_send_chat
(
client
,
'主机密码不正确 (Checksum Failed)'
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -481,19 +484,19 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -481,19 +484,19 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
finish
(
buffer
)
finish
(
buffer
)
else
if
info
.
pass
.
length
&&
!
Room
.
validate
(
info
.
pass
)
else
if
info
.
pass
.
length
&&
!
Room
.
validate
(
info
.
pass
)
#ygopro.stoc_send client, 'ERROR_MSG',{
#ygopro.stoc_send client, 'ERROR_MSG',{
# msg: 1
# msg: 1
# code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在这里就经常弹不出提示
# code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在这里就经常弹不出提示
#}
#}
ygopro
.
stoc_send_chat
(
client
,
"房间密码不正确"
,
11
)
ygopro
.
stoc_send_chat
(
client
,
"房间密码不正确"
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
client
.
end
()
client
.
end
()
else
if
client
.
name
==
'[INCORRECT]'
#模拟用户验证
else
if
client
.
name
==
'[INCORRECT]'
#模拟用户验证
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -502,8 +505,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -502,8 +505,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else
if
_
.
indexOf
(
settings
.
BANNED_user
,
client
.
name
)
>
-
1
#账号被封
else
if
_
.
indexOf
(
settings
.
BANNED_user
,
client
.
name
)
>
-
1
#账号被封
settings
.
BANNED_IP
.
push
(
client
.
remoteAddress
)
settings
.
BANNED_IP
.
push
(
client
.
remoteAddress
)
log
.
info
(
"BANNED USER LOGIN"
,
client
.
name
,
client
.
remoteAddress
)
log
.
info
(
"BANNED USER LOGIN"
,
client
.
name
,
client
.
remoteAddress
)
ygopro
.
stoc_send_chat
(
client
,
"您的账号已被封禁"
,
11
)
ygopro
.
stoc_send_chat
(
client
,
"您的账号已被封禁"
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
...
@@ -511,33 +514,33 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -511,33 +514,33 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else
if
_
.
indexOf
(
settings
.
BANNED_IP
,
client
.
remoteAddress
)
>
-
1
#IP被封
else
if
_
.
indexOf
(
settings
.
BANNED_IP
,
client
.
remoteAddress
)
>
-
1
#IP被封
log
.
info
(
"BANNED IP LOGIN"
,
client
.
name
,
client
.
remoteAddress
)
log
.
info
(
"BANNED IP LOGIN"
,
client
.
name
,
client
.
remoteAddress
)
ygopro
.
stoc_send_chat
(
client
,
"您的账号已被封禁"
,
11
)
ygopro
.
stoc_send_chat
(
client
,
"您的账号已被封禁"
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
client
.
end
()
client
.
end
()
else
else
#log.info 'join_game',info.pass, client.name
#log.info 'join_game',info.pass, client.name
room
=
Room
.
find_or_create_by_name
(
info
.
pass
,
client
.
remoteAddress
)
room
=
Room
.
find_or_create_by_name
(
info
.
pass
,
client
.
remoteAddress
)
if
!
room
if
!
room
ygopro
.
stoc_send_chat
(
client
,
"服务器已经爆满,请稍候再试"
,
11
)
ygopro
.
stoc_send_chat
(
client
,
"服务器已经爆满,请稍候再试"
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
client
.
end
()
client
.
end
()
else
if
room
.
error
else
if
room
.
error
ygopro
.
stoc_send_chat
(
client
,
room
.
error
,
11
)
ygopro
.
stoc_send_chat
(
client
,
room
.
error
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
client
.
end
()
client
.
end
()
else
if
room
.
started
else
if
room
.
started
if
settings
.
modules
.
post_start_watching
if
settings
.
modules
.
post_start_watching
client
.
room
=
room
client
.
room
=
room
client
.
is_post_watcher
=
true
client
.
is_post_watcher
=
true
ygopro
.
stoc_send_chat_to_room
client
.
room
,
"
#{
client
.
name
}
加入了观战"
ygopro
.
stoc_send_chat_to_room
client
.
room
,
"
#{
client
.
name
}
加入了观战"
client
.
room
.
watchers
.
push
client
client
.
room
.
watchers
.
push
client
...
@@ -545,19 +548,19 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -545,19 +548,19 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
for
buffer
in
client
.
room
.
watcher_buffers
for
buffer
in
client
.
room
.
watcher_buffers
client
.
write
buffer
client
.
write
buffer
else
else
ygopro
.
stoc_send_chat
(
client
,
"决斗已开始,不允许观战"
,
11
)
ygopro
.
stoc_send_chat
(
client
,
"决斗已开始,不允许观战"
,
11
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,
{
msg
:
1
msg
:
1
code
:
2
code
:
2
}
}
client
.
end
()
client
.
end
()
else
else
client
.
room
=
room
client
.
room
=
room
client
.
room
.
connect
(
client
)
client
.
room
.
connect
(
client
)
return
return
ygopro
.
stoc_follow
'JOIN_GAME'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
stoc_follow
'JOIN_GAME'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
#欢迎信息
#欢迎信息
return
unless
client
.
room
return
unless
client
.
room
if
settings
.
modules
.
welcome
if
settings
.
modules
.
welcome
ygopro
.
stoc_send_chat
client
,
settings
.
modules
.
welcome
ygopro
.
stoc_send_chat
client
,
settings
.
modules
.
welcome
...
@@ -586,7 +589,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
...
@@ -586,7 +589,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
return
return
watcher
.
on
'error'
,
(
error
)
->
watcher
.
on
'error'
,
(
error
)
->
#log.error "watcher error", error
#log.error "watcher error", error
return
return
return
return
...
@@ -602,16 +605,16 @@ if settings.modules.dialogues
...
@@ -602,16 +605,16 @@ if settings.modules.dialogues
else
if
error
or
!
body
else
if
error
or
!
body
log
.
warn
'dialogues error'
,
error
,
response
log
.
warn
'dialogues error'
,
error
,
response
else
else
#log.info "dialogues loaded", _.size body
#log.info "dialogues loaded", _.size body
dialogues
=
body
dialogues
=
body
return
return
ygopro
.
stoc_follow
'GAME_MSG'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
stoc_follow
'GAME_MSG'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
msg
=
buffer
.
readInt8
(
0
)
msg
=
buffer
.
readInt8
(
0
)
if
msg
>=
10
and
msg
<
30
#SELECT开头的消息
if
msg
>=
10
and
msg
<
30
#SELECT开头的消息
client
.
room
.
waiting_for_player
=
client
client
.
room
.
waiting_for_player
=
client
client
.
room
.
last_active_time
=
moment
()
client
.
room
.
last_active_time
=
moment
()
#log.info("#{ygopro.constants.MSG[msg]}等待#{client.room.waiting_for_player.name}")
#log.info("#{ygopro.constants.MSG[msg]}等待#{client.room.waiting_for_player.name}")
#log.info 'MSG', ygopro.constants.MSG[msg]
#log.info 'MSG', ygopro.constants.MSG[msg]
...
@@ -672,7 +675,7 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
...
@@ -672,7 +675,7 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
ygopro
.
ctos_follow
'HS_KICK'
,
true
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
ctos_follow
'HS_KICK'
,
true
,
(
buffer
,
info
,
client
,
server
)
->
return
unless
client
.
room
return
unless
client
.
room
for
player
in
client
.
room
.
players
for
player
in
client
.
room
.
players
if
player
and
player
.
pos
==
info
.
pos
and
player
!=
client
if
player
and
player
.
pos
==
info
.
pos
and
player
!=
client
ygopro
.
stoc_send_chat_to_room
client
.
room
,
"
#{
player
.
name
}
被请出了房间"
,
11
ygopro
.
stoc_send_chat_to_room
client
.
room
,
"
#{
player
.
name
}
被请出了房间"
,
11
return
false
return
false
...
@@ -691,22 +694,22 @@ ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
...
@@ -691,22 +694,22 @@ ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
if
pos
<
client
.
room
.
max_player
if
pos
<
client
.
room
.
max_player
client
.
room
.
ready_player_count_without_host
=
0
client
.
room
.
ready_player_count_without_host
=
0
for
player
in
client
.
room
.
players
for
player
in
client
.
room
.
players
if
player
.
pos
==
pos
if
player
.
pos
==
pos
player
.
is_ready
=
is_ready
player
.
is_ready
=
is_ready
unless
player
.
is_host
unless
player
.
is_host
client
.
room
.
ready_player_count_without_host
+=
player
.
is_ready
client
.
room
.
ready_player_count_without_host
+=
player
.
is_ready
if
client
.
room
.
ready_player_count_without_host
>=
client
.
room
.
max_player
-
1
if
client
.
room
.
ready_player_count_without_host
>=
client
.
room
.
max_player
-
1
#log.info "all ready"
#log.info "all ready"
setTimeout
(()
->
wait_room_start
(
client
.
room
,
20
);
return
),
1000
setTimeout
(()
->
wait_room_start
(
client
.
room
,
20
);
return
),
1000
return
return
wait_room_start
=
(
room
,
time
)
->
wait_room_start
=
(
room
,
time
)
->
unless
!
room
or
room
.
started
or
room
.
ready_player_count_without_host
<
room
.
max_player
-
1
unless
!
room
or
room
.
started
or
room
.
ready_player_count_without_host
<
room
.
max_player
-
1
time
-=
1
time
-=
1
if
time
if
time
unless
time
%
5
unless
time
%
5
ygopro
.
stoc_send_chat_to_room
room
,
"
#{
if
time
<=
9
then
' '
else
''
}#{
time
}
秒后房主若不开始游戏将被请出房间"
,
if
time
<=
9
then
11
else
8
ygopro
.
stoc_send_chat_to_room
room
,
"
#{
if
time
<=
9
then
' '
else
''
}#{
time
}
秒后房主若不开始游戏将被请出房间"
,
if
time
<=
9
then
11
else
8
setTimeout
(()
->
wait_room_start
(
room
,
time
);
return
),
1000
setTimeout
(()
->
wait_room_start
(
room
,
time
);
return
),
1000
else
else
for
player
in
room
.
players
for
player
in
room
.
players
if
player
and
player
.
is_host
if
player
and
player
.
is_host
...
@@ -759,7 +762,7 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
...
@@ -759,7 +762,7 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
client
.
room
.
dueling_players
=
[]
client
.
room
.
dueling_players
=
[]
for
player
in
client
.
room
.
players
when
player
.
pos
!=
7
for
player
in
client
.
room
.
players
when
player
.
pos
!=
7
client
.
room
.
dueling_players
[
player
.
pos
]
=
player
client
.
room
.
dueling_players
[
player
.
pos
]
=
player
client
.
room
.
player_datas
.
push
ip
:
player
.
remoteAddress
,
name
:
player
.
name
client
.
room
.
player_datas
.
push
ip
:
player
.
remoteAddress
,
name
:
player
.
name
if
client
.
room
.
windbot
if
client
.
room
.
windbot
client
.
room
.
dueling_players
[
1
-
player
.
pos
]
=
{}
client
.
room
.
dueling_players
[
1
-
player
.
pos
]
=
{}
if
settings
.
modules
.
tips
if
settings
.
modules
.
tips
...
@@ -767,8 +770,8 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
...
@@ -767,8 +770,8 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
return
return
ygopro
.
ctos_follow
'CHAT'
,
true
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
ctos_follow
'CHAT'
,
true
,
(
buffer
,
info
,
client
,
server
)
->
cancel
=
_
.
startsWith
(
_
.
trim
(
info
.
msg
),
"/"
)
cancel
=
_
.
startsWith
(
_
.
trim
(
info
.
msg
),
"/"
)
client
.
room
.
last_active_time
=
moment
()
unless
cancel
or
not
client
.
room
.
random_type
client
.
room
.
last_active_time
=
moment
()
unless
cancel
or
not
client
.
room
.
random_type
switch
_
.
trim
(
info
.
msg
)
switch
_
.
trim
(
info
.
msg
)
when
'/ping'
when
'/ping'
execFile
'ss'
,
[
'-it'
,
"dst
#{
client
.
remoteAddress
}
:
#{
client
.
remotePort
}
"
],
(
error
,
stdout
,
stderr
)
->
execFile
'ss'
,
[
'-it'
,
"dst
#{
client
.
remoteAddress
}
:
#{
client
.
remotePort
}
"
],
(
error
,
stdout
,
stderr
)
->
...
@@ -779,21 +782,21 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
...
@@ -779,21 +782,21 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
if
line
.
indexOf
(
'rtt'
)
!=
-
1
if
line
.
indexOf
(
'rtt'
)
!=
-
1
ygopro
.
stoc_send_chat_to_room
client
.
room
,
line
ygopro
.
stoc_send_chat_to_room
client
.
room
,
line
else
else
#log.warn 'ping', stdout
#log.warn 'ping', stdout
ygopro
.
stoc_send_chat_to_room
client
.
room
,
stdout
ygopro
.
stoc_send_chat_to_room
client
.
room
,
stdout
return
return
when
'/help'
when
'/help'
ygopro
.
stoc_send_chat
(
client
,
"YGOSrv233 指令帮助"
)
ygopro
.
stoc_send_chat
(
client
,
"YGOSrv233 指令帮助"
)
ygopro
.
stoc_send_chat
(
client
,
"/help 显示这个帮助信息"
)
ygopro
.
stoc_send_chat
(
client
,
"/help 显示这个帮助信息"
)
ygopro
.
stoc_send_chat
(
client
,
"/roomname 显示当前房间的名字"
)
ygopro
.
stoc_send_chat
(
client
,
"/roomname 显示当前房间的名字"
)
ygopro
.
stoc_send_chat
(
client
,
"/tip 显示一条提示"
)
if
settings
.
modules
.
tips
ygopro
.
stoc_send_chat
(
client
,
"/tip 显示一条提示"
)
if
settings
.
modules
.
tips
when
'/tip'
when
'/tip'
ygopro
.
stoc_send_random_tip
(
client
)
if
settings
.
modules
.
tips
ygopro
.
stoc_send_random_tip
(
client
)
if
settings
.
modules
.
tips
when
'/roomname'
when
'/roomname'
ygopro
.
stoc_send_chat
(
client
,
"您当前的房间名是 "
+
client
.
room
.
name
)
if
client
.
room
ygopro
.
stoc_send_chat
(
client
,
"您当前的房间名是 "
+
client
.
room
.
name
)
if
client
.
room
when
'/test'
when
'/test'
ygopro
.
stoc_send_hint_card_to_room
(
client
.
room
,
2333365
)
ygopro
.
stoc_send_hint_card_to_room
(
client
.
room
,
2333365
)
...
@@ -801,58 +804,58 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
...
@@ -801,58 +804,58 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
return
cancel
return
cancel
ygopro
.
ctos_follow
'UPDATE_DECK'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
ctos_follow
'UPDATE_DECK'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
#log.info info
#log.info info
main
=
(
info
.
deckbuf
[
i
]
for
i
in
[
0
...
info
.
mainc
])
main
=
(
info
.
deckbuf
[
i
]
for
i
in
[
0
...
info
.
mainc
])
side
=
(
info
.
deckbuf
[
i
]
for
i
in
[
info
.
mainc
...
info
.
mainc
+
info
.
sidec
])
side
=
(
info
.
deckbuf
[
i
]
for
i
in
[
info
.
mainc
...
info
.
mainc
+
info
.
sidec
])
client
.
main
=
main
client
.
main
=
main
client
.
side
=
side
client
.
side
=
side
return
return
ygopro
.
ctos_follow
'RESPONSE'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
ctos_follow
'RESPONSE'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
return
unless
client
.
room
and
client
.
room
.
random_type
return
unless
client
.
room
and
client
.
room
.
random_type
client
.
room
.
last_active_time
=
moment
()
client
.
room
.
last_active_time
=
moment
()
return
return
ygopro
.
ctos_follow
'HAND_RESULT'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
ctos_follow
'HAND_RESULT'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
return
unless
client
.
room
and
client
.
room
.
random_type
return
unless
client
.
room
and
client
.
room
.
random_type
if
client
.
is_host
if
client
.
is_host
client
.
room
.
waiting_for_player
=
client
.
room
.
waiting_for_player2
client
.
room
.
waiting_for_player
=
client
.
room
.
waiting_for_player2
client
.
room
.
last_active_time
=
moment
().
subtract
(
settings
.
modules
.
hang_timeout
-
19
,
's'
)
client
.
room
.
last_active_time
=
moment
().
subtract
(
settings
.
modules
.
hang_timeout
-
19
,
's'
)
return
return
ygopro
.
ctos_follow
'TP_RESULT'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
ctos_follow
'TP_RESULT'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
return
unless
client
.
room
and
client
.
room
.
random_type
return
unless
client
.
room
and
client
.
room
.
random_type
client
.
room
.
last_active_time
=
moment
()
client
.
room
.
last_active_time
=
moment
()
return
return
ygopro
.
stoc_follow
'SELECT_HAND'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
stoc_follow
'SELECT_HAND'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
return
unless
client
.
room
and
client
.
room
.
random_type
return
unless
client
.
room
and
client
.
room
.
random_type
if
client
.
is_host
if
client
.
is_host
client
.
room
.
waiting_for_player
=
client
client
.
room
.
waiting_for_player
=
client
else
else
client
.
room
.
waiting_for_player2
=
client
client
.
room
.
waiting_for_player2
=
client
client
.
room
.
last_active_time
=
moment
().
subtract
(
settings
.
modules
.
hang_timeout
-
19
,
's'
)
client
.
room
.
last_active_time
=
moment
().
subtract
(
settings
.
modules
.
hang_timeout
-
19
,
's'
)
return
return
ygopro
.
stoc_follow
'SELECT_TP'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
ygopro
.
stoc_follow
'SELECT_TP'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
return
unless
client
.
room
and
client
.
room
.
random_type
return
unless
client
.
room
and
client
.
room
.
random_type
client
.
room
.
waiting_for_player
=
client
client
.
room
.
waiting_for_player
=
client
client
.
room
.
last_active_time
=
moment
()
client
.
room
.
last_active_time
=
moment
()
return
return
setInterval
()
->
setInterval
()
->
for
room
in
Room
.
all
when
room
and
room
.
started
and
room
.
random_type
and
room
.
last_active_time
and
room
.
waiting_for_player
for
room
in
Room
.
all
when
room
and
room
.
started
and
room
.
random_type
and
room
.
last_active_time
and
room
.
waiting_for_player
time_passed
=
Math
.
floor
((
moment
()
-
room
.
last_active_time
)
/
1000
)
time_passed
=
Math
.
floor
((
moment
()
-
room
.
last_active_time
)
/
1000
)
#log.info time_passed
#log.info time_passed
if
time_passed
>=
settings
.
modules
.
hang_timeout
if
time_passed
>=
settings
.
modules
.
hang_timeout
room
.
last_active_time
=
moment
()
room
.
last_active_time
=
moment
()
Room
.
ban_player
(
room
.
waiting_for_player
.
name
,
room
.
waiting_for_player
.
ip
,
"挂机"
)
Room
.
ban_player
(
room
.
waiting_for_player
.
name
,
room
.
waiting_for_player
.
ip
,
"挂机"
)
ygopro
.
stoc_send_chat_to_room
(
room
,
"
#{
room
.
waiting_for_player
.
name
}
被系统请出了房间"
,
11
)
ygopro
.
stoc_send_chat_to_room
(
room
,
"
#{
room
.
waiting_for_player
.
name
}
被系统请出了房间"
,
11
)
room
.
waiting_for_player
.
server
.
end
()
room
.
waiting_for_player
.
server
.
end
()
else
if
time_passed
>=
(
settings
.
modules
.
hang_timeout
-
20
)
and
not
(
time_passed
%
10
)
else
if
time_passed
>=
(
settings
.
modules
.
hang_timeout
-
20
)
and
not
(
time_passed
%
10
)
ygopro
.
stoc_send_chat_to_room
(
room
,
"
#{
room
.
waiting_for_player
.
name
}
已经很久没有操作了,若继续挂机,将于
#{
settings
.
modules
.
hang_timeout
-
time_passed
}
秒后被请出房间"
,
11
)
ygopro
.
stoc_send_chat_to_room
(
room
,
"
#{
room
.
waiting_for_player
.
name
}
已经很久没有操作了,若继续挂机,将于
#{
settings
.
modules
.
hang_timeout
-
time_passed
}
秒后被请出房间"
,
11
)
return
return
,
1000
,
1000
#http
#http
if
settings
.
modules
.
http
if
settings
.
modules
.
http
...
@@ -865,13 +868,13 @@ if settings.modules.http
...
@@ -865,13 +868,13 @@ if settings.modules.http
if
u
.
pathname
==
'/api/getrooms'
if
u
.
pathname
==
'/api/getrooms'
if
u
.
query
.
pass
and
!
pass_validated
if
u
.
query
.
pass
and
!
pass_validated
response
.
writeHead
(
200
);
response
.
writeHead
(
200
);
response
.
end
(
u
.
query
.
callback
+
'( {"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]} );'
)
response
.
end
(
u
.
query
.
callback
+
'( {"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]} );'
)
else
else
response
.
writeHead
(
200
);
response
.
writeHead
(
200
);
roomsjson
=
JSON
.
stringify
rooms
:
(
for
room
in
Room
.
all
when
room
.
established
roomsjson
=
JSON
.
stringify
rooms
:
(
for
room
in
Room
.
all
when
room
.
established
pid
:
room
.
process
.
pid
.
toString
(),
pid
:
room
.
process
.
pid
.
toString
(),
roomid
:
room
.
port
.
toString
(),
roomid
:
room
.
port
.
toString
(),
roomname
:
if
pass_validated
then
room
.
name
else
room
.
name
.
split
(
'$'
,
2
)[
0
],
roomname
:
if
pass_validated
then
room
.
name
else
room
.
name
.
split
(
'$'
,
2
)[
0
],
needpass
:
(
room
.
name
.
indexOf
(
'$'
)
!=
-
1
).
toString
(),
needpass
:
(
room
.
name
.
indexOf
(
'$'
)
!=
-
1
).
toString
(),
users
:
(
for
player
in
room
.
players
when
player
.
pos
?
users
:
(
for
player
in
room
.
players
when
player
.
pos
?
id
:
(
-
1
).
toString
(),
id
:
(
-
1
).
toString
(),
...
@@ -880,36 +883,36 @@ if settings.modules.http
...
@@ -880,36 +883,36 @@ if settings.modules.http
),
),
istart
:
if
room
.
started
then
'start'
else
'wait'
istart
:
if
room
.
started
then
'start'
else
'wait'
)
)
response
.
end
(
u
.
query
.
callback
+
"( "
+
roomsjson
+
" );"
)
response
.
end
(
u
.
query
.
callback
+
"( "
+
roomsjson
+
" );"
)
else
if
u
.
pathname
==
'/api/message'
else
if
u
.
pathname
==
'/api/message'
if
!
pass_validated
if
!
pass_validated
response
.
writeHead
(
200
);
response
.
writeHead
(
200
);
response
.
end
(
u
.
query
.
callback
+
"( '密码错误', 0 );"
);
response
.
end
(
u
.
query
.
callback
+
"( '密码错误', 0 );"
);
return
return
if
u
.
query
.
shout
if
u
.
query
.
shout
for
room
in
Room
.
all
for
room
in
Room
.
all
ygopro
.
stoc_send_chat_to_room
(
room
,
u
.
query
.
shout
,
16
)
ygopro
.
stoc_send_chat_to_room
(
room
,
u
.
query
.
shout
,
16
)
response
.
writeHead
(
200
)
response
.
writeHead
(
200
)
response
.
end
(
u
.
query
.
callback
+
"( 'shout ok', '"
+
u
.
query
.
shout
+
"' );"
)
response
.
end
(
u
.
query
.
callback
+
"( 'shout ok', '"
+
u
.
query
.
shout
+
"' );"
)
else
if
u
.
query
.
stop
else
if
u
.
query
.
stop
if
u
.
query
.
stop
==
'false'
if
u
.
query
.
stop
==
'false'
u
.
query
.
stop
=
false
u
.
query
.
stop
=
false
settings
.
modules
.
stop
=
u
.
query
.
stop
settings
.
modules
.
stop
=
u
.
query
.
stop
response
.
writeHead
(
200
)
response
.
writeHead
(
200
)
response
.
end
(
u
.
query
.
callback
+
"( 'stop ok', '"
+
u
.
query
.
stop
+
"' );"
)
response
.
end
(
u
.
query
.
callback
+
"( 'stop ok', '"
+
u
.
query
.
stop
+
"' );"
)
else
if
u
.
query
.
welcome
else
if
u
.
query
.
welcome
settings
.
modules
.
welcome
=
u
.
query
.
welcome
settings
.
modules
.
welcome
=
u
.
query
.
welcome
response
.
writeHead
(
200
)
response
.
writeHead
(
200
)
response
.
end
(
u
.
query
.
callback
+
"( 'welcome ok', '"
+
u
.
query
.
welcome
+
"' );"
)
response
.
end
(
u
.
query
.
callback
+
"( 'welcome ok', '"
+
u
.
query
.
welcome
+
"' );"
)
else
if
u
.
query
.
ban
else
if
u
.
query
.
ban
settings
.
BANNED_user
.
push
(
u
.
query
.
ban
)
settings
.
BANNED_user
.
push
(
u
.
query
.
ban
)
response
.
writeHead
(
200
)
response
.
writeHead
(
200
)
response
.
end
(
u
.
query
.
callback
+
"( 'ban ok', '"
+
u
.
query
.
ban
+
"' );"
)
response
.
end
(
u
.
query
.
callback
+
"( 'ban ok', '"
+
u
.
query
.
ban
+
"' );"
)
else
else
response
.
writeHead
(
404
);
response
.
writeHead
(
404
);
...
...
ygopro-server.js
View file @
bcfe4525
// Generated by CoffeeScript 1.10.0
// Generated by CoffeeScript 1.10.0
(
function
()
{
(
function
()
{
var
Graveyard
,
Room
,
_
,
bunyan
,
crypto
,
debug
,
dialogues
,
execFile
,
fs
,
http
,
http_server
,
https
,
https_server
,
log
,
moment
,
net
,
options
,
os
,
path
,
pg
,
request
,
requestListener
,
roomlist
,
settings
,
tips
,
tribute
,
url
,
users_cache
,
wait_room_start
,
ygopro
;
var
Graveyard
,
Room
,
_
,
bunyan
,
crypto
,
debug
,
dialogues
,
execFile
,
fs
,
http
,
http_server
,
https
,
https_server
,
l
ist
,
l
og
,
moment
,
net
,
options
,
os
,
path
,
pg
,
request
,
requestListener
,
roomlist
,
settings
,
tips
,
tribute
,
url
,
users_cache
,
wait_room_start
,
ygopro
;
net
=
require
(
'
net
'
);
net
=
require
(
'
net
'
);
...
@@ -40,6 +40,20 @@
...
@@ -40,6 +40,20 @@
settings
.
version
=
parseInt
(
fs
.
readFileSync
(
'
ygopro/gframe/game.cpp
'
,
'
utf8
'
).
match
(
/PRO_VERSION =
([
x
\d]
+
)
/
)[
1
],
'
16
'
);
settings
.
version
=
parseInt
(
fs
.
readFileSync
(
'
ygopro/gframe/game.cpp
'
,
'
utf8
'
).
match
(
/PRO_VERSION =
([
x
\d]
+
)
/
)[
1
],
'
16
'
);
settings
.
lflist
=
(
function
()
{
var
k
,
len
,
ref
,
results
;
ref
=
fs
.
readFileSync
(
'
ygopro/lflist.conf
'
,
'
utf8
'
).
match
(
/!.*/g
);
results
=
[];
for
(
k
=
0
,
len
=
ref
.
length
;
k
<
len
;
k
++
)
{
list
=
ref
[
k
];
results
.
push
({
date
:
moment
(
list
.
match
(
/!
([\d\.]
+
)
/
)[
1
],
'
YYYY.MM.DD
'
),
tcg
:
list
.
indexOf
(
'
TCG
'
)
!==
-
1
});
}
return
results
;
})();
ygopro
=
require
(
'
./ygopro.js
'
);
ygopro
=
require
(
'
./ygopro.js
'
);
Room
=
require
(
'
./room.js
'
);
Room
=
require
(
'
./room.js
'
);
...
@@ -351,7 +365,7 @@
...
@@ -351,7 +365,7 @@
});
});
client
.
end
();
client
.
end
();
}
else
if
(
settings
.
modules
.
windbot
&&
info
.
pass
.
slice
(
0
,
2
)
===
'
AI
'
)
{
}
else
if
(
settings
.
modules
.
windbot
&&
info
.
pass
.
slice
(
0
,
2
)
===
'
AI
'
)
{
if
(
info
.
pass
.
length
>
3
&&
info
.
pass
.
slice
(
0
,
3
)
===
'
AI#
'
)
{
if
(
info
.
pass
.
length
>
3
&&
info
.
pass
.
slice
(
0
,
3
)
===
'
AI#
'
||
info
.
pass
.
slice
(
0
,
3
)
===
'
AI_
'
)
{
name
=
info
.
pass
.
slice
(
3
);
name
=
info
.
pass
.
slice
(
3
);
windbot
=
_
.
sample
(
_
.
filter
(
settings
.
modules
.
windbot
,
function
(
w
)
{
windbot
=
_
.
sample
(
_
.
filter
(
settings
.
modules
.
windbot
,
function
(
w
)
{
return
w
.
name
===
name
||
w
.
deck
===
name
;
return
w
.
name
===
name
||
w
.
deck
===
name
;
...
@@ -442,6 +456,9 @@
...
@@ -442,6 +456,9 @@
start_hand
:
opt3
>>
4
,
start_hand
:
opt3
>>
4
,
draw_count
:
opt3
&
0xF
draw_count
:
opt3
&
0xF
};
};
options
.
lflist
=
_
.
findIndex
(
settings
.
lflist
,
function
(
list
)
{
return
((
options
.
rule
===
1
)
===
list
.
tcg
)
&&
list
.
date
.
isBefore
();
});
room
=
new
Room
(
name
,
options
);
room
=
new
Room
(
name
,
options
);
room
.
title
=
info
.
pass
.
slice
(
8
).
replace
(
String
.
fromCharCode
(
0xFEFF
),
'
'
);
room
.
title
=
info
.
pass
.
slice
(
8
).
replace
(
String
.
fromCharCode
(
0xFEFF
),
'
'
);
room
[
"
private
"
]
=
action
===
2
;
room
[
"
private
"
]
=
action
===
2
;
...
...
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