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
c0edb987
Commit
c0edb987
authored
Jul 25, 2018
by
nanahira
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add vip
parent
fa26789b
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
766 additions
and
196 deletions
+766
-196
data/default_config.json
data/default_config.json
+6
-1
data/default_data.json
data/default_data.json
+13
-0
data/i18n.json
data/i18n.json
+56
-0
ygopro-server.coffee
ygopro-server.coffee
+220
-12
ygopro-server.js
ygopro-server.js
+471
-183
No files found.
data/default_config.json
View file @
c0edb987
...
...
@@ -66,6 +66,10 @@
"enabled"
:
true
,
"get"
:
false
},
"vip"
:
{
"enabled"
:
false
,
"generate_count"
:
50
},
"random_duel"
:
{
"enabled"
:
false
,
"no_rematch_check"
:
false
,
...
...
@@ -85,7 +89,8 @@
"my_ip"
:
"127.0.0.1"
},
"chat_color"
:
{
"enabled"
:
false
"enabled"
:
false
,
"restrict_to_vip"
:
false
},
"retry_handle"
:
{
"enabled"
:
true
,
...
...
data/default_data.json
View file @
c0edb987
...
...
@@ -50,5 +50,18 @@
"chat_color"
:
{
"file"
:
"./config/chat_color.json"
,
"save_list"
:
{}
},
"vip_info"
:
{
"file"
:
"./config/vip_info.json"
,
"cdkeys"
:
{
"365"
:
[],
"180"
:
[],
"90"
:
[],
"30"
:
[],
"7"
:
[],
"3"
:
[],
"1"
:
[]
},
"players"
:
{}
}
}
\ No newline at end of file
data/i18n.json
View file @
c0edb987
...
...
@@ -73,6 +73,14 @@
"chat_order_tip"
:
"/tip show a tip"
,
"chat_order_chatcolor_1"
:
"/color show the current chat color, /color colorname set the chat color"
,
"chat_order_chatcolor_2"
:
"/color default restore the default chat color, /color help list all available color"
,
"chat_order_vip"
:
"/vip to view your supporter info, /vip help to view the help of supporter"
,
"chat_order_vip_help"
:
"/vip help to show this list"
,
"chat_order_vip_status"
:
"/vip status to view your supporter info"
,
"chat_order_vip_buy"
:
"/vip buy YOUR_KEY to become a supporter"
,
"chat_order_vip_password"
:
"/vip password NEW_PASSWORD to change password"
,
"chat_order_vip_dialogues"
:
"/vip dialogues CARD_CODE DIALOGUE to set a dialogue for a specific card"
,
"chat_order_vip_words"
:
"/vip words WORD to set your word when joining in the server"
,
"chat_order_vip_victory"
:
"/vip victory WORD to set your word when you win a duel"
,
"room_name"
:
"Room name is"
,
"banned_chat_tip"
:
"You are banned from chatting."
,
"banned_duel_tip"
:
"You are banned from the random duel system for sending inappropriate messages."
,
...
...
@@ -144,6 +152,26 @@
"challonge_match_already_finished"
:
"Your current match was already finished. Please call the judge for any help."
,
"challonge_match_created"
:
"A room for match only is created. Your opponent will join in automatically."
,
"challonge_player_already_in"
:
"Please do not enter the room you are already in."
,
"vip_remain_part1"
:
"Your supporter identity will be expired at "
,
"vip_remain_part2"
:
". Thanks for your support."
,
"vip_remain"
:
"You have already been a supporter. Welcome back!"
,
"vip_not_bought"
:
"You are not a supporter yet. enter /vip buy KEY to become one."
,
"vip_expired_part1"
:
"Your supporter identity have been expired at "
,
"vip_expired_part2"
:
". Welcome to support again."
,
"vip_key_not_found"
:
"Key not found."
,
"vip_success_new_part1"
:
"Support success. Use "
,
"vip_success_new_part2"
:
" as your name to get the supporter goodies. Thanks for your support."
,
"vip_success_renew"
:
"Support success. Thanks again for your support."
,
"vip_invalid_card_code"
:
"Invalid card code."
,
"vip_cleared_dialogues_part1"
:
"Deleted the dialogue for "
,
"vip_cleared_dialogues_part2"
:
"."
,
"vip_set_dialogues_part1"
:
"Dialogue for "
,
"vip_set_dialogues_part2"
:
" have been set."
,
"vip_cleared_words"
:
"Your join word have been deleted."
,
"vip_set_words"
:
"Your join word have been set."
,
"vip_cleared_victory"
:
"Your victory word have been deleted."
,
"vip_set_victory"
:
"Your victory word have been set."
,
"vip_password_changed"
:
"Password changed."
,
"athletic_arena_tip"
:
"During an athletic match, a game quit behavior is regarded as a surrender."
},
"es-es"
:
{
...
...
@@ -357,6 +385,14 @@
"chat_order_tip"
:
"/tip 显示一条提示"
,
"chat_order_chatcolor_1"
:
"/color 查看自己的聊天文字颜色,/color 颜色名 设定自己的聊天文字颜色"
,
"chat_order_chatcolor_2"
:
"/color default 恢复默认聊天字体颜色,/color help 查看所有可用的颜色"
,
"chat_order_vip"
:
"/vip 查看捐助信息,/vip help 显示捐助指令帮助"
,
"chat_order_vip_help"
:
"/vip help 显示此帮助"
,
"chat_order_vip_status"
:
"/vip status 查看自己的捐助信息"
,
"chat_order_vip_buy"
:
"/vip buy 卡密 获取捐助特权"
,
"chat_order_vip_password"
:
"/vip password 新密码 修改自己的密码"
,
"chat_order_vip_dialogues"
:
"/vip dialogues 卡号 台词 设置特定卡的召唤台词"
,
"chat_order_vip_words"
:
"/vip words 台词 设置自己的进场台词"
,
"chat_order_vip_victory"
:
"/vip victory 台词 设置自己的胜利台词"
,
"room_name"
:
"您当前的房间名是"
,
"banned_chat_tip"
:
"您已被禁言!"
,
"banned_duel_tip"
:
"您的发言存在严重不适当的内容,禁止您使用随机对战功能!"
,
...
...
@@ -428,6 +464,26 @@
"challonge_match_already_finished"
:
"你在当前轮次的比赛已经结束,如需重赛,请联系裁判。"
,
"challonge_match_created"
:
"已建立比赛专用房间,将会自动匹配你的对手。"
,
"challonge_player_already_in"
:
"请不要重复加入比赛房间。"
,
"vip_remain_part1"
:
"你的捐助者特权将在 "
,
"vip_remain_part2"
:
" 时到期。感谢您的支持。"
,
"vip_remain"
:
"尊敬的捐助者,欢迎回来。"
,
"vip_not_bought"
:
"你还未成为捐助者。输入 /vip buy 卡密 进行捐助。"
,
"vip_expired_part1"
:
"你的捐助者特权已在 "
,
"vip_expired_part2"
:
" 时到期。欢迎再次捐助。"
,
"vip_key_not_found"
:
"卡密不存在。"
,
"vip_success_new_part1"
:
"捐助成功。进房时输入 "
,
"vip_success_new_part2"
:
" 即可享受捐助特权。感谢您对服务器的支持。"
,
"vip_success_renew"
:
"续费成功。感谢您对服务器的再次支持。"
,
"vip_invalid_card_code"
:
"非法卡号。"
,
"vip_cleared_dialogues_part1"
:
"已删除 "
,
"vip_cleared_dialogues_part2"
:
" 的召唤台词。"
,
"vip_set_dialogues_part1"
:
"已为 "
,
"vip_set_dialogues_part2"
:
" 设置召唤台词。"
,
"vip_cleared_words"
:
"已删除进场台词。"
,
"vip_set_words"
:
"已设置进场台词。"
,
"vip_cleared_victory"
:
"已删除胜利台词。"
,
"vip_set_victory"
:
"已设置胜利台词。"
,
"vip_password_changed"
:
"密码修改成功。"
,
"athletic_arena_tip"
:
"在竞技匹配中,比赛开始前退出游戏也会视为投降。"
},
"ko-kr"
:
{
...
...
ygopro-server.coffee
View file @
c0edb987
...
...
@@ -42,6 +42,8 @@ moment.locale('zh-cn', {
import_datas
=
[
"abuse_count"
,
"vip"
,
"vpass"
,
"rag"
,
"rid"
,
"is_post_watcher"
,
...
...
@@ -151,6 +153,67 @@ setting_change = (settings, path, val) ->
setting_save
(
settings
)
return
VIP_generate_cdkeys
=
(
key_type
,
count
)
->
return
false
unless
settings
.
modules
.
vip
.
enabled
and
vip_info
.
cdkeys
[
key_type
]
for
i
in
[
1
...
count
]
key
=
Math
.
floor
(
Math
.
random
()
*
10000000000000000
).
toString
()
vip_info
.
cdkeys
[
key_type
].
push
(
key
)
setting_save
(
vip_info
)
return
true
CLIENT_use_cdkey
=
(
client
,
pkey
)
->
return
0
unless
settings
.
modules
.
vip
.
enabled
and
pkey
found_type
=
null
for
type
,
keys
of
vip_info
.
cdkeys
for
key
in
keys
when
pkey
==
key
found_type
=
parseInt
(
type
)
index
=
_
.
indexOf
(
keys
,
key
)
keys
.
splice
(
index
,
1
)
unless
index
==
-
1
break
if
found_type
break
if
!
found_type
return
0
if
!
vip_info
.
cdkeys
[
found_type
].
length
VIP_generate_cdkeys
(
found_type
,
settings
.
modules
.
vip
.
generate_count
)
client
.
vip
=
true
new_vip
=
false
if
vip_info
.
players
[
client
.
name
]
vip_info
.
players
[
client
.
name
].
expire_date
=
moment
().
add
(
found_type
,
'd'
).
format
(
'YYYY-MM-DD HH:mm:ss'
)
else
if
!
client
.
vpass
client
.
vpass
=
Math
.
floor
(
Math
.
random
()
*
100000
).
toString
()
vip_info
.
players
[
client
.
name
]
=
{
password
:
client
.
vpass
,
expire_date
:
moment
().
add
(
found_type
,
'd'
).
format
(
'YYYY-MM-DD HH:mm:ss'
),
dialogues
:
{}
}
new_vip
=
true
setting_save
(
vip_info
)
return
(
if
new_vip
then
1
else
2
)
CLIENT_check_vip
=
(
client
)
->
if
!
settings
.
modules
.
vip
.
enabled
return
false
if
!
vip_info
.
players
[
client
.
name
]
return
false
if
vip_info
.
players
[
client
.
name
].
password
!=
client
.
vpass
return
false
return
moment
().
isSameOrBefore
(
vip_info
.
players
[
client
.
name
].
expire_date
)
CLIENT_send_vip_status
=
(
client
,
display
)
->
if
!
settings
.
modules
.
vip
.
enabled
return
false
if
client
.
vip
if
display
ygopro
.
stoc_send_chat
(
client
,
"${vip_remain_part1}"
+
vip_info
.
players
[
client
.
name
].
expire_date
+
"${vip_remain_part2}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
else
ygopro
.
stoc_send_chat
(
client
,
"${vip_remain}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
else
if
!
vip_info
.
players
[
client
.
name
]
or
vip_info
.
players
[
client
.
name
].
password
!=
client
.
vpass
ygopro
.
stoc_send_chat
(
client
,
"${vip_not_bought}"
,
ygopro
.
constants
.
COLORS
.
RED
)
else
ygopro
.
stoc_send_chat
(
client
,
"${vip_expired_part1}"
+
vip_info
.
players
[
client
.
name
].
expire_date
+
"${vip_expired_part2}"
,
ygopro
.
constants
.
COLORS
.
RED
)
# 读取配置
default_config
=
loadJSON
(
'./data/default_config.json'
)
try
...
...
@@ -199,6 +262,13 @@ try
catch
chat_color
=
default_data
.
chat_color
setting_save
(
chat_color
)
try
vip_info
=
loadJSON
(
'./config/vip_info.json'
)
catch
vip_info
=
default_data
.
vip_info
for
k
,
v
of
vip_info
.
cdkeys
VIP_generate_cdkeys
(
k
,
settings
.
modules
.
vip
.
generate_count
)
setting_save
(
vip_info
)
try
cppversion
=
parseInt
(
fs
.
readFileSync
(
'ygopro/gframe/game.cpp'
,
'utf8'
).
match
(
/PRO_VERSION = ([x\dABCDEF]+)/
)[
1
],
'16'
)
...
...
@@ -474,6 +544,8 @@ release_disconnect = (dinfo, reconnected) ->
return
CLIENT_get_authorize_key
=
(
client
)
->
if
settings
.
modules
.
vip
.
enabled
and
client
.
vip
return
client
.
name
+
"$"
+
client
.
vpass
if
settings
.
modules
.
mycard
.
enabled
or
settings
.
modules
.
tournament_mode
.
enabled
or
settings
.
modules
.
challonge
.
enabled
or
client
.
is_local
return
client
.
name
else
...
...
@@ -1310,7 +1382,9 @@ if settings.modules.stop
ygopro
.
ctos_follow
'PLAYER_INFO'
,
true
,
(
buffer
,
info
,
client
,
server
)
->
# checkmate use username$password, but here don't
# so remove the password
name
=
info
.
name
.
split
(
"$"
)[
0
]
name_full
=
info
.
name
.
split
(
"$"
)
name
=
name_full
[
0
]
vpass
=
name_full
[
1
]
if
(
_
.
any
(
settings
.
ban
.
illegal_id
,
(
badid
)
->
regexp
=
new
RegExp
(
badid
,
'i'
)
matchs
=
name
.
match
(
regexp
)
...
...
@@ -1325,6 +1399,9 @@ ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)->
struct
.
set
(
"name"
,
name
)
buffer
=
struct
.
buffer
client
.
name
=
name
client
.
vpass
=
vpass
if
settings
.
modules
.
vip
.
enabled
and
CLIENT_check_vip
(
client
)
client
.
vip
=
true
if
not
settings
.
modules
.
i18n
.
auto_pick
or
client
.
is_local
client
.
lang
=
settings
.
modules
.
i18n
.
default
...
...
@@ -1723,6 +1800,9 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
if
settings
.
modules
.
words
.
enabled
and
words
.
words
[
client
.
name
]
for
line
in
_
.
lines
words
.
words
[
client
.
name
][
Math
.
floor
(
Math
.
random
()
*
words
.
words
[
client
.
name
].
length
)]
ygopro
.
stoc_send_chat_to_room
(
room
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
)
else
if
settings
.
modules
.
vip
.
enabled
and
client
.
vip
and
vip_info
.
players
[
client
.
name
].
words
for
line
in
_
.
lines
vip_info
.
players
[
client
.
name
].
words
ygopro
.
stoc_send_chat_to_room
(
room
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
)
if
settings
.
modules
.
welcome
ygopro
.
stoc_send_chat
(
client
,
settings
.
modules
.
welcome
,
ygopro
.
constants
.
COLORS
.
GREEN
)
if
room
.
welcome
...
...
@@ -1972,6 +2052,12 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server)->
room
.
winner_name
=
room
.
dueling_players
[
pos
].
name
#log.info room.dueling_players, pos
room
.
scores
[
room
.
winner_name
]
=
room
.
scores
[
room
.
winner_name
]
+
1
if
settings
.
modules
.
vip
.
enabled
and
room
.
dueling_players
[
pos
].
vip
and
vip_info
.
players
[
room
.
dueling_players
[
pos
].
name
].
victory
for
line
in
_
.
lines
vip_info
.
players
[
room
.
dueling_players
[
pos
].
name
].
victory
ygopro
.
stoc_send_chat_to_room
(
room
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
)
else
if
room
.
hostinfo
.
mode
==
2
and
settings
.
modules
.
vip
.
enabled
and
room
.
dueling_players
[
pos
+
1
].
vip
and
vip_info
.
players
[
room
.
dueling_players
[
pos
+
1
].
name
].
victory
for
line
in
_
.
lines
vip_info
.
players
[
room
.
dueling_players
[
pos
+
1
].
name
].
victory
ygopro
.
stoc_send_chat_to_room
(
room
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
)
if
settings
.
modules
.
challonge
.
enabled
and
!
room
.
kicked
if
room
.
scores
[
room
.
dueling_players
[
0
].
name
]
>
room
.
scores
[
room
.
dueling_players
[
1
].
name
]
room
.
challonge_duel_log
.
winnerId
=
room
.
dueling_players
[
0
].
challonge_info
.
id
...
...
@@ -2110,15 +2196,26 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server)->
delete
room
.
long_resolve_chain
#登场台词
if
settings
.
modules
.
dialogues
.
enabled
if
settings
.
modules
.
dialogues
.
enabled
or
settings
.
modules
.
vip
.
enabled
if
ygopro
.
constants
.
MSG
[
msg
]
==
'SUMMONING'
or
ygopro
.
constants
.
MSG
[
msg
]
==
'SPSUMMONING'
or
ygopro
.
constants
.
MSG
[
msg
]
==
'CHAINING'
card
=
buffer
.
readUInt32LE
(
1
)
trigger_location
=
buffer
.
readUInt8
(
6
)
act_pos
=
buffer
.
readUInt8
(
if
ygopro
.
constants
.
MSG
[
msg
]
==
'CHAINING'
then
9
else
5
)
if
!
room
.
dueling_players
[
0
].
is_first
act_pos
=
1
-
act_pos
if
room
.
hostinfo
.
mode
==
2
act_pos
=
act_pos
*
2
if
ygopro
.
constants
.
MSG
[
msg
]
!=
'CHAINING'
or
(
trigger_location
&
0x8
)
and
client
.
ready_trap
if
dialogues
.
dialogues
[
card
]
if
settings
.
modules
.
vip
.
enabled
and
room
.
dueling_players
[
act_pos
].
vip
and
vip_info
.
players
[
room
.
dueling_players
[
act_pos
].
name
].
dialogues
[
card
]
for
line
in
_
.
lines
vip_info
.
players
[
room
.
dueling_players
[
act_pos
].
name
].
dialogues
[
card
]
ygopro
.
stoc_send_chat
(
client
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
)
else
if
settings
.
modules
.
vip
.
enabled
and
room
.
hostinfo
.
mode
==
2
and
room
.
dueling_players
[
act_pos
+
1
].
vip
and
vip_info
.
players
[
room
.
dueling_players
[
act_pos
+
1
].
name
].
dialogues
[
card
]
for
line
in
_
.
lines
vip_info
.
players
[
room
.
dueling_players
[
act_pos
+
1
].
name
].
dialogues
[
card
]
ygopro
.
stoc_send_chat
(
client
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
)
else
if
settings
.
modules
.
dialogues
.
enabled
and
dialogues
.
dialogues
[
card
]
for
line
in
_
.
lines
dialogues
.
dialogues
[
card
][
Math
.
floor
(
Math
.
random
()
*
dialogues
.
dialogues
[
card
].
length
)]
ygopro
.
stoc_send_chat
(
client
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
)
else
if
dialogues
.
dialogues_custom
[
card
]
else
if
settings
.
modules
.
dialogues
.
enabled
and
dialogues
.
dialogues_custom
[
card
]
for
line
in
_
.
lines
dialogues
.
dialogues_custom
[
card
][
Math
.
floor
(
Math
.
random
()
*
dialogues
.
dialogues_custom
[
card
].
length
)]
ygopro
.
stoc_send_chat
(
client
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
)
if
ygopro
.
constants
.
MSG
[
msg
]
==
'POS_CHANGE'
...
...
@@ -2416,8 +2513,9 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_roomname}"
)
if
!
settings
.
modules
.
mycard
.
enabled
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_windbot}"
)
if
settings
.
modules
.
windbot
.
enabled
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_tip}"
)
if
settings
.
modules
.
tips
.
enabled
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_chatcolor_1}"
)
if
settings
.
modules
.
chat_color
.
enabled
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_chatcolor_2}"
)
if
settings
.
modules
.
chat_color
.
enabled
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_chatcolor_1}"
)
if
settings
.
modules
.
chat_color
.
enabled
and
(
!
(
settings
.
modules
.
vip
.
enabled
and
settings
.
modules
.
chat_color
.
restrict_to_vip
)
or
client
.
vip
)
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_chatcolor_2}"
)
if
settings
.
modules
.
chat_color
.
enabled
and
(
!
(
settings
.
modules
.
vip
.
enabled
and
settings
.
modules
.
chat_color
.
restrict_to_vip
)
or
client
.
vip
)
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_vip}"
)
if
settings
.
modules
.
vip
.
enabled
when
'/tip'
ygopro
.
stoc_send_random_tip
(
client
)
if
settings
.
modules
.
tips
.
enabled
...
...
@@ -2440,28 +2538,117 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
when
'/color'
if
settings
.
modules
.
chat_color
.
enabled
cip
=
CLIENT_get_authorize_key
(
client
)
if
cmsg
=
cmd
[
1
]
if
settings
.
modules
.
vip
.
enabled
and
settings
.
modules
.
chat_color
.
restrict_to_vip
and
!
client
.
vip
CLIENT_send_vip_status
(
client
)
else
if
cmsg
=
cmd
[
1
]
if
cmsg
.
toLowerCase
()
==
"help"
ygopro
.
stoc_send_chat
(
client
,
"${show_color_list}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
for
cname
,
cvalue
of
ygopro
.
constants
.
COLORS
when
cvalue
>
10
ygopro
.
stoc_send_chat
(
client
,
cname
,
cvalue
)
else
if
cmsg
.
toLowerCase
()
==
"default"
chat_color
.
save_list
[
cip
]
=
false
if
settings
.
modules
.
vip
.
enabled
and
settings
.
modules
.
chat_color
.
restrict_to_vip
delete
vip_info
.
players
[
client
.
name
].
chat_color
setting_save
(
vip_info
)
else
delete
chat_color
.
save_list
[
cip
]
setting_save
(
chat_color
)
ygopro
.
stoc_send_chat
(
client
,
"${set_chat_color_default}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
else
ccolor
=
cmsg
.
toUpperCase
()
if
ygopro
.
constants
.
COLORS
[
ccolor
]
and
ygopro
.
constants
.
COLORS
[
ccolor
]
>
10
and
ygopro
.
constants
.
COLORS
[
ccolor
]
<
20
chat_color
.
save_list
[
cip
]
=
ccolor
if
settings
.
modules
.
vip
.
enabled
and
settings
.
modules
.
chat_color
.
restrict_to_vip
vip_info
.
players
[
client
.
name
].
chat_color
=
ccolor
setting_save
(
vip_info
)
else
chat_color
.
save_list
[
cip
]
=
ccolor
setting_save
(
chat_color
)
ygopro
.
stoc_send_chat
(
client
,
"${set_chat_color_part1}"
+
ccolor
+
"${set_chat_color_part2}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
else
ygopro
.
stoc_send_chat
(
client
,
"${color_not_found_part1}"
+
ccolor
+
"${color_not_found_part2}"
,
ygopro
.
constants
.
COLORS
.
RED
)
else
if
color
=
chat_color
.
save_list
[
cip
]
if
color
=
(
if
settings
.
modules
.
vip
.
enabled
and
settings
.
modules
.
chat_color
.
restrict_to_vip
then
vip_info
.
players
[
client
.
name
].
chat_color
else
chat_color
.
save_list
[
cip
])
ygopro
.
stoc_send_chat
(
client
,
"${get_chat_color_part1}"
+
color
+
"${get_chat_color_part2}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
else
ygopro
.
stoc_send_chat
(
client
,
"${get_chat_color_default}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
when
'/vip'
if
settings
.
modules
.
vip
.
enabled
if
name
=
cmd
[
1
]
uname
=
name
.
toLowerCase
()
switch
uname
when
'help'
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_vip_help}"
)
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_vip_status}"
)
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_vip_buy}"
)
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_vip_password}"
)
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_vip_dialogues}"
)
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_vip_words}"
)
ygopro
.
stoc_send_chat
(
client
,
"${chat_order_vip_victory}"
)
when
'status'
CLIENT_send_vip_status
(
client
,
true
)
when
'buy'
key
=
cmd
[
2
]
buy_result
=
CLIENT_use_cdkey
(
client
,
key
)
switch
buy_result
when
0
ygopro
.
stoc_send_chat
(
client
,
"${vip_key_not_found}"
,
ygopro
.
constants
.
COLORS
.
RED
)
when
1
ygopro
.
stoc_send_chat
(
client
,
"${vip_success_new_part1}"
+
client
.
name
+
"$"
+
client
.
vpass
+
"${vip_success_new_part2}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
when
2
ygopro
.
stoc_send_chat
(
client
,
"${vip_success_renew}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
when
'dialogues'
if
!
client
.
vip
CLIENT_send_vip_status
(
client
)
else
code
=
cmd
[
2
]
word
=
cmd
[
3
]
if
!
code
or
!
parseInt
(
code
)
ygopro
.
stoc_send_chat
(
client
,
"${vip_invalid_card_code}"
,
ygopro
.
constants
.
COLORS
.
RED
)
else
if
!
word
delete
vip_info
.
players
[
client
.
name
].
dialogues
[
code
]
setting_save
(
vip_info
)
ygopro
.
stoc_send_chat
(
client
,
"${vip_cleared_dialogues_part1}"
+
code
+
"${vip_cleared_dialogues_part2}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
else
vip_info
.
players
[
client
.
name
].
dialogues
[
code
]
=
word
setting_save
(
vip_info
)
ygopro
.
stoc_send_chat
(
client
,
"${vip_set_dialogues_part1}"
+
code
+
"${vip_set_dialogues_part2}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
when
'words'
if
!
client
.
vip
CLIENT_send_vip_status
(
client
)
else
word
=
cmd
[
2
]
if
!
word
delete
vip_info
.
players
[
client
.
name
].
words
setting_save
(
vip_info
)
ygopro
.
stoc_send_chat
(
client
,
"${vip_cleared_words}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
else
vip_info
.
players
[
client
.
name
].
words
=
word
setting_save
(
vip_info
)
ygopro
.
stoc_send_chat
(
client
,
"${vip_set_words}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
when
'victory'
if
!
client
.
vip
CLIENT_send_vip_status
(
client
)
else
word
=
cmd
[
2
]
if
!
word
delete
vip_info
.
players
[
client
.
name
].
victory
setting_save
(
vip_info
)
ygopro
.
stoc_send_chat
(
client
,
"${vip_cleared_victory}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
else
vip_info
.
players
[
client
.
name
].
victory
=
word
setting_save
(
vip_info
)
ygopro
.
stoc_send_chat
(
client
,
"${vip_set_victory}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
when
'password'
if
!
client
.
vip
CLIENT_send_vip_status
(
client
)
else
word
=
cmd
[
2
]
if
word
vip_info
.
players
[
client
.
name
].
password
=
word
client
.
vpass
=
word
setting_save
(
vip_info
)
ygopro
.
stoc_send_chat
(
client
,
"${vip_password_changed}"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
)
else
CLIENT_send_vip_status
(
client
)
#when '/test'
# ygopro.stoc_send_hint_card_to_room(room, 2333365)
...
...
@@ -2715,8 +2902,8 @@ ygopro.stoc_follow 'CHAT', true, (buffer, info, client, server)->
pid
=
1
-
pid
for
player
in
room
.
players
when
player
and
player
.
pos
==
pid
tplayer
=
player
return
unless
tplayer
tcolor
=
chat_color
.
save_list
[
CLIENT_get_authorize_key
(
tplayer
)]
return
unless
tplayer
and
(
!
(
settings
.
modules
.
vip
.
enabled
and
settings
.
modules
.
chat_color
.
restrict_to_vip
)
or
tplayer
.
vip
)
tcolor
=
if
settings
.
modules
.
vip
.
enabled
and
settings
.
modules
.
chat_color
.
restrict_to_vip
then
vip_info
.
players
[
tplayer
.
name
].
chat_color
else
chat_color
.
save_list
[
CLIENT_get_authorize_key
(
tplayer
)]
if
tcolor
ygopro
.
stoc_send
client
,
'CHAT'
,
{
player
:
ygopro
.
constants
.
COLORS
[
tcolor
]
...
...
@@ -2945,6 +3132,22 @@ if settings.modules.http
duellog
=
JSON
.
stringify
duel_log
.
duel_log
,
null
,
2
response
.
end
(
addCallback
(
u
.
query
.
callback
,
duellog
))
else
if
u
.
pathname
==
'/api/getkeys'
and
settings
.
modules
.
vip
.
enabled
if
!
(
u
.
query
.
pass
==
settings
.
modules
.
tournament_mode
.
password
)
response
.
writeHead
(
200
)
response
.
end
(
addCallback
(
u
.
query
.
callback
,
"Unauthorized."
))
return
else
if
!
u
.
query
.
keytype
or
!
vip_info
.
cdkeys
[
u
.
query
.
keytype
]
response
.
writeHead
(
200
)
response
.
end
(
addCallback
(
u
.
query
.
callback
,
"Key type not found."
))
return
else
response
.
writeHead
(
200
)
ret_keys
=
""
for
key
in
vip_info
.
cdkeys
[
u
.
query
.
keytype
]
ret_keys
=
ret_keys
+
key
+
"
\n
"
response
.
end
(
addCallback
(
u
.
query
.
callback
,
ret_keys
))
else
if
u
.
pathname
==
'/api/archive.zip'
and
settings
.
modules
.
tournament_mode
.
enabled
if
!
(
u
.
query
.
pass
==
settings
.
modules
.
tournament_mode
.
password
)
response
.
writeHead
(
403
)
...
...
@@ -3143,6 +3346,11 @@ if settings.modules.http
else
response
.
end
(
addCallback
(
u
.
query
.
callback
,
"['room not found', '"
+
u
.
query
.
deathcancel
+
"']"
))
else
if
u
.
query
.
generatekey
and
settings
.
modules
.
vip
.
enabled
VIP_generate_cdkeys
(
u
.
query
.
generatekey
,
settings
.
modules
.
vip
.
generate_count
)
response
.
writeHead
(
200
)
response
.
end
(
addCallback
(
u
.
query
.
callback
,
"['Keys generated', '"
+
u
.
query
.
generatekey
+
"']"
))
else
response
.
writeHead
(
400
)
response
.
end
()
...
...
ygopro-server.js
View file @
c0edb987
// Generated by CoffeeScript 1.12.7
(
function
()
{
var
CLIENT_
get_authorize_key
,
CLIENT_heartbeat_register
,
CLIENT_heartbeat_unregister
,
CLIENT_import_data
,
CLIENT_is_able_to_reconnect
,
CLIENT_is_player
,
CLIENT_kick
,
CLIENT_pre_reconnect
,
CLIENT_reconnect
,
CLIENT_reconnect_register
,
CLIENT_reconnect_unregister
,
CLIENT_send_pre_reconnect_info
,
CLIENT_send_reconnect_info
,
Cloud_replay_ids
,
ROOM_all
,
ROOM_bad_ip
,
ROOM_ban_player
,
ROOM_clear_disconnect
,
ROOM_connected_ip
,
ROOM_find_by_name
,
ROOM_find_by_port
,
ROOM_find_by_title
,
ROOM_find_or_create_ai
,
ROOM_find_or_create_by_name
,
ROOM_find_or_create_random
,
ROOM_players_banned
,
ROOM_players_oppentlist
,
ROOM_unwelcome
,
ROOM_validate
,
Room
,
SERVER_clear_disconnect
,
_
,
addCallback
,
badwords
,
ban_user
,
bunyan
,
challonge
,
chat_color
,
config
,
cppversion
,
crypto
,
date
,
default_config
,
default_data
,
dialogues
,
disconnect_list
,
duel_log
,
e
,
exec
,
execFile
,
fs
,
geoip
,
get_memory_usage
,
http
,
http_server
,
https
,
https_server
,
import_datas
,
j
,
l
,
len
,
len1
,
lflists
,
list
,
loadJSON
,
load_dialogues
,
load_dialogues_custom
,
load_tips
,
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
,
redis
,
redisdb
,
ref
,
ref1
,
release_disconnect
,
report_to_big_brother
,
request
,
requestListener
,
roomlist
,
setting_change
,
setting_save
,
settings
,
spawn
,
spawnSync
,
tips
,
url
,
users_cache
,
wait_room_start
,
wait_room_start_arena
,
windbot_bin
,
windbot_parameters
,
windbot_process
,
windbots
,
words
,
ygopro
,
zlib
;
var
CLIENT_
check_vip
,
CLIENT_get_authorize_key
,
CLIENT_heartbeat_register
,
CLIENT_heartbeat_unregister
,
CLIENT_import_data
,
CLIENT_is_able_to_reconnect
,
CLIENT_is_player
,
CLIENT_kick
,
CLIENT_pre_reconnect
,
CLIENT_reconnect
,
CLIENT_reconnect_register
,
CLIENT_reconnect_unregister
,
CLIENT_send_pre_reconnect_info
,
CLIENT_send_reconnect_info
,
CLIENT_send_vip_status
,
CLIENT_use_cdkey
,
Cloud_replay_ids
,
ROOM_all
,
ROOM_bad_ip
,
ROOM_ban_player
,
ROOM_clear_disconnect
,
ROOM_connected_ip
,
ROOM_find_by_name
,
ROOM_find_by_port
,
ROOM_find_by_title
,
ROOM_find_or_create_ai
,
ROOM_find_or_create_by_name
,
ROOM_find_or_create_random
,
ROOM_players_banned
,
ROOM_players_oppentlist
,
ROOM_unwelcome
,
ROOM_validate
,
Room
,
SERVER_clear_disconnect
,
VIP_generate_cdkeys
,
_
,
addCallback
,
badwords
,
ban_user
,
bunyan
,
challonge
,
chat_color
,
config
,
cppversion
,
crypto
,
date
,
default_config
,
default_data
,
dialogues
,
disconnect_list
,
duel_log
,
e
,
exec
,
execFile
,
fs
,
geoip
,
get_memory_usage
,
http
,
http_server
,
https
,
https_server
,
import_datas
,
j
,
k
,
l
,
len
,
len1
,
lflists
,
list
,
loadJSON
,
load_dialogues
,
load_dialogues_custom
,
load_tips
,
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
,
redis
,
redisdb
,
ref
,
ref1
,
ref2
,
release_disconnect
,
report_to_big_brother
,
request
,
requestListener
,
roomlist
,
setting_change
,
setting_save
,
settings
,
spawn
,
spawnSync
,
tips
,
url
,
users_cache
,
v
,
vip_info
,
wait_room_start
,
wait_room_start_arena
,
windbot_bin
,
windbot_parameters
,
windbot_process
,
windbots
,
words
,
ygopro
,
zlib
;
net
=
require
(
'
net
'
);
...
...
@@ -58,7 +58,7 @@
}
});
import_datas
=
[
"
abuse_count
"
,
"
rag
"
,
"
rid
"
,
"
is_post_watcher
"
,
"
retry_count
"
,
"
name
"
,
"
is_first
"
,
"
lp
"
,
"
card_count
"
,
"
is_host
"
,
"
pos
"
,
"
surrend_confirm
"
,
"
kick_count
"
,
"
deck_saved
"
,
"
main
"
,
"
side
"
,
"
side_interval
"
,
"
side_tcount
"
,
"
selected_preduel
"
,
"
last_game_msg
"
,
"
last_game_msg_title
"
,
"
last_hint_msg
"
,
"
start_deckbuf
"
,
"
challonge_info
"
,
"
ready_trap
"
];
import_datas
=
[
"
abuse_count
"
,
"
vip
"
,
"
vpass
"
,
"
rag
"
,
"
rid
"
,
"
is_post_watcher
"
,
"
retry_count
"
,
"
name
"
,
"
is_first
"
,
"
lp
"
,
"
card_count
"
,
"
is_host
"
,
"
pos
"
,
"
surrend_confirm
"
,
"
kick_count
"
,
"
deck_saved
"
,
"
main
"
,
"
side
"
,
"
side_interval
"
,
"
side_tcount
"
,
"
selected_preduel
"
,
"
last_game_msg
"
,
"
last_game_msg_title
"
,
"
last_hint_msg
"
,
"
start_deckbuf
"
,
"
challonge_info
"
,
"
ready_trap
"
];
merge
=
require
(
'
deepmerge
'
);
...
...
@@ -160,6 +160,99 @@
setting_save
(
settings
);
};
VIP_generate_cdkeys
=
function
(
key_type
,
count
)
{
var
i
,
j
,
key
,
ref
;
if
(
!
(
settings
.
modules
.
vip
.
enabled
&&
vip_info
.
cdkeys
[
key_type
]))
{
return
false
;
}
for
(
i
=
j
=
1
,
ref
=
count
;
1
<=
ref
?
j
<
ref
:
j
>
ref
;
i
=
1
<=
ref
?
++
j
:
--
j
)
{
key
=
Math
.
floor
(
Math
.
random
()
*
10000000000000000
).
toString
();
vip_info
.
cdkeys
[
key_type
].
push
(
key
);
}
setting_save
(
vip_info
);
return
true
;
};
CLIENT_use_cdkey
=
function
(
client
,
pkey
)
{
var
found_type
,
index
,
j
,
key
,
keys
,
len
,
new_vip
,
ref
,
type
;
if
(
!
(
settings
.
modules
.
vip
.
enabled
&&
pkey
))
{
return
0
;
}
found_type
=
null
;
ref
=
vip_info
.
cdkeys
;
for
(
type
in
ref
)
{
keys
=
ref
[
type
];
for
(
j
=
0
,
len
=
keys
.
length
;
j
<
len
;
j
++
)
{
key
=
keys
[
j
];
if
(
!
(
pkey
===
key
))
{
continue
;
}
found_type
=
parseInt
(
type
);
index
=
_
.
indexOf
(
keys
,
key
);
if
(
index
!==
-
1
)
{
keys
.
splice
(
index
,
1
);
}
break
;
}
if
(
found_type
)
{
break
;
}
}
if
(
!
found_type
)
{
return
0
;
}
if
(
!
vip_info
.
cdkeys
[
found_type
].
length
)
{
VIP_generate_cdkeys
(
found_type
,
settings
.
modules
.
vip
.
generate_count
);
}
client
.
vip
=
true
;
new_vip
=
false
;
if
(
vip_info
.
players
[
client
.
name
])
{
vip_info
.
players
[
client
.
name
].
expire_date
=
moment
().
add
(
found_type
,
'
d
'
).
format
(
'
YYYY-MM-DD HH:mm:ss
'
);
}
else
{
if
(
!
client
.
vpass
)
{
client
.
vpass
=
Math
.
floor
(
Math
.
random
()
*
100000
).
toString
();
}
vip_info
.
players
[
client
.
name
]
=
{
password
:
client
.
vpass
,
expire_date
:
moment
().
add
(
found_type
,
'
d
'
).
format
(
'
YYYY-MM-DD HH:mm:ss
'
),
dialogues
:
{}
};
new_vip
=
true
;
}
setting_save
(
vip_info
);
return
(
new_vip
?
1
:
2
);
};
CLIENT_check_vip
=
function
(
client
)
{
if
(
!
settings
.
modules
.
vip
.
enabled
)
{
return
false
;
}
if
(
!
vip_info
.
players
[
client
.
name
])
{
return
false
;
}
if
(
vip_info
.
players
[
client
.
name
].
password
!==
client
.
vpass
)
{
return
false
;
}
return
moment
().
isSameOrBefore
(
vip_info
.
players
[
client
.
name
].
expire_date
);
};
CLIENT_send_vip_status
=
function
(
client
,
display
)
{
if
(
!
settings
.
modules
.
vip
.
enabled
)
{
return
false
;
}
if
(
client
.
vip
)
{
if
(
display
)
{
return
ygopro
.
stoc_send_chat
(
client
,
"
${vip_remain_part1}
"
+
vip_info
.
players
[
client
.
name
].
expire_date
+
"
${vip_remain_part2}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
else
{
return
ygopro
.
stoc_send_chat
(
client
,
"
${vip_remain}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
}
else
if
(
!
vip_info
.
players
[
client
.
name
]
||
vip_info
.
players
[
client
.
name
].
password
!==
client
.
vpass
)
{
return
ygopro
.
stoc_send_chat
(
client
,
"
${vip_not_bought}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
}
else
{
return
ygopro
.
stoc_send_chat
(
client
,
"
${vip_expired_part1}
"
+
vip_info
.
players
[
client
.
name
].
expire_date
+
"
${vip_expired_part2}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
}
};
default_config
=
loadJSON
(
'
./data/default_config.json
'
);
try
{
...
...
@@ -227,6 +320,18 @@
setting_save
(
chat_color
);
}
try
{
vip_info
=
loadJSON
(
'
./config/vip_info.json
'
);
}
catch
(
error1
)
{
vip_info
=
default_data
.
vip_info
;
ref
=
vip_info
.
cdkeys
;
for
(
k
in
ref
)
{
v
=
ref
[
k
];
VIP_generate_cdkeys
(
k
,
settings
.
modules
.
vip
.
generate_count
);
}
setting_save
(
vip_info
);
}
try
{
cppversion
=
parseInt
(
fs
.
readFileSync
(
'
ygopro/gframe/game.cpp
'
,
'
utf8
'
).
match
(
/PRO_VERSION =
([
x
\d
ABCDEF
]
+
)
/
)[
1
],
'
16
'
);
setting_change
(
settings
,
"
version
"
,
cppversion
);
...
...
@@ -238,9 +343,9 @@
lflists
=
[];
try
{
ref
=
fs
.
readFileSync
(
'
ygopro/expansions/lflist.conf
'
,
'
utf8
'
).
match
(
/!.*/g
);
for
(
j
=
0
,
len
=
ref
.
length
;
j
<
len
;
j
++
)
{
list
=
ref
[
j
];
ref
1
=
fs
.
readFileSync
(
'
ygopro/expansions/lflist.conf
'
,
'
utf8
'
).
match
(
/!.*/g
);
for
(
j
=
0
,
len
=
ref
1
.
length
;
j
<
len
;
j
++
)
{
list
=
ref
1
[
j
];
date
=
list
.
match
(
/!
([\d\.]
+
)
/
);
if
(
!
date
)
{
continue
;
...
...
@@ -255,9 +360,9 @@
}
try
{
ref
1
=
fs
.
readFileSync
(
'
ygopro/lflist.conf
'
,
'
utf8
'
).
match
(
/!.*/g
);
for
(
l
=
0
,
len1
=
ref
1
.
length
;
l
<
len1
;
l
++
)
{
list
=
ref
1
[
l
];
ref
2
=
fs
.
readFileSync
(
'
ygopro/lflist.conf
'
,
'
utf8
'
).
match
(
/!.*/g
);
for
(
l
=
0
,
len1
=
ref
2
.
length
;
l
<
len1
;
l
++
)
{
list
=
ref
2
[
l
];
date
=
list
.
match
(
/!
([\d\.]
+
)
/
);
if
(
!
date
)
{
continue
;
...
...
@@ -372,16 +477,16 @@
ROOM_bad_ip
=
{};
ban_user
=
function
(
name
)
{
var
bad_ip
,
len2
,
len3
,
m
,
n
,
player
,
ref
2
,
room
;
var
bad_ip
,
len2
,
len3
,
m
,
n
,
player
,
ref
3
,
room
;
settings
.
ban
.
banned_user
.
push
(
name
);
setting_save
(
settings
);
bad_ip
=
0
;
for
(
m
=
0
,
len2
=
ROOM_all
.
length
;
m
<
len2
;
m
++
)
{
room
=
ROOM_all
[
m
];
if
(
room
&&
room
.
established
)
{
ref
2
=
room
.
players
;
for
(
n
=
0
,
len3
=
ref
2
.
length
;
n
<
len3
;
n
++
)
{
player
=
ref
2
[
n
];
ref
3
=
room
.
players
;
for
(
n
=
0
,
len3
=
ref
3
.
length
;
n
<
len3
;
n
++
)
{
player
=
ref
3
[
n
];
if
(
player
&&
(
player
.
name
===
name
||
player
.
ip
===
bad_ip
))
{
bad_ip
=
player
.
ip
;
ROOM_bad_ip
[
bad_ip
]
=
99
;
...
...
@@ -577,13 +682,13 @@
};
ROOM_unwelcome
=
function
(
room
,
bad_player
,
reason
)
{
var
len2
,
m
,
player
,
ref
2
;
var
len2
,
m
,
player
,
ref
3
;
if
(
!
room
)
{
return
;
}
ref
2
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
if
(
player
&&
player
===
bad_player
)
{
ygopro
.
stoc_send_chat
(
player
,
"
${unwelcome_warn_part1}
"
+
reason
+
"
${unwelcome_warn_part2}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
}
else
if
(
player
&&
player
.
pos
!==
7
&&
player
!==
bad_player
)
{
...
...
@@ -613,6 +718,9 @@
};
CLIENT_get_authorize_key
=
function
(
client
)
{
if
(
settings
.
modules
.
vip
.
enabled
&&
client
.
vip
)
{
return
client
.
name
+
"
$
"
+
client
.
vpass
;
}
if
(
settings
.
modules
.
mycard
.
enabled
||
settings
.
modules
.
tournament_mode
.
enabled
||
settings
.
modules
.
challonge
.
enabled
||
client
.
is_local
)
{
return
client
.
name
;
}
else
{
...
...
@@ -668,10 +776,10 @@
};
CLIENT_import_data
=
function
(
client
,
old_client
,
room
)
{
var
index
,
key
,
len2
,
len3
,
m
,
n
,
player
,
ref
2
;
ref
2
=
room
.
players
;
for
(
index
=
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
index
=
++
m
)
{
player
=
ref
2
[
index
];
var
index
,
key
,
len2
,
len3
,
m
,
n
,
player
,
ref
3
;
ref
3
=
room
.
players
;
for
(
index
=
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
index
=
++
m
)
{
player
=
ref
3
[
index
];
if
(
player
===
old_client
)
{
room
.
players
[
index
]
=
client
;
break
;
...
...
@@ -695,7 +803,6 @@
};
SERVER_clear_disconnect
=
function
(
server
)
{
var
k
,
v
;
if
(
!
settings
.
modules
.
reconnect
.
enabled
)
{
return
false
;
}
...
...
@@ -711,7 +818,6 @@
};
ROOM_clear_disconnect
=
function
(
room_id
)
{
var
k
,
v
;
if
(
!
settings
.
modules
.
reconnect
.
enabled
)
{
return
false
;
}
...
...
@@ -727,11 +833,11 @@
};
CLIENT_is_player
=
function
(
client
,
room
)
{
var
is_player
,
len2
,
m
,
player
,
ref
2
;
var
is_player
,
len2
,
m
,
player
,
ref
3
;
is_player
=
false
;
ref
2
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
if
(
client
===
player
)
{
is_player
=
true
;
break
;
...
...
@@ -761,7 +867,7 @@
};
CLIENT_send_pre_reconnect_info
=
function
(
client
,
room
,
old_client
)
{
var
len2
,
m
,
player
,
ref
2
,
req_pos
;
var
len2
,
m
,
player
,
ref
3
,
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
);
req_pos
=
old_client
.
pos
;
...
...
@@ -771,9 +877,9 @@
ygopro
.
stoc_send
(
client
,
'
TYPE_CHANGE
'
,
{
type
:
req_pos
});
ref
2
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
ygopro
.
stoc_send
(
client
,
'
HS_PLAYER_ENTER
'
,
{
name
:
player
.
name
,
pos
:
player
.
pos
...
...
@@ -1061,10 +1167,10 @@
_this
.
port
=
parseInt
(
data
);
_
.
each
(
_this
.
players
,
function
(
player
)
{
player
.
server
.
connect
(
_this
.
port
,
'
127.0.0.1
'
,
function
()
{
var
buffer
,
len2
,
m
,
ref
2
;
ref
2
=
player
.
pre_establish_buffers
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
buffer
=
ref
2
[
m
];
var
buffer
,
len2
,
m
,
ref
3
;
ref
3
=
player
.
pre_establish_buffers
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
buffer
=
ref
3
[
m
];
player
.
server
.
write
(
buffer
);
}
player
.
established
=
true
;
...
...
@@ -1097,14 +1203,14 @@
}
Room
.
prototype
[
"
delete
"
]
=
function
()
{
var
end_time
,
index
,
log_rep_id
,
name
,
player_ips
,
player_names
,
recorder_buffer
,
ref
2
,
replay_id
,
score
,
score_array
;
var
end_time
,
index
,
log_rep_id
,
name
,
player_ips
,
player_names
,
recorder_buffer
,
ref
3
,
replay_id
,
score
,
score_array
;
if
(
this
.
deleted
)
{
return
;
}
score_array
=
[];
ref
2
=
this
.
scores
;
for
(
name
in
ref
2
)
{
score
=
ref
2
[
name
];
ref
3
=
this
.
scores
;
for
(
name
in
ref
3
)
{
score
=
ref
3
[
name
];
score_array
.
push
({
name
:
name
,
score
:
score
...
...
@@ -1244,14 +1350,14 @@
};
Room
.
prototype
.
is_has_disconnected_player
=
function
()
{
var
found
,
len2
,
m
,
player
,
ref
2
;
var
found
,
len2
,
m
,
player
,
ref
3
;
if
(
!
settings
.
modules
.
reconnect
.
enabled
)
{
return
false
;
}
found
=
false
;
ref
2
=
this
.
get_playing_player
();
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
this
.
get_playing_player
();
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
if
(
!
player
.
closed
)
{
continue
;
}
...
...
@@ -1293,10 +1399,10 @@
roomlist
.
update
(
this
);
}
client
.
server
.
connect
(
this
.
port
,
'
127.0.0.1
'
,
function
()
{
var
buffer
,
len2
,
m
,
ref
2
;
ref
2
=
client
.
pre_establish_buffers
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
buffer
=
ref
2
[
m
];
var
buffer
,
len2
,
m
,
ref
3
;
ref
3
=
client
.
pre_establish_buffers
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
buffer
=
ref
3
[
m
];
client
.
server
.
write
(
buffer
);
}
client
.
established
=
true
;
...
...
@@ -1306,7 +1412,7 @@
};
Room
.
prototype
.
disconnect
=
function
(
client
,
error
)
{
var
index
,
len2
,
m
,
player
,
ref
2
;
var
index
,
len2
,
m
,
player
,
ref
3
;
if
(
client
.
had_new_reconnection
)
{
return
;
}
...
...
@@ -1319,9 +1425,9 @@
client
.
server
.
destroy
();
}
else
{
if
(
this
.
arena
&&
!
this
.
started
)
{
ref
2
=
this
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
this
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
if
(
player
.
pos
!==
7
)
{
this
.
scores
[
player
.
name
]
=
0
;
}
...
...
@@ -1646,8 +1752,10 @@
}
ygopro
.
ctos_follow
(
'
PLAYER_INFO
'
,
true
,
function
(
buffer
,
info
,
client
,
server
)
{
var
geo
,
lang
,
name
,
struct
;
name
=
info
.
name
.
split
(
"
$
"
)[
0
];
var
geo
,
lang
,
name
,
name_full
,
struct
,
vpass
;
name_full
=
info
.
name
.
split
(
"
$
"
);
name
=
name_full
[
0
];
vpass
=
name_full
[
1
];
if
(
_
.
any
(
settings
.
ban
.
illegal_id
,
function
(
badid
)
{
var
matchs
,
regexp
;
regexp
=
new
RegExp
(
badid
,
'
i
'
);
...
...
@@ -1665,6 +1773,10 @@
struct
.
set
(
"
name
"
,
name
);
buffer
=
struct
.
buffer
;
client
.
name
=
name
;
client
.
vpass
=
vpass
;
if
(
settings
.
modules
.
vip
.
enabled
&&
CLIENT_check_vip
(
client
))
{
client
.
vip
=
true
;
}
if
(
!
settings
.
modules
.
i18n
.
auto_pick
||
client
.
is_local
)
{
client
.
lang
=
settings
.
modules
.
i18n
[
"
default
"
];
}
else
{
...
...
@@ -1684,7 +1796,7 @@
});
ygopro
.
ctos_follow
(
'
JOIN_GAME
'
,
false
,
function
(
buffer
,
info
,
client
,
server
)
{
var
check
,
decrypted_buffer
,
finish
,
i
,
id
,
len2
,
len3
,
len4
,
m
,
n
,
name
,
o
,
pre_room
,
ref
2
,
ref3
,
ref4
,
replay_id
,
room
,
secret
;
var
check
,
decrypted_buffer
,
finish
,
i
,
id
,
len2
,
len3
,
len4
,
m
,
n
,
name
,
o
,
pre_room
,
ref
3
,
ref4
,
ref5
,
replay_id
,
room
,
secret
;
info
.
pass
=
info
.
pass
.
trim
();
if
(
CLIENT_is_able_to_reconnect
(
client
))
{
CLIENT_pre_reconnect
(
client
);
...
...
@@ -1755,15 +1867,15 @@
return
;
}
check
=
function
(
buf
)
{
var
checksum
,
i
,
m
,
ref
2
;
var
checksum
,
i
,
m
,
ref
3
;
checksum
=
0
;
for
(
i
=
m
=
0
,
ref
2
=
buf
.
length
;
0
<=
ref2
?
m
<
ref2
:
m
>
ref2
;
i
=
0
<=
ref2
?
++
m
:
--
m
)
{
for
(
i
=
m
=
0
,
ref
3
=
buf
.
length
;
0
<=
ref3
?
m
<
ref3
:
m
>
ref3
;
i
=
0
<=
ref3
?
++
m
:
--
m
)
{
checksum
+=
buf
.
readUInt8
(
i
);
}
return
(
checksum
&
0xFF
)
===
0
;
};
finish
=
function
(
buffer
)
{
var
action
,
len2
,
m
,
name
,
opt1
,
opt2
,
opt3
,
options
,
ref
2
,
room
,
title
;
var
action
,
len2
,
m
,
name
,
opt1
,
opt2
,
opt3
,
options
,
ref
3
,
room
,
title
;
if
(
client
.
closed
)
{
return
;
}
...
...
@@ -1847,9 +1959,9 @@
ygopro
.
stoc_send_chat_to_room
(
room
,
client
.
name
+
"
${watch_join}
"
);
room
.
watchers
.
push
(
client
);
ygopro
.
stoc_send_chat
(
client
,
"
${watch_watching}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
ref
2
=
room
.
watcher_buffers
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
buffer
=
ref
2
[
m
];
ref
3
=
room
.
watcher_buffers
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
buffer
=
ref
3
[
m
];
client
.
write
(
buffer
);
}
}
else
{
...
...
@@ -1866,9 +1978,9 @@
if
(
id
=
users_cache
[
client
.
name
])
{
secret
=
id
%
65535
+
1
;
decrypted_buffer
=
new
Buffer
(
6
);
ref
2
=
[
0
,
2
,
4
];
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
i
=
ref
2
[
m
];
ref
3
=
[
0
,
2
,
4
];
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
i
=
ref
3
[
m
];
decrypted_buffer
.
writeUInt16LE
(
buffer
.
readUInt16LE
(
i
)
^
secret
,
i
);
}
if
(
check
(
decrypted_buffer
))
{
...
...
@@ -1885,14 +1997,14 @@
},
json
:
true
},
function
(
error
,
response
,
body
)
{
var
len3
,
n
,
ref
3
;
var
len3
,
n
,
ref
4
;
if
(
body
&&
body
.
user
)
{
users_cache
[
client
.
name
]
=
body
.
user
.
id
;
secret
=
body
.
user
.
id
%
65535
+
1
;
decrypted_buffer
=
new
Buffer
(
6
);
ref
3
=
[
0
,
2
,
4
];
for
(
n
=
0
,
len3
=
ref
3
.
length
;
n
<
len3
;
n
++
)
{
i
=
ref
3
[
n
];
ref
4
=
[
0
,
2
,
4
];
for
(
n
=
0
,
len3
=
ref
4
.
length
;
n
<
len3
;
n
++
)
{
i
=
ref
4
[
n
];
decrypted_buffer
.
writeUInt16LE
(
buffer
.
readUInt16LE
(
i
)
^
secret
,
i
);
}
if
(
check
(
decrypted_buffer
))
{
...
...
@@ -1915,9 +2027,9 @@
ygopro
.
stoc_send_chat_to_room
(
room
,
client
.
name
+
"
${watch_join}
"
);
room
.
watchers
.
push
(
client
);
ygopro
.
stoc_send_chat
(
client
,
"
${watch_watching}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
ref
3
=
room
.
watcher_buffers
;
for
(
n
=
0
,
len3
=
ref
3
.
length
;
n
<
len3
;
n
++
)
{
buffer
=
ref
3
[
n
];
ref
4
=
room
.
watcher_buffers
;
for
(
n
=
0
,
len3
=
ref
4
.
length
;
n
<
len3
;
n
++
)
{
buffer
=
ref
4
[
n
];
client
.
write
(
buffer
);
}
}
else
{
...
...
@@ -1925,7 +2037,7 @@
challonge
.
participants
.
index
({
id
:
encodeURIComponent
(
settings
.
modules
.
challonge
.
tournament_id
),
callback
:
function
(
err
,
data
)
{
var
found
,
k
,
user
;
var
found
,
user
;
if
(
err
||
!
data
)
{
if
(
err
)
{
log
.
warn
(
"
Failed loading Challonge user info
"
,
err
);
...
...
@@ -1949,7 +2061,7 @@
challonge
.
matches
.
index
({
id
:
encodeURIComponent
(
settings
.
modules
.
challonge
.
tournament_id
),
callback
:
function
(
err
,
data
)
{
var
len4
,
len5
,
match
,
o
,
p
,
player
,
ref
4
,
ref5
;
var
len4
,
len5
,
match
,
o
,
p
,
player
,
ref
5
,
ref6
;
if
(
client
.
closed
)
{
return
;
}
...
...
@@ -1989,9 +2101,9 @@
ygopro
.
stoc_send_chat_to_room
(
room
,
client
.
name
+
"
${watch_join}
"
);
room
.
watchers
.
push
(
client
);
ygopro
.
stoc_send_chat
(
client
,
"
${watch_watching}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
ref
4
=
room
.
watcher_buffers
;
for
(
o
=
0
,
len4
=
ref
4
.
length
;
o
<
len4
;
o
++
)
{
buffer
=
ref
4
[
o
];
ref
5
=
room
.
watcher_buffers
;
for
(
o
=
0
,
len4
=
ref
5
.
length
;
o
<
len4
;
o
++
)
{
buffer
=
ref
5
[
o
];
client
.
write
(
buffer
);
}
}
else
{
...
...
@@ -2000,9 +2112,9 @@
}
else
if
(
room
.
no_watch
&&
room
.
players
.
length
>=
(
room
.
hostinfo
.
mode
===
2
?
4
:
2
))
{
ygopro
.
stoc_die
(
client
,
"
${watch_denied_room}
"
);
}
else
{
ref
5
=
room
.
players
;
for
(
p
=
0
,
len5
=
ref
5
.
length
;
p
<
len5
;
p
++
)
{
player
=
ref
5
[
p
];
ref
6
=
room
.
players
;
for
(
p
=
0
,
len5
=
ref
6
.
length
;
p
<
len5
;
p
++
)
{
player
=
ref
6
[
p
];
if
(
!
(
player
&&
player
!==
client
&&
player
.
name
===
client
.
name
))
{
continue
;
}
...
...
@@ -2068,9 +2180,9 @@
ygopro
.
stoc_send_chat_to_room
(
room
,
client
.
name
+
"
${watch_join}
"
);
room
.
watchers
.
push
(
client
);
ygopro
.
stoc_send_chat
(
client
,
"
${watch_watching}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
ref
4
=
room
.
watcher_buffers
;
for
(
o
=
0
,
len4
=
ref
4
.
length
;
o
<
len4
;
o
++
)
{
buffer
=
ref
4
[
o
];
ref
5
=
room
.
watcher_buffers
;
for
(
o
=
0
,
len4
=
ref
5
.
length
;
o
<
len4
;
o
++
)
{
buffer
=
ref
5
[
o
];
client
.
write
(
buffer
);
}
}
else
{
...
...
@@ -2087,7 +2199,7 @@
});
ygopro
.
stoc_follow
(
'
JOIN_GAME
'
,
false
,
function
(
buffer
,
info
,
client
,
server
)
{
var
len2
,
l
ine
,
m
,
recorder
,
ref2
,
room
,
watcher
;
var
len2
,
l
en3
,
line
,
m
,
n
,
recorder
,
ref3
,
ref4
,
room
,
watcher
;
room
=
ROOM_all
[
client
.
rid
];
if
(
!
(
room
&&
!
client
.
reconnecting
))
{
return
;
...
...
@@ -2096,9 +2208,15 @@
room
.
join_game_buffer
=
buffer
;
}
if
(
settings
.
modules
.
words
.
enabled
&&
words
.
words
[
client
.
name
])
{
ref2
=
_
.
lines
(
words
.
words
[
client
.
name
][
Math
.
floor
(
Math
.
random
()
*
words
.
words
[
client
.
name
].
length
)]);
for
(
m
=
0
,
len2
=
ref2
.
length
;
m
<
len2
;
m
++
)
{
line
=
ref2
[
m
];
ref3
=
_
.
lines
(
words
.
words
[
client
.
name
][
Math
.
floor
(
Math
.
random
()
*
words
.
words
[
client
.
name
].
length
)]);
for
(
m
=
0
,
len2
=
ref3
.
length
;
m
<
len2
;
m
++
)
{
line
=
ref3
[
m
];
ygopro
.
stoc_send_chat_to_room
(
room
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
);
}
}
else
if
(
settings
.
modules
.
vip
.
enabled
&&
client
.
vip
&&
vip_info
.
players
[
client
.
name
].
words
)
{
ref4
=
_
.
lines
(
vip_info
.
players
[
client
.
name
].
words
);
for
(
n
=
0
,
len3
=
ref4
.
length
;
n
<
len3
;
n
++
)
{
line
=
ref4
[
n
];
ygopro
.
stoc_send_chat_to_room
(
room
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
);
}
}
...
...
@@ -2156,15 +2274,15 @@
ygopro
.
ctos_send
(
watcher
,
'
HS_TOOBSERVER
'
);
});
watcher
.
on
(
'
data
'
,
function
(
data
)
{
var
len
3
,
n
,
ref3
,
w
;
var
len
4
,
o
,
ref5
,
w
;
room
=
ROOM_all
[
client
.
rid
];
if
(
!
room
)
{
return
;
}
room
.
watcher_buffers
.
push
(
data
);
ref
3
=
room
.
watchers
;
for
(
n
=
0
,
len3
=
ref3
.
length
;
n
<
len3
;
n
++
)
{
w
=
ref
3
[
n
];
ref
5
=
room
.
watchers
;
for
(
o
=
0
,
len4
=
ref5
.
length
;
o
<
len4
;
o
++
)
{
w
=
ref
5
[
o
];
if
(
w
)
{
w
.
write
(
data
);
}
...
...
@@ -2235,7 +2353,7 @@
}
ygopro
.
stoc_follow
(
'
GAME_MSG
'
,
true
,
function
(
buffer
,
info
,
client
,
server
)
{
var
card
,
chain
,
check
,
count
,
cpos
,
deck_found
,
found
,
hint_type
,
i
,
id
,
len2
,
len3
,
len4
,
len5
,
len6
,
limbo_found
,
line
,
loc
,
m
,
max_loop
,
msg
,
n
,
o
,
oppo_pos
,
p
,
phase
,
player
,
playertype
,
pos
,
ppos
,
q
,
r
,
r_player
,
reason
,
ref2
,
ref3
,
ref4
,
ref5
,
ref6
,
ref7
,
ref8
,
room
,
trigger_location
,
val
,
win_pos
;
var
act_pos
,
card
,
chain
,
check
,
count
,
cpos
,
deck_found
,
found
,
hint_type
,
i
,
id
,
len10
,
len2
,
len3
,
len4
,
len5
,
len6
,
len7
,
len8
,
len9
,
limbo_found
,
line
,
loc
,
m
,
max_loop
,
msg
,
n
,
o
,
oppo_pos
,
p
,
phase
,
player
,
playertype
,
pos
,
ppos
,
q
,
r
,
r_player
,
reason
,
ref10
,
ref11
,
ref12
,
ref13
,
ref3
,
ref4
,
ref5
,
ref6
,
ref7
,
ref8
,
ref9
,
room
,
s
,
t
,
trigger_location
,
val
,
win_pos
,
x
,
y
;
room
=
ROOM_all
[
client
.
rid
];
if
(
!
(
room
&&
!
client
.
reconnecting
))
{
return
;
...
...
@@ -2375,9 +2493,9 @@
room
.
winner
=
pos
;
room
.
turn
=
0
;
if
(
settings
.
modules
.
heartbeat_detection
.
enabled
)
{
ref
2
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
player
.
heartbeat_protected
=
false
;
}
delete
room
.
long_resolve_card
;
...
...
@@ -2386,6 +2504,19 @@
if
(
room
&&
!
room
.
finished
&&
room
.
dueling_players
[
pos
])
{
room
.
winner_name
=
room
.
dueling_players
[
pos
].
name
;
room
.
scores
[
room
.
winner_name
]
=
room
.
scores
[
room
.
winner_name
]
+
1
;
if
(
settings
.
modules
.
vip
.
enabled
&&
room
.
dueling_players
[
pos
].
vip
&&
vip_info
.
players
[
room
.
dueling_players
[
pos
].
name
].
victory
)
{
ref4
=
_
.
lines
(
vip_info
.
players
[
room
.
dueling_players
[
pos
].
name
].
victory
);
for
(
n
=
0
,
len3
=
ref4
.
length
;
n
<
len3
;
n
++
)
{
line
=
ref4
[
n
];
ygopro
.
stoc_send_chat_to_room
(
room
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
);
}
}
else
if
(
room
.
hostinfo
.
mode
===
2
&&
settings
.
modules
.
vip
.
enabled
&&
room
.
dueling_players
[
pos
+
1
].
vip
&&
vip_info
.
players
[
room
.
dueling_players
[
pos
+
1
].
name
].
victory
)
{
ref5
=
_
.
lines
(
vip_info
.
players
[
room
.
dueling_players
[
pos
+
1
].
name
].
victory
);
for
(
o
=
0
,
len4
=
ref5
.
length
;
o
<
len4
;
o
++
)
{
line
=
ref5
[
o
];
ygopro
.
stoc_send_chat_to_room
(
room
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
);
}
}
}
if
(
settings
.
modules
.
challonge
.
enabled
&&
!
room
.
kicked
)
{
if
(
room
.
scores
[
room
.
dueling_players
[
0
].
name
]
>
room
.
scores
[
room
.
dueling_players
[
1
].
name
])
{
...
...
@@ -2435,7 +2566,7 @@
if
(
room
.
dueling_players
[
pos
].
lp
<
0
)
{
room
.
dueling_players
[
pos
].
lp
=
0
;
}
if
((
0
<
(
ref
3
=
room
.
dueling_players
[
pos
].
lp
)
&&
ref3
<=
100
))
{
if
((
0
<
(
ref
6
=
room
.
dueling_players
[
pos
].
lp
)
&&
ref6
<=
100
))
{
ygopro
.
stoc_send_chat_to_room
(
room
,
"
${lp_low_opponent}
"
,
ygopro
.
constants
.
COLORS
.
PINK
);
}
}
...
...
@@ -2474,7 +2605,7 @@
if
(
room
.
dueling_players
[
pos
].
lp
<
0
)
{
room
.
dueling_players
[
pos
].
lp
=
0
;
}
if
((
0
<
(
ref
4
=
room
.
dueling_players
[
pos
].
lp
)
&&
ref4
<=
100
))
{
if
((
0
<
(
ref
7
=
room
.
dueling_players
[
pos
].
lp
)
&&
ref7
<=
100
))
{
ygopro
.
stoc_send_chat_to_room
(
room
,
"
${lp_low_self}
"
,
ygopro
.
constants
.
COLORS
.
PINK
);
}
}
...
...
@@ -2512,7 +2643,7 @@
max_loop
=
3
+
(
count
-
1
)
*
7
;
deck_found
=
0
;
limbo_found
=
0
;
for
(
i
=
n
=
3
,
ref5
=
max_loop
;
n
<=
ref5
;
i
=
n
+=
7
)
{
for
(
i
=
p
=
3
,
ref8
=
max_loop
;
p
<=
ref8
;
i
=
p
+=
7
)
{
loc
=
buffer
.
readInt8
(
i
+
5
);
if
((
loc
&
0x41
)
>
0
)
{
deck_found
++
;
...
...
@@ -2532,8 +2663,8 @@
if
(
ygopro
.
constants
.
MSG
[
msg
]
===
'
CHAINING
'
)
{
card
=
buffer
.
readUInt32LE
(
1
);
found
=
false
;
for
(
o
=
0
,
len3
=
long_resolve_cards
.
length
;
o
<
len3
;
o
++
)
{
id
=
long_resolve_cards
[
o
];
for
(
q
=
0
,
len5
=
long_resolve_cards
.
length
;
q
<
len5
;
q
++
)
{
id
=
long_resolve_cards
[
q
];
if
(
!
(
id
===
card
))
{
continue
;
}
...
...
@@ -2555,9 +2686,9 @@
}
else
if
(
ygopro
.
constants
.
MSG
[
msg
]
===
'
CHAIN_SOLVING
'
&&
room
.
long_resolve_chain
)
{
chain
=
buffer
.
readInt8
(
1
);
if
(
room
.
long_resolve_chain
[
chain
])
{
ref
6
=
room
.
get_playing_player
();
for
(
p
=
0
,
len4
=
ref6
.
length
;
p
<
len4
;
p
++
)
{
player
=
ref
6
[
p
];
ref
9
=
room
.
get_playing_player
();
for
(
r
=
0
,
len6
=
ref9
.
length
;
r
<
len6
;
r
++
)
{
player
=
ref
9
[
r
];
player
.
heartbeat_protected
=
true
;
}
}
...
...
@@ -2569,21 +2700,40 @@
delete
room
.
long_resolve_chain
;
}
}
if
(
settings
.
modules
.
dialogues
.
enabled
)
{
if
(
settings
.
modules
.
dialogues
.
enabled
||
settings
.
modules
.
vip
.
enabled
)
{
if
(
ygopro
.
constants
.
MSG
[
msg
]
===
'
SUMMONING
'
||
ygopro
.
constants
.
MSG
[
msg
]
===
'
SPSUMMONING
'
||
ygopro
.
constants
.
MSG
[
msg
]
===
'
CHAINING
'
)
{
card
=
buffer
.
readUInt32LE
(
1
);
trigger_location
=
buffer
.
readUInt8
(
6
);
act_pos
=
buffer
.
readUInt8
(
ygopro
.
constants
.
MSG
[
msg
]
===
'
CHAINING
'
?
9
:
5
);
if
(
!
room
.
dueling_players
[
0
].
is_first
)
{
act_pos
=
1
-
act_pos
;
}
if
(
room
.
hostinfo
.
mode
===
2
)
{
act_pos
=
act_pos
*
2
;
}
if
(
ygopro
.
constants
.
MSG
[
msg
]
!==
'
CHAINING
'
||
(
trigger_location
&
0x8
)
&&
client
.
ready_trap
)
{
if
(
dialogues
.
dialogues
[
card
])
{
ref7
=
_
.
lines
(
dialogues
.
dialogues
[
card
][
Math
.
floor
(
Math
.
random
()
*
dialogues
.
dialogues
[
card
].
length
)]);
for
(
q
=
0
,
len5
=
ref7
.
length
;
q
<
len5
;
q
++
)
{
line
=
ref7
[
q
];
if
(
settings
.
modules
.
vip
.
enabled
&&
room
.
dueling_players
[
act_pos
].
vip
&&
vip_info
.
players
[
room
.
dueling_players
[
act_pos
].
name
].
dialogues
[
card
])
{
ref10
=
_
.
lines
(
vip_info
.
players
[
room
.
dueling_players
[
act_pos
].
name
].
dialogues
[
card
]);
for
(
s
=
0
,
len7
=
ref10
.
length
;
s
<
len7
;
s
++
)
{
line
=
ref10
[
s
];
ygopro
.
stoc_send_chat
(
client
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
);
}
}
else
if
(
settings
.
modules
.
vip
.
enabled
&&
room
.
hostinfo
.
mode
===
2
&&
room
.
dueling_players
[
act_pos
+
1
].
vip
&&
vip_info
.
players
[
room
.
dueling_players
[
act_pos
+
1
].
name
].
dialogues
[
card
])
{
ref11
=
_
.
lines
(
vip_info
.
players
[
room
.
dueling_players
[
act_pos
+
1
].
name
].
dialogues
[
card
]);
for
(
t
=
0
,
len8
=
ref11
.
length
;
t
<
len8
;
t
++
)
{
line
=
ref11
[
t
];
ygopro
.
stoc_send_chat
(
client
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
);
}
}
else
if
(
settings
.
modules
.
dialogues
.
enabled
&&
dialogues
.
dialogues
[
card
])
{
ref12
=
_
.
lines
(
dialogues
.
dialogues
[
card
][
Math
.
floor
(
Math
.
random
()
*
dialogues
.
dialogues
[
card
].
length
)]);
for
(
x
=
0
,
len9
=
ref12
.
length
;
x
<
len9
;
x
++
)
{
line
=
ref12
[
x
];
ygopro
.
stoc_send_chat
(
client
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
);
}
}
else
if
(
dialogues
.
dialogues_custom
[
card
])
{
ref
8
=
_
.
lines
(
dialogues
.
dialogues_custom
[
card
][
Math
.
floor
(
Math
.
random
()
*
dialogues
.
dialogues_custom
[
card
].
length
)]);
for
(
r
=
0
,
len6
=
ref8
.
length
;
r
<
len6
;
r
++
)
{
line
=
ref
8
[
r
];
}
else
if
(
settings
.
modules
.
dialogues
.
enabled
&&
dialogues
.
dialogues_custom
[
card
])
{
ref
13
=
_
.
lines
(
dialogues
.
dialogues_custom
[
card
][
Math
.
floor
(
Math
.
random
()
*
dialogues
.
dialogues_custom
[
card
].
length
)]);
for
(
y
=
0
,
len10
=
ref13
.
length
;
y
<
len10
;
y
++
)
{
line
=
ref
13
[
y
];
ygopro
.
stoc_send_chat
(
client
,
line
,
ygopro
.
constants
.
COLORS
.
PINK
);
}
}
...
...
@@ -2602,7 +2752,7 @@
});
ygopro
.
ctos_follow
(
'
HS_TOOBSERVER
'
,
true
,
function
(
buffer
,
info
,
client
,
server
)
{
var
len2
,
m
,
player
,
ref
2
,
room
;
var
len2
,
m
,
player
,
ref
3
,
room
;
room
=
ROOM_all
[
client
.
rid
];
if
(
!
room
)
{
return
;
...
...
@@ -2614,9 +2764,9 @@
if
((
!
room
.
arena
&&
!
settings
.
modules
.
challonge
.
enabled
)
||
client
.
is_local
)
{
return
false
;
}
ref
2
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
if
(
player
===
client
)
{
ygopro
.
stoc_send_chat
(
client
,
"
${cannot_to_observer}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
return
true
;
...
...
@@ -2626,14 +2776,14 @@
});
ygopro
.
ctos_follow
(
'
HS_KICK
'
,
true
,
function
(
buffer
,
info
,
client
,
server
)
{
var
len2
,
m
,
player
,
ref
2
,
room
;
var
len2
,
m
,
player
,
ref
3
,
room
;
room
=
ROOM_all
[
client
.
rid
];
if
(
!
room
)
{
return
;
}
ref
2
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
if
(
player
&&
player
.
pos
===
info
.
pos
&&
player
!==
client
)
{
if
(
room
.
arena
===
"
athletic
"
||
settings
.
modules
.
challonge
.
enabled
)
{
ygopro
.
stoc_send_chat_to_room
(
room
,
client
.
name
+
"
${kicked_by_system}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
...
...
@@ -2663,7 +2813,7 @@
});
ygopro
.
stoc_follow
(
'
HS_PLAYER_CHANGE
'
,
false
,
function
(
buffer
,
info
,
client
,
server
)
{
var
is_ready
,
len2
,
len3
,
m
,
n
,
p1
,
p2
,
player
,
pos
,
ref
2
,
ref3
,
room
;
var
is_ready
,
len2
,
len3
,
m
,
n
,
p1
,
p2
,
player
,
pos
,
ref
3
,
ref4
,
room
;
room
=
ROOM_all
[
client
.
rid
];
if
(
!
(
room
&&
room
.
max_player
&&
client
.
is_host
))
{
return
;
...
...
@@ -2673,9 +2823,9 @@
if
(
pos
<
room
.
max_player
)
{
if
(
room
.
arena
)
{
room
.
ready_player_count
=
0
;
ref
2
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
if
(
player
.
pos
===
pos
)
{
player
.
is_ready
=
is_ready
;
}
...
...
@@ -2713,9 +2863,9 @@
}
}
else
{
room
.
ready_player_count_without_host
=
0
;
ref
3
=
room
.
players
;
for
(
n
=
0
,
len3
=
ref
3
.
length
;
n
<
len3
;
n
++
)
{
player
=
ref
3
[
n
];
ref
4
=
room
.
players
;
for
(
n
=
0
,
len3
=
ref
4
.
length
;
n
<
len3
;
n
++
)
{
player
=
ref
4
[
n
];
if
(
player
.
pos
===
pos
)
{
player
.
is_ready
=
is_ready
;
}
...
...
@@ -2761,7 +2911,7 @@
});
wait_room_start
=
function
(
room
,
time
)
{
var
len2
,
m
,
player
,
ref
2
;
var
len2
,
m
,
player
,
ref
3
;
if
(
!
(
!
room
||
room
.
started
||
room
.
ready_player_count_without_host
<
room
.
max_player
-
1
))
{
time
-=
1
;
if
(
time
)
{
...
...
@@ -2772,9 +2922,9 @@
wait_room_start
(
room
,
time
);
}),
1000
);
}
else
{
ref
2
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
if
(
player
&&
player
.
is_host
)
{
ROOM_ban_player
(
player
.
name
,
player
.
ip
,
"
${random_ban_reason_zombie}
"
);
ygopro
.
stoc_send_chat_to_room
(
room
,
player
.
name
+
"
${kicked_by_system}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
...
...
@@ -2850,7 +3000,7 @@
}
ygopro
.
stoc_follow
(
'
DUEL_START
'
,
false
,
function
(
buffer
,
info
,
client
,
server
)
{
var
deck_arena
,
deck_name
,
deck_text
,
len2
,
m
,
player
,
ref
2
,
room
;
var
deck_arena
,
deck_name
,
deck_text
,
len2
,
m
,
player
,
ref
3
,
room
;
room
=
ROOM_all
[
client
.
rid
];
if
(
!
(
room
&&
!
client
.
reconnecting
))
{
return
;
...
...
@@ -2863,9 +3013,9 @@
roomlist
.
start
(
room
);
}
room
.
dueling_players
=
[];
ref
2
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
if
(
!
(
player
.
pos
!==
7
))
{
continue
;
}
...
...
@@ -2971,7 +3121,7 @@
};
ygopro
.
ctos_follow
(
'
CHAT
'
,
true
,
function
(
buffer
,
info
,
client
,
server
)
{
var
cancel
,
ccolor
,
cip
,
cmd
,
cmsg
,
cname
,
color
,
cvalue
,
msg
,
name
,
oldmsg
,
ref2
,
room
,
struct
,
windbot
;
var
buy_result
,
cancel
,
ccolor
,
cip
,
cmd
,
cmsg
,
cname
,
code
,
color
,
cvalue
,
key
,
msg
,
name
,
oldmsg
,
ref3
,
room
,
struct
,
uname
,
windbot
,
word
;
room
=
ROOM_all
[
client
.
rid
];
if
(
!
room
)
{
return
;
...
...
@@ -3011,12 +3161,15 @@
if
(
settings
.
modules
.
tips
.
enabled
)
{
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_tip}
"
);
}
if
(
settings
.
modules
.
chat_color
.
enabled
)
{
if
(
settings
.
modules
.
chat_color
.
enabled
&&
(
!
(
settings
.
modules
.
vip
.
enabled
&&
settings
.
modules
.
chat_color
.
restrict_to_vip
)
||
client
.
vip
)
)
{
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_chatcolor_1}
"
);
}
if
(
settings
.
modules
.
chat_color
.
enabled
)
{
if
(
settings
.
modules
.
chat_color
.
enabled
&&
(
!
(
settings
.
modules
.
vip
.
enabled
&&
settings
.
modules
.
chat_color
.
restrict_to_vip
)
||
client
.
vip
)
)
{
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_chatcolor_2}
"
);
}
if
(
settings
.
modules
.
vip
.
enabled
)
{
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_vip}
"
);
}
break
;
case
'
/tip
'
:
if
(
settings
.
modules
.
tips
.
enabled
)
{
...
...
@@ -3047,24 +3200,36 @@
case
'
/color
'
:
if
(
settings
.
modules
.
chat_color
.
enabled
)
{
cip
=
CLIENT_get_authorize_key
(
client
);
if
(
cmsg
=
cmd
[
1
])
{
if
(
settings
.
modules
.
vip
.
enabled
&&
settings
.
modules
.
chat_color
.
restrict_to_vip
&&
!
client
.
vip
)
{
CLIENT_send_vip_status
(
client
);
}
else
if
(
cmsg
=
cmd
[
1
])
{
if
(
cmsg
.
toLowerCase
()
===
"
help
"
)
{
ygopro
.
stoc_send_chat
(
client
,
"
${show_color_list}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
ref
2
=
ygopro
.
constants
.
COLORS
;
for
(
cname
in
ref
2
)
{
cvalue
=
ref
2
[
cname
];
ref
3
=
ygopro
.
constants
.
COLORS
;
for
(
cname
in
ref
3
)
{
cvalue
=
ref
3
[
cname
];
if
(
cvalue
>
10
)
{
ygopro
.
stoc_send_chat
(
client
,
cname
,
cvalue
);
}
}
}
else
if
(
cmsg
.
toLowerCase
()
===
"
default
"
)
{
chat_color
.
save_list
[
cip
]
=
false
;
if
(
settings
.
modules
.
vip
.
enabled
&&
settings
.
modules
.
chat_color
.
restrict_to_vip
)
{
delete
vip_info
.
players
[
client
.
name
].
chat_color
;
setting_save
(
vip_info
);
}
else
{
delete
chat_color
.
save_list
[
cip
];
}
setting_save
(
chat_color
);
ygopro
.
stoc_send_chat
(
client
,
"
${set_chat_color_default}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
else
{
ccolor
=
cmsg
.
toUpperCase
();
if
(
ygopro
.
constants
.
COLORS
[
ccolor
]
&&
ygopro
.
constants
.
COLORS
[
ccolor
]
>
10
&&
ygopro
.
constants
.
COLORS
[
ccolor
]
<
20
)
{
chat_color
.
save_list
[
cip
]
=
ccolor
;
if
(
settings
.
modules
.
vip
.
enabled
&&
settings
.
modules
.
chat_color
.
restrict_to_vip
)
{
vip_info
.
players
[
client
.
name
].
chat_color
=
ccolor
;
setting_save
(
vip_info
);
}
else
{
chat_color
.
save_list
[
cip
]
=
ccolor
;
}
setting_save
(
chat_color
);
ygopro
.
stoc_send_chat
(
client
,
"
${set_chat_color_part1}
"
+
ccolor
+
"
${set_chat_color_part2}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
else
{
...
...
@@ -3072,13 +3237,113 @@
}
}
}
else
{
if
(
color
=
chat_color
.
save_list
[
cip
]
)
{
if
(
color
=
(
settings
.
modules
.
vip
.
enabled
&&
settings
.
modules
.
chat_color
.
restrict_to_vip
?
vip_info
.
players
[
client
.
name
].
chat_color
:
chat_color
.
save_list
[
cip
])
)
{
ygopro
.
stoc_send_chat
(
client
,
"
${get_chat_color_part1}
"
+
color
+
"
${get_chat_color_part2}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
else
{
ygopro
.
stoc_send_chat
(
client
,
"
${get_chat_color_default}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
}
}
break
;
case
'
/vip
'
:
if
(
settings
.
modules
.
vip
.
enabled
)
{
if
(
name
=
cmd
[
1
])
{
uname
=
name
.
toLowerCase
();
switch
(
uname
)
{
case
'
help
'
:
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_vip_help}
"
);
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_vip_status}
"
);
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_vip_buy}
"
);
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_vip_password}
"
);
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_vip_dialogues}
"
);
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_vip_words}
"
);
ygopro
.
stoc_send_chat
(
client
,
"
${chat_order_vip_victory}
"
);
break
;
case
'
status
'
:
CLIENT_send_vip_status
(
client
,
true
);
break
;
case
'
buy
'
:
key
=
cmd
[
2
];
buy_result
=
CLIENT_use_cdkey
(
client
,
key
);
switch
(
buy_result
)
{
case
0
:
ygopro
.
stoc_send_chat
(
client
,
"
${vip_key_not_found}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
break
;
case
1
:
ygopro
.
stoc_send_chat
(
client
,
"
${vip_success_new_part1}
"
+
client
.
name
+
"
$
"
+
client
.
vpass
+
"
${vip_success_new_part2}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
break
;
case
2
:
ygopro
.
stoc_send_chat
(
client
,
"
${vip_success_renew}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
break
;
case
'
dialogues
'
:
if
(
!
client
.
vip
)
{
CLIENT_send_vip_status
(
client
);
}
else
{
code
=
cmd
[
2
];
word
=
cmd
[
3
];
if
(
!
code
||
!
parseInt
(
code
))
{
ygopro
.
stoc_send_chat
(
client
,
"
${vip_invalid_card_code}
"
,
ygopro
.
constants
.
COLORS
.
RED
);
}
else
if
(
!
word
)
{
delete
vip_info
.
players
[
client
.
name
].
dialogues
[
code
];
setting_save
(
vip_info
);
ygopro
.
stoc_send_chat
(
client
,
"
${vip_cleared_dialogues_part1}
"
+
code
+
"
${vip_cleared_dialogues_part2}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
else
{
vip_info
.
players
[
client
.
name
].
dialogues
[
code
]
=
word
;
setting_save
(
vip_info
);
ygopro
.
stoc_send_chat
(
client
,
"
${vip_set_dialogues_part1}
"
+
code
+
"
${vip_set_dialogues_part2}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
}
break
;
case
'
words
'
:
if
(
!
client
.
vip
)
{
CLIENT_send_vip_status
(
client
);
}
else
{
word
=
cmd
[
2
];
if
(
!
word
)
{
delete
vip_info
.
players
[
client
.
name
].
words
;
setting_save
(
vip_info
);
ygopro
.
stoc_send_chat
(
client
,
"
${vip_cleared_words}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
else
{
vip_info
.
players
[
client
.
name
].
words
=
word
;
setting_save
(
vip_info
);
ygopro
.
stoc_send_chat
(
client
,
"
${vip_set_words}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
}
break
;
case
'
victory
'
:
if
(
!
client
.
vip
)
{
CLIENT_send_vip_status
(
client
);
}
else
{
word
=
cmd
[
2
];
if
(
!
word
)
{
delete
vip_info
.
players
[
client
.
name
].
victory
;
setting_save
(
vip_info
);
ygopro
.
stoc_send_chat
(
client
,
"
${vip_cleared_victory}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
else
{
vip_info
.
players
[
client
.
name
].
victory
=
word
;
setting_save
(
vip_info
);
ygopro
.
stoc_send_chat
(
client
,
"
${vip_set_victory}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
}
break
;
case
'
password
'
:
if
(
!
client
.
vip
)
{
CLIENT_send_vip_status
(
client
);
}
else
{
word
=
cmd
[
2
];
if
(
word
)
{
vip_info
.
players
[
client
.
name
].
password
=
word
;
client
.
vpass
=
word
;
setting_save
(
vip_info
);
ygopro
.
stoc_send_chat
(
client
,
"
${vip_password_changed}
"
,
ygopro
.
constants
.
COLORS
.
BABYBLUE
);
}
}
}
}
else
{
CLIENT_send_vip_status
(
client
);
}
}
}
if
(
msg
.
length
>
100
)
{
log
.
warn
(
"
SPAM WORD
"
,
client
.
name
,
client
.
ip
,
msg
);
...
...
@@ -3192,17 +3457,17 @@
return
false
;
}
buff_main
=
(
function
()
{
var
m
,
ref
2
,
results
;
var
m
,
ref
3
,
results
;
results
=
[];
for
(
i
=
m
=
0
,
ref
2
=
info
.
mainc
;
0
<=
ref2
?
m
<
ref2
:
m
>
ref2
;
i
=
0
<=
ref2
?
++
m
:
--
m
)
{
for
(
i
=
m
=
0
,
ref
3
=
info
.
mainc
;
0
<=
ref3
?
m
<
ref3
:
m
>
ref3
;
i
=
0
<=
ref3
?
++
m
:
--
m
)
{
results
.
push
(
info
.
deckbuf
[
i
]);
}
return
results
;
})();
buff_side
=
(
function
()
{
var
m
,
ref
2
,
ref3
,
results
;
var
m
,
ref
3
,
ref4
,
results
;
results
=
[];
for
(
i
=
m
=
ref
2
=
info
.
mainc
,
ref3
=
info
.
mainc
+
info
.
sidec
;
ref2
<=
ref3
?
m
<
ref3
:
m
>
ref3
;
i
=
ref2
<=
ref3
?
++
m
:
--
m
)
{
for
(
i
=
m
=
ref
3
=
info
.
mainc
,
ref4
=
info
.
mainc
+
info
.
sidec
;
ref3
<=
ref4
?
m
<
ref4
:
m
>
ref4
;
i
=
ref3
<=
ref4
?
++
m
:
--
m
)
{
results
.
push
(
info
.
deckbuf
[
i
]);
}
return
results
;
...
...
@@ -3400,7 +3665,7 @@
});
ygopro
.
stoc_follow
(
'
CHAT
'
,
true
,
function
(
buffer
,
info
,
client
,
server
)
{
var
len2
,
m
,
pid
,
player
,
ref
2
,
room
,
tcolor
,
tplayer
;
var
len2
,
m
,
pid
,
player
,
ref
3
,
room
,
tcolor
,
tplayer
;
room
=
ROOM_all
[
client
.
rid
];
pid
=
info
.
player
;
if
(
!
(
room
&&
pid
<
4
&&
settings
.
modules
.
chat_color
.
enabled
))
{
...
...
@@ -3418,17 +3683,17 @@
pid
=
1
-
pid
;
}
}
ref
2
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
2
[
m
];
ref
3
=
room
.
players
;
for
(
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
m
++
)
{
player
=
ref
3
[
m
];
if
(
player
&&
player
.
pos
===
pid
)
{
tplayer
=
player
;
}
}
if
(
!
tplayer
)
{
if
(
!
(
tplayer
&&
(
!
(
settings
.
modules
.
vip
.
enabled
&&
settings
.
modules
.
chat_color
.
restrict_to_vip
)
||
tplayer
.
vip
))
)
{
return
;
}
tcolor
=
chat_color
.
save_list
[
CLIENT_get_authorize_key
(
tplayer
)];
tcolor
=
settings
.
modules
.
vip
.
enabled
&&
settings
.
modules
.
chat_color
.
restrict_to_vip
?
vip_info
.
players
[
tplayer
.
name
].
chat_color
:
chat_color
.
save_list
[
CLIENT_get_authorize_key
(
tplayer
)];
if
(
tcolor
)
{
ygopro
.
stoc_send
(
client
,
'
CHAT
'
,
{
player
:
ygopro
.
constants
.
COLORS
[
tcolor
],
...
...
@@ -3530,7 +3795,7 @@
});
ygopro
.
stoc_follow
(
'
REPLAY
'
,
true
,
function
(
buffer
,
info
,
client
,
server
)
{
var
duellog
,
dueltime
,
i
,
len2
,
len3
,
m
,
n
,
player
,
ref
2
,
ref3
,
replay_filename
,
room
;
var
duellog
,
dueltime
,
i
,
len2
,
len3
,
m
,
n
,
player
,
ref
3
,
ref4
,
replay_filename
,
room
;
room
=
ROOM_all
[
client
.
rid
];
if
(
!
room
)
{
return
settings
.
modules
.
tournament_mode
.
enabled
&&
settings
.
modules
.
tournament_mode
.
replay_safe
&&
settings
.
modules
.
tournament_mode
.
block_replay_to_player
;
...
...
@@ -3543,15 +3808,15 @@
dueltime
=
moment
().
format
(
'
YYYY-MM-DD HH-mm-ss
'
);
replay_filename
=
dueltime
;
if
(
room
.
hostinfo
.
mode
!==
2
)
{
ref
2
=
room
.
dueling_players
;
for
(
i
=
m
=
0
,
len2
=
ref
2
.
length
;
m
<
len2
;
i
=
++
m
)
{
player
=
ref
2
[
i
];
ref
3
=
room
.
dueling_players
;
for
(
i
=
m
=
0
,
len2
=
ref
3
.
length
;
m
<
len2
;
i
=
++
m
)
{
player
=
ref
3
[
i
];
replay_filename
=
replay_filename
+
(
i
>
0
?
"
VS
"
:
"
"
)
+
player
.
name
;
}
}
else
{
ref
3
=
room
.
dueling_players
;
for
(
i
=
n
=
0
,
len3
=
ref
3
.
length
;
n
<
len3
;
i
=
++
n
)
{
player
=
ref
3
[
i
];
ref
4
=
room
.
dueling_players
;
for
(
i
=
n
=
0
,
len3
=
ref
4
.
length
;
n
<
len3
;
i
=
++
n
)
{
player
=
ref
4
[
i
];
replay_filename
=
replay_filename
+
(
i
>
0
?
(
i
===
2
?
"
VS
"
:
"
&
"
)
:
"
"
)
+
player
.
name
;
}
}
...
...
@@ -3564,11 +3829,11 @@
replay_filename
:
replay_filename
,
roommode
:
room
.
hostinfo
.
mode
,
players
:
(
function
()
{
var
len4
,
o
,
ref
4
,
results
;
ref
4
=
room
.
dueling_players
;
var
len4
,
o
,
ref
5
,
results
;
ref
5
=
room
.
dueling_players
;
results
=
[];
for
(
o
=
0
,
len4
=
ref
4
.
length
;
o
<
len4
;
o
++
)
{
player
=
ref
4
[
o
];
for
(
o
=
0
,
len4
=
ref
5
.
length
;
o
<
len4
;
o
++
)
{
player
=
ref
5
[
o
];
results
.
push
({
name
:
player
.
name
+
(
settings
.
modules
.
tournament_mode
.
show_ip
&&
!
player
.
is_local
?
"
(IP:
"
+
player
.
ip
.
slice
(
7
)
+
"
)
"
:
""
)
+
(
settings
.
modules
.
tournament_mode
.
show_info
&&
!
(
room
.
hostinfo
.
mode
===
2
&&
player
.
pos
%
2
>
0
)
?
"
(Score:
"
+
room
.
scores
[
player
.
name
]
+
"
LP:
"
+
(
player
.
lp
!=
null
?
player
.
lp
:
room
.
hostinfo
.
start_lp
)
+
(
room
.
hostinfo
.
mode
!==
2
?
"
Cards:
"
+
(
player
.
card_count
!=
null
?
player
.
card_count
:
room
.
hostinfo
.
start_hand
)
:
""
)
+
"
)
"
:
""
),
winner
:
player
.
pos
===
room
.
winner
...
...
@@ -3640,13 +3905,13 @@
if
(
settings
.
modules
.
heartbeat_detection
.
enabled
)
{
setInterval
(
function
()
{
var
len2
,
len3
,
m
,
n
,
player
,
ref
2
,
room
;
var
len2
,
len3
,
m
,
n
,
player
,
ref
3
,
room
;
for
(
m
=
0
,
len2
=
ROOM_all
.
length
;
m
<
len2
;
m
++
)
{
room
=
ROOM_all
[
m
];
if
(
room
&&
room
.
started
&&
(
room
.
hostinfo
.
time_limit
===
0
||
!
room
.
turn
||
room
.
turn
<=
0
)
&&
!
room
.
windbot
)
{
ref
2
=
room
.
players
;
for
(
n
=
0
,
len3
=
ref
2
.
length
;
n
<
len3
;
n
++
)
{
player
=
ref
2
[
n
];
ref
3
=
room
.
players
;
for
(
n
=
0
,
len3
=
ref
3
.
length
;
n
<
len3
;
n
++
)
{
player
=
ref
3
[
n
];
if
(
!
room
.
changing_side
||
player
.
selected_preduel
)
{
CLIENT_heartbeat_register
(
player
,
true
);
}
...
...
@@ -3693,7 +3958,7 @@
return
callback
+
"
(
"
+
text
+
"
);
"
;
};
requestListener
=
function
(
request
,
response
)
{
var
archive_args
,
archive_name
,
archive_process
,
check
,
death_room_found
,
duellog
,
error
,
filename
,
getpath
,
k
ick_room_found
,
len2
,
len3
,
len4
,
len5
,
len6
,
m
,
n
,
o
,
oppo_pos
,
p
,
parseQueryString
,
pass_validated
,
player
,
q
,
ref2
,
replay
,
room
,
roomsjson
,
u
,
win_pos
;
var
archive_args
,
archive_name
,
archive_process
,
check
,
death_room_found
,
duellog
,
error
,
filename
,
getpath
,
k
ey
,
kick_room_found
,
len2
,
len3
,
len4
,
len5
,
len6
,
len7
,
m
,
n
,
o
,
oppo_pos
,
p
,
parseQueryString
,
pass_validated
,
player
,
q
,
r
,
ref3
,
ref4
,
replay
,
ret_keys
,
room
,
roomsjson
,
u
,
win_pos
;
parseQueryString
=
true
;
u
=
url
.
parse
(
request
.
url
,
parseQueryString
);
pass_validated
=
u
.
query
.
pass
===
settings
.
modules
.
http
.
password
;
...
...
@@ -3717,11 +3982,11 @@
roommode
:
room
.
hostinfo
.
mode
,
needpass
:
(
room
.
name
.
indexOf
(
'
$
'
)
!==
-
1
).
toString
(),
users
:
(
function
()
{
var
len3
,
n
,
ref
2
,
results1
;
ref
2
=
room
.
players
;
var
len3
,
n
,
ref
3
,
results1
;
ref
3
=
room
.
players
;
results1
=
[];
for
(
n
=
0
,
len3
=
ref
2
.
length
;
n
<
len3
;
n
++
)
{
player
=
ref
2
[
n
];
for
(
n
=
0
,
len3
=
ref
3
.
length
;
n
<
len3
;
n
++
)
{
player
=
ref
3
[
n
];
if
(
player
.
pos
!=
null
)
{
results1
.
push
({
id
:
(
-
1
).
toString
(),
...
...
@@ -3751,6 +4016,25 @@
duellog
=
JSON
.
stringify
(
duel_log
.
duel_log
,
null
,
2
);
response
.
end
(
addCallback
(
u
.
query
.
callback
,
duellog
));
}
}
else
if
(
u
.
pathname
===
'
/api/getkeys
'
&&
settings
.
modules
.
vip
.
enabled
)
{
if
(
!
(
u
.
query
.
pass
===
settings
.
modules
.
tournament_mode
.
password
))
{
response
.
writeHead
(
200
);
response
.
end
(
addCallback
(
u
.
query
.
callback
,
"
Unauthorized.
"
));
return
;
}
else
if
(
!
u
.
query
.
keytype
||
!
vip_info
.
cdkeys
[
u
.
query
.
keytype
])
{
response
.
writeHead
(
200
);
response
.
end
(
addCallback
(
u
.
query
.
callback
,
"
Key type not found.
"
));
return
;
}
else
{
response
.
writeHead
(
200
);
ret_keys
=
""
;
ref3
=
vip_info
.
cdkeys
[
u
.
query
.
keytype
];
for
(
m
=
0
,
len2
=
ref3
.
length
;
m
<
len2
;
m
++
)
{
key
=
ref3
[
m
];
ret_keys
=
ret_keys
+
key
+
"
\n
"
;
}
response
.
end
(
addCallback
(
u
.
query
.
callback
,
ret_keys
));
}
}
else
if
(
u
.
pathname
===
'
/api/archive.zip
'
&&
settings
.
modules
.
tournament_mode
.
enabled
)
{
if
(
!
(
u
.
query
.
pass
===
settings
.
modules
.
tournament_mode
.
password
))
{
response
.
writeHead
(
403
);
...
...
@@ -3761,9 +4045,9 @@
archive_name
=
moment
().
format
(
'
YYYY-MM-DD HH-mm-ss
'
)
+
"
.zip
"
;
archive_args
=
[
"
a
"
,
"
-mx0
"
,
"
-y
"
,
archive_name
];
check
=
false
;
ref
2
=
duel_log
.
duel_log
;
for
(
m
=
0
,
len2
=
ref2
.
length
;
m
<
len2
;
m
++
)
{
replay
=
ref
2
[
m
];
ref
4
=
duel_log
.
duel_log
;
for
(
n
=
0
,
len3
=
ref4
.
length
;
n
<
len3
;
n
++
)
{
replay
=
ref
4
[
n
];
check
=
true
;
archive_args
.
push
(
replay
.
replay_filename
);
}
...
...
@@ -3861,8 +4145,8 @@
return
;
}
if
(
u
.
query
.
shout
)
{
for
(
n
=
0
,
len3
=
ROOM_all
.
length
;
n
<
len3
;
n
++
)
{
room
=
ROOM_all
[
n
];
for
(
o
=
0
,
len4
=
ROOM_all
.
length
;
o
<
len4
;
o
++
)
{
room
=
ROOM_all
[
o
];
if
(
room
&&
room
.
established
)
{
ygopro
.
stoc_send_chat_to_room
(
room
,
u
.
query
.
shout
,
ygopro
.
constants
.
COLORS
.
YELLOW
);
}
...
...
@@ -3904,8 +4188,8 @@
response
.
end
(
addCallback
(
u
.
query
.
callback
,
"
['ban ok', '
"
+
u
.
query
.
ban
+
"
']
"
));
}
else
if
(
u
.
query
.
kick
)
{
kick_room_found
=
false
;
for
(
o
=
0
,
len4
=
ROOM_all
.
length
;
o
<
len4
;
o
++
)
{
room
=
ROOM_all
[
o
];
for
(
p
=
0
,
len5
=
ROOM_all
.
length
;
p
<
len5
;
p
++
)
{
room
=
ROOM_all
[
p
];
if
(
!
(
room
&&
room
.
established
&&
(
u
.
query
.
kick
===
"
all
"
||
u
.
query
.
kick
===
room
.
port
.
toString
()
||
u
.
query
.
kick
===
room
.
name
)))
{
continue
;
}
...
...
@@ -3926,8 +4210,8 @@
}
}
else
if
(
u
.
query
.
death
)
{
death_room_found
=
false
;
for
(
p
=
0
,
len5
=
ROOM_all
.
length
;
p
<
len5
;
p
++
)
{
room
=
ROOM_all
[
p
];
for
(
q
=
0
,
len6
=
ROOM_all
.
length
;
q
<
len6
;
q
++
)
{
room
=
ROOM_all
[
q
];
if
(
!
(
room
&&
room
.
established
&&
room
.
started
&&
!
room
.
death
&&
(
u
.
query
.
death
===
"
all
"
||
u
.
query
.
death
===
room
.
port
.
toString
()
||
u
.
query
.
death
===
room
.
name
)))
{
continue
;
}
...
...
@@ -3987,8 +4271,8 @@
}
}
else
if
(
u
.
query
.
deathcancel
)
{
death_room_found
=
false
;
for
(
q
=
0
,
len6
=
ROOM_all
.
length
;
q
<
len6
;
q
++
)
{
room
=
ROOM_all
[
q
];
for
(
r
=
0
,
len7
=
ROOM_all
.
length
;
r
<
len7
;
r
++
)
{
room
=
ROOM_all
[
r
];
if
(
!
(
room
&&
room
.
established
&&
room
.
started
&&
room
.
death
&&
(
u
.
query
.
deathcancel
===
"
all
"
||
u
.
query
.
deathcancel
===
room
.
port
.
toString
())))
{
continue
;
}
...
...
@@ -4002,6 +4286,10 @@
}
else
{
response
.
end
(
addCallback
(
u
.
query
.
callback
,
"
['room not found', '
"
+
u
.
query
.
deathcancel
+
"
']
"
));
}
}
else
if
(
u
.
query
.
generatekey
&&
settings
.
modules
.
vip
.
enabled
)
{
VIP_generate_cdkeys
(
u
.
query
.
generatekey
,
settings
.
modules
.
vip
.
generate_count
);
response
.
writeHead
(
200
);
response
.
end
(
addCallback
(
u
.
query
.
callback
,
"
['Keys generated', '
"
+
u
.
query
.
generatekey
+
"
']
"
));
}
else
{
response
.
writeHead
(
400
);
response
.
end
();
...
...
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