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
a180954a
Commit
a180954a
authored
Nov 14, 2022
by
nanahira
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
finish rep chat feature
parent
c9102370
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
110 additions
and
86 deletions
+110
-86
ygopro-server.coffee
ygopro-server.coffee
+38
-27
ygopro-server.js
ygopro-server.js
+44
-28
ygopro.coffee
ygopro.coffee
+12
-5
ygopro.js
ygopro.js
+16
-26
No files found.
ygopro-server.coffee
View file @
a180954a
...
@@ -991,7 +991,7 @@ CLIENT_is_able_to_reconnect = global.CLIENT_is_able_to_reconnect = (client, deck
...
@@ -991,7 +991,7 @@ CLIENT_is_able_to_reconnect = global.CLIENT_is_able_to_reconnect = (client, deck
CLIENT_get_kick_reconnect_target
=
global
.
CLIENT_get_kick_reconnect_target
=
(
client
,
deckbuf
)
->
CLIENT_get_kick_reconnect_target
=
global
.
CLIENT_get_kick_reconnect_target
=
(
client
,
deckbuf
)
->
for
room
in
ROOM_all
when
room
and
room
.
duel_stage
!=
ygopro
.
constants
.
DUEL_STAGE
.
BEGIN
and
!
room
.
windbot
for
room
in
ROOM_all
when
room
and
room
.
duel_stage
!=
ygopro
.
constants
.
DUEL_STAGE
.
BEGIN
and
!
room
.
windbot
for
player
in
room
.
get_playing_player
()
when
!
player
.
c
losed
and
player
.
name
==
client
.
name
and
(
settings
.
modules
.
challonge
.
enabled
or
player
.
pass
==
client
.
pass
)
and
(
settings
.
modules
.
mycard
.
enabled
or
settings
.
modules
.
tournament_mode
.
enabled
or
player
.
ip
==
client
.
ip
or
(
client
.
vpass
and
client
.
vpass
==
player
.
vpass
))
and
(
!
deckbuf
or
deckbuf
.
compare
(
player
.
start_deckbuf
)
==
0
)
for
player
in
room
.
get_playing_player
()
when
!
player
.
isC
losed
and
player
.
name
==
client
.
name
and
(
settings
.
modules
.
challonge
.
enabled
or
player
.
pass
==
client
.
pass
)
and
(
settings
.
modules
.
mycard
.
enabled
or
settings
.
modules
.
tournament_mode
.
enabled
or
player
.
ip
==
client
.
ip
or
(
client
.
vpass
and
client
.
vpass
==
player
.
vpass
))
and
(
!
deckbuf
or
deckbuf
.
compare
(
player
.
start_deckbuf
)
==
0
)
return
player
return
player
return
null
return
null
...
@@ -1124,7 +1124,7 @@ CLIENT_heartbeat_unregister = global.CLIENT_heartbeat_unregister = (client) ->
...
@@ -1124,7 +1124,7 @@ CLIENT_heartbeat_unregister = global.CLIENT_heartbeat_unregister = (client) ->
return
true
return
true
CLIENT_heartbeat_register
=
global
.
CLIENT_heartbeat_register
=
(
client
,
send
)
->
CLIENT_heartbeat_register
=
global
.
CLIENT_heartbeat_register
=
(
client
,
send
)
->
if
!
settings
.
modules
.
heartbeat_detection
.
enabled
or
client
.
c
losed
or
client
.
is_post_watcher
or
client
.
pre_reconnecting
or
client
.
reconnecting
or
client
.
waiting_for_last
or
client
.
pos
>
3
or
client
.
heartbeat_protected
if
!
settings
.
modules
.
heartbeat_detection
.
enabled
or
client
.
isC
losed
or
client
.
is_post_watcher
or
client
.
pre_reconnecting
or
client
.
reconnecting
or
client
.
waiting_for_last
or
client
.
pos
>
3
or
client
.
heartbeat_protected
return
false
return
false
if
client
.
heartbeat_timeout
if
client
.
heartbeat_timeout
CLIENT_heartbeat_unregister
(
client
)
CLIENT_heartbeat_unregister
(
client
)
...
@@ -1140,7 +1140,7 @@ CLIENT_heartbeat_register = global.CLIENT_heartbeat_register = (client, send) ->
...
@@ -1140,7 +1140,7 @@ CLIENT_heartbeat_register = global.CLIENT_heartbeat_register = (client, send) ->
})
})
client
.
heartbeat_timeout
=
setTimeout
(()
->
client
.
heartbeat_timeout
=
setTimeout
(()
->
CLIENT_heartbeat_unregister
(
client
)
CLIENT_heartbeat_unregister
(
client
)
client
.
destroy
()
unless
client
.
c
losed
or
client
.
heartbeat_responsed
client
.
destroy
()
unless
client
.
isC
losed
or
client
.
heartbeat_responsed
return
return
,
settings
.
modules
.
heartbeat_detection
.
wait_time
)
,
settings
.
modules
.
heartbeat_detection
.
wait_time
)
#log.info(1, client.name)
#log.info(1, client.name)
...
@@ -1150,7 +1150,7 @@ CLIENT_is_banned_by_mc = global.CLIENT_is_banned_by_mc = (client) ->
...
@@ -1150,7 +1150,7 @@ CLIENT_is_banned_by_mc = global.CLIENT_is_banned_by_mc = (client) ->
return
client
.
ban_mc
and
client
.
ban_mc
.
banned
and
moment_now
.
isBefore
(
client
.
ban_mc
.
until
)
return
client
.
ban_mc
and
client
.
ban_mc
.
banned
and
moment_now
.
isBefore
(
client
.
ban_mc
.
until
)
CLIENT_send_replays
=
global
.
CLIENT_send_replays
=
(
client
,
room
)
->
CLIENT_send_replays
=
global
.
CLIENT_send_replays
=
(
client
,
room
)
->
return
false
unless
settings
.
modules
.
replay_delay
and
not
(
settings
.
modules
.
tournament_mode
.
enabled
and
settings
.
modules
.
tournament_mode
.
block_replay_to_player
)
and
room
.
replays
.
length
and
room
.
hostinfo
.
mode
==
1
and
!
client
.
replays_sent
and
!
client
.
c
losed
return
false
unless
settings
.
modules
.
replay_delay
and
not
(
settings
.
modules
.
tournament_mode
.
enabled
and
settings
.
modules
.
tournament_mode
.
block_replay_to_player
)
and
room
.
replays
.
length
and
room
.
hostinfo
.
mode
==
1
and
!
client
.
replays_sent
and
!
client
.
isC
losed
client
.
replays_sent
=
true
client
.
replays_sent
=
true
i
=
0
i
=
0
for
buffer
in
room
.
replays
for
buffer
in
room
.
replays
...
@@ -1161,7 +1161,7 @@ CLIENT_send_replays = global.CLIENT_send_replays = (client, room) ->
...
@@ -1161,7 +1161,7 @@ CLIENT_send_replays = global.CLIENT_send_replays = (client, room) ->
return
true
return
true
SOCKET_flush_data
=
global
.
SOCKET_flush_data
=
(
sk
,
datas
)
->
SOCKET_flush_data
=
global
.
SOCKET_flush_data
=
(
sk
,
datas
)
->
if
!
sk
or
sk
.
c
losed
if
!
sk
or
sk
.
isC
losed
return
false
return
false
while
datas
.
length
while
datas
.
length
buffer
=
datas
.
shift
()
buffer
=
datas
.
shift
()
...
@@ -1512,7 +1512,7 @@ class Room
...
@@ -1512,7 +1512,7 @@ class Room
if
!
settings
.
modules
.
reconnect
.
enabled
if
!
settings
.
modules
.
reconnect
.
enabled
return
0
return
0
found
=
0
found
=
0
for
player
in
@
get_playing_player
()
when
player
.
c
losed
for
player
in
@
get_playing_player
()
when
player
.
isC
losed
found
++
found
++
return
found
return
found
...
@@ -1772,11 +1772,22 @@ class Room
...
@@ -1772,11 +1772,22 @@ class Room
else
else
@
last_active_time
=
moment_now_string
@
last_active_time
=
moment_now_string
addRecorderBuffer
:
(
buffer
,
isChat
)
->
addRecorderBuffer
:
(
buffer
)
->
if
settings
.
modules
.
cloud_replay
.
enabled
and
(
!
isChat
or
@
arena
or
settings
.
modules
.
tournament_mode
.
enabled
)
if
settings
.
modules
.
cloud_replay
.
enabled
@
recorder_buffers
.
push
buffer
@
recorder_buffers
.
push
buffer
return
return
recordChatMessage
:
(
msg
,
player
)
->
unless
settings
.
modules
.
cloud_replay
.
enabled
and
(
@
arena
or
settings
.
modules
.
tournament_mode
.
enabled
)
return
for
line
in
ygopro
.
split_chat_lines
(
msg
,
player
,
settings
.
modules
.
i18n
.
default
)
chat_buf
=
ygopro
.
helper
.
prepareMessage
(
"STOC_CHAT"
,
{
player
:
player
msg
:
line
})
@
addRecorderBuffer
(
chat_buf
)
return
# 网络连接
# 网络连接
netRequestHandler
=
(
client
)
->
netRequestHandler
=
(
client
)
->
if
!
client
.
isWs
if
!
client
.
isWs
...
@@ -1803,16 +1814,16 @@ netRequestHandler = (client) ->
...
@@ -1803,16 +1814,16 @@ netRequestHandler = (client) ->
# 释放处理
# 释放处理
closeHandler
=
(
error
)
->
closeHandler
=
(
error
)
->
log
.
info
"client closed"
,
client
.
name
,
error
,
client
.
c
losed
#log.info "client closed", client.name, error, client.isC
losed
log
.
info
"disconnect"
,
client
.
ip
,
ROOM_connected_ip
[
client
.
ip
]
#
log.info "disconnect", client.ip, ROOM_connected_ip[client.ip]
if
client
.
c
losed
if
client
.
isC
losed
return
return
room
=
ROOM_all
[
client
.
rid
]
room
=
ROOM_all
[
client
.
rid
]
connect_count
=
ROOM_connected_ip
[
client
.
ip
]
connect_count
=
ROOM_connected_ip
[
client
.
ip
]
if
connect_count
>
0
if
connect_count
>
0
connect_count
--
connect_count
--
ROOM_connected_ip
[
client
.
ip
]
=
connect_count
ROOM_connected_ip
[
client
.
ip
]
=
connect_count
client
.
c
losed
=
true
client
.
isC
losed
=
true
if
settings
.
modules
.
heartbeat_detection
.
enabled
if
settings
.
modules
.
heartbeat_detection
.
enabled
CLIENT_heartbeat_unregister
(
client
)
CLIENT_heartbeat_unregister
(
client
)
if
room
if
room
...
@@ -1836,14 +1847,14 @@ netRequestHandler = (client) ->
...
@@ -1836,14 +1847,14 @@ netRequestHandler = (client) ->
server
.
on
'close'
,
(
had_error
)
->
server
.
on
'close'
,
(
had_error
)
->
server
.
closed
=
true
unless
server
.
c
losed
server
.
isClosed
=
true
unless
server
.
isC
losed
if
!
server
.
client
if
!
server
.
client
return
return
#log.info "server
c
losed", server.client.name, had_error
#log.info "server
isC
losed", server.client.name, had_error
room
=
ROOM_all
[
server
.
client
.
rid
]
room
=
ROOM_all
[
server
.
client
.
rid
]
#log.info "server close", server.client.ip, ROOM_connected_ip[server.client.ip]
#log.info "server close", server.client.ip, ROOM_connected_ip[server.client.ip]
room
.
disconnector
=
'server'
if
room
and
!
server
.
system_kicked
and
!
server
.
had_new_reconnection
room
.
disconnector
=
'server'
if
room
and
!
server
.
system_kicked
and
!
server
.
had_new_reconnection
unless
server
.
client
.
c
losed
unless
server
.
client
.
isC
losed
ygopro
.
stoc_send_chat
(
server
.
client
,
"${server_closed}"
,
ygopro
.
constants
.
COLORS
.
RED
)
ygopro
.
stoc_send_chat
(
server
.
client
,
"${server_closed}"
,
ygopro
.
constants
.
COLORS
.
RED
)
#if room and settings.modules.replay_delay
#if room and settings.modules.replay_delay
# room.send_replays()
# room.send_replays()
...
@@ -1852,14 +1863,14 @@ netRequestHandler = (client) ->
...
@@ -1852,14 +1863,14 @@ netRequestHandler = (client) ->
return
return
server
.
on
'error'
,
(
error
)
->
server
.
on
'error'
,
(
error
)
->
server
.
c
losed
=
error
server
.
isC
losed
=
error
if
!
server
.
client
if
!
server
.
client
return
return
#log.info "server error", client.name, error
#log.info "server error", client.name, error
room
=
ROOM_all
[
server
.
client
.
rid
]
room
=
ROOM_all
[
server
.
client
.
rid
]
#log.info "server err close", client.ip, ROOM_connected_ip[client.ip]
#log.info "server err close", client.ip, ROOM_connected_ip[client.ip]
room
.
disconnector
=
'server'
if
room
and
!
server
.
system_kicked
and
!
server
.
had_new_reconnection
room
.
disconnector
=
'server'
if
room
and
!
server
.
system_kicked
and
!
server
.
had_new_reconnection
unless
server
.
client
.
c
losed
unless
server
.
client
.
isC
losed
ygopro
.
stoc_send_chat
(
server
.
client
,
"${server_error}:
#{
error
}
"
,
ygopro
.
constants
.
COLORS
.
RED
)
ygopro
.
stoc_send_chat
(
server
.
client
,
"${server_error}:
#{
error
}
"
,
ygopro
.
constants
.
COLORS
.
RED
)
#if room and settings.modules.replay_delay
#if room and settings.modules.replay_delay
# room.send_replays()
# room.send_replays()
...
@@ -1931,7 +1942,7 @@ netRequestHandler = (client) ->
...
@@ -1931,7 +1942,7 @@ netRequestHandler = (client) ->
ROOM_bad_ip
[
client
.
ip
]
=
1
ROOM_bad_ip
[
client
.
ip
]
=
1
CLIENT_kick
(
client
)
CLIENT_kick
(
client
)
return
return
if
client
.
c
losed
||
!
client
.
server
if
client
.
isC
losed
||
!
client
.
server
return
return
if
client
.
established
if
client
.
established
await
ygopro
.
helper
.
send
(
client
.
server
,
buffer
)
for
buffer
in
handle_data
.
datas
await
ygopro
.
helper
.
send
(
client
.
server
,
buffer
)
for
buffer
in
handle_data
.
datas
...
@@ -1956,7 +1967,7 @@ netRequestHandler = (client) ->
...
@@ -1956,7 +1967,7 @@ netRequestHandler = (client) ->
if
handle_data
.
feedback
.
type
==
"OVERSIZE"
if
handle_data
.
feedback
.
type
==
"OVERSIZE"
server
.
destroy
()
server
.
destroy
()
return
return
if
server
.
client
and
!
server
.
client
.
c
losed
if
server
.
client
and
!
server
.
client
.
isC
losed
await
ygopro
.
helper
.
send
(
server
.
client
,
buffer
)
for
buffer
in
handle_data
.
datas
await
ygopro
.
helper
.
send
(
server
.
client
,
buffer
)
for
buffer
in
handle_data
.
datas
return
return
...
@@ -2122,7 +2133,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
...
@@ -2122,7 +2133,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
(
checksum
&
0xFF
)
==
0
(
checksum
&
0xFF
)
==
0
create_room_with_action
=
(
buffer
,
decrypted_buffer
)
->
create_room_with_action
=
(
buffer
,
decrypted_buffer
)
->
if
client
.
c
losed
if
client
.
isC
losed
return
return
firstByte
=
buffer
.
readUInt8
(
1
)
firstByte
=
buffer
.
readUInt8
(
1
)
action
=
firstByte
>>
4
action
=
firstByte
>>
4
...
@@ -2201,7 +2212,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
...
@@ -2201,7 +2212,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
match_permit
=
matchPermitRes
.
data
match_permit
=
matchPermitRes
.
data
catch
e
catch
e
log
.
warn
"match permit fail
#{
e
.
toString
()
}
"
log
.
warn
"match permit fail
#{
e
.
toString
()
}
"
if
client
.
c
losed
if
client
.
isC
losed
return
return
if
match_permit
and
match_permit
.
permit
==
false
if
match_permit
and
match_permit
.
permit
==
false
ygopro
.
stoc_die
(
client
,
'${invalid_password_unauthorized}'
)
ygopro
.
stoc_die
(
client
,
'${invalid_password_unauthorized}'
)
...
@@ -2258,10 +2269,10 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
...
@@ -2258,10 +2269,10 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
#console.log userData
#console.log userData
catch
e
catch
e
log
.
warn
(
"READ USER FAIL"
,
client
.
name
,
e
.
toString
())
log
.
warn
(
"READ USER FAIL"
,
client
.
name
,
e
.
toString
())
if
!
client
.
c
losed
if
!
client
.
isC
losed
ygopro
.
stoc_die
(
client
,
'${load_user_info_fail}'
)
ygopro
.
stoc_die
(
client
,
'${load_user_info_fail}'
)
return
return
if
client
.
c
losed
if
client
.
isC
losed
return
return
users_cache
[
client
.
name
]
=
userData
.
user
.
id
users_cache
[
client
.
name
]
=
userData
.
user
.
id
secret
=
userData
.
user
.
id
%
65535
+
1
secret
=
userData
.
user
.
id
%
65535
+
1
...
@@ -2292,18 +2303,18 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
...
@@ -2292,18 +2303,18 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
recover_match
=
info
.
pass
.
match
(
/^(RC|RECOVER)(\d*)T(\d*)$/
)
recover_match
=
info
.
pass
.
match
(
/^(RC|RECOVER)(\d*)T(\d*)$/
)
tournament_data
=
await
challonge
.
getTournament
(
!!
recover_match
)
tournament_data
=
await
challonge
.
getTournament
(
!!
recover_match
)
if
!
tournament_data
if
!
tournament_data
if
!
client
.
c
losed
if
!
client
.
isC
losed
ygopro
.
stoc_die
(
client
,
'${challonge_match_load_failed}'
)
ygopro
.
stoc_die
(
client
,
'${challonge_match_load_failed}'
)
return
return
matching_participant
=
tournament_data
.
participants
.
find
((
p
)
=>
p
.
participant
.
name
and
deck_name_match
(
p
.
participant
.
name
,
client
.
name
))
matching_participant
=
tournament_data
.
participants
.
find
((
p
)
=>
p
.
participant
.
name
and
deck_name_match
(
p
.
participant
.
name
,
client
.
name
))
unless
matching_participant
unless
matching_participant
if
!
client
.
c
losed
if
!
client
.
isC
losed
ygopro
.
stoc_die
(
client
,
'${challonge_user_not_found}'
)
ygopro
.
stoc_die
(
client
,
'${challonge_user_not_found}'
)
return
return
client
.
challonge_info
=
matching_participant
.
participant
client
.
challonge_info
=
matching_participant
.
participant
matching_match
=
tournament_data
.
matches
.
find
((
match
)
=>
match
.
match
and
!
match
.
match
.
winner_id
and
match
.
match
.
state
!=
"complete"
and
match
.
match
.
player1_id
and
match
.
match
.
player2_id
and
(
match
.
match
.
player1_id
==
client
.
challonge_info
.
id
or
match
.
match
.
player2_id
==
client
.
challonge_info
.
id
))
matching_match
=
tournament_data
.
matches
.
find
((
match
)
=>
match
.
match
and
!
match
.
match
.
winner_id
and
match
.
match
.
state
!=
"complete"
and
match
.
match
.
player1_id
and
match
.
match
.
player2_id
and
(
match
.
match
.
player1_id
==
client
.
challonge_info
.
id
or
match
.
match
.
player2_id
==
client
.
challonge_info
.
id
))
unless
matching_match
unless
matching_match
if
!
client
.
c
losed
if
!
client
.
isC
losed
ygopro
.
stoc_die
(
client
,
'${challonge_match_not_found}'
)
ygopro
.
stoc_die
(
client
,
'${challonge_match_not_found}'
)
return
return
create_room_name
=
matching_match
.
match
.
id
.
toString
()
create_room_name
=
matching_match
.
match
.
id
.
toString
()
...
@@ -3358,7 +3369,7 @@ ygopro.stoc_follow 'TIME_LIMIT', true, (buffer, info, client, server, datas)->
...
@@ -3358,7 +3369,7 @@ ygopro.stoc_follow 'TIME_LIMIT', true, (buffer, info, client, server, datas)->
ygopro
.
ctos_send
(
server
,
'TIME_CONFIRM'
)
ygopro
.
ctos_send
(
server
,
'TIME_CONFIRM'
)
return
true
return
true
if
settings
.
modules
.
reconnect
.
enabled
if
settings
.
modules
.
reconnect
.
enabled
if
client
.
c
losed
if
client
.
isC
losed
ygopro
.
ctos_send
(
server
,
'TIME_CONFIRM'
)
ygopro
.
ctos_send
(
server
,
'TIME_CONFIRM'
)
return
true
return
true
else
else
...
...
ygopro-server.js
View file @
a180954a
...
@@ -1321,7 +1321,7 @@
...
@@ -1321,7 +1321,7 @@
ref
=
room
.
get_playing_player
();
ref
=
room
.
get_playing_player
();
for
(
l
=
0
,
len1
=
ref
.
length
;
l
<
len1
;
l
++
)
{
for
(
l
=
0
,
len1
=
ref
.
length
;
l
<
len1
;
l
++
)
{
player
=
ref
[
l
];
player
=
ref
[
l
];
if
(
!
player
.
c
losed
&&
player
.
name
===
client
.
name
&&
(
settings
.
modules
.
challonge
.
enabled
||
player
.
pass
===
client
.
pass
)
&&
(
settings
.
modules
.
mycard
.
enabled
||
settings
.
modules
.
tournament_mode
.
enabled
||
player
.
ip
===
client
.
ip
||
(
client
.
vpass
&&
client
.
vpass
===
player
.
vpass
))
&&
(
!
deckbuf
||
deckbuf
.
compare
(
player
.
start_deckbuf
)
===
0
))
{
if
(
!
player
.
isC
losed
&&
player
.
name
===
client
.
name
&&
(
settings
.
modules
.
challonge
.
enabled
||
player
.
pass
===
client
.
pass
)
&&
(
settings
.
modules
.
mycard
.
enabled
||
settings
.
modules
.
tournament_mode
.
enabled
||
player
.
ip
===
client
.
ip
||
(
client
.
vpass
&&
client
.
vpass
===
player
.
vpass
))
&&
(
!
deckbuf
||
deckbuf
.
compare
(
player
.
start_deckbuf
)
===
0
))
{
return
player
;
return
player
;
}
}
}
}
...
@@ -1481,7 +1481,7 @@
...
@@ -1481,7 +1481,7 @@
};
};
CLIENT_heartbeat_register
=
global
.
CLIENT_heartbeat_register
=
function
(
client
,
send
)
{
CLIENT_heartbeat_register
=
global
.
CLIENT_heartbeat_register
=
function
(
client
,
send
)
{
if
(
!
settings
.
modules
.
heartbeat_detection
.
enabled
||
client
.
c
losed
||
client
.
is_post_watcher
||
client
.
pre_reconnecting
||
client
.
reconnecting
||
client
.
waiting_for_last
||
client
.
pos
>
3
||
client
.
heartbeat_protected
)
{
if
(
!
settings
.
modules
.
heartbeat_detection
.
enabled
||
client
.
isC
losed
||
client
.
is_post_watcher
||
client
.
pre_reconnecting
||
client
.
reconnecting
||
client
.
waiting_for_last
||
client
.
pos
>
3
||
client
.
heartbeat_protected
)
{
return
false
;
return
false
;
}
}
if
(
client
.
heartbeat_timeout
)
{
if
(
client
.
heartbeat_timeout
)
{
...
@@ -1500,7 +1500,7 @@
...
@@ -1500,7 +1500,7 @@
}
}
client
.
heartbeat_timeout
=
setTimeout
(
function
()
{
client
.
heartbeat_timeout
=
setTimeout
(
function
()
{
CLIENT_heartbeat_unregister
(
client
);
CLIENT_heartbeat_unregister
(
client
);
if
(
!
(
client
.
c
losed
||
client
.
heartbeat_responsed
))
{
if
(
!
(
client
.
isC
losed
||
client
.
heartbeat_responsed
))
{
client
.
destroy
();
client
.
destroy
();
}
}
},
settings
.
modules
.
heartbeat_detection
.
wait_time
);
},
settings
.
modules
.
heartbeat_detection
.
wait_time
);
...
@@ -1514,7 +1514,7 @@
...
@@ -1514,7 +1514,7 @@
CLIENT_send_replays
=
global
.
CLIENT_send_replays
=
function
(
client
,
room
)
{
CLIENT_send_replays
=
global
.
CLIENT_send_replays
=
function
(
client
,
room
)
{
var
buffer
,
i
,
j
,
len
,
ref
;
var
buffer
,
i
,
j
,
len
,
ref
;
if
(
!
(
settings
.
modules
.
replay_delay
&&
!
(
settings
.
modules
.
tournament_mode
.
enabled
&&
settings
.
modules
.
tournament_mode
.
block_replay_to_player
)
&&
room
.
replays
.
length
&&
room
.
hostinfo
.
mode
===
1
&&
!
client
.
replays_sent
&&
!
client
.
c
losed
))
{
if
(
!
(
settings
.
modules
.
replay_delay
&&
!
(
settings
.
modules
.
tournament_mode
.
enabled
&&
settings
.
modules
.
tournament_mode
.
block_replay_to_player
)
&&
room
.
replays
.
length
&&
room
.
hostinfo
.
mode
===
1
&&
!
client
.
replays_sent
&&
!
client
.
isC
losed
))
{
return
false
;
return
false
;
}
}
client
.
replays_sent
=
true
;
client
.
replays_sent
=
true
;
...
@@ -1533,7 +1533,7 @@
...
@@ -1533,7 +1533,7 @@
SOCKET_flush_data
=
global
.
SOCKET_flush_data
=
async
function
(
sk
,
datas
)
{
SOCKET_flush_data
=
global
.
SOCKET_flush_data
=
async
function
(
sk
,
datas
)
{
var
buffer
;
var
buffer
;
if
(
!
sk
||
sk
.
c
losed
)
{
if
(
!
sk
||
sk
.
isC
losed
)
{
return
false
;
return
false
;
}
}
while
(
datas
.
length
)
{
while
(
datas
.
length
)
{
...
@@ -2002,7 +2002,7 @@
...
@@ -2002,7 +2002,7 @@
ref
=
this
.
get_playing_player
();
ref
=
this
.
get_playing_player
();
for
(
j
=
0
,
len
=
ref
.
length
;
j
<
len
;
j
++
)
{
for
(
j
=
0
,
len
=
ref
.
length
;
j
<
len
;
j
++
)
{
player
=
ref
[
j
];
player
=
ref
[
j
];
if
(
player
.
c
losed
)
{
if
(
player
.
isC
losed
)
{
found
++
;
found
++
;
}
}
}
}
...
@@ -2397,12 +2397,28 @@
...
@@ -2397,12 +2397,28 @@
}
}
}
}
addRecorderBuffer
(
buffer
,
isChat
)
{
addRecorderBuffer
(
buffer
)
{
if
(
settings
.
modules
.
cloud_replay
.
enabled
&&
(
!
isChat
||
this
.
arena
||
settings
.
modules
.
tournament_mode
.
enabled
)
)
{
if
(
settings
.
modules
.
cloud_replay
.
enabled
)
{
this
.
recorder_buffers
.
push
(
buffer
);
this
.
recorder_buffers
.
push
(
buffer
);
}
}
}
}
recordChatMessage
(
msg
,
player
)
{
var
chat_buf
,
j
,
len
,
line
,
ref
;
if
(
!
(
settings
.
modules
.
cloud_replay
.
enabled
&&
(
this
.
arena
||
settings
.
modules
.
tournament_mode
.
enabled
)))
{
return
;
}
ref
=
ygopro
.
split_chat_lines
(
msg
,
player
,
settings
.
modules
.
i18n
.
default
);
for
(
j
=
0
,
len
=
ref
.
length
;
j
<
len
;
j
++
)
{
line
=
ref
[
j
];
chat_buf
=
ygopro
.
helper
.
prepareMessage
(
"
STOC_CHAT
"
,
{
player
:
player
,
msg
:
line
});
this
.
addRecorderBuffer
(
chat_buf
);
}
}
};
};
// 网络连接
// 网络连接
...
@@ -2432,9 +2448,9 @@
...
@@ -2432,9 +2448,9 @@
// 释放处理
// 释放处理
closeHandler
=
function
(
error
)
{
closeHandler
=
function
(
error
)
{
var
room
;
var
room
;
log
.
info
(
"
client closed
"
,
client
.
name
,
error
,
client
.
closed
);
//log.info "client closed", client.name, error, client.isClosed
log
.
info
(
"
disconnect
"
,
client
.
ip
,
ROOM_connected_ip
[
client
.
ip
]);
//log.info "disconnect", client.ip, ROOM_connected_ip[client.ip]
if
(
client
.
c
losed
)
{
if
(
client
.
isC
losed
)
{
return
;
return
;
}
}
room
=
ROOM_all
[
client
.
rid
];
room
=
ROOM_all
[
client
.
rid
];
...
@@ -2443,7 +2459,7 @@
...
@@ -2443,7 +2459,7 @@
connect_count
--
;
connect_count
--
;
}
}
ROOM_connected_ip
[
client
.
ip
]
=
connect_count
;
ROOM_connected_ip
[
client
.
ip
]
=
connect_count
;
client
.
c
losed
=
true
;
client
.
isC
losed
=
true
;
if
(
settings
.
modules
.
heartbeat_detection
.
enabled
)
{
if
(
settings
.
modules
.
heartbeat_detection
.
enabled
)
{
CLIENT_heartbeat_unregister
(
client
);
CLIENT_heartbeat_unregister
(
client
);
}
}
...
@@ -2474,19 +2490,19 @@
...
@@ -2474,19 +2490,19 @@
client
.
on
(
'
error
'
,
closeHandler
);
client
.
on
(
'
error
'
,
closeHandler
);
server
.
on
(
'
close
'
,
function
(
had_error
)
{
server
.
on
(
'
close
'
,
function
(
had_error
)
{
var
room
;
var
room
;
if
(
!
server
.
c
losed
)
{
if
(
!
server
.
isC
losed
)
{
server
.
c
losed
=
true
;
server
.
isC
losed
=
true
;
}
}
if
(
!
server
.
client
)
{
if
(
!
server
.
client
)
{
return
;
return
;
}
}
//log.info "server
c
losed", server.client.name, had_error
//log.info "server
isC
losed", server.client.name, had_error
room
=
ROOM_all
[
server
.
client
.
rid
];
room
=
ROOM_all
[
server
.
client
.
rid
];
if
(
room
&&
!
server
.
system_kicked
&&
!
server
.
had_new_reconnection
)
{
if
(
room
&&
!
server
.
system_kicked
&&
!
server
.
had_new_reconnection
)
{
//log.info "server close", server.client.ip, ROOM_connected_ip[server.client.ip]
//log.info "server close", server.client.ip, ROOM_connected_ip[server.client.ip]
room
.
disconnector
=
'
server
'
;
room
.
disconnector
=
'
server
'
;
}
}
if
(
!
server
.
client
.
c
losed
)
{
if
(
!
server
.
client
.
isC
losed
)
{
ygopro
.
stoc_send_chat
(
server
.
client
,
"
${server_closed}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
ygopro
.
stoc_send_chat
(
server
.
client
,
"
${server_closed}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
//if room and settings.modules.replay_delay
//if room and settings.modules.replay_delay
// room.send_replays()
// room.send_replays()
...
@@ -2496,7 +2512,7 @@
...
@@ -2496,7 +2512,7 @@
});
});
server
.
on
(
'
error
'
,
function
(
error
)
{
server
.
on
(
'
error
'
,
function
(
error
)
{
var
room
;
var
room
;
server
.
c
losed
=
error
;
server
.
isC
losed
=
error
;
if
(
!
server
.
client
)
{
if
(
!
server
.
client
)
{
return
;
return
;
}
}
...
@@ -2506,7 +2522,7 @@
...
@@ -2506,7 +2522,7 @@
//log.info "server err close", client.ip, ROOM_connected_ip[client.ip]
//log.info "server err close", client.ip, ROOM_connected_ip[client.ip]
room
.
disconnector
=
'
server
'
;
room
.
disconnector
=
'
server
'
;
}
}
if
(
!
server
.
client
.
c
losed
)
{
if
(
!
server
.
client
.
isC
losed
)
{
ygopro
.
stoc_send_chat
(
server
.
client
,
`\${server_error}:
${
error
}
`
,
ygopro
.
constants
.
COLORS
.
RED
);
ygopro
.
stoc_send_chat
(
server
.
client
,
`\${server_error}:
${
error
}
`
,
ygopro
.
constants
.
COLORS
.
RED
);
//if room and settings.modules.replay_delay
//if room and settings.modules.replay_delay
// room.send_replays()
// room.send_replays()
...
@@ -2594,7 +2610,7 @@
...
@@ -2594,7 +2610,7 @@
return
;
return
;
}
}
}
}
if
(
client
.
c
losed
||
!
client
.
server
)
{
if
(
client
.
isC
losed
||
!
client
.
server
)
{
return
;
return
;
}
}
if
(
client
.
established
)
{
if
(
client
.
established
)
{
...
@@ -2627,7 +2643,7 @@
...
@@ -2627,7 +2643,7 @@
return
;
return
;
}
}
}
}
if
(
server
.
client
&&
!
server
.
client
.
c
losed
)
{
if
(
server
.
client
&&
!
server
.
client
.
isC
losed
)
{
ref
=
handle_data
.
datas
;
ref
=
handle_data
.
datas
;
for
(
j
=
0
,
len
=
ref
.
length
;
j
<
len
;
j
++
)
{
for
(
j
=
0
,
len
=
ref
.
length
;
j
<
len
;
j
++
)
{
buffer
=
ref
[
j
];
buffer
=
ref
[
j
];
...
@@ -2809,7 +2825,7 @@
...
@@ -2809,7 +2825,7 @@
};
};
create_room_with_action
=
async
function
(
buffer
,
decrypted_buffer
)
{
create_room_with_action
=
async
function
(
buffer
,
decrypted_buffer
)
{
var
action
,
e
,
firstByte
,
len2
,
m
,
matchPermitRes
,
match_permit
,
name
,
opt0
,
opt1
,
opt2
,
opt3
,
options
,
player
,
ref
,
ref1
,
room
,
room_title
,
title
;
var
action
,
e
,
firstByte
,
len2
,
m
,
matchPermitRes
,
match_permit
,
name
,
opt0
,
opt1
,
opt2
,
opt3
,
options
,
player
,
ref
,
ref1
,
room
,
room_title
,
title
;
if
(
client
.
c
losed
)
{
if
(
client
.
isC
losed
)
{
return
;
return
;
}
}
firstByte
=
buffer
.
readUInt8
(
1
);
firstByte
=
buffer
.
readUInt8
(
1
);
...
@@ -2904,7 +2920,7 @@
...
@@ -2904,7 +2920,7 @@
e
=
error1
;
e
=
error1
;
log
.
warn
(
`match permit fail
${
e
.
toString
()}
`
);
log
.
warn
(
`match permit fail
${
e
.
toString
()}
`
);
}
}
if
(
client
.
c
losed
)
{
if
(
client
.
isC
losed
)
{
return
;
return
;
}
}
if
(
match_permit
&&
match_permit
.
permit
===
false
)
{
if
(
match_permit
&&
match_permit
.
permit
===
false
)
{
...
@@ -2981,12 +2997,12 @@
...
@@ -2981,12 +2997,12 @@
//console.log userData
//console.log userData
e
=
error1
;
e
=
error1
;
log
.
warn
(
"
READ USER FAIL
"
,
client
.
name
,
e
.
toString
());
log
.
warn
(
"
READ USER FAIL
"
,
client
.
name
,
e
.
toString
());
if
(
!
client
.
c
losed
)
{
if
(
!
client
.
isC
losed
)
{
ygopro
.
stoc_die
(
client
,
'
${load_user_info_fail}
'
);
ygopro
.
stoc_die
(
client
,
'
${load_user_info_fail}
'
);
}
}
return
;
return
;
}
}
if
(
client
.
c
losed
)
{
if
(
client
.
isC
losed
)
{
return
;
return
;
}
}
users_cache
[
client
.
name
]
=
userData
.
user
.
id
;
users_cache
[
client
.
name
]
=
userData
.
user
.
id
;
...
@@ -3023,7 +3039,7 @@
...
@@ -3023,7 +3039,7 @@
recover_match
=
info
.
pass
.
match
(
/^
(
RC|RECOVER
)(\d
*
)
T
(\d
*
)
$/
);
recover_match
=
info
.
pass
.
match
(
/^
(
RC|RECOVER
)(\d
*
)
T
(\d
*
)
$/
);
tournament_data
=
(
await
challonge
.
getTournament
(
!!
recover_match
));
tournament_data
=
(
await
challonge
.
getTournament
(
!!
recover_match
));
if
(
!
tournament_data
)
{
if
(
!
tournament_data
)
{
if
(
!
client
.
c
losed
)
{
if
(
!
client
.
isC
losed
)
{
ygopro
.
stoc_die
(
client
,
'
${challonge_match_load_failed}
'
);
ygopro
.
stoc_die
(
client
,
'
${challonge_match_load_failed}
'
);
}
}
return
;
return
;
...
@@ -3032,7 +3048,7 @@
...
@@ -3032,7 +3048,7 @@
return
p
.
participant
.
name
&&
deck_name_match
(
p
.
participant
.
name
,
client
.
name
);
return
p
.
participant
.
name
&&
deck_name_match
(
p
.
participant
.
name
,
client
.
name
);
});
});
if
(
!
matching_participant
)
{
if
(
!
matching_participant
)
{
if
(
!
client
.
c
losed
)
{
if
(
!
client
.
isC
losed
)
{
ygopro
.
stoc_die
(
client
,
'
${challonge_user_not_found}
'
);
ygopro
.
stoc_die
(
client
,
'
${challonge_user_not_found}
'
);
}
}
return
;
return
;
...
@@ -3042,7 +3058,7 @@
...
@@ -3042,7 +3058,7 @@
return
match
.
match
&&
!
match
.
match
.
winner_id
&&
match
.
match
.
state
!==
"
complete
"
&&
match
.
match
.
player1_id
&&
match
.
match
.
player2_id
&&
(
match
.
match
.
player1_id
===
client
.
challonge_info
.
id
||
match
.
match
.
player2_id
===
client
.
challonge_info
.
id
);
return
match
.
match
&&
!
match
.
match
.
winner_id
&&
match
.
match
.
state
!==
"
complete
"
&&
match
.
match
.
player1_id
&&
match
.
match
.
player2_id
&&
(
match
.
match
.
player1_id
===
client
.
challonge_info
.
id
||
match
.
match
.
player2_id
===
client
.
challonge_info
.
id
);
});
});
if
(
!
matching_match
)
{
if
(
!
matching_match
)
{
if
(
!
client
.
c
losed
)
{
if
(
!
client
.
isC
losed
)
{
ygopro
.
stoc_die
(
client
,
'
${challonge_match_not_found}
'
);
ygopro
.
stoc_die
(
client
,
'
${challonge_match_not_found}
'
);
}
}
return
;
return
;
...
@@ -4502,7 +4518,7 @@
...
@@ -4502,7 +4518,7 @@
return
true
;
return
true
;
}
}
if
(
settings
.
modules
.
reconnect
.
enabled
)
{
if
(
settings
.
modules
.
reconnect
.
enabled
)
{
if
(
client
.
c
losed
)
{
if
(
client
.
isC
losed
)
{
ygopro
.
ctos_send
(
server
,
'
TIME_CONFIRM
'
);
ygopro
.
ctos_send
(
server
,
'
TIME_CONFIRM
'
);
return
true
;
return
true
;
}
else
{
}
else
{
...
...
ygopro.coffee
View file @
a180954a
...
@@ -59,15 +59,21 @@ translateHandler = (handler) ->
...
@@ -59,15 +59,21 @@ translateHandler = (handler) ->
return
@
helper
.
sendMessage
(
socket
,
"CTOS_
#{
proto
}
"
,
info
)
return
@
helper
.
sendMessage
(
socket
,
"CTOS_
#{
proto
}
"
,
info
)
#util
#util
@
stoc_send_chat
=
(
client
,
msg
,
player
=
8
)
->
@
split_chat_lines
=
(
msg
,
player
,
lang
)
->
if
!
client
lines
=
[]
console
.
log
"err stoc_send_chat"
return
for
line
in
_
.
lines
(
msg
)
for
line
in
_
.
lines
(
msg
)
if
player
>=
10
if
player
>=
10
line
=
"[Server]: "
+
line
line
=
"[Server]: "
+
line
for
o
,
r
of
@
i18nR
[
client
.
lang
]
for
o
,
r
of
@
i18nR
[
lang
]
line
=
line
.
replace
(
r
.
regex
,
r
.
text
)
line
=
line
.
replace
(
r
.
regex
,
r
.
text
)
lines
.
push
(
line
)
return
lines
@
stoc_send_chat
=
(
client
,
msg
,
player
=
8
)
->
if
!
client
console
.
log
"err stoc_send_chat"
return
for
line
in
@
split_chat_lines
(
msg
,
player
,
client
.
lang
)
await
@
stoc_send
client
,
'CHAT'
,
{
await
@
stoc_send
client
,
'CHAT'
,
{
player
:
player
player
:
player
msg
:
line
msg
:
line
...
@@ -82,6 +88,7 @@ translateHandler = (handler) ->
...
@@ -82,6 +88,7 @@ translateHandler = (handler) ->
@
stoc_send_chat
(
client
,
msg
,
player
)
if
client
@
stoc_send_chat
(
client
,
msg
,
player
)
if
client
for
client
in
room
.
watchers
for
client
in
room
.
watchers
@
stoc_send_chat
(
client
,
msg
,
player
)
if
client
@
stoc_send_chat
(
client
,
msg
,
player
)
if
client
room
.
recordChatMessage
(
msg
,
player
)
return
return
@
stoc_send_hint_card_to_room
=
(
room
,
card
)
->
@
stoc_send_hint_card_to_room
=
(
room
,
card
)
->
...
...
ygopro.js
View file @
a180954a
...
@@ -94,7 +94,8 @@
...
@@ -94,7 +94,8 @@
return
this
.
helper
.
sendMessage
(
socket
,
`CTOS_
${
proto
}
`
,
info
);
return
this
.
helper
.
sendMessage
(
socket
,
`CTOS_
${
proto
}
`
,
info
);
};
};
this
.
splitLines
=
function
(
msg
,
player
)
{
//util
this
.
split_chat_lines
=
function
(
msg
,
player
,
lang
)
{
var
i
,
len
,
line
,
lines
,
o
,
r
,
ref
,
ref1
;
var
i
,
len
,
line
,
lines
,
o
,
r
,
ref
,
ref1
;
lines
=
[];
lines
=
[];
ref
=
_
.
lines
(
msg
);
ref
=
_
.
lines
(
msg
);
...
@@ -103,7 +104,7 @@
...
@@ -103,7 +104,7 @@
if
(
player
>=
10
)
{
if
(
player
>=
10
)
{
line
=
"
[Server]:
"
+
line
;
line
=
"
[Server]:
"
+
line
;
}
}
ref1
=
this
.
i18nR
[
client
.
lang
];
ref1
=
this
.
i18nR
[
lang
];
for
(
o
in
ref1
)
{
for
(
o
in
ref1
)
{
r
=
ref1
[
o
];
r
=
ref1
[
o
];
line
=
line
.
replace
(
r
.
regex
,
r
.
text
);
line
=
line
.
replace
(
r
.
regex
,
r
.
text
);
...
@@ -113,14 +114,13 @@
...
@@ -113,14 +114,13 @@
return
lines
;
return
lines
;
};
};
//util
this
.
stoc_send_chat
=
async
function
(
client
,
msg
,
player
=
8
)
{
this
.
stoc_send_chat
=
async
function
(
client
,
msg
,
player
=
8
)
{
var
i
,
len
,
line
,
ref
;
var
i
,
len
,
line
,
ref
;
if
(
!
client
)
{
if
(
!
client
)
{
console
.
log
(
"
err stoc_send_chat
"
);
console
.
log
(
"
err stoc_send_chat
"
);
return
;
return
;
}
}
ref
=
this
.
split
Lines
(
msg
,
player
);
ref
=
this
.
split
_chat_lines
(
msg
,
player
,
client
.
lang
);
for
(
i
=
0
,
len
=
ref
.
length
;
i
<
len
;
i
++
)
{
for
(
i
=
0
,
len
=
ref
.
length
;
i
<
len
;
i
++
)
{
line
=
ref
[
i
];
line
=
ref
[
i
];
await
this
.
stoc_send
(
client
,
'
CHAT
'
,
{
await
this
.
stoc_send
(
client
,
'
CHAT
'
,
{
...
@@ -131,36 +131,26 @@
...
@@ -131,36 +131,26 @@
};
};
this
.
stoc_send_chat_to_room
=
function
(
room
,
msg
,
player
=
8
)
{
this
.
stoc_send_chat_to_room
=
function
(
room
,
msg
,
player
=
8
)
{
var
c
hat_buffer
,
client
,
i
,
j
,
k
,
len
,
len1
,
len2
,
line
,
ref
,
ref1
,
ref2
;
var
c
lient
,
i
,
j
,
len
,
len1
,
ref
,
ref1
;
if
(
!
room
)
{
if
(
!
room
)
{
console
.
log
(
"
err stoc_send_chat_to_room
"
);
console
.
log
(
"
err stoc_send_chat_to_room
"
);
return
;
return
;
}
}
ref
=
this
.
splitLines
(
msg
,
player
)
;
ref
=
room
.
players
;
for
(
i
=
0
,
len
=
ref
.
length
;
i
<
len
;
i
++
)
{
for
(
i
=
0
,
len
=
ref
.
length
;
i
<
len
;
i
++
)
{
line
=
ref
[
i
];
client
=
ref
[
i
];
chat_buffer
=
this
.
helper
.
prepareMessage
(
"
STOC_CHAT
"
,
{
player
:
player
,
msg
:
line
});
ref1
=
room
.
players
;
for
(
j
=
0
,
len1
=
ref1
.
length
;
j
<
len1
;
j
++
)
{
client
=
ref1
[
j
];
if
(
client
)
{
if
(
client
)
{
this
.
helper
.
send
(
client
,
chat_buff
er
);
this
.
stoc_send_chat
(
client
,
msg
,
play
er
);
}
}
}
}
ref2
=
room
.
watchers
;
ref1
=
room
.
watchers
;
for
(
k
=
0
,
len2
=
ref2
.
length
;
k
<
len2
;
k
++
)
{
for
(
j
=
0
,
len1
=
ref1
.
length
;
j
<
len1
;
j
++
)
{
client
=
ref2
[
k
];
client
=
ref1
[
j
];
if
(
client
)
{
if
(
client
)
{
this
.
helper
.
send
(
client
,
chat_buffer
);
this
.
stoc_send_chat
(
client
,
msg
,
player
);
}
}
if
(
room
.
duel_stage
!==
this
.
constants
.
DUEL_STAGE
.
BEGIN
)
{
room
.
addRecorderBuffer
(
chat_buffer
,
true
);
}
}
}
}
room
.
recordChatMessage
(
msg
,
player
);
};
};
this
.
stoc_send_hint_card_to_room
=
function
(
room
,
card
)
{
this
.
stoc_send_hint_card_to_room
=
function
(
room
,
card
)
{
...
...
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