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
1094f445
Commit
1094f445
authored
Jul 24, 2019
by
nanahira
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'plugins' into plugin_koishi
parents
bb24e5ae
e8ef0195
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
461 additions
and
258 deletions
+461
-258
.dockerignore
.dockerignore
+37
-0
.gitignore
.gitignore
+1
-0
ygopro-server.coffee
ygopro-server.coffee
+131
-102
ygopro-server.js
ygopro-server.js
+166
-111
ygopro.coffee
ygopro.coffee
+45
-16
ygopro.js
ygopro.js
+81
-29
No files found.
.dockerignore
View file @
1094f445
# ignore
jsconfig.json
coffeelint.json
.vscode/
password.json
config.*.json
config.user.bak
/bak
/config
/ygopro
/windbot
/decks
/decks_save*
/replays
/node_modules
/ssl
/ygosrv233
/challonge
/logs
/plugins
test*
*.heapsnapshot
*.tmp
*.bak
*.log
*.map
Thumbs.db
ehthumbs.db
Desktop.ini
$RECYCLE.BIN/
.DS_Store
.git*
.dockerignore
Dockerfile*
...
...
.gitignore
View file @
1094f445
...
...
@@ -24,6 +24,7 @@ ygopro-2pick
/ygosrv233
/challonge
/logs
/plugins
test*
*.heapsnapshot
...
...
ygopro-server.coffee
View file @
1094f445
...
...
@@ -141,11 +141,11 @@ try
catch
e
log
.
info
e
unless
e
.
code
==
'ENOENT'
setting_save
=
(
settings
)
->
setting_save
=
global
.
setting_save
=
(
settings
)
->
fs
.
writeFileSync
(
settings
.
file
,
JSON
.
stringify
(
settings
,
null
,
2
))
return
setting_change
=
(
settings
,
path
,
val
)
->
setting_change
=
global
.
setting_change
=
(
settings
,
path
,
val
)
->
# path should be like "modules:welcome"
log
.
info
(
"setting changed"
,
path
,
val
)
if
_
.
isString
(
val
)
path
=
path
.
split
(
':'
)
...
...
@@ -161,7 +161,7 @@ setting_change = (settings, path, val) ->
setting_save
(
settings
)
return
VIP_generate_cdkeys
=
(
key_type
,
count
)
->
VIP_generate_cdkeys
=
global
.
VIP_generate_cdkeys
=
(
key_type
,
count
)
->
return
false
unless
settings
.
modules
.
vip
.
enabled
and
vip_info
.
cdkeys
[
key_type
]
for
i
in
[
0
...
count
]
key
=
Math
.
floor
(
Math
.
random
()
*
10000000000000000
).
toString
()
...
...
@@ -170,7 +170,7 @@ VIP_generate_cdkeys = (key_type, count) ->
log
.
info
(
"keys generated"
,
key_type
,
count
,
vip_info
.
cdkeys
[
key_type
].
length
)
return
true
CLIENT_use_cdkey
=
(
client
,
pkey
)
->
CLIENT_use_cdkey
=
global
.
CLIENT_use_cdkey
=
(
client
,
pkey
)
->
return
0
unless
settings
.
modules
.
vip
.
enabled
and
pkey
found_type
=
null
for
type
,
keys
of
vip_info
.
cdkeys
...
...
@@ -204,7 +204,7 @@ CLIENT_use_cdkey = (client, pkey) ->
setting_save
(
vip_info
)
return
(
if
new_vip
then
1
else
2
)
CLIENT_check_vip
=
(
client
)
->
CLIENT_check_vip
=
global
.
CLIENT_check_vip
=
(
client
)
->
if
!
settings
.
modules
.
vip
.
enabled
return
false
if
!
vip_info
.
players
[
client
.
name
]
...
...
@@ -213,7 +213,7 @@ CLIENT_check_vip = (client) ->
return
false
return
moment
().
isSameOrBefore
(
vip_info
.
players
[
client
.
name
].
expire_date
)
CLIENT_send_vip_status
=
(
client
,
display
)
->
CLIENT_send_vip_status
=
global
.
CLIENT_send_vip_status
=
(
client
,
display
)
->
if
!
settings
.
modules
.
vip
.
enabled
return
false
if
client
.
vip
...
...
@@ -226,7 +226,7 @@ CLIENT_send_vip_status = (client, display) ->
else
ygopro
.
stoc_send_chat
(
client
,
"${vip_expired_part1}"
+
vip_info
.
players
[
client
.
name
].
expire_date
+
"${vip_expired_part2}"
,
ygopro
.
constants
.
COLORS
.
RED
)
concat_name
=
(
name
,
num
)
->
concat_name
=
global
.
concat_name
=
(
name
,
num
)
->
if
!
name
[
num
]
return
null
res
=
name
[
num
]
...
...
@@ -248,7 +248,7 @@ catch
config
=
{}
settings
=
global
.
settings
=
merge
(
default_config
,
config
,
{
arrayMerge
:
(
destination
,
source
)
->
source
})
auth
=
require
'./ygopro-auth.js'
auth
=
global
.
auth
=
require
'./ygopro-auth.js'
#import old configs
imported
=
false
...
...
@@ -316,45 +316,45 @@ if imported
# 读取数据
default_data
=
loadJSON
(
'./data/default_data.json'
)
try
tips
=
loadJSON
(
'./config/tips.json'
)
tips
=
global
.
tips
=
loadJSON
(
'./config/tips.json'
)
if
!
tips
.
tips_zh
tips
.
tips_zh
=
[]
setting_save
(
tips
);
catch
tips
=
default_data
.
tips
tips
=
global
.
tips
=
default_data
.
tips
setting_save
(
tips
)
try
words
=
loadJSON
(
'./config/words.json'
)
words
=
global
.
words
=
loadJSON
(
'./config/words.json'
)
catch
words
=
default_data
.
words
words
=
global
.
words
=
default_data
.
words
setting_save
(
words
)
try
dialogues
=
loadJSON
(
'./config/dialogues.json'
)
dialogues
=
global
.
dialogues
=
loadJSON
(
'./config/dialogues.json'
)
if
!
dialogues
.
dialogues_custom
dialogues
.
dialogues_custom
=
{}
setting_save
(
dialogues
);
catch
dialogues
=
default_data
.
dialogues
dialogues
=
global
.
dialogues
=
default_data
.
dialogues
setting_save
(
dialogues
)
try
badwords
=
loadJSON
(
'./config/badwords.json'
)
badwords
=
global
.
badwords
=
loadJSON
(
'./config/badwords.json'
)
catch
badwords
=
default_data
.
badwords
badwords
=
global
.
badwords
=
default_data
.
badwords
setting_save
(
badwords
)
try
duel_log
=
loadJSON
(
'./config/duel_log.json'
)
duel_log
=
global
.
duel_log
=
loadJSON
(
'./config/duel_log.json'
)
catch
duel_log
=
default_data
.
duel_log
duel_log
=
global
.
duel_log
=
default_data
.
duel_log
setting_save
(
duel_log
)
try
chat_color
=
loadJSON
(
'./config/chat_color.json'
)
chat_color
=
global
.
chat_color
=
loadJSON
(
'./config/chat_color.json'
)
catch
chat_color
=
default_data
.
chat_color
chat_color
=
global
.
chat_color
=
default_data
.
chat_color
setting_save
(
chat_color
)
try
vip_info
=
loadJSON
(
'./config/vip_info.json'
)
vip_info
=
global
.
vip_info
=
loadJSON
(
'./config/vip_info.json'
)
catch
vip_info
=
default_data
.
vip_info
vip_info
=
global
.
vip_info
=
default_data
.
vip_info
setting_save
(
vip_info
)
try
...
...
@@ -365,7 +365,7 @@ catch
#settings.version = settings.version_default
log
.
info
"ygopro version 0x"
+
settings
.
version
.
toString
(
16
),
"(from config)"
# load the lflist of current date
lflists
=
[]
lflists
=
global
.
lflists
=
[]
# expansions/lflist
try
for
list
in
fs
.
readFileSync
(
'ygopro/expansions/lflist.conf'
,
'utf8'
).
match
(
/!.*/g
)
...
...
@@ -401,14 +401,14 @@ if settings.modules.windbot.enabled
if
settings
.
modules
.
heartbeat_detection
.
enabled
long_resolve_cards
=
loadJSON
(
'./data/long_resolve_cards.json'
)
long_resolve_cards
=
global
.
long_resolve_cards
=
loadJSON
(
'./data/long_resolve_cards.json'
)
if
settings
.
modules
.
pre_release_compat
.
enabled
sqlite3
=
require
(
'sqlite3'
).
verbose
()
# 组件
ygopro
=
require
'./ygopro.js'
roomlist
=
require
'./roomlist.js'
if
settings
.
modules
.
http
.
websocket_roomlist
ygopro
=
global
.
ygopro
=
require
'./ygopro.js'
roomlist
=
global
.
roomlist
=
require
'./roomlist.js'
if
settings
.
modules
.
http
.
websocket_roomlist
if
settings
.
modules
.
i18n
.
auto_pick
geoip
=
require
(
'geoip-country-lite'
)
...
...
@@ -528,8 +528,8 @@ if settings.modules.vip.enabled
VIP_generate_cdkeys
(
k
,
settings
.
modules
.
vip
.
generate_count
)
# 获取可用内存
memory_usage
=
0
get_memory_usage
=
()
->
memory_usage
=
global
.
memory_usage
=
0
get_memory_usage
=
get_memory_usage
=
()
->
prc_free
=
exec
(
"free"
)
prc_free
.
stdout
.
on
'data'
,
(
data
)
->
lines
=
data
.
toString
().
split
(
/\n/g
)
...
...
@@ -551,17 +551,17 @@ get_memory_usage = ()->
get_memory_usage
()
setInterval
(
get_memory_usage
,
3000
)
Cloud_replay_ids
=
[]
Cloud_replay_ids
=
global
.
Cloud_replay_ids
=
[]
ROOM_all
=
[]
ROOM_players_oppentlist
=
{}
ROOM_players_banned
=
[]
ROOM_players_scores
=
{}
ROOM_connected_ip
=
{}
ROOM_bad_ip
=
{}
ROOM_all
=
global
.
ROOM_all
=
[]
ROOM_players_oppentlist
=
global
.
ROOM_players_oppentlist
=
{}
ROOM_players_banned
=
global
.
ROOM_players_banned
=
[]
ROOM_players_scores
=
global
.
ROOM_players_scores
=
{}
ROOM_connected_ip
=
global
.
ROOM_connected_ip
=
{}
ROOM_bad_ip
=
global
.
ROOM_bad_ip
=
{}
# ban a user manually and permanently
ban_user
=
(
name
)
->
ban_user
=
global
.
ban_user
=
(
name
)
->
settings
.
ban
.
banned_user
.
push
(
name
)
setting_save
(
settings
)
bad_ip
=
0
...
...
@@ -578,7 +578,7 @@ ban_user = (name) ->
return
# automatically ban user to use random duel
ROOM_ban_player
=
(
name
,
ip
,
reason
,
countadd
=
1
)
->
ROOM_ban_player
=
global
.
ROOM_ban_player
=
(
name
,
ip
,
reason
,
countadd
=
1
)
->
return
if
settings
.
modules
.
test_mode
.
no_ban_player
bannedplayer
=
_
.
find
ROOM_players_banned
,
(
bannedplayer
)
->
ip
==
bannedplayer
.
ip
...
...
@@ -595,28 +595,28 @@ ROOM_ban_player = (name, ip, reason, countadd = 1)->
#log.info("banned", name, ip, reason, bannedplayer.count)
return
ROOM_player_win
=
(
name
)
->
ROOM_player_win
=
global
.
ROOM_player_win
=
(
name
)
->
if
!
ROOM_players_scores
[
name
]
ROOM_players_scores
[
name
]
=
{
win
:
0
,
lose
:
0
,
flee
:
0
,
combo
:
0
}
ROOM_players_scores
[
name
].
win
=
ROOM_players_scores
[
name
].
win
+
1
ROOM_players_scores
[
name
].
combo
=
ROOM_players_scores
[
name
].
combo
+
1
return
ROOM_player_lose
=
(
name
)
->
ROOM_player_lose
=
global
.
ROOM_player_lose
=
(
name
)
->
if
!
ROOM_players_scores
[
name
]
ROOM_players_scores
[
name
]
=
{
win
:
0
,
lose
:
0
,
flee
:
0
,
combo
:
0
}
ROOM_players_scores
[
name
].
lose
=
ROOM_players_scores
[
name
].
lose
+
1
ROOM_players_scores
[
name
].
combo
=
0
return
ROOM_player_flee
=
(
name
)
->
ROOM_player_flee
=
global
.
ROOM_player_flee
=
(
name
)
->
if
!
ROOM_players_scores
[
name
]
ROOM_players_scores
[
name
]
=
{
win
:
0
,
lose
:
0
,
flee
:
0
,
combo
:
0
}
ROOM_players_scores
[
name
].
flee
=
ROOM_players_scores
[
name
].
flee
+
1
ROOM_players_scores
[
name
].
combo
=
0
return
ROOM_player_get_score
=
(
player
)
->
ROOM_player_get_score
=
global
.
ROOM_player_get_score
=
(
player
)
->
name
=
player
.
name_vpass
score
=
ROOM_players_scores
[
name
]
if
!
score
...
...
@@ -653,7 +653,7 @@ if settings.modules.random_duel.post_match_scores
return
,
60000
)
ROOM_find_or_create_by_name
=
(
name
,
player_ip
)
->
ROOM_find_or_create_by_name
=
global
.
ROOM_find_or_create_by_name
=
(
name
,
player_ip
)
->
uname
=
name
.
toUpperCase
()
if
settings
.
modules
.
windbot
.
enabled
and
(
uname
[
0
...
2
]
==
'AI'
or
(
!
settings
.
modules
.
random_duel
.
enabled
and
uname
==
''
))
return
ROOM_find_or_create_ai
(
name
)
...
...
@@ -666,7 +666,7 @@ ROOM_find_or_create_by_name = (name, player_ip)->
else
return
new
Room
(
name
)
ROOM_find_or_create_random
=
(
type
,
player_ip
)
->
ROOM_find_or_create_random
=
global
.
ROOM_find_or_create_random
=
(
type
,
player_ip
)
->
bannedplayer
=
_
.
find
ROOM_players_banned
,
(
bannedplayer
)
->
return
player_ip
==
bannedplayer
.
ip
if
bannedplayer
...
...
@@ -706,7 +706,7 @@ ROOM_find_or_create_random = (type, player_ip)->
if
result
.
random_type
==
'M'
then
result
.
welcome
=
result
.
welcome
+
'
\n
${random_duel_enter_room_match}'
return
result
ROOM_find_or_create_ai
=
(
name
)
->
ROOM_find_or_create_ai
=
global
.
ROOM_find_or_create_ai
=
(
name
)
->
if
name
==
''
name
=
'AI'
namea
=
name
.
split
(
'#'
)
...
...
@@ -734,21 +734,25 @@ ROOM_find_or_create_ai = (name)->
result
.
private
=
true
return
result
ROOM_find_by_name
=
(
name
)
->
ROOM_find_by_name
=
global
.
ROOM_find_by_name
=
(
name
)
->
result
=
_
.
find
ROOM_all
,
(
room
)
->
return
room
and
room
.
name
==
name
return
result
ROOM_find_by_title
=
(
title
)
->
ROOM_find_by_title
=
global
.
ROOM_find_by_title
=
(
title
)
->
result
=
_
.
find
ROOM_all
,
(
room
)
->
return
room
and
room
.
title
==
title
return
result
ROOM_find_by_port
=
(
port
)
->
ROOM_find_by_port
=
global
.
ROOM_find_by_port
=
(
port
)
->
_
.
find
ROOM_all
,
(
room
)
->
return
room
and
room
.
port
==
port
ROOM_validate
=
(
name
)
->
ROOM_find_by_pid
=
global
.
ROOM_find_by_pid
=
(
pid
)
->
_
.
find
ROOM_all
,
(
room
)
->
return
room
and
room
.
process_pid
==
pid
ROOM_validate
=
global
.
ROOM_validate
=
(
name
)
->
client_name_and_pass
=
name
.
split
(
'$'
,
2
)
client_name
=
client_name_and_pass
[
0
]
client_pass
=
client_name_and_pass
[
1
]
...
...
@@ -760,7 +764,7 @@ ROOM_validate = (name)->
room_pass
=
room_name_and_pass
[
1
]
client_name
==
room_name
and
client_pass
!=
room_pass
ROOM_unwelcome
=
(
room
,
bad_player
,
reason
)
->
ROOM_unwelcome
=
global
.
ROOM_unwelcome
=
(
room
,
bad_player
,
reason
)
->
return
unless
room
for
player
in
room
.
players
if
player
and
player
==
bad_player
...
...
@@ -770,7 +774,7 @@ ROOM_unwelcome = (room, bad_player, reason)->
ygopro
.
stoc_send_chat
(
player
,
"${unwelcome_tip_part1}
#{
reason
}
${unwelcome_tip_part2}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
return
CLIENT_kick
=
(
client
)
->
CLIENT_kick
=
global
.
CLIENT_kick
=
(
client
)
->
if
!
client
return
false
client
.
system_kicked
=
true
...
...
@@ -781,7 +785,7 @@ CLIENT_kick = (client) ->
client
.
destroy
()
return
true
release_disconnect
=
(
dinfo
,
reconnected
)
->
release_disconnect
=
global
.
release_disconnect
=
(
dinfo
,
reconnected
)
->
if
dinfo
.
old_client
and
!
reconnected
dinfo
.
old_client
.
destroy
()
if
dinfo
.
old_server
and
!
reconnected
...
...
@@ -789,7 +793,7 @@ release_disconnect = (dinfo, reconnected) ->
clearTimeout
(
dinfo
.
timeout
)
return
CLIENT_get_authorize_key
=
(
client
)
->
CLIENT_get_authorize_key
=
global
.
CLIENT_get_authorize_key
=
(
client
)
->
if
!
settings
.
modules
.
mycard
.
enabled
and
client
.
vpass
return
client
.
name_vpass
else
if
settings
.
modules
.
mycard
.
enabled
or
settings
.
modules
.
tournament_mode
.
enabled
or
settings
.
modules
.
challonge
.
enabled
or
client
.
is_local
...
...
@@ -797,7 +801,7 @@ CLIENT_get_authorize_key = (client) ->
else
return
client
.
ip
+
":"
+
client
.
name
CLIENT_reconnect_unregister
=
(
client
,
reconnected
,
exact
)
->
CLIENT_reconnect_unregister
=
global
.
CLIENT_reconnect_unregister
=
(
client
,
reconnected
,
exact
)
->
if
!
settings
.
modules
.
reconnect
.
enabled
return
false
if
disconnect_list
[
CLIENT_get_authorize_key
(
client
)]
...
...
@@ -808,7 +812,7 @@ CLIENT_reconnect_unregister = (client, reconnected, exact) ->
return
true
return
false
CLIENT_reconnect_register
=
(
client
,
room_id
,
error
)
->
CLIENT_reconnect_register
=
global
.
CLIENT_reconnect_register
=
(
client
,
room_id
,
error
)
->
room
=
ROOM_all
[
room_id
]
if
client
.
had_new_reconnection
return
false
...
...
@@ -839,7 +843,7 @@ CLIENT_reconnect_register = (client, room_id, error) ->
ygopro
.
ctos_send
(
client
.
server
,
'SURRENDER'
)
return
true
CLIENT_import_data
=
(
client
,
old_client
,
room
)
->
CLIENT_import_data
=
global
.
CLIENT_import_data
=
(
client
,
old_client
,
room
)
->
for
player
,
index
in
room
.
players
if
player
==
old_client
room
.
players
[
index
]
=
client
...
...
@@ -856,7 +860,7 @@ CLIENT_import_data = (client, old_client, room) ->
old_client
.
had_new_reconnection
=
true
return
SERVER_clear_disconnect
=
(
server
)
->
SERVER_clear_disconnect
=
global
.
SERVER_clear_disconnect
=
(
server
)
->
return
false
unless
settings
.
modules
.
reconnect
.
enabled
for
k
,
v
of
disconnect_list
if
v
and
server
==
v
.
old_server
...
...
@@ -865,7 +869,7 @@ SERVER_clear_disconnect = (server) ->
return
true
return
false
ROOM_clear_disconnect
=
(
room_id
)
->
ROOM_clear_disconnect
=
global
.
ROOM_clear_disconnect
=
(
room_id
)
->
return
false
unless
settings
.
modules
.
reconnect
.
enabled
for
k
,
v
of
disconnect_list
if
v
and
room_id
==
v
.
room_id
...
...
@@ -874,7 +878,7 @@ ROOM_clear_disconnect = (room_id) ->
return
true
return
false
CLIENT_is_player
=
(
client
,
room
)
->
CLIENT_is_player
=
global
.
CLIENT_is_player
=
(
client
,
room
)
->
is_player
=
false
for
player
in
room
.
players
if
client
==
player
...
...
@@ -882,7 +886,7 @@ CLIENT_is_player = (client, room) ->
break
return
is_player
and
client
.
pos
<=
3
CLIENT_is_able_to_reconnect
=
(
client
,
deckbuf
)
->
CLIENT_is_able_to_reconnect
=
global
.
CLIENT_is_able_to_reconnect
=
(
client
,
deckbuf
)
->
unless
settings
.
modules
.
reconnect
.
enabled
return
false
if
client
.
system_kicked
...
...
@@ -898,20 +902,20 @@ CLIENT_is_able_to_reconnect = (client, deckbuf) ->
return
false
return
true
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
player
in
room
.
get_playing_player
()
when
!
player
.
closed
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
_
.
isEqual
(
player
.
start_deckbuf
,
deckbuf
))
return
player
return
null
CLIENT_is_able_to_kick_reconnect
=
(
client
,
deckbuf
)
->
CLIENT_is_able_to_kick_reconnect
=
global
.
CLIENT_is_able_to_kick_reconnect
=
(
client
,
deckbuf
)
->
unless
settings
.
modules
.
reconnect
.
enabled
and
settings
.
modules
.
reconnect
.
allow_kick_reconnect
return
false
if
!
CLIENT_get_kick_reconnect_target
(
client
,
deckbuf
)
return
false
return
true
CLIENT_send_pre_reconnect_info
=
(
client
,
room
,
old_client
)
->
CLIENT_send_pre_reconnect_info
=
global
.
CLIENT_send_pre_reconnect_info
=
(
client
,
room
,
old_client
)
->
ygopro
.
stoc_send_chat
(
client
,
"${pre_reconnecting_to_room}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
ygopro
.
stoc_send
(
client
,
'JOIN_GAME'
,
room
.
join_game_buffer
)
req_pos
=
old_client
.
pos
...
...
@@ -927,7 +931,7 @@ CLIENT_send_pre_reconnect_info = (client, room, old_client) ->
})
return
CLIENT_send_reconnect_info
=
(
client
,
server
,
room
)
->
CLIENT_send_reconnect_info
=
global
.
CLIENT_send_reconnect_info
=
(
client
,
server
,
room
)
->
client
.
reconnecting
=
true
ygopro
.
stoc_send_chat
(
client
,
"${reconnecting_to_room}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
switch
room
.
duel_stage
...
...
@@ -954,7 +958,7 @@ CLIENT_send_reconnect_info = (client, server, room) ->
break
return
CLIENT_pre_reconnect
=
(
client
)
->
CLIENT_pre_reconnect
=
global
.
CLIENT_pre_reconnect
=
(
client
)
->
if
CLIENT_is_able_to_reconnect
(
client
)
dinfo
=
disconnect_list
[
CLIENT_get_authorize_key
(
client
)]
client
.
pre_reconnecting
=
true
...
...
@@ -969,7 +973,7 @@ CLIENT_pre_reconnect = (client) ->
CLIENT_send_pre_reconnect_info
(
client
,
ROOM_all
[
player
.
rid
],
player
)
return
CLIENT_reconnect
=
(
client
)
->
CLIENT_reconnect
=
global
.
CLIENT_reconnect
=
(
client
)
->
if
!
CLIENT_is_able_to_reconnect
(
client
)
ygopro
.
stoc_send_chat
(
client
,
"${reconnect_failed}"
,
ygopro
.
constants
.
COLORS
.
RED
)
CLIENT_kick
(
client
)
...
...
@@ -995,7 +999,7 @@ CLIENT_reconnect = (client) ->
CLIENT_reconnect_unregister
(
client
,
true
)
return
CLIENT_kick_reconnect
=
(
client
,
deckbuf
)
->
CLIENT_kick_reconnect
=
global
.
CLIENT_kick_reconnect
=
(
client
,
deckbuf
)
->
if
!
CLIENT_is_able_to_kick_reconnect
(
client
)
ygopro
.
stoc_send_chat
(
client
,
"${reconnect_failed}"
,
ygopro
.
constants
.
COLORS
.
RED
)
CLIENT_kick
(
client
)
...
...
@@ -1027,7 +1031,7 @@ CLIENT_kick_reconnect = (client, deckbuf) ->
if
settings
.
modules
.
reconnect
.
enabled
disconnect_list
=
{}
# {old_client, old_server, room_id, timeout, deckbuf}
CLIENT_heartbeat_unregister
=
(
client
)
->
CLIENT_heartbeat_unregister
=
global
.
CLIENT_heartbeat_unregister
=
(
client
)
->
if
!
settings
.
modules
.
heartbeat_detection
.
enabled
or
!
client
.
heartbeat_timeout
return
false
clearTimeout
(
client
.
heartbeat_timeout
)
...
...
@@ -1035,7 +1039,7 @@ CLIENT_heartbeat_unregister = (client) ->
#log.info(2, client.name)
return
true
CLIENT_heartbeat_register
=
(
client
,
send
)
->
CLIENT_heartbeat_register
=
global
.
CLIENT_heartbeat_register
=
(
client
,
send
)
->
if
!
settings
.
modules
.
heartbeat_detection
.
enabled
or
client
.
closed
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
if
client
.
heartbeat_timeout
...
...
@@ -1058,10 +1062,10 @@ CLIENT_heartbeat_register = (client, send) ->
#log.info(1, client.name)
return
true
CLIENT_is_banned_by_mc
=
(
client
)
->
CLIENT_is_banned_by_mc
=
global
.
CLIENT_is_banned_by_mc
=
(
client
)
->
return
client
.
ban_mc
and
client
.
ban_mc
.
banned
and
moment
().
isBefore
(
client
.
ban_mc
.
until
)
CLIENT_get_absolute_pos
=
(
client
)
->
CLIENT_get_absolute_pos
=
global
.
CLIENT_get_absolute_pos
=
(
client
)
->
room
=
ROOM_all
[
client
.
rid
]
if
room
.
hostinfo
.
mode
!=
2
or
client
.
pos
>
3
return
client
.
pos
...
...
@@ -1070,7 +1074,7 @@ CLIENT_get_absolute_pos = (client) ->
else
return
1
CLIENT_get_partner
=
(
client
)
->
CLIENT_get_partner
=
global
.
CLIENT_get_partner
=
(
client
)
->
room
=
ROOM_all
[
client
.
rid
]
if
room
.
hostinfo
.
mode
!=
2
or
client
.
pos
>
3
return
client
...
...
@@ -1079,7 +1083,7 @@ CLIENT_get_partner = (client) ->
else
return
room
.
dueling_players
[
5
-
client
.
pos
]
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
.
replay_safe
and
settings
.
modules
.
tournament_mode
.
block_replay_to_player
)
and
room
.
replays
.
length
and
room
.
hostinfo
.
mode
==
1
and
!
client
.
replays_sent
and
!
client
.
closed
client
.
replays_sent
=
true
i
=
0
...
...
@@ -1090,7 +1094,7 @@ CLIENT_send_replays = (client, room) ->
ygopro
.
stoc_send
(
client
,
"REPLAY"
,
buffer
)
return
true
SOCKET_flush_data
=
(
sk
,
datas
)
->
SOCKET_flush_data
=
global
.
SOCKET_flush_data
=
(
sk
,
datas
)
->
if
!
sk
or
sk
.
closed
return
false
for
buffer
in
datas
...
...
@@ -1098,7 +1102,7 @@ SOCKET_flush_data = (sk, datas) ->
datas
.
splice
(
0
,
datas
.
length
)
return
true
replace_buffer
=
(
buffer
,
list
,
start_pos
)
->
replace_buffer
=
global
.
replace_buffer
=
(
buffer
,
list
,
start_pos
)
->
found
=
0
len
=
buffer
.
length
if
len
<
4
+
start_pos
...
...
@@ -1796,16 +1800,25 @@ net.createServer (client) ->
cancel
=
false
if
settings
.
modules
.
reconnect
.
enabled
and
client
.
pre_reconnecting
and
ygopro
.
constants
.
CTOS
[
ctos_proto
]
!=
'UPDATE_DECK'
cancel
=
true
b
=
ctos_buffer
.
slice
(
3
,
ctos_message_length
-
1
+
3
)
info
=
null
if
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
CTOS
[
ygopro
.
constants
.
CTOS
[
ctos_proto
]]]
struct
.
_setBuff
(
b
)
info
=
_
.
clone
(
struct
.
fields
)
if
ygopro
.
ctos_follows_before
[
ctos_proto
]
and
!
cancel
for
ctos_event
in
ygopro
.
ctos_follows_before
[
ctos_proto
]
result
=
ctos_event
.
callback
b
,
info
,
client
,
client
.
server
,
datas
if
result
and
ctos_event
.
synchronous
cancel
=
true
if
ygopro
.
ctos_follows
[
ctos_proto
]
and
!
cancel
b
=
ctos_buffer
.
slice
(
3
,
ctos_message_length
-
1
+
3
)
info
=
null
if
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
CTOS
[
ygopro
.
constants
.
CTOS
[
ctos_proto
]]]
struct
.
_setBuff
(
b
)
info
=
_
.
clone
(
struct
.
fields
)
if
ygopro
.
ctos_follows
[
ctos_proto
].
synchronous
cancel
=
ygopro
.
ctos_follows
[
ctos_proto
].
callback
b
,
info
,
client
,
client
.
server
,
datas
else
ygopro
.
ctos_follows
[
ctos_proto
].
callback
b
,
info
,
client
,
client
.
server
,
datas
result
=
ygopro
.
ctos_follows
[
ctos_proto
].
callback
b
,
info
,
client
,
client
.
server
,
datas
if
result
and
ygopro
.
ctos_follows
[
ctos_proto
].
synchronous
cancel
=
true
if
ygopro
.
ctos_follows_after
[
ctos_proto
]
and
!
cancel
for
ctos_event
in
ygopro
.
ctos_follows_after
[
ctos_proto
]
result
=
ctos_event
.
callback
b
,
info
,
client
,
client
.
server
,
datas
if
result
and
ctos_event
.
synchronous
cancel
=
true
datas
.
push
ctos_buffer
.
slice
(
0
,
2
+
ctos_message_length
)
unless
cancel
ctos_buffer
=
ctos_buffer
.
slice
(
2
+
ctos_message_length
)
ctos_message_length
=
0
...
...
@@ -1864,17 +1877,25 @@ net.createServer (client) ->
if
stoc_buffer
.
length
>=
2
+
stoc_message_length
#console.log "STOC", ygopro.constants.STOC[stoc_proto]
cancel
=
false
stanzas
=
stoc_proto
if
ygopro
.
stoc_follows
[
stoc_proto
]
b
=
stoc_buffer
.
slice
(
3
,
stoc_message_length
-
1
+
3
)
info
=
null
if
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
STOC
[
ygopro
.
constants
.
STOC
[
stoc_proto
]]]
struct
.
_setBuff
(
b
)
info
=
_
.
clone
(
struct
.
fields
)
if
ygopro
.
stoc_follows
[
stoc_proto
].
synchronous
cancel
=
ygopro
.
stoc_follows
[
stoc_proto
].
callback
b
,
info
,
server
.
client
,
server
,
datas
else
ygopro
.
stoc_follows
[
stoc_proto
].
callback
b
,
info
,
server
.
client
,
server
,
datas
b
=
stoc_buffer
.
slice
(
3
,
stoc_message_length
-
1
+
3
)
info
=
null
if
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
STOC
[
ygopro
.
constants
.
STOC
[
stoc_proto
]]]
struct
.
_setBuff
(
b
)
info
=
_
.
clone
(
struct
.
fields
)
if
ygopro
.
stoc_follows_before
[
stoc_proto
]
and
!
cancel
for
stoc_event
in
ygopro
.
stoc_follows_before
[
stoc_proto
]
result
=
stoc_event
.
callback
b
,
info
,
server
.
client
,
server
,
datas
if
result
and
stoc_event
.
synchronous
cancel
=
true
if
ygopro
.
stoc_follows
[
stoc_proto
]
and
!
cancel
result
=
ygopro
.
stoc_follows
[
stoc_proto
].
callback
b
,
info
,
server
.
client
,
server
,
datas
if
result
and
ygopro
.
stoc_follows
[
stoc_proto
].
synchronous
cancel
=
true
if
ygopro
.
stoc_follows_after
[
stoc_proto
]
and
!
cancel
for
stoc_event
in
ygopro
.
stoc_follows_after
[
stoc_proto
]
result
=
stoc_event
.
callback
b
,
info
,
server
.
client
,
server
,
datas
if
result
and
stoc_event
.
synchronous
cancel
=
true
datas
.
push
stoc_buffer
.
slice
(
0
,
2
+
stoc_message_length
)
unless
cancel
stoc_buffer
=
stoc_buffer
.
slice
(
2
+
stoc_message_length
)
stoc_message_length
=
0
...
...
@@ -2544,7 +2565,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)->
return
# 登场台词
load_words
=
()
->
load_words
=
global
.
load_words
=
()
->
request
url
:
settings
.
modules
.
words
.
get
json
:
true
...
...
@@ -2562,7 +2583,7 @@ load_words = () ->
if
settings
.
modules
.
words
.
get
load_words
()
load_dialogues
=
()
->
load_dialogues
=
global
.
load_dialogues
=
()
->
request
url
:
settings
.
modules
.
dialogues
.
get
json
:
true
...
...
@@ -2577,7 +2598,7 @@ load_dialogues = () ->
return
return
load_dialogues_custom
=
()
->
load_dialogues_custom
=
global
.
load_dialogues_custom
=
()
->
request
url
:
settings
.
modules
.
dialogues
.
get_custom
json
:
true
...
...
@@ -3051,7 +3072,7 @@ ygopro.stoc_send_random_tip_to_room = (room)->
ygopro
.
stoc_send_random_tip
(
player
)
return
load_tips
=
()
->
load_tips
=
global
.
load_tips
=
()
->
request
url
:
settings
.
modules
.
tips
.
get
json
:
true
...
...
@@ -3066,7 +3087,7 @@ load_tips = ()->
return
return
load_tips_zh
=
()
->
load_tips_zh
=
global
.
load_tips_zh
=
()
->
request
url
:
settings
.
modules
.
tips
.
get_zh
json
:
true
...
...
@@ -3178,7 +3199,7 @@ ygopro.ctos_follow 'SURRENDER', true, (buffer, info, client, server, datas)->
return
true
return
false
report_to_big_brother
=
(
roomname
,
sender
,
ip
,
level
,
content
,
match
)
->
report_to_big_brother
=
global
.
report_to_big_brother
=
(
roomname
,
sender
,
ip
,
level
,
content
,
match
)
->
return
unless
settings
.
modules
.
big_brother
.
enabled
request
.
post
{
url
:
settings
.
modules
.
big_brother
.
post
,
form
:
{
accesskey
:
settings
.
modules
.
big_brother
.
accesskey
,
...
...
@@ -3878,9 +3899,9 @@ setInterval ()->
# spawn windbot
windbot_looplimit
=
0
windbot_process
=
null
windbot_process
=
global
.
windbot_process
=
null
spawn_windbot
=
()
->
spawn_windbot
=
global
.
spawn_windbot
=
()
->
if
/^win/
.
test
(
process
.
platform
)
windbot_bin
=
'WindBot.exe'
windbot_parameters
=
[]
...
...
@@ -4240,3 +4261,11 @@ if settings.modules.http
if
settings
.
modules
.
http
.
websocket_roomlist
and
roomlist
roomlist
.
init
https_server
,
ROOM_all
https_server
.
listen
settings
.
modules
.
http
.
ssl
.
port
if
not
fs
.
existsSync
(
'./plugins'
)
fs
.
mkdirSync
(
'./plugins'
)
plugin_list
=
fs
.
readdirSync
(
"./plugins"
)
for
plugin_filename
in
plugin_list
plugin_path
=
"./plugins/"
+
plugin_filename
require
(
plugin_path
)
ygopro-server.js
View file @
1094f445
// Generated by CoffeeScript 1.12.7
(
function
()
{
var
CLIENT_check_vip
,
CLIENT_get_absolute_pos
,
CLIENT_get_authorize_key
,
CLIENT_get_kick_reconnect_target
,
CLIENT_get_partner
,
CLIENT_heartbeat_register
,
CLIENT_heartbeat_unregister
,
CLIENT_import_data
,
CLIENT_is_able_to_kick_reconnect
,
CLIENT_is_able_to_reconnect
,
CLIENT_is_banned_by_mc
,
CLIENT_is_player
,
CLIENT_kick
,
CLIENT_kick_reconnect
,
CLIENT_pre_reconnect
,
CLIENT_reconnect
,
CLIENT_reconnect_register
,
CLIENT_reconnect_unregister
,
CLIENT_send_pre_reconnect_info
,
CLIENT_send_reconnect_info
,
CLIENT_send_replays
,
CLIENT_send_vip_status
,
CLIENT_use_cdkey
,
Cloud_replay_ids
,
ROOM_all
,
ROOM_bad_ip
,
ROOM_ban_player
,
ROOM_clear_disconnect
,
ROOM_connected_ip
,
ROOM_find_by_name
,
ROOM_find_by_p
ort
,
ROOM_find_by_title
,
ROOM_find_or_create_ai
,
ROOM_find_or_create_by_name
,
ROOM_find_or_create_random
,
ROOM_player_flee
,
ROOM_player_get_score
,
ROOM_player_lose
,
ROOM_player_win
,
ROOM_players_banned
,
ROOM_players_oppentlist
,
ROOM_players_scores
,
ROOM_unwelcome
,
ROOM_validate
,
Room
,
SERVER_clear_disconnect
,
SOCKET_flush_data
,
VIP_generate_cdkeys
,
_
,
addCallback
,
auth
,
badwords
,
ban_user
,
bunyan
,
challonge
,
challonge_cache
,
challonge_module_name
,
challonge_queue_callbacks
,
chat_color
,
concat_name
,
config
,
cppversion
,
crypto
,
date
,
default_config
,
default_data
,
dialogues
,
disconnect_list
,
dns
,
duel_log
,
e
,
exec
,
execFile
,
fs
,
geoip
,
get_callback
,
get_memory_usage
,
http
,
http_server
,
https
,
https_server
,
import_datas
,
imported
,
is_requesting
,
j
,
k
,
l
,
len1
,
len2
,
lflists
,
list
,
loadJSON
,
load_dialogues
,
load_dialogues_custom
,
load_tips
,
load_tips_zh
,
load_words
,
log
,
long_resolve_cards
,
memory_usage
,
merge
,
moment
,
net
,
oldbadwords
,
oldconfig
,
olddialogues
,
oldduellog
,
oldtips
,
oldwords
,
options
,
os
,
path
,
pgClient
,
pg_client
,
pg_query
,
real_windbot_server_ip
,
rebooted
,
redis
,
redisdb
,
ref
,
ref1
,
ref2
,
refresh_challonge_cache
,
release_disconnect
,
replace_buffer
,
report_to_big_brother
,
request
,
requestListener
,
roomlist
,
setting_change
,
setting_save
,
settings
,
spawn
,
spawnSync
,
spawn_windbot
,
sqlite3
,
tips
,
url
,
users_cache
,
v
,
vip_info
,
wait_room_start
,
wait_room_start_arena
,
windbot_looplimit
,
windbot_process
,
windbots
,
words
,
ygopro
,
zlib
;
var
CLIENT_check_vip
,
CLIENT_get_absolute_pos
,
CLIENT_get_authorize_key
,
CLIENT_get_kick_reconnect_target
,
CLIENT_get_partner
,
CLIENT_heartbeat_register
,
CLIENT_heartbeat_unregister
,
CLIENT_import_data
,
CLIENT_is_able_to_kick_reconnect
,
CLIENT_is_able_to_reconnect
,
CLIENT_is_banned_by_mc
,
CLIENT_is_player
,
CLIENT_kick
,
CLIENT_kick_reconnect
,
CLIENT_pre_reconnect
,
CLIENT_reconnect
,
CLIENT_reconnect_register
,
CLIENT_reconnect_unregister
,
CLIENT_send_pre_reconnect_info
,
CLIENT_send_reconnect_info
,
CLIENT_send_replays
,
CLIENT_send_vip_status
,
CLIENT_use_cdkey
,
Cloud_replay_ids
,
ROOM_all
,
ROOM_bad_ip
,
ROOM_ban_player
,
ROOM_clear_disconnect
,
ROOM_connected_ip
,
ROOM_find_by_name
,
ROOM_find_by_p
id
,
ROOM_find_by_port
,
ROOM_find_by_title
,
ROOM_find_or_create_ai
,
ROOM_find_or_create_by_name
,
ROOM_find_or_create_random
,
ROOM_player_flee
,
ROOM_player_get_score
,
ROOM_player_lose
,
ROOM_player_win
,
ROOM_players_banned
,
ROOM_players_oppentlist
,
ROOM_players_scores
,
ROOM_unwelcome
,
ROOM_validate
,
Room
,
SERVER_clear_disconnect
,
SOCKET_flush_data
,
VIP_generate_cdkeys
,
_
,
addCallback
,
auth
,
badwords
,
ban_user
,
bunyan
,
challonge
,
challonge_cache
,
challonge_module_name
,
challonge_queue_callbacks
,
chat_color
,
concat_name
,
config
,
cppversion
,
crypto
,
date
,
default_config
,
default_data
,
dialogues
,
disconnect_list
,
dns
,
duel_log
,
e
,
exec
,
execFile
,
fs
,
geoip
,
get_callback
,
get_memory_usage
,
http
,
http_server
,
https
,
https_server
,
import_datas
,
imported
,
is_requesting
,
j
,
k
,
l
,
len1
,
len2
,
len3
,
lflists
,
list
,
loadJSON
,
load_dialogues
,
load_dialogues_custom
,
load_tips
,
load_tips_zh
,
load_words
,
log
,
long_resolve_cards
,
m
,
memory_usage
,
merge
,
moment
,
net
,
oldbadwords
,
oldconfig
,
olddialogues
,
oldduellog
,
oldtips
,
oldwords
,
options
,
os
,
path
,
pgClient
,
pg_client
,
pg_query
,
plugin_filename
,
plugin_list
,
plugin_path
,
real_windbot_server_ip
,
rebooted
,
redis
,
redisdb
,
ref
,
ref1
,
ref2
,
refresh_challonge_cache
,
release_disconnect
,
replace_buffer
,
report_to_big_brother
,
request
,
requestListener
,
roomlist
,
setting_change
,
setting_save
,
settings
,
spawn
,
spawnSync
,
spawn_windbot
,
sqlite3
,
tips
,
url
,
users_cache
,
v
,
vip_info
,
wait_room_start
,
wait_room_start_arena
,
windbot_looplimit
,
windbot_process
,
windbots
,
words
,
ygopro
,
zlib
;
net
=
require
(
'
net
'
);
...
...
@@ -137,11 +137,11 @@
}
}
setting_save
=
function
(
settings
)
{
setting_save
=
global
.
setting_save
=
function
(
settings
)
{
fs
.
writeFileSync
(
settings
.
file
,
JSON
.
stringify
(
settings
,
null
,
2
));
};
setting_change
=
function
(
settings
,
path
,
val
)
{
setting_change
=
global
.
setting_change
=
function
(
settings
,
path
,
val
)
{
var
key
,
target
;
if
(
_
.
isString
(
val
))
{
log
.
info
(
"
setting changed
"
,
path
,
val
);
...
...
@@ -161,7 +161,7 @@
setting_save
(
settings
);
};
VIP_generate_cdkeys
=
function
(
key_type
,
count
)
{
VIP_generate_cdkeys
=
global
.
VIP_generate_cdkeys
=
function
(
key_type
,
count
)
{
var
i
,
j
,
key
,
ref
;
if
(
!
(
settings
.
modules
.
vip
.
enabled
&&
vip_info
.
cdkeys
[
key_type
]))
{
return
false
;
...
...
@@ -175,7 +175,7 @@
return
true
;
};
CLIENT_use_cdkey
=
function
(
client
,
pkey
)
{
CLIENT_use_cdkey
=
global
.
CLIENT_use_cdkey
=
function
(
client
,
pkey
)
{
var
current_date
,
found_type
,
index
,
j
,
key
,
keys
,
len1
,
new_vip
,
ref
,
type
;
if
(
!
(
settings
.
modules
.
vip
.
enabled
&&
pkey
))
{
return
0
;
...
...
@@ -229,7 +229,7 @@
return
(
new_vip
?
1
:
2
);
};
CLIENT_check_vip
=
function
(
client
)
{
CLIENT_check_vip
=
global
.
CLIENT_check_vip
=
function
(
client
)
{
if
(
!
settings
.
modules
.
vip
.
enabled
)
{
return
false
;
}
...
...
@@ -242,7 +242,7 @@
return
moment
().
isSameOrBefore
(
vip_info
.
players
[
client
.
name
].
expire_date
);
};
CLIENT_send_vip_status
=
function
(
client
,
display
)
{
CLIENT_send_vip_status
=
global
.
CLIENT_send_vip_status
=
function
(
client
,
display
)
{
if
(
!
settings
.
modules
.
vip
.
enabled
)
{
return
false
;
}
...
...
@@ -259,7 +259,7 @@
}
};
concat_name
=
function
(
name
,
num
)
{
concat_name
=
global
.
concat_name
=
function
(
name
,
num
)
{
var
count
,
res
,
temp
;
if
(
!
name
[
num
])
{
return
null
;
...
...
@@ -292,7 +292,7 @@
}
});
auth
=
require
(
'
./ygopro-auth.js
'
);
auth
=
global
.
auth
=
require
(
'
./ygopro-auth.js
'
);
imported
=
false
;
...
...
@@ -372,59 +372,59 @@
default_data
=
loadJSON
(
'
./data/default_data.json
'
);
try
{
tips
=
loadJSON
(
'
./config/tips.json
'
);
tips
=
global
.
tips
=
loadJSON
(
'
./config/tips.json
'
);
if
(
!
tips
.
tips_zh
)
{
tips
.
tips_zh
=
[];
setting_save
(
tips
);
}
}
catch
(
error1
)
{
tips
=
default_data
.
tips
;
tips
=
global
.
tips
=
default_data
.
tips
;
setting_save
(
tips
);
}
try
{
words
=
loadJSON
(
'
./config/words.json
'
);
words
=
global
.
words
=
loadJSON
(
'
./config/words.json
'
);
}
catch
(
error1
)
{
words
=
default_data
.
words
;
words
=
global
.
words
=
default_data
.
words
;
setting_save
(
words
);
}
try
{
dialogues
=
loadJSON
(
'
./config/dialogues.json
'
);
dialogues
=
global
.
dialogues
=
loadJSON
(
'
./config/dialogues.json
'
);
if
(
!
dialogues
.
dialogues_custom
)
{
dialogues
.
dialogues_custom
=
{};
setting_save
(
dialogues
);
}
}
catch
(
error1
)
{
dialogues
=
default_data
.
dialogues
;
dialogues
=
global
.
dialogues
=
default_data
.
dialogues
;
setting_save
(
dialogues
);
}
try
{
badwords
=
loadJSON
(
'
./config/badwords.json
'
);
badwords
=
global
.
badwords
=
loadJSON
(
'
./config/badwords.json
'
);
}
catch
(
error1
)
{
badwords
=
default_data
.
badwords
;
badwords
=
global
.
badwords
=
default_data
.
badwords
;
setting_save
(
badwords
);
}
try
{
duel_log
=
loadJSON
(
'
./config/duel_log.json
'
);
duel_log
=
global
.
duel_log
=
loadJSON
(
'
./config/duel_log.json
'
);
}
catch
(
error1
)
{
duel_log
=
default_data
.
duel_log
;
duel_log
=
global
.
duel_log
=
default_data
.
duel_log
;
setting_save
(
duel_log
);
}
try
{
chat_color
=
loadJSON
(
'
./config/chat_color.json
'
);
chat_color
=
global
.
chat_color
=
loadJSON
(
'
./config/chat_color.json
'
);
}
catch
(
error1
)
{
chat_color
=
default_data
.
chat_color
;
chat_color
=
global
.
chat_color
=
default_data
.
chat_color
;
setting_save
(
chat_color
);
}
try
{
vip_info
=
loadJSON
(
'
./config/vip_info.json
'
);
vip_info
=
global
.
vip_info
=
loadJSON
(
'
./config/vip_info.json
'
);
}
catch
(
error1
)
{
vip_info
=
default_data
.
vip_info
;
vip_info
=
global
.
vip_info
=
default_data
.
vip_info
;
setting_save
(
vip_info
);
}
...
...
@@ -436,7 +436,7 @@
log
.
info
(
"
ygopro version 0x
"
+
settings
.
version
.
toString
(
16
),
"
(from config)
"
);
}
lflists
=
[];
lflists
=
global
.
lflists
=
[];
try
{
ref
=
fs
.
readFileSync
(
'
ygopro/expansions/lflist.conf
'
,
'
utf8
'
).
match
(
/!.*/g
);
...
...
@@ -495,17 +495,17 @@
}
if
(
settings
.
modules
.
heartbeat_detection
.
enabled
)
{
long_resolve_cards
=
loadJSON
(
'
./data/long_resolve_cards.json
'
);
long_resolve_cards
=
global
.
long_resolve_cards
=
loadJSON
(
'
./data/long_resolve_cards.json
'
);
}
if
(
settings
.
modules
.
pre_release_compat
.
enabled
)
{
sqlite3
=
require
(
'
sqlite3
'
).
verbose
();
}
ygopro
=
require
(
'
./ygopro.js
'
);
ygopro
=
global
.
ygopro
=
require
(
'
./ygopro.js
'
);
if
(
settings
.
modules
.
http
.
websocket_roomlist
)
{
roomlist
=
require
(
'
./roomlist.js
'
);
roomlist
=
global
.
roomlist
=
require
(
'
./roomlist.js
'
);
}
if
(
settings
.
modules
.
i18n
.
auto_pick
)
{
...
...
@@ -644,9 +644,9 @@
}
}
memory_usage
=
0
;
memory_usage
=
global
.
memory_usage
=
0
;
get_memory_usage
=
function
()
{
get_memory_usage
=
get_memory_usage
=
function
()
{
var
prc_free
;
prc_free
=
exec
(
"
free
"
);
prc_free
.
stdout
.
on
(
'
data
'
,
function
(
data
)
{
...
...
@@ -673,21 +673,21 @@
setInterval
(
get_memory_usage
,
3000
);
Cloud_replay_ids
=
[];
Cloud_replay_ids
=
global
.
Cloud_replay_ids
=
[];
ROOM_all
=
[];
ROOM_all
=
global
.
ROOM_all
=
[];
ROOM_players_oppentlist
=
{};
ROOM_players_oppentlist
=
global
.
ROOM_players_oppentlist
=
{};
ROOM_players_banned
=
[];
ROOM_players_banned
=
global
.
ROOM_players_banned
=
[];
ROOM_players_scores
=
{};
ROOM_players_scores
=
global
.
ROOM_players_scores
=
{};
ROOM_connected_ip
=
{};
ROOM_connected_ip
=
global
.
ROOM_connected_ip
=
{};
ROOM_bad_ip
=
{};
ROOM_bad_ip
=
global
.
ROOM_bad_ip
=
{};
ban_user
=
function
(
name
)
{
ban_user
=
global
.
ban_user
=
function
(
name
)
{
var
bad_ip
,
len3
,
len4
,
m
,
n
,
player
,
ref3
,
room
;
settings
.
ban
.
banned_user
.
push
(
name
);
setting_save
(
settings
);
...
...
@@ -712,7 +712,7 @@
}
};
ROOM_ban_player
=
function
(
name
,
ip
,
reason
,
countadd
)
{
ROOM_ban_player
=
global
.
ROOM_ban_player
=
function
(
name
,
ip
,
reason
,
countadd
)
{
var
bannedplayer
,
bantime
;
if
(
countadd
==
null
)
{
countadd
=
1
;
...
...
@@ -745,7 +745,7 @@
}
};
ROOM_player_win
=
function
(
name
)
{
ROOM_player_win
=
global
.
ROOM_player_win
=
function
(
name
)
{
if
(
!
ROOM_players_scores
[
name
])
{
ROOM_players_scores
[
name
]
=
{
win
:
0
,
...
...
@@ -758,7 +758,7 @@
ROOM_players_scores
[
name
].
combo
=
ROOM_players_scores
[
name
].
combo
+
1
;
};
ROOM_player_lose
=
function
(
name
)
{
ROOM_player_lose
=
global
.
ROOM_player_lose
=
function
(
name
)
{
if
(
!
ROOM_players_scores
[
name
])
{
ROOM_players_scores
[
name
]
=
{
win
:
0
,
...
...
@@ -771,7 +771,7 @@
ROOM_players_scores
[
name
].
combo
=
0
;
};
ROOM_player_flee
=
function
(
name
)
{
ROOM_player_flee
=
global
.
ROOM_player_flee
=
function
(
name
)
{
if
(
!
ROOM_players_scores
[
name
])
{
ROOM_players_scores
[
name
]
=
{
win
:
0
,
...
...
@@ -784,7 +784,7 @@
ROOM_players_scores
[
name
].
combo
=
0
;
};
ROOM_player_get_score
=
function
(
player
)
{
ROOM_player_get_score
=
global
.
ROOM_player_get_score
=
function
(
player
)
{
var
name
,
score
,
total
;
name
=
player
.
name_vpass
;
score
=
ROOM_players_scores
[
name
];
...
...
@@ -833,7 +833,7 @@
},
60000
);
}
ROOM_find_or_create_by_name
=
function
(
name
,
player_ip
)
{
ROOM_find_or_create_by_name
=
global
.
ROOM_find_or_create_by_name
=
function
(
name
,
player_ip
)
{
var
room
,
uname
;
uname
=
name
.
toUpperCase
();
if
(
settings
.
modules
.
windbot
.
enabled
&&
(
uname
.
slice
(
0
,
2
)
===
'
AI
'
||
(
!
settings
.
modules
.
random_duel
.
enabled
&&
uname
===
''
)))
{
...
...
@@ -851,7 +851,7 @@
}
};
ROOM_find_or_create_random
=
function
(
type
,
player_ip
)
{
ROOM_find_or_create_random
=
global
.
ROOM_find_or_create_random
=
function
(
type
,
player_ip
)
{
var
bannedplayer
,
max_player
,
name
,
playerbanned
,
result
;
bannedplayer
=
_
.
find
(
ROOM_players_banned
,
function
(
bannedplayer
)
{
return
player_ip
===
bannedplayer
.
ip
;
...
...
@@ -900,7 +900,7 @@
return
result
;
};
ROOM_find_or_create_ai
=
function
(
name
)
{
ROOM_find_or_create_ai
=
global
.
ROOM_find_or_create_ai
=
function
(
name
)
{
var
ainame
,
namea
,
result
,
room
,
uname
,
windbot
;
if
(
name
===
''
)
{
name
=
'
AI
'
;
...
...
@@ -939,7 +939,7 @@
return
result
;
};
ROOM_find_by_name
=
function
(
name
)
{
ROOM_find_by_name
=
global
.
ROOM_find_by_name
=
function
(
name
)
{
var
result
;
result
=
_
.
find
(
ROOM_all
,
function
(
room
)
{
return
room
&&
room
.
name
===
name
;
...
...
@@ -947,7 +947,7 @@
return
result
;
};
ROOM_find_by_title
=
function
(
title
)
{
ROOM_find_by_title
=
global
.
ROOM_find_by_title
=
function
(
title
)
{
var
result
;
result
=
_
.
find
(
ROOM_all
,
function
(
room
)
{
return
room
&&
room
.
title
===
title
;
...
...
@@ -955,13 +955,19 @@
return
result
;
};
ROOM_find_by_port
=
function
(
port
)
{
ROOM_find_by_port
=
global
.
ROOM_find_by_port
=
function
(
port
)
{
return
_
.
find
(
ROOM_all
,
function
(
room
)
{
return
room
&&
room
.
port
===
port
;
});
};
ROOM_validate
=
function
(
name
)
{
ROOM_find_by_pid
=
global
.
ROOM_find_by_pid
=
function
(
pid
)
{
return
_
.
find
(
ROOM_all
,
function
(
room
)
{
return
room
&&
room
.
process_pid
===
pid
;
});
};
ROOM_validate
=
global
.
ROOM_validate
=
function
(
name
)
{
var
client_name
,
client_name_and_pass
,
client_pass
;
client_name_and_pass
=
name
.
split
(
'
$
'
,
2
);
client_name
=
client_name_and_pass
[
0
];
...
...
@@ -981,7 +987,7 @@
});
};
ROOM_unwelcome
=
function
(
room
,
bad_player
,
reason
)
{
ROOM_unwelcome
=
global
.
ROOM_unwelcome
=
function
(
room
,
bad_player
,
reason
)
{
var
len3
,
m
,
player
,
ref3
;
if
(
!
room
)
{
return
;
...
...
@@ -998,7 +1004,7 @@
}
};
CLIENT_kick
=
function
(
client
)
{
CLIENT_kick
=
global
.
CLIENT_kick
=
function
(
client
)
{
if
(
!
client
)
{
return
false
;
}
...
...
@@ -1013,7 +1019,7 @@
return
true
;
};
release_disconnect
=
function
(
dinfo
,
reconnected
)
{
release_disconnect
=
global
.
release_disconnect
=
function
(
dinfo
,
reconnected
)
{
if
(
dinfo
.
old_client
&&
!
reconnected
)
{
dinfo
.
old_client
.
destroy
();
}
...
...
@@ -1023,7 +1029,7 @@
clearTimeout
(
dinfo
.
timeout
);
};
CLIENT_get_authorize_key
=
function
(
client
)
{
CLIENT_get_authorize_key
=
global
.
CLIENT_get_authorize_key
=
function
(
client
)
{
if
(
!
settings
.
modules
.
mycard
.
enabled
&&
client
.
vpass
)
{
return
client
.
name_vpass
;
}
else
if
(
settings
.
modules
.
mycard
.
enabled
||
settings
.
modules
.
tournament_mode
.
enabled
||
settings
.
modules
.
challonge
.
enabled
||
client
.
is_local
)
{
...
...
@@ -1033,7 +1039,7 @@
}
};
CLIENT_reconnect_unregister
=
function
(
client
,
reconnected
,
exact
)
{
CLIENT_reconnect_unregister
=
global
.
CLIENT_reconnect_unregister
=
function
(
client
,
reconnected
,
exact
)
{
if
(
!
settings
.
modules
.
reconnect
.
enabled
)
{
return
false
;
}
...
...
@@ -1048,7 +1054,7 @@
return
false
;
};
CLIENT_reconnect_register
=
function
(
client
,
room_id
,
error
)
{
CLIENT_reconnect_register
=
global
.
CLIENT_reconnect_register
=
function
(
client
,
room_id
,
error
)
{
var
dinfo
,
room
,
tmot
;
room
=
ROOM_all
[
room_id
];
if
(
client
.
had_new_reconnection
)
{
...
...
@@ -1080,7 +1086,7 @@
return
true
;
};
CLIENT_import_data
=
function
(
client
,
old_client
,
room
)
{
CLIENT_import_data
=
global
.
CLIENT_import_data
=
function
(
client
,
old_client
,
room
)
{
var
index
,
key
,
len3
,
len4
,
m
,
n
,
player
,
ref3
;
ref3
=
room
.
players
;
for
(
index
=
m
=
0
,
len3
=
ref3
.
length
;
m
<
len3
;
index
=
++
m
)
{
...
...
@@ -1107,7 +1113,7 @@
old_client
.
had_new_reconnection
=
true
;
};
SERVER_clear_disconnect
=
function
(
server
)
{
SERVER_clear_disconnect
=
global
.
SERVER_clear_disconnect
=
function
(
server
)
{
if
(
!
settings
.
modules
.
reconnect
.
enabled
)
{
return
false
;
}
...
...
@@ -1122,7 +1128,7 @@
return
false
;
};
ROOM_clear_disconnect
=
function
(
room_id
)
{
ROOM_clear_disconnect
=
global
.
ROOM_clear_disconnect
=
function
(
room_id
)
{
if
(
!
settings
.
modules
.
reconnect
.
enabled
)
{
return
false
;
}
...
...
@@ -1137,7 +1143,7 @@
return
false
;
};
CLIENT_is_player
=
function
(
client
,
room
)
{
CLIENT_is_player
=
global
.
CLIENT_is_player
=
function
(
client
,
room
)
{
var
is_player
,
len3
,
m
,
player
,
ref3
;
is_player
=
false
;
ref3
=
room
.
players
;
...
...
@@ -1151,7 +1157,7 @@
return
is_player
&&
client
.
pos
<=
3
;
};
CLIENT_is_able_to_reconnect
=
function
(
client
,
deckbuf
)
{
CLIENT_is_able_to_reconnect
=
global
.
CLIENT_is_able_to_reconnect
=
function
(
client
,
deckbuf
)
{
var
disconnect_info
,
room
;
if
(
!
settings
.
modules
.
reconnect
.
enabled
)
{
return
false
;
...
...
@@ -1174,7 +1180,7 @@
return
true
;
};
CLIENT_get_kick_reconnect_target
=
function
(
client
,
deckbuf
)
{
CLIENT_get_kick_reconnect_target
=
global
.
CLIENT_get_kick_reconnect_target
=
function
(
client
,
deckbuf
)
{
var
len3
,
len4
,
m
,
n
,
player
,
ref3
,
room
;
for
(
m
=
0
,
len3
=
ROOM_all
.
length
;
m
<
len3
;
m
++
)
{
room
=
ROOM_all
[
m
];
...
...
@@ -1191,7 +1197,7 @@
return
null
;
};
CLIENT_is_able_to_kick_reconnect
=
function
(
client
,
deckbuf
)
{
CLIENT_is_able_to_kick_reconnect
=
global
.
CLIENT_is_able_to_kick_reconnect
=
function
(
client
,
deckbuf
)
{
if
(
!
(
settings
.
modules
.
reconnect
.
enabled
&&
settings
.
modules
.
reconnect
.
allow_kick_reconnect
))
{
return
false
;
}
...
...
@@ -1201,7 +1207,7 @@
return
true
;
};
CLIENT_send_pre_reconnect_info
=
function
(
client
,
room
,
old_client
)
{
CLIENT_send_pre_reconnect_info
=
global
.
CLIENT_send_pre_reconnect_info
=
function
(
client
,
room
,
old_client
)
{
var
len3
,
m
,
player
,
ref3
,
req_pos
;
ygopro
.
stoc_send_chat
(
client
,
"
${pre_reconnecting_to_room}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
ygopro
.
stoc_send
(
client
,
'
JOIN_GAME
'
,
room
.
join_game_buffer
);
...
...
@@ -1222,7 +1228,7 @@
}
};
CLIENT_send_reconnect_info
=
function
(
client
,
server
,
room
)
{
CLIENT_send_reconnect_info
=
global
.
CLIENT_send_reconnect_info
=
function
(
client
,
server
,
room
)
{
client
.
reconnecting
=
true
;
ygopro
.
stoc_send_chat
(
client
,
"
${reconnecting_to_room}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
switch
(
room
.
duel_stage
)
{
...
...
@@ -1253,7 +1259,7 @@
}
};
CLIENT_pre_reconnect
=
function
(
client
)
{
CLIENT_pre_reconnect
=
global
.
CLIENT_pre_reconnect
=
function
(
client
)
{
var
dinfo
,
player
;
if
(
CLIENT_is_able_to_reconnect
(
client
))
{
dinfo
=
disconnect_list
[
CLIENT_get_authorize_key
(
client
)];
...
...
@@ -1270,7 +1276,7 @@
}
};
CLIENT_reconnect
=
function
(
client
)
{
CLIENT_reconnect
=
global
.
CLIENT_reconnect
=
function
(
client
)
{
var
current_old_server
,
dinfo
,
room
;
if
(
!
CLIENT_is_able_to_reconnect
(
client
))
{
ygopro
.
stoc_send_chat
(
client
,
"
${reconnect_failed}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
...
...
@@ -1298,7 +1304,7 @@
CLIENT_reconnect_unregister
(
client
,
true
);
};
CLIENT_kick_reconnect
=
function
(
client
,
deckbuf
)
{
CLIENT_kick_reconnect
=
global
.
CLIENT_kick_reconnect
=
function
(
client
,
deckbuf
)
{
var
current_old_server
,
player
,
room
;
if
(
!
CLIENT_is_able_to_kick_reconnect
(
client
))
{
ygopro
.
stoc_send_chat
(
client
,
"
${reconnect_failed}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
...
...
@@ -1333,7 +1339,7 @@
disconnect_list
=
{};
}
CLIENT_heartbeat_unregister
=
function
(
client
)
{
CLIENT_heartbeat_unregister
=
global
.
CLIENT_heartbeat_unregister
=
function
(
client
)
{
if
(
!
settings
.
modules
.
heartbeat_detection
.
enabled
||
!
client
.
heartbeat_timeout
)
{
return
false
;
}
...
...
@@ -1342,7 +1348,7 @@
return
true
;
};
CLIENT_heartbeat_register
=
function
(
client
,
send
)
{
CLIENT_heartbeat_register
=
global
.
CLIENT_heartbeat_register
=
function
(
client
,
send
)
{
if
(
!
settings
.
modules
.
heartbeat_detection
.
enabled
||
client
.
closed
||
client
.
is_post_watcher
||
client
.
pre_reconnecting
||
client
.
reconnecting
||
client
.
waiting_for_last
||
client
.
pos
>
3
||
client
.
heartbeat_protected
)
{
return
false
;
}
...
...
@@ -1369,11 +1375,11 @@
return
true
;
};
CLIENT_is_banned_by_mc
=
function
(
client
)
{
CLIENT_is_banned_by_mc
=
global
.
CLIENT_is_banned_by_mc
=
function
(
client
)
{
return
client
.
ban_mc
&&
client
.
ban_mc
.
banned
&&
moment
().
isBefore
(
client
.
ban_mc
.
until
);
};
CLIENT_get_absolute_pos
=
function
(
client
)
{
CLIENT_get_absolute_pos
=
global
.
CLIENT_get_absolute_pos
=
function
(
client
)
{
var
room
;
room
=
ROOM_all
[
client
.
rid
];
if
(
room
.
hostinfo
.
mode
!==
2
||
client
.
pos
>
3
)
{
...
...
@@ -1385,7 +1391,7 @@
}
};
CLIENT_get_partner
=
function
(
client
)
{
CLIENT_get_partner
=
global
.
CLIENT_get_partner
=
function
(
client
)
{
var
room
;
room
=
ROOM_all
[
client
.
rid
];
if
(
room
.
hostinfo
.
mode
!==
2
||
client
.
pos
>
3
)
{
...
...
@@ -1398,7 +1404,7 @@
}
};
CLIENT_send_replays
=
function
(
client
,
room
)
{
CLIENT_send_replays
=
global
.
CLIENT_send_replays
=
function
(
client
,
room
)
{
var
buffer
,
i
,
len3
,
m
,
ref3
;
if
(
!
(
settings
.
modules
.
replay_delay
&&
!
(
settings
.
modules
.
tournament_mode
.
enabled
&&
settings
.
modules
.
tournament_mode
.
replay_safe
&&
settings
.
modules
.
tournament_mode
.
block_replay_to_player
)
&&
room
.
replays
.
length
&&
room
.
hostinfo
.
mode
===
1
&&
!
client
.
replays_sent
&&
!
client
.
closed
))
{
return
false
;
...
...
@@ -1417,7 +1423,7 @@
return
true
;
};
SOCKET_flush_data
=
function
(
sk
,
datas
)
{
SOCKET_flush_data
=
global
.
SOCKET_flush_data
=
function
(
sk
,
datas
)
{
var
buffer
,
len3
,
m
;
if
(
!
sk
||
sk
.
closed
)
{
return
false
;
...
...
@@ -1430,7 +1436,7 @@
return
true
;
};
replace_buffer
=
function
(
buffer
,
list
,
start_pos
)
{
replace_buffer
=
global
.
replace_buffer
=
function
(
buffer
,
list
,
start_pos
)
{
var
code
,
found
,
i
,
len
,
m
,
ref3
,
ref4
;
found
=
0
;
len
=
buffer
.
length
;
...
...
@@ -2280,7 +2286,7 @@
}
client
.
pre_establish_buffers
=
new
Array
();
client
.
on
(
'
data
'
,
function
(
ctos_buffer
)
{
var
b
,
bad_ip_count
,
buffer
,
cancel
,
ctos_
message_length
,
ctos_proto
,
datas
,
info
,
len3
,
len4
,
looplimit
,
m
,
n
,
room
,
struct
;
var
b
,
bad_ip_count
,
buffer
,
cancel
,
ctos_
event
,
ctos_message_length
,
ctos_proto
,
datas
,
info
,
len3
,
len4
,
len5
,
len6
,
looplimit
,
m
,
n
,
o
,
p
,
ref3
,
ref4
,
result
,
room
,
struct
;
if
(
client
.
is_post_watcher
)
{
room
=
ROOM_all
[
client
.
rid
];
if
(
room
&&
!
CLIENT_is_banned_by_mc
(
client
))
{
...
...
@@ -2314,17 +2320,36 @@
if
(
settings
.
modules
.
reconnect
.
enabled
&&
client
.
pre_reconnecting
&&
ygopro
.
constants
.
CTOS
[
ctos_proto
]
!==
'
UPDATE_DECK
'
)
{
cancel
=
true
;
}
b
=
ctos_buffer
.
slice
(
3
,
ctos_message_length
-
1
+
3
);
info
=
null
;
if
(
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
CTOS
[
ygopro
.
constants
.
CTOS
[
ctos_proto
]]])
{
struct
.
_setBuff
(
b
);
info
=
_
.
clone
(
struct
.
fields
);
}
if
(
ygopro
.
ctos_follows_before
[
ctos_proto
]
&&
!
cancel
)
{
ref3
=
ygopro
.
ctos_follows_before
[
ctos_proto
];
for
(
m
=
0
,
len3
=
ref3
.
length
;
m
<
len3
;
m
++
)
{
ctos_event
=
ref3
[
m
];
result
=
ctos_event
.
callback
(
b
,
info
,
client
,
client
.
server
,
datas
);
if
(
result
&&
ctos_event
.
synchronous
)
{
cancel
=
true
;
}
}
}
if
(
ygopro
.
ctos_follows
[
ctos_proto
]
&&
!
cancel
)
{
b
=
ctos_buffer
.
slice
(
3
,
ctos_message_length
-
1
+
3
);
info
=
null
;
if
(
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
CTOS
[
ygopro
.
constants
.
CTOS
[
ctos_proto
]]])
{
struct
.
_setBuff
(
b
);
info
=
_
.
clone
(
struct
.
fields
);
result
=
ygopro
.
ctos_follows
[
ctos_proto
].
callback
(
b
,
info
,
client
,
client
.
server
,
datas
);
if
(
result
&&
ygopro
.
ctos_follows
[
ctos_proto
].
synchronous
)
{
cancel
=
true
;
}
if
(
ygopro
.
ctos_follows
[
ctos_proto
].
synchronous
)
{
cancel
=
ygopro
.
ctos_follows
[
ctos_proto
].
callback
(
b
,
info
,
client
,
client
.
server
,
datas
);
}
else
{
ygopro
.
ctos_follows
[
ctos_proto
].
callback
(
b
,
info
,
client
,
client
.
server
,
datas
);
}
if
(
ygopro
.
ctos_follows_after
[
ctos_proto
]
&&
!
cancel
)
{
ref4
=
ygopro
.
ctos_follows_after
[
ctos_proto
];
for
(
n
=
0
,
len4
=
ref4
.
length
;
n
<
len4
;
n
++
)
{
ctos_event
=
ref4
[
n
];
result
=
ctos_event
.
callback
(
b
,
info
,
client
,
client
.
server
,
datas
);
if
(
result
&&
ctos_event
.
synchronous
)
{
cancel
=
true
;
}
}
}
if
(
!
cancel
)
{
...
...
@@ -2357,20 +2382,20 @@
return
;
}
if
(
client
.
established
)
{
for
(
m
=
0
,
len3
=
datas
.
length
;
m
<
len3
;
m
++
)
{
buffer
=
datas
[
m
];
for
(
o
=
0
,
len5
=
datas
.
length
;
o
<
len5
;
o
++
)
{
buffer
=
datas
[
o
];
client
.
server
.
write
(
buffer
);
}
}
else
{
for
(
n
=
0
,
len4
=
datas
.
length
;
n
<
len4
;
n
++
)
{
buffer
=
datas
[
n
];
for
(
p
=
0
,
len6
=
datas
.
length
;
p
<
len6
;
p
++
)
{
buffer
=
datas
[
p
];
client
.
pre_establish_buffers
.
push
(
buffer
);
}
}
}
});
server
.
on
(
'
data
'
,
function
(
stoc_buffer
)
{
var
b
,
buffer
,
cancel
,
datas
,
info
,
len3
,
l
ooplimit
,
m
,
stanzas
,
stoc_message_length
,
stoc_proto
,
struct
;
var
b
,
buffer
,
cancel
,
datas
,
info
,
len3
,
l
en4
,
len5
,
looplimit
,
m
,
n
,
o
,
ref3
,
ref4
,
result
,
stoc_event
,
stoc_message_length
,
stoc_proto
,
struct
;
stoc_message_length
=
0
;
stoc_proto
=
0
;
datas
=
[];
...
...
@@ -2395,18 +2420,36 @@
}
else
{
if
(
stoc_buffer
.
length
>=
2
+
stoc_message_length
)
{
cancel
=
false
;
stanzas
=
stoc_proto
;
if
(
ygopro
.
stoc_follows
[
stoc_proto
])
{
b
=
stoc_buffer
.
slice
(
3
,
stoc_message_length
-
1
+
3
);
info
=
null
;
if
(
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
STOC
[
ygopro
.
constants
.
STOC
[
stoc_proto
]]])
{
struct
.
_setBuff
(
b
);
info
=
_
.
clone
(
struct
.
fields
);
b
=
stoc_buffer
.
slice
(
3
,
stoc_message_length
-
1
+
3
);
info
=
null
;
if
(
struct
=
ygopro
.
structs
[
ygopro
.
proto_structs
.
STOC
[
ygopro
.
constants
.
STOC
[
stoc_proto
]]])
{
struct
.
_setBuff
(
b
);
info
=
_
.
clone
(
struct
.
fields
);
}
if
(
ygopro
.
stoc_follows_before
[
stoc_proto
]
&&
!
cancel
)
{
ref3
=
ygopro
.
stoc_follows_before
[
stoc_proto
];
for
(
m
=
0
,
len3
=
ref3
.
length
;
m
<
len3
;
m
++
)
{
stoc_event
=
ref3
[
m
];
result
=
stoc_event
.
callback
(
b
,
info
,
server
.
client
,
server
,
datas
);
if
(
result
&&
stoc_event
.
synchronous
)
{
cancel
=
true
;
}
}
if
(
ygopro
.
stoc_follows
[
stoc_proto
].
synchronous
)
{
cancel
=
ygopro
.
stoc_follows
[
stoc_proto
].
callback
(
b
,
info
,
server
.
client
,
server
,
datas
);
}
else
{
ygopro
.
stoc_follows
[
stoc_proto
].
callback
(
b
,
info
,
server
.
client
,
server
,
datas
);
}
if
(
ygopro
.
stoc_follows
[
stoc_proto
]
&&
!
cancel
)
{
result
=
ygopro
.
stoc_follows
[
stoc_proto
].
callback
(
b
,
info
,
server
.
client
,
server
,
datas
);
if
(
result
&&
ygopro
.
stoc_follows
[
stoc_proto
].
synchronous
)
{
cancel
=
true
;
}
}
if
(
ygopro
.
stoc_follows_after
[
stoc_proto
]
&&
!
cancel
)
{
ref4
=
ygopro
.
stoc_follows_after
[
stoc_proto
];
for
(
n
=
0
,
len4
=
ref4
.
length
;
n
<
len4
;
n
++
)
{
stoc_event
=
ref4
[
n
];
result
=
stoc_event
.
callback
(
b
,
info
,
server
.
client
,
server
,
datas
);
if
(
result
&&
stoc_event
.
synchronous
)
{
cancel
=
true
;
}
}
}
if
(
!
cancel
)
{
...
...
@@ -2428,8 +2471,8 @@
}
}
if
(
server
.
client
&&
!
server
.
client
.
closed
)
{
for
(
m
=
0
,
len3
=
datas
.
length
;
m
<
len3
;
m
++
)
{
buffer
=
datas
[
m
];
for
(
o
=
0
,
len5
=
datas
.
length
;
o
<
len5
;
o
++
)
{
buffer
=
datas
[
o
];
server
.
client
.
write
(
buffer
);
}
}
...
...
@@ -3186,7 +3229,7 @@
}
});
load_words
=
function
()
{
load_words
=
global
.
load_words
=
function
()
{
request
({
url
:
settings
.
modules
.
words
.
get
,
json
:
true
...
...
@@ -3206,7 +3249,7 @@
load_words
();
}
load_dialogues
=
function
()
{
load_dialogues
=
global
.
load_dialogues
=
function
()
{
request
({
url
:
settings
.
modules
.
dialogues
.
get
,
json
:
true
...
...
@@ -3222,7 +3265,7 @@
});
};
load_dialogues_custom
=
function
()
{
load_dialogues_custom
=
global
.
load_dialogues_custom
=
function
()
{
request
({
url
:
settings
.
modules
.
dialogues
.
get_custom
,
json
:
true
...
...
@@ -3898,7 +3941,7 @@
}
};
load_tips
=
function
()
{
load_tips
=
global
.
load_tips
=
function
()
{
request
({
url
:
settings
.
modules
.
tips
.
get
,
json
:
true
...
...
@@ -3914,7 +3957,7 @@
});
};
load_tips_zh
=
function
()
{
load_tips_zh
=
global
.
load_tips_zh
=
function
()
{
request
({
url
:
settings
.
modules
.
tips
.
get_zh
,
json
:
true
...
...
@@ -4077,7 +4120,7 @@
return
false
;
});
report_to_big_brother
=
function
(
roomname
,
sender
,
ip
,
level
,
content
,
match
)
{
report_to_big_brother
=
global
.
report_to_big_brother
=
function
(
roomname
,
sender
,
ip
,
level
,
content
,
match
)
{
if
(
!
settings
.
modules
.
big_brother
.
enabled
)
{
return
;
}
...
...
@@ -5046,9 +5089,9 @@
windbot_looplimit
=
0
;
windbot_process
=
null
;
windbot_process
=
global
.
windbot_process
=
null
;
spawn_windbot
=
function
()
{
spawn_windbot
=
global
.
spawn_windbot
=
function
()
{
var
windbot_bin
,
windbot_parameters
;
if
(
/^win/
.
test
(
process
.
platform
))
{
windbot_bin
=
'
WindBot.exe
'
;
...
...
@@ -5497,4 +5540,16 @@
}
}
if
(
!
fs
.
existsSync
(
'
./plugins
'
))
{
fs
.
mkdirSync
(
'
./plugins
'
);
}
plugin_list
=
fs
.
readdirSync
(
"
./plugins
"
);
for
(
m
=
0
,
len3
=
plugin_list
.
length
;
m
<
len3
;
m
++
)
{
plugin_filename
=
plugin_list
[
m
];
plugin_path
=
"
./plugins/
"
+
plugin_filename
;
require
(
plugin_path
);
}
}).
call
(
this
);
ygopro.coffee
View file @
1094f445
...
...
@@ -37,26 +37,55 @@ for name, declaration of structs_declaration
#消息跟踪函数 需要重构, 另暂时只支持异步, 同步没做.
@
stoc_follows
=
{}
@
stoc_follows_before
=
{}
@
stoc_follows_after
=
{}
@
ctos_follows
=
{}
@
ctos_follows_before
=
{}
@
ctos_follows_after
=
{}
@
replace_proto
=
(
proto
,
tp
)
->
if
typeof
(
proto
)
!=
"string"
return
proto
changed_proto
=
proto
for
key
,
value
of
@
constants
[
tp
]
if
value
==
proto
changed_proto
=
key
break
throw
"unknown proto"
if
!
@
constants
[
tp
][
changed_proto
]
return
changed_proto
@
stoc_follow
=
(
proto
,
synchronous
,
callback
)
->
if
typeof
proto
==
'string'
for
key
,
value
of
@
constants
.
STOC
if
value
==
proto
proto
=
key
break
throw
"unknown proto"
if
!
@
constants
.
STOC
[
proto
]
@
stoc_follows
[
proto
]
=
{
callback
:
callback
,
synchronous
:
synchronous
}
changed_proto
=
@
replace_proto
(
proto
,
"STOC"
)
@
stoc_follows
[
changed_proto
]
=
{
callback
:
callback
,
synchronous
:
synchronous
}
return
@
stoc_follow_before
=
(
proto
,
synchronous
,
callback
)
->
changed_proto
=
@
replace_proto
(
proto
,
"STOC"
)
if
!
@
stoc_follows_before
[
changed_proto
]
@
stoc_follows_before
[
changed_proto
]
=
[]
@
stoc_follows_before
[
changed_proto
].
push
({
callback
:
callback
,
synchronous
:
synchronous
})
return
@
stoc_follow_after
=
(
proto
,
synchronous
,
callback
)
->
changed_proto
=
@
replace_proto
(
proto
,
"STOC"
)
if
!
@
stoc_follows_after
[
changed_proto
]
@
stoc_follows_after
[
changed_proto
]
=
[]
@
stoc_follows_after
[
changed_proto
].
push
({
callback
:
callback
,
synchronous
:
synchronous
})
return
@
ctos_follow
=
(
proto
,
synchronous
,
callback
)
->
if
typeof
proto
==
'string'
for
key
,
value
of
@
constants
.
CTOS
if
value
==
proto
proto
=
key
break
throw
"unknown proto"
if
!
@
constants
.
CTOS
[
proto
]
@
ctos_follows
[
proto
]
=
{
callback
:
callback
,
synchronous
:
synchronous
}
changed_proto
=
@
replace_proto
(
proto
,
"CTOS"
)
@
ctos_follows
[
changed_proto
]
=
{
callback
:
callback
,
synchronous
:
synchronous
}
return
@
ctos_follow_before
=
(
proto
,
synchronous
,
callback
)
->
changed_proto
=
@
replace_proto
(
proto
,
"CTOS"
)
if
!
@
ctos_follows_before
[
changed_proto
]
@
ctos_follows_before
[
changed_proto
]
=
[]
@
ctos_follows_before
[
changed_proto
].
push
({
callback
:
callback
,
synchronous
:
synchronous
})
return
@
ctos_follow_after
=
(
proto
,
synchronous
,
callback
)
->
changed_proto
=
@
replace_proto
(
proto
,
"CTOS"
)
if
!
@
ctos_follows_after
[
changed_proto
]
@
ctos_follows_after
[
changed_proto
]
=
[]
@
ctos_follows_after
[
changed_proto
].
push
({
callback
:
callback
,
synchronous
:
synchronous
})
return
#消息发送函数,至少要把俩合起来....
@
stoc_send
=
(
socket
,
proto
,
info
)
->
...
...
@@ -171,4 +200,4 @@ for name, declaration of structs_declaration
if
client
client
.
system_kicked
=
true
client
.
destroy
()
return
\ No newline at end of file
return
ygopro.js
View file @
1094f445
...
...
@@ -58,50 +58,102 @@
this
.
stoc_follows
=
{};
this
.
stoc_follows_before
=
{};
this
.
stoc_follows_after
=
{};
this
.
ctos_follows
=
{};
this
.
stoc_follow
=
function
(
proto
,
synchronous
,
callback
)
{
var
key
,
ref
,
value
;
if
(
typeof
proto
===
'
string
'
)
{
ref
=
this
.
constants
.
STOC
;
for
(
key
in
ref
)
{
value
=
ref
[
key
];
if
(
value
===
proto
)
{
proto
=
key
;
break
;
}
}
if
(
!
this
.
constants
.
STOC
[
proto
])
{
throw
"
unknown proto
"
;
this
.
ctos_follows_before
=
{};
this
.
ctos_follows_after
=
{};
this
.
replace_proto
=
function
(
proto
,
tp
)
{
var
changed_proto
,
key
,
ref
,
value
;
if
(
typeof
proto
!==
"
string
"
)
{
return
proto
;
}
changed_proto
=
proto
;
ref
=
this
.
constants
[
tp
];
for
(
key
in
ref
)
{
value
=
ref
[
key
];
if
(
value
===
proto
)
{
changed_proto
=
key
;
break
;
}
}
this
.
stoc_follows
[
proto
]
=
{
if
(
!
this
.
constants
[
tp
][
changed_proto
])
{
throw
"
unknown proto
"
;
}
return
changed_proto
;
};
this
.
stoc_follow
=
function
(
proto
,
synchronous
,
callback
)
{
var
changed_proto
;
changed_proto
=
this
.
replace_proto
(
proto
,
"
STOC
"
);
this
.
stoc_follows
[
changed_proto
]
=
{
callback
:
callback
,
synchronous
:
synchronous
};
};
this
.
ctos_follow
=
function
(
proto
,
synchronous
,
callback
)
{
var
key
,
ref
,
value
;
if
(
typeof
proto
===
'
string
'
)
{
ref
=
this
.
constants
.
CTOS
;
for
(
key
in
ref
)
{
value
=
ref
[
key
];
if
(
value
===
proto
)
{
proto
=
key
;
break
;
}
}
if
(
!
this
.
constants
.
CTOS
[
proto
])
{
throw
"
unknown proto
"
;
}
this
.
stoc_follow_before
=
function
(
proto
,
synchronous
,
callback
)
{
var
changed_proto
;
changed_proto
=
this
.
replace_proto
(
proto
,
"
STOC
"
);
if
(
!
this
.
stoc_follows_before
[
changed_proto
])
{
this
.
stoc_follows_before
[
changed_proto
]
=
[];
}
this
.
ctos_follows
[
proto
]
=
{
this
.
stoc_follows_before
[
changed_proto
].
push
({
callback
:
callback
,
synchronous
:
synchronous
});
};
this
.
stoc_follow_after
=
function
(
proto
,
synchronous
,
callback
)
{
var
changed_proto
;
changed_proto
=
this
.
replace_proto
(
proto
,
"
STOC
"
);
if
(
!
this
.
stoc_follows_after
[
changed_proto
])
{
this
.
stoc_follows_after
[
changed_proto
]
=
[];
}
this
.
stoc_follows_after
[
changed_proto
].
push
({
callback
:
callback
,
synchronous
:
synchronous
});
};
this
.
ctos_follow
=
function
(
proto
,
synchronous
,
callback
)
{
var
changed_proto
;
changed_proto
=
this
.
replace_proto
(
proto
,
"
CTOS
"
);
this
.
ctos_follows
[
changed_proto
]
=
{
callback
:
callback
,
synchronous
:
synchronous
};
};
this
.
ctos_follow_before
=
function
(
proto
,
synchronous
,
callback
)
{
var
changed_proto
;
changed_proto
=
this
.
replace_proto
(
proto
,
"
CTOS
"
);
if
(
!
this
.
ctos_follows_before
[
changed_proto
])
{
this
.
ctos_follows_before
[
changed_proto
]
=
[];
}
this
.
ctos_follows_before
[
changed_proto
].
push
({
callback
:
callback
,
synchronous
:
synchronous
});
};
this
.
ctos_follow_after
=
function
(
proto
,
synchronous
,
callback
)
{
var
changed_proto
;
changed_proto
=
this
.
replace_proto
(
proto
,
"
CTOS
"
);
if
(
!
this
.
ctos_follows_after
[
changed_proto
])
{
this
.
ctos_follows_after
[
changed_proto
]
=
[];
}
this
.
ctos_follows_after
[
changed_proto
].
push
({
callback
:
callback
,
synchronous
:
synchronous
});
};
this
.
stoc_send
=
function
(
socket
,
proto
,
info
)
{
var
buffer
,
header
,
key
,
ref
,
struct
,
value
;
if
(
socket
.
closed
)
{
...
...
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