Commit c0edb987 authored by nanahira's avatar nanahira

add vip

parent fa26789b
......@@ -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,
......
......@@ -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
......@@ -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": {
......
......@@ -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()
......
// 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\dABCDEF]+)/)[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];
ref1 = fs.readFileSync('ygopro/expansions/lflist.conf', 'utf8').match(/!.*/g);
for (j = 0, len = ref1.length; j < len; j++) {
list = ref1[j];
date = list.match(/!([\d\.]+)/);
if (!date) {
continue;
......@@ -255,9 +360,9 @@
}
try {
ref1 = fs.readFileSync('ygopro/lflist.conf', 'utf8').match(/!.*/g);
for (l = 0, len1 = ref1.length; l < len1; l++) {
list = ref1[l];
ref2 = fs.readFileSync('ygopro/lflist.conf', 'utf8').match(/!.*/g);
for (l = 0, len1 = ref2.length; l < len1; l++) {
list = ref2[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, ref2, room;
var bad_ip, len2, len3, m, n, player, ref3, 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) {
ref2 = room.players;
for (n = 0, len3 = ref2.length; n < len3; n++) {
player = ref2[n];
ref3 = room.players;
for (n = 0, len3 = ref3.length; n < len3; n++) {
player = ref3[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, ref2;
var len2, m, player, ref3;
if (!room) {
return;
}
ref2 = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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, ref2;
ref2 = room.players;
for (index = m = 0, len2 = ref2.length; m < len2; index = ++m) {
player = ref2[index];
var index, key, len2, len3, m, n, player, ref3;
ref3 = room.players;
for (index = m = 0, len2 = ref3.length; m < len2; index = ++m) {
player = ref3[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, ref2;
var is_player, len2, m, player, ref3;
is_player = false;
ref2 = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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, ref2, req_pos;
var len2, 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);
req_pos = old_client.pos;
......@@ -771,9 +877,9 @@
ygopro.stoc_send(client, 'TYPE_CHANGE', {
type: req_pos
});
ref2 = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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, ref2;
ref2 = player.pre_establish_buffers;
for (m = 0, len2 = ref2.length; m < len2; m++) {
buffer = ref2[m];
var buffer, len2, m, ref3;
ref3 = player.pre_establish_buffers;
for (m = 0, len2 = ref3.length; m < len2; m++) {
buffer = ref3[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, ref2, replay_id, score, score_array;
var end_time, index, log_rep_id, name, player_ips, player_names, recorder_buffer, ref3, replay_id, score, score_array;
if (this.deleted) {
return;
}
score_array = [];
ref2 = this.scores;
for (name in ref2) {
score = ref2[name];
ref3 = this.scores;
for (name in ref3) {
score = ref3[name];
score_array.push({
name: name,
score: score
......@@ -1244,14 +1350,14 @@
};
Room.prototype.is_has_disconnected_player = function() {
var found, len2, m, player, ref2;
var found, len2, m, player, ref3;
if (!settings.modules.reconnect.enabled) {
return false;
}
found = false;
ref2 = this.get_playing_player();
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = this.get_playing_player();
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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, ref2;
ref2 = client.pre_establish_buffers;
for (m = 0, len2 = ref2.length; m < len2; m++) {
buffer = ref2[m];
var buffer, len2, m, ref3;
ref3 = client.pre_establish_buffers;
for (m = 0, len2 = ref3.length; m < len2; m++) {
buffer = ref3[m];
client.server.write(buffer);
}
client.established = true;
......@@ -1306,7 +1412,7 @@
};
Room.prototype.disconnect = function(client, error) {
var index, len2, m, player, ref2;
var index, len2, m, player, ref3;
if (client.had_new_reconnection) {
return;
}
......@@ -1319,9 +1425,9 @@
client.server.destroy();
} else {
if (this.arena && !this.started) {
ref2 = this.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = this.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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, ref2, ref3, ref4, replay_id, room, secret;
var check, decrypted_buffer, finish, i, id, len2, len3, len4, m, n, name, o, pre_room, ref3, 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, ref2;
var checksum, i, m, ref3;
checksum = 0;
for (i = m = 0, ref2 = buf.length; 0 <= ref2 ? m < ref2 : m > ref2; i = 0 <= ref2 ? ++m : --m) {
for (i = m = 0, ref3 = 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, ref2, room, title;
var action, len2, m, name, opt1, opt2, opt3, options, ref3, 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);
ref2 = room.watcher_buffers;
for (m = 0, len2 = ref2.length; m < len2; m++) {
buffer = ref2[m];
ref3 = room.watcher_buffers;
for (m = 0, len2 = ref3.length; m < len2; m++) {
buffer = ref3[m];
client.write(buffer);
}
} else {
......@@ -1866,9 +1978,9 @@
if (id = users_cache[client.name]) {
secret = id % 65535 + 1;
decrypted_buffer = new Buffer(6);
ref2 = [0, 2, 4];
for (m = 0, len2 = ref2.length; m < len2; m++) {
i = ref2[m];
ref3 = [0, 2, 4];
for (m = 0, len2 = ref3.length; m < len2; m++) {
i = ref3[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, ref3;
var len3, n, ref4;
if (body && body.user) {
users_cache[client.name] = body.user.id;
secret = body.user.id % 65535 + 1;
decrypted_buffer = new Buffer(6);
ref3 = [0, 2, 4];
for (n = 0, len3 = ref3.length; n < len3; n++) {
i = ref3[n];
ref4 = [0, 2, 4];
for (n = 0, len3 = ref4.length; n < len3; n++) {
i = ref4[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);
ref3 = room.watcher_buffers;
for (n = 0, len3 = ref3.length; n < len3; n++) {
buffer = ref3[n];
ref4 = room.watcher_buffers;
for (n = 0, len3 = ref4.length; n < len3; n++) {
buffer = ref4[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, ref4, ref5;
var len4, len5, match, o, p, player, ref5, 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);
ref4 = room.watcher_buffers;
for (o = 0, len4 = ref4.length; o < len4; o++) {
buffer = ref4[o];
ref5 = room.watcher_buffers;
for (o = 0, len4 = ref5.length; o < len4; o++) {
buffer = ref5[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 {
ref5 = room.players;
for (p = 0, len5 = ref5.length; p < len5; p++) {
player = ref5[p];
ref6 = room.players;
for (p = 0, len5 = ref6.length; p < len5; p++) {
player = ref6[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);
ref4 = room.watcher_buffers;
for (o = 0, len4 = ref4.length; o < len4; o++) {
buffer = ref4[o];
ref5 = room.watcher_buffers;
for (o = 0, len4 = ref5.length; o < len4; o++) {
buffer = ref5[o];
client.write(buffer);
}
} else {
......@@ -2087,7 +2199,7 @@
});
ygopro.stoc_follow('JOIN_GAME', false, function(buffer, info, client, server) {
var len2, line, m, recorder, ref2, room, watcher;
var len2, len3, 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 len3, n, ref3, w;
var len4, o, ref5, w;
room = ROOM_all[client.rid];
if (!room) {
return;
}
room.watcher_buffers.push(data);
ref3 = room.watchers;
for (n = 0, len3 = ref3.length; n < len3; n++) {
w = ref3[n];
ref5 = room.watchers;
for (o = 0, len4 = ref5.length; o < len4; o++) {
w = ref5[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) {
ref2 = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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 < (ref3 = room.dueling_players[pos].lp) && ref3 <= 100)) {
if ((0 < (ref6 = 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 < (ref4 = room.dueling_players[pos].lp) && ref4 <= 100)) {
if ((0 < (ref7 = 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]) {
ref6 = room.get_playing_player();
for (p = 0, len4 = ref6.length; p < len4; p++) {
player = ref6[p];
ref9 = room.get_playing_player();
for (r = 0, len6 = ref9.length; r < len6; r++) {
player = ref9[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]) {
ref8 = _.lines(dialogues.dialogues_custom[card][Math.floor(Math.random() * dialogues.dialogues_custom[card].length)]);
for (r = 0, len6 = ref8.length; r < len6; r++) {
line = ref8[r];
} else if (settings.modules.dialogues.enabled && dialogues.dialogues_custom[card]) {
ref13 = _.lines(dialogues.dialogues_custom[card][Math.floor(Math.random() * dialogues.dialogues_custom[card].length)]);
for (y = 0, len10 = ref13.length; y < len10; y++) {
line = ref13[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, ref2, room;
var len2, m, player, ref3, 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;
}
ref2 = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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, ref2, room;
var len2, m, player, ref3, room;
room = ROOM_all[client.rid];
if (!room) {
return;
}
ref2 = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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, ref2, ref3, room;
var is_ready, len2, len3, m, n, p1, p2, player, pos, ref3, 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;
ref2 = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[m];
if (player.pos === pos) {
player.is_ready = is_ready;
}
......@@ -2713,9 +2863,9 @@
}
} else {
room.ready_player_count_without_host = 0;
ref3 = room.players;
for (n = 0, len3 = ref3.length; n < len3; n++) {
player = ref3[n];
ref4 = room.players;
for (n = 0, len3 = ref4.length; n < len3; n++) {
player = ref4[n];
if (player.pos === pos) {
player.is_ready = is_ready;
}
......@@ -2761,7 +2911,7 @@
});
wait_room_start = function(room, time) {
var len2, m, player, ref2;
var len2, m, player, ref3;
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 {
ref2 = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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, ref2, room;
var deck_arena, deck_name, deck_text, len2, m, player, ref3, room;
room = ROOM_all[client.rid];
if (!(room && !client.reconnecting)) {
return;
......@@ -2863,9 +3013,9 @@
roomlist.start(room);
}
room.dueling_players = [];
ref2 = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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);
ref2 = ygopro.constants.COLORS;
for (cname in ref2) {
cvalue = ref2[cname];
ref3 = ygopro.constants.COLORS;
for (cname in ref3) {
cvalue = ref3[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, ref2, results;
var m, ref3, results;
results = [];
for (i = m = 0, ref2 = info.mainc; 0 <= ref2 ? m < ref2 : m > ref2; i = 0 <= ref2 ? ++m : --m) {
for (i = m = 0, ref3 = 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, ref2, ref3, results;
var m, ref3, ref4, results;
results = [];
for (i = m = ref2 = info.mainc, ref3 = info.mainc + info.sidec; ref2 <= ref3 ? m < ref3 : m > ref3; i = ref2 <= ref3 ? ++m : --m) {
for (i = m = ref3 = 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, ref2, room, tcolor, tplayer;
var len2, m, pid, player, ref3, 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;
}
}
ref2 = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) {
player = ref2[m];
ref3 = room.players;
for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[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, ref2, ref3, replay_filename, room;
var duellog, dueltime, i, len2, len3, m, n, player, ref3, 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) {
ref2 = room.dueling_players;
for (i = m = 0, len2 = ref2.length; m < len2; i = ++m) {
player = ref2[i];
ref3 = room.dueling_players;
for (i = m = 0, len2 = ref3.length; m < len2; i = ++m) {
player = ref3[i];
replay_filename = replay_filename + (i > 0 ? " VS " : " ") + player.name;
}
} else {
ref3 = room.dueling_players;
for (i = n = 0, len3 = ref3.length; n < len3; i = ++n) {
player = ref3[i];
ref4 = room.dueling_players;
for (i = n = 0, len3 = ref4.length; n < len3; i = ++n) {
player = ref4[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, ref4, results;
ref4 = room.dueling_players;
var len4, o, ref5, results;
ref5 = room.dueling_players;
results = [];
for (o = 0, len4 = ref4.length; o < len4; o++) {
player = ref4[o];
for (o = 0, len4 = ref5.length; o < len4; o++) {
player = ref5[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, ref2, room;
var len2, len3, m, n, player, ref3, 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) {
ref2 = room.players;
for (n = 0, len3 = ref2.length; n < len3; n++) {
player = ref2[n];
ref3 = room.players;
for (n = 0, len3 = ref3.length; n < len3; n++) {
player = ref3[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, kick_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, key, 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, ref2, results1;
ref2 = room.players;
var len3, n, ref3, results1;
ref3 = room.players;
results1 = [];
for (n = 0, len3 = ref2.length; n < len3; n++) {
player = ref2[n];
for (n = 0, len3 = ref3.length; n < len3; n++) {
player = ref3[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;
ref2 = duel_log.duel_log;
for (m = 0, len2 = ref2.length; m < len2; m++) {
replay = ref2[m];
ref4 = duel_log.duel_log;
for (n = 0, len3 = ref4.length; n < len3; n++) {
replay = ref4[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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment