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
1
Issues
1
List
Boards
Labels
Service Desk
Milestones
Merge Requests
3
Merge Requests
3
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
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
MyCard
srvpro
Commits
9c4b7ccc
Commit
9c4b7ccc
authored
Dec 07, 2013
by
神楽坂玲奈
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix
parent
1657f74c
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
637 additions
and
634 deletions
+637
-634
ygopro-server.coffee
ygopro-server.coffee
+627
-626
ygopro-server.js
ygopro-server.js
+9
-7
ygopro-server.map
ygopro-server.map
+1
-1
No files found.
ygopro-server.coffee
View file @
9c4b7ccc
#标准库
net
=
require
'net'
http
=
require
'http'
url
=
require
'url'
path
=
require
'path'
fs
=
require
'fs'
execFile
=
require
(
'child_process'
).
execFile
#三方库
_
=
require
'underscore'
_
.
str
=
require
'underscore.string'
_
.
mixin
(
_
.
str
.
exports
());
Inotify
=
require
(
'inotify'
).
Inotify
request
=
require
'request'
bunyan
=
require
'bunyan'
#配置文件
settings
=
require
'./config.json'
#组件
ygopro
=
require
'./ygopro.js'
mycard
=
require
'./mycard.js'
Room
=
require
'./room.js'
User
=
require
'./user.js'
if
settings
.
modules
.
database
Deck
=
require
'./deck.js'
if
settings
.
modules
.
database
victories
=
require
'./victories.json'
#debug模式 端口号+1
debug
=
false
log
=
null
if
process
.
argv
[
2
]
==
'--debug'
settings
.
port
++
settings
.
modules
.
http
.
port
++
if
settings
.
modules
.
http
log
=
bunyan
.
createLogger
name
:
"mycard-debug"
else
log
=
bunyan
.
createLogger
name
:
"mycard"
#网络连接
net
.
createServer
(
client
)
->
server
=
new
net
.
Socket
()
client
.
server
=
server
#释放处理
client
.
on
'close'
,
(
had_error
)
->
log
.
info
"client closed"
,
client
.
name
,
had_error
client
.
room
.
disconnector
=
client
if
client
.
room
and
client
.
room
.
started
and
client
in
client
.
room
.
dueling_players
and
!
client
.
room
.
disconnector
unless
client
.
closed
client
.
closed
=
true
client
.
room
.
disconnect
(
client
)
if
client
.
room
server
.
end
()
client
.
on
'error'
,
(
error
)
->
log
.
info
"client error"
,
client
.
name
,
error
client
.
room
.
disconnector
=
client
if
client
.
room
and
client
.
room
.
started
and
client
in
client
.
room
.
dueling_players
and
!
client
.
room
.
disconnector
unless
client
.
closed
client
.
closed
=
error
client
.
room
.
disconnect
(
client
,
error
)
if
client
.
room
server
.
end
()
server
.
on
'close'
,
(
had_error
)
->
log
.
info
"server closed"
,
client
.
name
,
had_error
server
.
closed
=
true
unless
server
.
closed
client
.
room
.
disconnector
=
'server'
if
client
.
room
and
client
.
room
.
started
and
client
in
client
.
room
.
dueling_players
and
!
client
.
room
.
disconnector
unless
client
.
closed
ygopro
.
stoc_send_chat
(
client
,
"服务器关闭了连接"
)
client
.
end
()
server
.
on
'error'
,
(
error
)
->
log
.
info
"server error"
,
client
.
name
,
error
server
.
closed
=
error
client
.
room
.
disconnector
=
'server'
if
client
.
room
and
client
.
room
.
started
and
client
in
client
.
room
.
dueling_players
and
!
client
.
room
.
disconnector
unless
client
.
closed
ygopro
.
stoc_send_chat
(
client
,
"服务器错误:
#{
error
}
"
)
client
.
end
()
#需要重构
#客户端到服务端(ctos)协议分析
ctos_buffer
=
new
Buffer
(
0
)
ctos_message_length
=
0
ctos_proto
=
0
client
.
pre_establish_buffers
=
new
Array
()
client
.
on
'data'
,
(
data
)
->
if
client
.
is_post_watcher
client
.
room
.
watcher
.
write
data
else
ctos_buffer
=
Buffer
.
concat
([
ctos_buffer
,
data
],
ctos_buffer
.
length
+
data
.
length
)
#buffer的错误使用方式,好孩子不要学
if
client
.
established
server
.
write
data
else
client
.
pre_establish_buffers
.
push
data
while
true
if
ctos_message_length
==
0
if
ctos_buffer
.
length
>=
2
ctos_message_length
=
ctos_buffer
.
readUInt16LE
(
0
)
else
break
else
if
ctos_proto
==
0
if
ctos_buffer
.
length
>=
3
ctos_proto
=
ctos_buffer
.
readUInt8
(
2
)
else
break
else
if
ctos_buffer
.
length
>=
2
+
ctos_message_length
#console.log "CTOS", ygopro.constants.CTOS[ctos_proto]
if
ygopro
.
ctos_follows
[
ctos_proto
]
b
=
ctos_buffer
.
slice
(
3
,
ctos_message_length
-
1
+
3
)
if
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
CTOS
[
ygopro
.
constants
.
CTOS
[
ctos_proto
]]]
struct
.
_setBuff
(
b
)
ygopro
.
ctos_follows
[
ctos_proto
].
callback
b
,
_
.
clone
(
struct
.
fields
),
client
,
server
else
ygopro
.
ctos_follows
[
ctos_proto
].
callback
b
,
null
,
client
,
server
ctos_buffer
=
ctos_buffer
.
slice
(
2
+
ctos_message_length
)
ctos_message_length
=
0
ctos_proto
=
0
else
break
#服务端到客户端(stoc)
stoc_buffer
=
new
Buffer
(
0
)
stoc_message_length
=
0
stoc_proto
=
0
server
.
on
'data'
,
(
data
)
->
stoc_buffer
=
Buffer
.
concat
([
stoc_buffer
,
data
],
stoc_buffer
.
length
+
data
.
length
)
#buffer的错误使用方式,好孩子不要学
#unless ygopro.stoc_follows[stoc_proto] and ygopro.stoc_follows[stoc_proto].synchronous
client
.
write
data
while
true
if
stoc_message_length
==
0
if
stoc_buffer
.
length
>=
2
stoc_message_length
=
stoc_buffer
.
readUInt16LE
(
0
)
else
break
else
if
stoc_proto
==
0
if
stoc_buffer
.
length
>=
3
stoc_proto
=
stoc_buffer
.
readUInt8
(
2
)
else
break
else
if
stoc_buffer
.
length
>=
2
+
stoc_message_length
#console.log "STOC", ygopro.constants.STOC[stoc_proto]
if
ygopro
.
stoc_follows
[
stoc_proto
]
b
=
stoc_buffer
.
slice
(
3
,
stoc_message_length
-
1
+
3
)
if
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
STOC
[
ygopro
.
constants
.
STOC
[
stoc_proto
]]]
struct
.
_setBuff
(
b
)
ygopro
.
stoc_follows
[
stoc_proto
].
callback
b
,
_
.
clone
(
struct
.
fields
),
client
,
server
else
ygopro
.
stoc_follows
[
stoc_proto
].
callback
b
,
null
,
client
,
server
stoc_buffer
=
stoc_buffer
.
slice
(
2
+
stoc_message_length
)
stoc_message_length
=
0
stoc_proto
=
0
else
break
.
listen
settings
.
port
,
->
log
.
info
"server started"
,
settings
.
ip
,
settings
.
port
#功能模块
ygopro
.
ctos_follow
'PLAYER_INFO'
,
true
,
(
buffer
,
info
,
client
,
server
)
->
client
.
name
=
info
.
name
#在创建room之前暂存
ygopro
.
ctos_follow
'JOIN_GAME'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
#log.info info
if
info
.
version
!=
settings
.
version
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
msg
:
4
code
:
settings
.
version
}
client
.
end
()
else
if
!
info
.
pass
.
length
ygopro
.
stoc_send_chat
(
client
,
"房间为空,请修改房间名"
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
msg
:
1
code
:
2
}
client
.
end
()
else
if
!
Room
.
validate
(
info
.
pass
)
#ygopro.stoc_send client, 'ERROR_MSG',{
# msg: 1
# code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在这里就经常弹不出提示
#}
ygopro
.
stoc_send_chat
(
client
,
"房间密码不正确"
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
msg
:
1
code
:
2
}
client
.
end
()
else
if
client
.
name
==
'[INCORRECT]'
#模拟用户验证
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
msg
:
1
code
:
2
}
client
.
end
()
else
log
.
info
'join_game'
,
info
.
pass
,
client
.
name
client
.
room
=
Room
.
find_or_create_by_name
(
info
.
pass
)
if
client
.
room
.
started
if
settings
.
modules
.
post_start_watching
client
.
is_post_watcher
=
true
ygopro
.
stoc_send_chat_to_room
client
.
room
,
"
#{
client
.
name
}
加入了观战"
client
.
room
.
watchers
.
push
client
for
buffer
in
client
.
room
.
watcher_buffers
client
.
write
buffer
ygopro
.
stoc_send_chat
client
,
"观战中."
else
ygopro
.
stoc_send_chat
(
client
,
"决斗已开始"
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
msg
:
1
code
:
2
}
client
.
end
()
else
client
.
room
.
connect
(
client
)
######################################################################################################################
ygopro
.
stoc_follow
'JOIN_GAME'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
#欢迎信息
if
settings
.
modules
.
welcome
ygopro
.
stoc_send_chat
client
,
settings
.
modules
.
welcome
if
settings
.
modules
.
database
if
_
.
startsWith
(
client
.
room
.
name
,
'M#'
)
User
.
findOne
{
name
:
client
.
name
},
(
err
,
user
)
->
if
!
user
user
=
new
User
({
name
:
client
.
name
,
points
:
0
})
user
.
save
()
User
.
count
{
points
:
{
$gt
:
user
.
points
}},
(
err
,
count
)
->
rank
=
count
+
1
ygopro
.
stoc_send_chat
(
client
,
"积分系统测试中,你现在有
#{
user
.
points
}
点积分,排名
#{
rank
}
,这些积分以后正式使用时会重置"
)
if
settings
.
modules
.
post_start_watching
and
!
client
.
room
.
watcher
client
.
room
.
watcher
=
watcher
=
net
.
connect
client
.
room
.
port
,
->
ygopro
.
ctos_send
watcher
,
'PLAYER_INFO'
,
{
name
:
"the Big Brother"
}
ygopro
.
ctos_send
watcher
,
'JOIN_GAME'
,
{
version
:
settings
.
version
,
gameid
:
2577
,
some_unknown_mysterious_fucking_thing
:
0
pass
:
""
}
ygopro
.
ctos_send
watcher
,
'HS_TOOBSERVER'
watcher
.
on
'data'
,
(
data
)
->
client
.
room
.
watcher_buffers
.
push
data
for
w
in
client
.
room
.
watchers
w
.
write
data
if
w
#a WTF fix
watcher
.
on
'error'
,
(
error
)
->
log
.
error
"watcher error"
,
error
#登场台词
if
settings
.
modules
.
dialogues
dialogues
=
{}
request
url
:
settings
.
modules
.
dialogues
json
:
true
,
(
error
,
response
,
body
)
->
if
_
.
isString
body
log
.
warn
"dialogues bad json"
,
body
else
if
error
or
!
body
log
.
warn
'dialogues error'
,
error
,
response
else
log
.
info
"dialogues loaded"
,
_
.
size
body
dialogues
=
body
ygopro
.
stoc_follow
'GAME_MSG'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
msg
=
buffer
.
readInt8
(
0
)
#log.info 'MSG', ygopro.constants.MSG[msg]
if
ygopro
.
constants
.
MSG
[
msg
]
==
'START'
playertype
=
buffer
.
readUInt8
(
1
)
client
.
is_first
=
!
(
playertype
&
0xf
);
client
.
lp
=
client
.
room
.
hostinfo
.
start_lp
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.name} 初始LP #{client.lp}")
if
ygopro
.
constants
.
MSG
[
msg
]
==
'WIN'
and
_
.
startsWith
(
client
.
room
.
name
,
'M#'
)
and
client
.
is_host
pos
=
buffer
.
readUInt8
(
1
)
pos
=
1
-
pos
unless
client
.
is_first
or
pos
==
2
reason
=
buffer
.
readUInt8
(
2
)
log
.
info
{
winner
:
pos
,
reason
:
reason
}
client
.
room
.
duels
.
push
{
winner
:
pos
,
reason
:
reason
}
#lp跟踪
if
ygopro
.
constants
.
MSG
[
msg
]
==
'DAMAGE'
and
client
.
is_host
pos
=
buffer
.
readUInt8
(
1
)
pos
=
1
-
pos
unless
client
.
is_first
val
=
buffer
.
readInt32LE
(
2
)
client
.
room
.
dueling_players
[
pos
].
lp
-=
val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 受到伤害 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if
0
<
client
.
room
.
dueling_players
[
pos
].
lp
<=
100
ygopro
.
stoc_send_chat_to_room
(
client
.
room
,
"你的生命已经如风中残烛了!"
)
if
ygopro
.
constants
.
MSG
[
msg
]
==
'RECOVER'
and
client
.
is_host
pos
=
buffer
.
readUInt8
(
1
)
pos
=
1
-
pos
unless
client
.
is_first
val
=
buffer
.
readInt32LE
(
2
)
client
.
room
.
dueling_players
[
pos
].
lp
+=
val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 回复 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if
ygopro
.
constants
.
MSG
[
msg
]
==
'LPUPDATE'
and
client
.
is_host
pos
=
buffer
.
readUInt8
(
1
)
pos
=
1
-
pos
unless
client
.
is_first
val
=
buffer
.
readInt32LE
(
2
)
client
.
room
.
dueling_players
[
pos
].
lp
=
val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 的LP变成 #{client.room.dueling_players[pos].lp}")
if
ygopro
.
constants
.
MSG
[
msg
]
==
'PAY_LPCOST'
and
client
.
is_host
pos
=
buffer
.
readUInt8
(
1
)
pos
=
1
-
pos
unless
client
.
is_first
val
=
buffer
.
readInt32LE
(
2
)
client
.
room
.
dueling_players
[
pos
].
lp
-=
val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 支付 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if
0
<
client
.
room
.
dueling_players
[
pos
].
lp
<=
100
ygopro
.
stoc_send_chat_to_room
(
client
.
room
,
"背水一战!"
)
#登场台词
if
settings
.
modules
.
dialogues
if
ygopro
.
constants
.
MSG
[
msg
]
==
'SUMMONING'
or
ygopro
.
constants
.
MSG
[
msg
]
==
'SPSUMMONING'
card
=
buffer
.
readUInt32LE
(
1
)
if
dialogues
[
card
]
for
line
in
_
.
lines
dialogues
[
card
][
Math
.
floor
(
Math
.
random
()
*
dialogues
[
card
].
length
)]
ygopro
.
stoc_send_chat
client
,
line
###
#房间管理
ygopro.stoc_follow 'HS_PLAYER_ENTER', false, (buffer, info, client, server)->
#console.log "PLAYER_ENTER to #{client.name}: #{info.name}, #{info.pos}"
#room = client.room
#if !room
# console.log "[WARN]player_enter: can't find room by player #{client.player}"
# return
#room.pos_name[info.pos] = info.name
ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
#client.ready = info.status & 0xF != 0
#client.pos = info.status >> 4
#console.log "PLAYER_CHANGE to #{client.name}: #{info.status & 0xF != 0}, #{info.status >> 4}"
###
ygopro
.
stoc_follow
'TYPE_CHANGE'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
selftype
=
info
.
type
&
0xf
;
is_host
=
((
info
.
type
>>
4
)
&
0xf
)
!=
0
;
client
.
is_host
=
is_host
client
.
pos
=
selftype
#console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host
#tip
ygopro
.
stoc_send_random_tip
=
(
client
)
->
ygopro
.
stoc_send_chat
client
,
"Tip: "
+
tips
[
Math
.
floor
(
Math
.
random
()
*
tips
.
length
)]
if
tips
tips
=
null
request
url
:
settings
.
modules
.
tips
json
:
true
,
(
error
,
response
,
body
)
->
tips
=
body
log
.
info
"tips loaded"
,
tips
.
length
ygopro
.
stoc_follow
'DUEL_START'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
unless
client
.
room
.
started
#first start
client
.
room
.
started
=
true
client
.
room
.
duels
=
[]
client
.
room
.
dueling_players
=
[]
for
player
in
client
.
room
.
players
when
player
.
pos
!=
7
client
.
room
.
dueling_players
[
player
.
pos
]
=
player
if
!
player
.
main
log
.
error
'WTF'
,
client
else
player
.
deck
=
mycard
.
load_card_usages_from_cards
(
player
.
main
,
player
.
side
)
if
!
client
.
room
.
dueling_players
[
0
]
or
!
client
.
room
.
dueling_players
[
1
]
log
.
error
'incomplete room'
,
client
.
room
.
dueling_players
,
client
.
room
.
players
if
settings
.
modules
.
tips
ygopro
.
stoc_send_random_tip
(
client
)
ygopro
.
ctos_follow
'CHAT'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
switch
_
.
trim
(
info
.
msg
)
when
'/ping'
execFile
'ss'
,
[
'-it'
,
"dst
#{
client
.
remoteAddress
}
:
#{
client
.
remotePort
}
"
],
(
error
,
stdout
,
stderr
)
->
if
error
ygopro
.
stoc_send_chat_to_room
client
.
room
,
error
else
line
=
_
.
lines
(
stdout
)[
2
]
if
line
.
indexOf
(
'rtt'
)
!=
-
1
ygopro
.
stoc_send_chat_to_room
client
.
room
,
line
else
log
.
warn
'ping'
,
stdout
ygopro
.
stoc_send_chat_to_room
client
.
room
,
stdout
when
'/ranktop'
if
settings
.
modules
.
database
User
.
find
null
,
null
,
{
sort
:
{
points
:
-
1
},
limit
:
8
},
(
err
,
users
)
->
if
err
return
log
.
error
'ranktop'
,
err
for
index
,
user
of
users
ygopro
.
stoc_send_chat
client
,
[
parseInt
(
index
)
+
1
,
user
.
points
,
user
.
name
].
join
(
' '
)
when
'/help'
ygopro
.
stoc_send_chat
(
client
,
"Mycard MatchServer 指令帮助"
)
ygopro
.
stoc_send_chat
(
client
,
"/help 显示这个帮助信息"
)
ygopro
.
stoc_send_chat
(
client
,
"/tip 显示一条提示"
)
if
settings
.
modules
.
tips
ygopro
.
stoc_send_chat
(
client
,
"/senddeck 发送自己的卡组"
)
when
'/tip'
ygopro
.
stoc_send_random_tip
(
client
)
if
settings
.
modules
.
tips
#发送卡组
when
'/senddeck'
if
client
.
deck
?
ygopro
.
stoc_send_chat
(
client
,
"正在读取卡组信息... "
)
mycard
.
deck_url_short
client
.
name
,
client
.
deck
,
(
url
)
->
ygopro
.
stoc_send_chat_to_room
(
client
.
room
,
"卡组链接: "
+
url
)
else
ygopro
.
stoc_send_chat_to_room
(
client
.
room
,
"读取卡组信息失败"
)
when
'/admin showroom'
log
.
info
client
.
room
ygopro
.
ctos_follow
'UPDATE_DECK'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
log
.
info
info
main
=
(
info
.
deckbuf
[
i
]
for
i
in
[
0
...
info
.
mainc
])
side
=
(
info
.
deckbuf
[
i
]
for
i
in
[
info
.
mainc
...
info
.
mainc
+
info
.
sidec
])
client
.
main
=
main
client
.
side
=
side
if
settings
.
modules
.
skip_empty_side
ygopro
.
stoc_follow
'CHANGE_SIDE'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
if
not
_
.
any
(
client
.
deck
,
(
card_usage
)
->
card_usage
.
side
)
ygopro
.
ctos_send
server
,
'UPDATE_DECK'
,
{
mainc
:
client
.
main
.
length
,
sidec
:
0
,
deckbuf
:
client
.
main
}
ygopro
.
stoc_send_chat
client
,
'等待更换副卡组中...'
###
# 开包大战
packs_weighted_cards = {}
for pack, cards of require './packs.json'
packs_weighted_cards[pack] = []
for card in cards
for i in [0..card.count]
packs_weighted_cards[pack].push card.card
console.log packs_weighted_cards
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
ygopro.ctos_send server, 'HS_NOTREADY'
deck = []
for pack in client.player
for i in [0...5]
deck.push packs_weighted_cards[pack][Math.floor(Math.random()*packs_weighted_cards[pack].length)]
ygopro.ctos_send server, 'UPDATE_DECK', {
mainc: deck.length,
sidec: 0,
deckbuf: deck
}
ygopro.ctos_send server, 'HS_READY'
###
#http
if
settings
.
modules
.
http
level_points
=
require
'./level_points.json'
waiting
=
[[]]
for
i
of
level_points
waiting
.
push
[]
log
.
info
'level_points loaded'
,
level_points
http
.
createServer
(
request
,
response
)
->
#http://122.0.65.70:7922/?operation=getroomjson
url
=
url
.
parse
(
request
.
url
)
#log.info url
if
url
.
pathname
==
'/count.json'
response
.
writeHead
(
200
);
response
.
end
(
Room
.
all
.
length
.
toString
())
else
if
url
.
pathname
==
'/match'
if
request
.
headers
[
'authorization'
]
[
name
,
password
]
=
new
Buffer
(
request
.
headers
[
'authorization'
].
split
(
/\s+/
).
pop
()
?
''
,
'base64'
).
toString
().
split
(
':'
)
User
.
findOne
{
name
:
name
},
(
err
,
user
)
->
if
!
user
user
=
new
User
({
name
:
name
,
points
:
0
,
elo
:
1400
})
user
.
save
()
level
=
level_points
.
length
for
index
,
points
of
level_points
if
user
.
points
<
points
level
=
index
break
response
.
allowance
=
0
waiting
[
level
].
push
response
request
.
on
'close'
,
()
->
index
=
waiting
[
level
].
indexOf
(
response
)
waiting
[
level
].
splice
(
index
,
1
)
unless
index
==
-
1
else
#log.info 'unauth match'
#response.writeHead(401);
#response.end("请更新mycard到1.2.8版本");
level
=
1
response
.
allowance
=
0
waiting
[
level
].
push
response
request
.
on
'close'
,
()
->
index
=
waiting
[
level
].
indexOf
(
response
)
waiting
[
level
].
splice
(
index
,
1
)
unless
index
==
-
1
else
if
url
.
pathname
==
'/rooms.json'
response
.
writeHead
(
404
);
response
.
end
();
else
if
url
.
query
==
'operation=getroomjson'
response
.
writeHead
(
200
);
response
.
end
JSON
.
stringify
rooms
:
(
for
room
in
Room
.
all
when
room
.
established
roomid
:
room
.
port
.
toString
(),
roomname
:
room
.
name
.
split
(
'$'
,
2
)[
0
],
needpass
:
(
room
.
name
.
indexOf
(
'$'
)
!=
-
1
).
toString
(),
users
:
(
for
player
in
room
.
players
when
player
.
pos
?
id
:
(
-
1
).
toString
(),
name
:
player
.
name
,
pos
:
player
.
pos
),
istart
:
if
room
.
started
then
"start"
else
"wait"
)
else
response
.
writeHead
(
404
);
response
.
end
();
.
listen
settings
.
modules
.
http
.
port
setInterval
()
->
for
level
in
[
level_points
.
length
..
0
]
for
index
,
player
of
waiting
[
level
]
opponent_level
=
null
opponent
=
_
.
find
waiting
[
level
],
(
opponent
)
->
log
.
info
opponent
,
player
opponent
isnt
player
log
.
info
'--------1--------'
,
waiting
,
opponent
if
opponent
opponent_level
=
level
else
if
player
.
allowance
>
0
for
displacement
in
[
1
..
player
.
allowance
]
if
level
+
displacement
<=
level_points
.
length
opponent
=
waiting
[
level
+
displacement
][
0
]
if
opponent
opponent_level
=
level
+
displacement
break
if
level
-
displacement
>=
0
opponent
=
waiting
[
level
-
displacement
][
0
]
if
opponent
opponent_level
=
level
-
displacement
break
if
opponent
if
waiting
[
level
].
indexOf
(
player
)
==
-
1
or
waiting
[
opponent_level
].
indexOf
(
opponent
)
==
-
1
log
.
info
waiting
,
player
,
level
,
opponent
,
opponent_level
throw
'WTF'
waiting
[
level
].
splice
(
waiting
[
level
].
indexOf
(
player
),
1
)
waiting
[
opponent_level
].
splice
(
waiting
[
opponent_level
].
indexOf
(
opponent
),
1
)
index
--
room
=
"mycard://
#{
settings
.
ip
}
:
#{
settings
.
port
}
/M#
#{
_
.
uniqueId
()
}
$
#{
_
.
random
(
999
)
}
"
log
.
info
'matched'
,
room
headers
=
{
"Access-Control-Allow-Origin"
:
"*"
,
"Content-Type"
:
"text/plain"
}
player
.
writeHead
(
200
,
headers
)
player
.
end
room
opponent
.
writeHead
(
200
,
headers
)
opponent
.
end
room
else
player
.
allowance
++
,
2000
#清理90s没活动的房间
inotify
=
new
Inotify
()
inotify
.
addWatch
path
:
'ygocore/replay'
,
watch_for
:
Inotify
.
IN_CLOSE_WRITE
|
Inotify
.
IN_CREATE
|
Inotify
.
IN_MODIFY
,
callback
:
(
event
)
->
mask
=
event
.
mask
if
event
.
name
port
=
parseInt
path
.
basename
(
event
.
name
,
'.yrp'
)
room
=
Room
.
find_by_port
port
if
room
if
mask
&
Inotify
.
IN_CREATE
else
if
mask
&
Inotify
.
IN_CLOSE_WRITE
fs
.
unlink
path
.
join
(
'ygocore/replay'
),
(
err
)
->
else
if
mask
&
Inotify
.
IN_MODIFY
room
.
alive
=
true
else
log
.
error
"event without filename"
setInterval
()
->
for
room
in
Room
.
all
if
room
.
alive
room
.
alive
=
false
else
log
.
info
"kill room"
,
room
.
port
for
player
in
room
.
players
ygopro
.
stoc_send_chat
(
player
,
"由于长时间没有活动被关闭"
)
unless
player
.
closed
room
.
process
.
kill
()
#标准库
net
=
require
'net'
http
=
require
'http'
url
=
require
'url'
path
=
require
'path'
fs
=
require
'fs'
execFile
=
require
(
'child_process'
).
execFile
#三方库
_
=
require
'underscore'
_
.
str
=
require
'underscore.string'
_
.
mixin
(
_
.
str
.
exports
());
Inotify
=
require
(
'inotify'
).
Inotify
request
=
require
'request'
bunyan
=
require
'bunyan'
#配置文件
settings
=
require
'./config.json'
#组件
ygopro
=
require
'./ygopro.js'
mycard
=
require
'./mycard.js'
Room
=
require
'./room.js'
User
=
require
'./user.js'
if
settings
.
modules
.
database
Deck
=
require
'./deck.js'
if
settings
.
modules
.
database
victories
=
require
'./victories.json'
#debug模式 端口号+1
debug
=
false
log
=
null
if
process
.
argv
[
2
]
==
'--debug'
settings
.
port
++
settings
.
modules
.
http
.
port
++
if
settings
.
modules
.
http
log
=
bunyan
.
createLogger
name
:
"mycard-debug"
else
log
=
bunyan
.
createLogger
name
:
"mycard"
#网络连接
net
.
createServer
(
client
)
->
server
=
new
net
.
Socket
()
client
.
server
=
server
#释放处理
client
.
on
'close'
,
(
had_error
)
->
log
.
info
"client closed"
,
client
.
name
,
had_error
client
.
room
.
disconnector
=
client
if
client
.
room
and
client
.
room
.
started
and
client
in
client
.
room
.
dueling_players
and
!
client
.
room
.
disconnector
unless
client
.
closed
client
.
closed
=
true
client
.
room
.
disconnect
(
client
)
if
client
.
room
server
.
end
()
client
.
on
'error'
,
(
error
)
->
log
.
info
"client error"
,
client
.
name
,
error
client
.
room
.
disconnector
=
client
if
client
.
room
and
client
.
room
.
started
and
client
in
client
.
room
.
dueling_players
and
!
client
.
room
.
disconnector
unless
client
.
closed
client
.
closed
=
error
client
.
room
.
disconnect
(
client
,
error
)
if
client
.
room
server
.
end
()
server
.
on
'close'
,
(
had_error
)
->
log
.
info
"server closed"
,
client
.
name
,
had_error
server
.
closed
=
true
unless
server
.
closed
client
.
room
.
disconnector
=
'server'
if
client
.
room
and
client
.
room
.
started
and
client
in
client
.
room
.
dueling_players
and
!
client
.
room
.
disconnector
unless
client
.
closed
ygopro
.
stoc_send_chat
(
client
,
"服务器关闭了连接"
)
client
.
end
()
server
.
on
'error'
,
(
error
)
->
log
.
info
"server error"
,
client
.
name
,
error
server
.
closed
=
error
client
.
room
.
disconnector
=
'server'
if
client
.
room
and
client
.
room
.
started
and
client
in
client
.
room
.
dueling_players
and
!
client
.
room
.
disconnector
unless
client
.
closed
ygopro
.
stoc_send_chat
(
client
,
"服务器错误:
#{
error
}
"
)
client
.
end
()
#需要重构
#客户端到服务端(ctos)协议分析
ctos_buffer
=
new
Buffer
(
0
)
ctos_message_length
=
0
ctos_proto
=
0
client
.
pre_establish_buffers
=
new
Array
()
client
.
on
'data'
,
(
data
)
->
if
client
.
is_post_watcher
client
.
room
.
watcher
.
write
data
else
ctos_buffer
=
Buffer
.
concat
([
ctos_buffer
,
data
],
ctos_buffer
.
length
+
data
.
length
)
#buffer的错误使用方式,好孩子不要学
if
client
.
established
server
.
write
data
else
client
.
pre_establish_buffers
.
push
data
while
true
if
ctos_message_length
==
0
if
ctos_buffer
.
length
>=
2
ctos_message_length
=
ctos_buffer
.
readUInt16LE
(
0
)
else
break
else
if
ctos_proto
==
0
if
ctos_buffer
.
length
>=
3
ctos_proto
=
ctos_buffer
.
readUInt8
(
2
)
else
break
else
if
ctos_buffer
.
length
>=
2
+
ctos_message_length
#console.log "CTOS", ygopro.constants.CTOS[ctos_proto]
if
ygopro
.
ctos_follows
[
ctos_proto
]
b
=
ctos_buffer
.
slice
(
3
,
ctos_message_length
-
1
+
3
)
if
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
CTOS
[
ygopro
.
constants
.
CTOS
[
ctos_proto
]]]
struct
.
_setBuff
(
b
)
ygopro
.
ctos_follows
[
ctos_proto
].
callback
b
,
_
.
clone
(
struct
.
fields
),
client
,
server
else
ygopro
.
ctos_follows
[
ctos_proto
].
callback
b
,
null
,
client
,
server
ctos_buffer
=
ctos_buffer
.
slice
(
2
+
ctos_message_length
)
ctos_message_length
=
0
ctos_proto
=
0
else
break
#服务端到客户端(stoc)
stoc_buffer
=
new
Buffer
(
0
)
stoc_message_length
=
0
stoc_proto
=
0
server
.
on
'data'
,
(
data
)
->
stoc_buffer
=
Buffer
.
concat
([
stoc_buffer
,
data
],
stoc_buffer
.
length
+
data
.
length
)
#buffer的错误使用方式,好孩子不要学
#unless ygopro.stoc_follows[stoc_proto] and ygopro.stoc_follows[stoc_proto].synchronous
client
.
write
data
while
true
if
stoc_message_length
==
0
if
stoc_buffer
.
length
>=
2
stoc_message_length
=
stoc_buffer
.
readUInt16LE
(
0
)
else
break
else
if
stoc_proto
==
0
if
stoc_buffer
.
length
>=
3
stoc_proto
=
stoc_buffer
.
readUInt8
(
2
)
else
break
else
if
stoc_buffer
.
length
>=
2
+
stoc_message_length
#console.log "STOC", ygopro.constants.STOC[stoc_proto]
if
ygopro
.
stoc_follows
[
stoc_proto
]
b
=
stoc_buffer
.
slice
(
3
,
stoc_message_length
-
1
+
3
)
if
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
STOC
[
ygopro
.
constants
.
STOC
[
stoc_proto
]]]
struct
.
_setBuff
(
b
)
ygopro
.
stoc_follows
[
stoc_proto
].
callback
b
,
_
.
clone
(
struct
.
fields
),
client
,
server
else
ygopro
.
stoc_follows
[
stoc_proto
].
callback
b
,
null
,
client
,
server
stoc_buffer
=
stoc_buffer
.
slice
(
2
+
stoc_message_length
)
stoc_message_length
=
0
stoc_proto
=
0
else
break
.
listen
settings
.
port
,
->
log
.
info
"server started"
,
settings
.
ip
,
settings
.
port
#功能模块
ygopro
.
ctos_follow
'PLAYER_INFO'
,
true
,
(
buffer
,
info
,
client
,
server
)
->
client
.
name
=
info
.
name
#在创建room之前暂存
ygopro
.
ctos_follow
'JOIN_GAME'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
#log.info info
if
info
.
version
!=
settings
.
version
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
msg
:
4
code
:
settings
.
version
}
client
.
end
()
else
if
!
info
.
pass
.
length
ygopro
.
stoc_send_chat
(
client
,
"房间为空,请修改房间名"
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
msg
:
1
code
:
2
}
client
.
end
()
else
if
!
Room
.
validate
(
info
.
pass
)
#ygopro.stoc_send client, 'ERROR_MSG',{
# msg: 1
# code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在这里就经常弹不出提示
#}
ygopro
.
stoc_send_chat
(
client
,
"房间密码不正确"
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
msg
:
1
code
:
2
}
client
.
end
()
else
if
client
.
name
==
'[INCORRECT]'
#模拟用户验证
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
msg
:
1
code
:
2
}
client
.
end
()
else
log
.
info
'join_game'
,
info
.
pass
,
client
.
name
client
.
room
=
Room
.
find_or_create_by_name
(
info
.
pass
)
if
client
.
room
.
started
if
settings
.
modules
.
post_start_watching
client
.
is_post_watcher
=
true
ygopro
.
stoc_send_chat_to_room
client
.
room
,
"
#{
client
.
name
}
加入了观战"
client
.
room
.
watchers
.
push
client
for
buffer
in
client
.
room
.
watcher_buffers
client
.
write
buffer
ygopro
.
stoc_send_chat
client
,
"观战中."
else
ygopro
.
stoc_send_chat
(
client
,
"决斗已开始"
)
ygopro
.
stoc_send
client
,
'ERROR_MSG'
,{
msg
:
1
code
:
2
}
client
.
end
()
else
client
.
room
.
connect
(
client
)
######################################################################################################################
ygopro
.
stoc_follow
'JOIN_GAME'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
#欢迎信息
if
settings
.
modules
.
welcome
ygopro
.
stoc_send_chat
client
,
settings
.
modules
.
welcome
if
settings
.
modules
.
database
if
_
.
startsWith
(
client
.
room
.
name
,
'M#'
)
User
.
findOne
{
name
:
client
.
name
},
(
err
,
user
)
->
if
!
user
user
=
new
User
({
name
:
client
.
name
,
points
:
0
})
user
.
save
()
User
.
count
{
points
:
{
$gt
:
user
.
points
}},
(
err
,
count
)
->
rank
=
count
+
1
ygopro
.
stoc_send_chat
(
client
,
"积分系统测试中,你现在有
#{
user
.
points
}
点积分,排名
#{
rank
}
,这些积分以后正式使用时会重置"
)
if
settings
.
modules
.
post_start_watching
and
!
client
.
room
.
watcher
client
.
room
.
watcher
=
watcher
=
net
.
connect
client
.
room
.
port
,
->
ygopro
.
ctos_send
watcher
,
'PLAYER_INFO'
,
{
name
:
"the Big Brother"
}
ygopro
.
ctos_send
watcher
,
'JOIN_GAME'
,
{
version
:
settings
.
version
,
gameid
:
2577
,
some_unknown_mysterious_fucking_thing
:
0
pass
:
""
}
ygopro
.
ctos_send
watcher
,
'HS_TOOBSERVER'
watcher
.
on
'data'
,
(
data
)
->
client
.
room
.
watcher_buffers
.
push
data
for
w
in
client
.
room
.
watchers
w
.
write
data
if
w
#a WTF fix
watcher
.
on
'error'
,
(
error
)
->
log
.
error
"watcher error"
,
error
#登场台词
if
settings
.
modules
.
dialogues
dialogues
=
{}
request
url
:
settings
.
modules
.
dialogues
json
:
true
,
(
error
,
response
,
body
)
->
if
_
.
isString
body
log
.
warn
"dialogues bad json"
,
body
else
if
error
or
!
body
log
.
warn
'dialogues error'
,
error
,
response
else
log
.
info
"dialogues loaded"
,
_
.
size
body
dialogues
=
body
ygopro
.
stoc_follow
'GAME_MSG'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
msg
=
buffer
.
readInt8
(
0
)
#log.info 'MSG', ygopro.constants.MSG[msg]
if
ygopro
.
constants
.
MSG
[
msg
]
==
'START'
playertype
=
buffer
.
readUInt8
(
1
)
client
.
is_first
=
!
(
playertype
&
0xf
);
client
.
lp
=
client
.
room
.
hostinfo
.
start_lp
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.name} 初始LP #{client.lp}")
if
ygopro
.
constants
.
MSG
[
msg
]
==
'WIN'
and
_
.
startsWith
(
client
.
room
.
name
,
'M#'
)
and
client
.
is_host
pos
=
buffer
.
readUInt8
(
1
)
pos
=
1
-
pos
unless
client
.
is_first
or
pos
==
2
reason
=
buffer
.
readUInt8
(
2
)
log
.
info
{
winner
:
pos
,
reason
:
reason
}
client
.
room
.
duels
.
push
{
winner
:
pos
,
reason
:
reason
}
#lp跟踪
if
ygopro
.
constants
.
MSG
[
msg
]
==
'DAMAGE'
and
client
.
is_host
pos
=
buffer
.
readUInt8
(
1
)
pos
=
1
-
pos
unless
client
.
is_first
val
=
buffer
.
readInt32LE
(
2
)
client
.
room
.
dueling_players
[
pos
].
lp
-=
val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 受到伤害 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if
0
<
client
.
room
.
dueling_players
[
pos
].
lp
<=
100
ygopro
.
stoc_send_chat_to_room
(
client
.
room
,
"你的生命已经如风中残烛了!"
)
if
ygopro
.
constants
.
MSG
[
msg
]
==
'RECOVER'
and
client
.
is_host
pos
=
buffer
.
readUInt8
(
1
)
pos
=
1
-
pos
unless
client
.
is_first
val
=
buffer
.
readInt32LE
(
2
)
client
.
room
.
dueling_players
[
pos
].
lp
+=
val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 回复 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if
ygopro
.
constants
.
MSG
[
msg
]
==
'LPUPDATE'
and
client
.
is_host
pos
=
buffer
.
readUInt8
(
1
)
pos
=
1
-
pos
unless
client
.
is_first
val
=
buffer
.
readInt32LE
(
2
)
client
.
room
.
dueling_players
[
pos
].
lp
=
val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 的LP变成 #{client.room.dueling_players[pos].lp}")
if
ygopro
.
constants
.
MSG
[
msg
]
==
'PAY_LPCOST'
and
client
.
is_host
pos
=
buffer
.
readUInt8
(
1
)
pos
=
1
-
pos
unless
client
.
is_first
val
=
buffer
.
readInt32LE
(
2
)
client
.
room
.
dueling_players
[
pos
].
lp
-=
val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 支付 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if
0
<
client
.
room
.
dueling_players
[
pos
].
lp
<=
100
ygopro
.
stoc_send_chat_to_room
(
client
.
room
,
"背水一战!"
)
#登场台词
if
settings
.
modules
.
dialogues
if
ygopro
.
constants
.
MSG
[
msg
]
==
'SUMMONING'
or
ygopro
.
constants
.
MSG
[
msg
]
==
'SPSUMMONING'
card
=
buffer
.
readUInt32LE
(
1
)
if
dialogues
[
card
]
for
line
in
_
.
lines
dialogues
[
card
][
Math
.
floor
(
Math
.
random
()
*
dialogues
[
card
].
length
)]
ygopro
.
stoc_send_chat
client
,
line
###
#房间管理
ygopro.stoc_follow 'HS_PLAYER_ENTER', false, (buffer, info, client, server)->
#console.log "PLAYER_ENTER to #{client.name}: #{info.name}, #{info.pos}"
#room = client.room
#if !room
# console.log "[WARN]player_enter: can't find room by player #{client.player}"
# return
#room.pos_name[info.pos] = info.name
ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
#client.ready = info.status & 0xF != 0
#client.pos = info.status >> 4
#console.log "PLAYER_CHANGE to #{client.name}: #{info.status & 0xF != 0}, #{info.status >> 4}"
###
ygopro
.
stoc_follow
'TYPE_CHANGE'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
selftype
=
info
.
type
&
0xf
;
is_host
=
((
info
.
type
>>
4
)
&
0xf
)
!=
0
;
client
.
is_host
=
is_host
client
.
pos
=
selftype
#console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host
#tip
ygopro
.
stoc_send_random_tip
=
(
client
)
->
ygopro
.
stoc_send_chat
client
,
"Tip: "
+
tips
[
Math
.
floor
(
Math
.
random
()
*
tips
.
length
)]
if
tips
tips
=
null
if
settings
.
modules
.
tips
request
url
:
settings
.
modules
.
tips
json
:
true
,
(
error
,
response
,
body
)
->
tips
=
body
log
.
info
"tips loaded"
,
tips
.
length
ygopro
.
stoc_follow
'DUEL_START'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
unless
client
.
room
.
started
#first start
client
.
room
.
started
=
true
client
.
room
.
duels
=
[]
client
.
room
.
dueling_players
=
[]
for
player
in
client
.
room
.
players
when
player
.
pos
!=
7
client
.
room
.
dueling_players
[
player
.
pos
]
=
player
if
!
player
.
main
log
.
error
'WTF'
,
client
else
player
.
deck
=
mycard
.
load_card_usages_from_cards
(
player
.
main
,
player
.
side
)
if
!
client
.
room
.
dueling_players
[
0
]
or
!
client
.
room
.
dueling_players
[
1
]
log
.
error
'incomplete room'
,
client
.
room
.
dueling_players
,
client
.
room
.
players
if
settings
.
modules
.
tips
ygopro
.
stoc_send_random_tip
(
client
)
ygopro
.
ctos_follow
'CHAT'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
switch
_
.
trim
(
info
.
msg
)
when
'/ping'
execFile
'ss'
,
[
'-it'
,
"dst
#{
client
.
remoteAddress
}
:
#{
client
.
remotePort
}
"
],
(
error
,
stdout
,
stderr
)
->
if
error
ygopro
.
stoc_send_chat_to_room
client
.
room
,
error
else
line
=
_
.
lines
(
stdout
)[
2
]
if
line
.
indexOf
(
'rtt'
)
!=
-
1
ygopro
.
stoc_send_chat_to_room
client
.
room
,
line
else
log
.
warn
'ping'
,
stdout
ygopro
.
stoc_send_chat_to_room
client
.
room
,
stdout
when
'/ranktop'
if
settings
.
modules
.
database
User
.
find
null
,
null
,
{
sort
:
{
points
:
-
1
},
limit
:
8
},
(
err
,
users
)
->
if
err
return
log
.
error
'ranktop'
,
err
for
index
,
user
of
users
ygopro
.
stoc_send_chat
client
,
[
parseInt
(
index
)
+
1
,
user
.
points
,
user
.
name
].
join
(
' '
)
when
'/help'
ygopro
.
stoc_send_chat
(
client
,
"Mycard MatchServer 指令帮助"
)
ygopro
.
stoc_send_chat
(
client
,
"/help 显示这个帮助信息"
)
ygopro
.
stoc_send_chat
(
client
,
"/tip 显示一条提示"
)
if
settings
.
modules
.
tips
ygopro
.
stoc_send_chat
(
client
,
"/senddeck 发送自己的卡组"
)
when
'/tip'
ygopro
.
stoc_send_random_tip
(
client
)
if
settings
.
modules
.
tips
#发送卡组
when
'/senddeck'
if
client
.
deck
?
ygopro
.
stoc_send_chat
(
client
,
"正在读取卡组信息... "
)
mycard
.
deck_url_short
client
.
name
,
client
.
deck
,
(
url
)
->
ygopro
.
stoc_send_chat_to_room
(
client
.
room
,
"卡组链接: "
+
url
)
else
ygopro
.
stoc_send_chat_to_room
(
client
.
room
,
"读取卡组信息失败"
)
when
'/admin showroom'
log
.
info
client
.
room
ygopro
.
ctos_follow
'UPDATE_DECK'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
log
.
info
info
main
=
(
info
.
deckbuf
[
i
]
for
i
in
[
0
...
info
.
mainc
])
side
=
(
info
.
deckbuf
[
i
]
for
i
in
[
info
.
mainc
...
info
.
mainc
+
info
.
sidec
])
client
.
main
=
main
client
.
side
=
side
if
settings
.
modules
.
skip_empty_side
ygopro
.
stoc_follow
'CHANGE_SIDE'
,
false
,
(
buffer
,
info
,
client
,
server
)
->
if
not
_
.
any
(
client
.
deck
,
(
card_usage
)
->
card_usage
.
side
)
ygopro
.
ctos_send
server
,
'UPDATE_DECK'
,
{
mainc
:
client
.
main
.
length
,
sidec
:
0
,
deckbuf
:
client
.
main
}
ygopro
.
stoc_send_chat
client
,
'等待更换副卡组中...'
###
# 开包大战
packs_weighted_cards = {}
for pack, cards of require './packs.json'
packs_weighted_cards[pack] = []
for card in cards
for i in [0..card.count]
packs_weighted_cards[pack].push card.card
console.log packs_weighted_cards
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
ygopro.ctos_send server, 'HS_NOTREADY'
deck = []
for pack in client.player
for i in [0...5]
deck.push packs_weighted_cards[pack][Math.floor(Math.random()*packs_weighted_cards[pack].length)]
ygopro.ctos_send server, 'UPDATE_DECK', {
mainc: deck.length,
sidec: 0,
deckbuf: deck
}
ygopro.ctos_send server, 'HS_READY'
###
#http
if
settings
.
modules
.
http
level_points
=
require
'./level_points.json'
waiting
=
[[]]
for
i
of
level_points
waiting
.
push
[]
log
.
info
'level_points loaded'
,
level_points
http
.
createServer
(
request
,
response
)
->
#http://122.0.65.70:7922/?operation=getroomjson
url
=
url
.
parse
(
request
.
url
)
#log.info url
if
url
.
pathname
==
'/count.json'
response
.
writeHead
(
200
);
response
.
end
(
Room
.
all
.
length
.
toString
())
else
if
url
.
pathname
==
'/match'
if
request
.
headers
[
'authorization'
]
[
name
,
password
]
=
new
Buffer
(
request
.
headers
[
'authorization'
].
split
(
/\s+/
).
pop
()
?
''
,
'base64'
).
toString
().
split
(
':'
)
User
.
findOne
{
name
:
name
},
(
err
,
user
)
->
if
!
user
user
=
new
User
({
name
:
name
,
points
:
0
,
elo
:
1400
})
user
.
save
()
level
=
level_points
.
length
for
index
,
points
of
level_points
if
user
.
points
<
points
level
=
index
break
response
.
allowance
=
0
waiting
[
level
].
push
response
request
.
on
'close'
,
()
->
index
=
waiting
[
level
].
indexOf
(
response
)
waiting
[
level
].
splice
(
index
,
1
)
unless
index
==
-
1
else
#log.info 'unauth match'
#response.writeHead(401);
#response.end("请更新mycard到1.2.8版本");
level
=
1
response
.
allowance
=
0
waiting
[
level
].
push
response
request
.
on
'close'
,
()
->
index
=
waiting
[
level
].
indexOf
(
response
)
waiting
[
level
].
splice
(
index
,
1
)
unless
index
==
-
1
else
if
url
.
pathname
==
'/rooms.json'
response
.
writeHead
(
404
);
response
.
end
();
else
if
url
.
query
==
'operation=getroomjson'
response
.
writeHead
(
200
);
response
.
end
JSON
.
stringify
rooms
:
(
for
room
in
Room
.
all
when
room
.
established
roomid
:
room
.
port
.
toString
(),
roomname
:
room
.
name
.
split
(
'$'
,
2
)[
0
],
needpass
:
(
room
.
name
.
indexOf
(
'$'
)
!=
-
1
).
toString
(),
users
:
(
for
player
in
room
.
players
when
player
.
pos
?
id
:
(
-
1
).
toString
(),
name
:
player
.
name
,
pos
:
player
.
pos
),
istart
:
if
room
.
started
then
"start"
else
"wait"
)
else
response
.
writeHead
(
404
);
response
.
end
();
.
listen
settings
.
modules
.
http
.
port
setInterval
()
->
for
level
in
[
level_points
.
length
..
0
]
for
index
,
player
of
waiting
[
level
]
opponent_level
=
null
opponent
=
_
.
find
waiting
[
level
],
(
opponent
)
->
log
.
info
opponent
,
player
opponent
isnt
player
log
.
info
'--------1--------'
,
waiting
,
opponent
if
opponent
opponent_level
=
level
else
if
player
.
allowance
>
0
for
displacement
in
[
1
..
player
.
allowance
]
if
level
+
displacement
<=
level_points
.
length
opponent
=
waiting
[
level
+
displacement
][
0
]
if
opponent
opponent_level
=
level
+
displacement
break
if
level
-
displacement
>=
0
opponent
=
waiting
[
level
-
displacement
][
0
]
if
opponent
opponent_level
=
level
-
displacement
break
if
opponent
if
waiting
[
level
].
indexOf
(
player
)
==
-
1
or
waiting
[
opponent_level
].
indexOf
(
opponent
)
==
-
1
log
.
info
waiting
,
player
,
level
,
opponent
,
opponent_level
throw
'WTF'
waiting
[
level
].
splice
(
waiting
[
level
].
indexOf
(
player
),
1
)
waiting
[
opponent_level
].
splice
(
waiting
[
opponent_level
].
indexOf
(
opponent
),
1
)
index
--
room
=
"mycard://
#{
settings
.
ip
}
:
#{
settings
.
port
}
/M#
#{
_
.
uniqueId
()
}
$
#{
_
.
random
(
999
)
}
"
log
.
info
'matched'
,
room
headers
=
{
"Access-Control-Allow-Origin"
:
"*"
,
"Content-Type"
:
"text/plain"
}
player
.
writeHead
(
200
,
headers
)
player
.
end
room
opponent
.
writeHead
(
200
,
headers
)
opponent
.
end
room
else
player
.
allowance
++
,
2000
#清理90s没活动的房间
inotify
=
new
Inotify
()
inotify
.
addWatch
path
:
'ygocore/replay'
,
watch_for
:
Inotify
.
IN_CLOSE_WRITE
|
Inotify
.
IN_CREATE
|
Inotify
.
IN_MODIFY
,
callback
:
(
event
)
->
mask
=
event
.
mask
if
event
.
name
port
=
parseInt
path
.
basename
(
event
.
name
,
'.yrp'
)
room
=
Room
.
find_by_port
port
if
room
if
mask
&
Inotify
.
IN_CREATE
else
if
mask
&
Inotify
.
IN_CLOSE_WRITE
fs
.
unlink
path
.
join
(
'ygocore/replay'
),
(
err
)
->
else
if
mask
&
Inotify
.
IN_MODIFY
room
.
alive
=
true
else
log
.
error
"event without filename"
setInterval
()
->
for
room
in
Room
.
all
if
room
.
alive
room
.
alive
=
false
else
log
.
info
"kill room"
,
room
.
port
for
player
in
room
.
players
ygopro
.
stoc_send_chat
(
player
,
"由于长时间没有活动被关闭"
)
unless
player
.
closed
room
.
process
.
kill
()
,
900000
\ No newline at end of file
ygopro-server.js
View file @
9c4b7ccc
...
...
@@ -464,13 +464,15 @@
tips
=
null
;
request
({
url
:
settings
.
modules
.
tips
,
json
:
true
},
function
(
error
,
response
,
body
)
{
tips
=
body
;
return
log
.
info
(
"
tips loaded
"
,
tips
.
length
);
});
if
(
settings
.
modules
.
tips
)
{
request
({
url
:
settings
.
modules
.
tips
,
json
:
true
},
function
(
error
,
response
,
body
)
{
tips
=
body
;
return
log
.
info
(
"
tips loaded
"
,
tips
.
length
);
});
}
ygopro
.
stoc_follow
(
'
DUEL_START
'
,
false
,
function
(
buffer
,
info
,
client
,
server
)
{
var
player
,
_i
,
_len
,
_ref
;
...
...
ygopro-server.map
View file @
9c4b7ccc
...
...
@@ -6,5 +6,5 @@
"ygopro-server.coffee"
],
"names": [],
"mappings": "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
mBA"
"mappings": "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
mBA"
}
\ No newline at end of file
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