Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
ygopro-match
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
MyCard
ygopro-match
Commits
e84a98f5
Commit
e84a98f5
authored
Jan 01, 2026
by
nanahira
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refa with Pool object
parent
82074b07
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
74 additions
and
59 deletions
+74
-59
main.js
main.js
+74
-59
No files found.
main.js
View file @
e84a98f5
...
...
@@ -11,11 +11,58 @@ const config = JSON.parse(fs.readFileSync("./config.json"));
let
athleticUserPool
=
[];
let
entertainUserPool
=
[];
let
deadUserPool
=
[];
let
playingPlayerPool
=
new
Map
();
let
playingPlayerOpponents
=
new
Map
();
let
playingPlayerTimeout
=
new
Map
();
let
pendingPlayerPool
=
new
Map
();
let
pendingPlayerTimeout
=
new
Map
();
class
Pool
{
constructor
(
config
)
{
this
.
config
=
config
;
this
.
pool
=
new
Map
();
this
.
timeout
=
new
Map
();
}
has
(
user
)
{
return
this
.
pool
.
has
(
user
);
}
get
(
user
)
{
return
this
.
pool
.
get
(
user
);
}
set
(
user
,
info
)
{
this
.
pool
.
set
(
user
,
info
);
if
(
this
.
timeout
.
has
(
user
))
clearTimeout
(
this
.
timeout
.
get
(
user
));
this
.
timeout
.
set
(
user
,
setTimeout
(()
=>
this
.
handleTimeout
(
user
),
this
.
config
.
timeoutMs
));
}
delete
(
user
)
{
let
hasUser
=
this
.
pool
.
has
(
user
);
let
info
=
hasUser
?
this
.
pool
.
get
(
user
)
:
null
;
if
(
hasUser
)
this
.
pool
.
delete
(
user
);
if
(
this
.
timeout
.
has
(
user
))
{
clearTimeout
(
this
.
timeout
.
get
(
user
));
this
.
timeout
.
delete
(
user
);
}
return
info
;
}
handleTimeout
(
user
)
{
if
(
clearUserPools
(
user
))
localLog
(
this
.
config
.
timeoutLogPrefix
+
user
);
}
transferToPool
(
targetPool
,
user
,
logPrefix
)
{
let
info
=
this
.
delete
(
user
);
if
(
!
info
)
{
if
(
logPrefix
)
localLog
(
logPrefix
+
user
);
return
null
;
}
targetPool
.
set
(
user
,
info
);
return
info
;
}
}
let
playingPool
=
new
Pool
({
timeoutLogPrefix
:
"
With timeout, user is seen as had left the game:
"
,
timeoutMs
:
config
.
match
.
longestMatchTime
});
let
pendingPool
=
new
Pool
({
timeoutLogPrefix
:
"
Pending room expired for user:
"
,
timeoutMs
:
600000
});
let
playerOpponents
=
new
Map
();
let
predictedEntertainTime
=
600
,
predictedAthleticTime
=
600
;
let
entertainRequestCountInTime
=
0
,
athleticRequestCountInTime
=
0
;
...
...
@@ -32,20 +79,14 @@ let clearUserPools = function(user) {
let
currentUser
=
toClear
.
pop
();
if
(
!
currentUser
||
seen
.
has
(
currentUser
))
continue
;
seen
.
add
(
currentUser
);
if
(
playingPlayerPool
.
delete
(
currentUser
))
removedFromPlaying
=
true
;
if
(
pendingPlayerPool
.
delete
(
currentUser
))
removedFromPending
=
true
;
if
(
playingPlayerTimeout
.
has
(
currentUser
))
{
clearTimeout
(
playingPlayerTimeout
.
get
(
currentUser
));
playingPlayerTimeout
.
delete
(
currentUser
);
}
if
(
pendingPlayerTimeout
.
has
(
currentUser
))
{
clearTimeout
(
pendingPlayerTimeout
.
get
(
currentUser
));
pendingPlayerTimeout
.
delete
(
currentUser
);
}
let
opponent
=
playingPlayerOpponents
.
get
(
currentUser
);
playingPlayerOpponents
.
delete
(
currentUser
);
let
playingRemoval
=
playingPool
.
delete
(
currentUser
);
let
pendingRemoval
=
pendingPool
.
delete
(
currentUser
);
if
(
playingRemoval
!==
null
)
removedFromPlaying
=
true
;
if
(
pendingRemoval
!==
null
)
removedFromPending
=
true
;
let
opponent
=
playerOpponents
.
get
(
currentUser
);
playerOpponents
.
delete
(
currentUser
);
if
(
opponent
)
{
play
ingPlay
erOpponents
.
delete
(
opponent
);
playerOpponents
.
delete
(
opponent
);
toClear
.
push
(
opponent
);
}
}
...
...
@@ -257,8 +298,8 @@ let pair = function (userARes, userBRes, serverName) {
}
options_buffer
.
writeUInt8
(
checksum
&
0xFF
,
0
);
localLog
(
userARes
.
username
+
"
and
"
+
userBRes
.
username
+
"
matched on room
"
+
room_id
);
play
ingPlay
erOpponents
.
set
(
userARes
.
username
,
userBRes
.
username
);
play
ingPlay
erOpponents
.
set
(
userBRes
.
username
,
userARes
.
username
);
playerOpponents
.
set
(
userARes
.
username
,
userBRes
.
username
);
playerOpponents
.
set
(
userBRes
.
username
,
userARes
.
username
);
for
(
let
client
of
[
userARes
,
userBRes
])
{
let
buffer
=
new
Buffer
(
6
);
let
secret
=
parseInt
(
client
.
password
)
%
65535
+
1
;
...
...
@@ -271,10 +312,7 @@ let pair = function (userARes, userBRes, serverName) {
"
port
"
:
server
.
port
,
"
password
"
:
password
,
};
pendingPlayerPool
.
set
(
client
.
username
,
result
);
if
(
pendingPlayerTimeout
.
has
(
client
.
username
))
clearTimeout
(
pendingPlayerTimeout
.
get
(
client
.
username
));
pendingPlayerTimeout
.
set
(
client
.
username
,
setTimeout
(
timeoutPendingUser
,
600000
,
client
.
username
));
pendingPool
.
set
(
client
.
username
,
result
);
client
.
writeHead
(
200
,
{
'
Content-Type
'
:
'
application/json
'
,
'
Cache-Control
'
:
'
no-cache
'
});
lookup
(
result
).
then
(
r
=>
client
.
end
(
JSON
.
stringify
(
r
))
...
...
@@ -343,8 +381,8 @@ let finishUser = function (json) {
let
userA
=
json
.
usernameA
;
let
userB
=
json
.
usernameB
;
if
(
!
userA
&&
!
userB
)
return
;
if
(
!
userA
&&
play
ingPlayerOpponents
.
has
(
userB
))
userA
=
playingP
layerOpponents
.
get
(
userB
);
if
(
!
userB
&&
play
ingPlayerOpponents
.
has
(
userA
))
userB
=
playingP
layerOpponents
.
get
(
userA
);
if
(
!
userA
&&
play
erOpponents
.
has
(
userB
))
userA
=
p
layerOpponents
.
get
(
userB
);
if
(
!
userB
&&
play
erOpponents
.
has
(
userA
))
userB
=
p
layerOpponents
.
get
(
userA
);
for
(
let
user
of
[
userA
,
userB
])
{
if
(
!
user
)
continue
;
if
(
!
clearUserPools
(
user
))
...
...
@@ -361,34 +399,11 @@ let startUser = function (query) {
if
(
!
userA
&&
!
userB
)
return
;
for
(
let
user
of
[
userA
,
userB
])
{
if
(
!
user
)
continue
;
let
roomInfo
=
pendingPlayerPool
.
get
(
user
);
if
(
!
roomInfo
)
{
localLog
(
"
Unknown pending player started the game:
"
+
user
);
continue
;
}
pendingPlayerPool
.
delete
(
user
);
clearTimeout
(
pendingPlayerTimeout
.
get
(
user
));
pendingPlayerTimeout
.
delete
(
user
);
playingPlayerPool
.
set
(
user
,
roomInfo
);
if
(
playingPlayerTimeout
.
has
(
user
))
clearTimeout
(
playingPlayerTimeout
.
get
(
user
));
playingPlayerTimeout
.
set
(
user
,
setTimeout
(
timeoutUser
,
config
.
match
.
longestMatchTime
,
user
));
pendingPool
.
transferToPool
(
playingPool
,
user
,
"
Unknown pending player started the game:
"
);
}
localLog
(
"
Player
"
+
userA
+
"
and
"
+
userB
+
"
started the game.
"
);
};
// 当超过时间,而 srvpro 从未通知基本服务器游戏已结束时
let
timeoutUser
=
function
(
user
)
{
if
(
clearUserPools
(
user
))
localLog
(
"
With timeout, user is seen as had left the game:
"
+
user
);
};
// 当房间未开始而超时
let
timeoutPendingUser
=
function
(
user
)
{
if
(
clearUserPools
(
user
))
localLog
(
"
Pending room expired for user:
"
+
user
);
};
// 计算预期时间
let
calculatePredictedTime
=
function
()
{
if
(
entertainRequestCountInTime
===
0
)
...
...
@@ -420,11 +435,11 @@ let matchResponse = function(req, res) {
res
.
username
=
username
;
res
.
password
=
password
;
// 检定是否掉线重连
if
(
playingP
layerP
ool
.
has
(
username
))
{
if
(
playingPool
.
has
(
username
))
{
switch
(
config
.
match
.
reconnect
)
{
case
"
reconnect
"
:
res
.
writeHead
(
200
,
{
'
Content-Type
'
:
'
application/json
'
,
'
Cache-Control
'
:
'
no-cache
'
});
let
message
=
playingP
layerP
ool
.
get
(
username
);
let
message
=
playingPool
.
get
(
username
);
localLog
(
username
+
"
is relining to:
"
+
message
);
lookup
(
message
).
then
(
r
=>
res
.
end
(
JSON
.
stringify
(
r
))
...
...
@@ -509,10 +524,10 @@ let endUserPermit = function(query, res) {
let
password
=
query
.
password
;
let
arena
=
query
.
arena
;
let
info
=
null
;
if
(
pendingP
layerP
ool
.
has
(
username
))
{
info
=
pendingP
layerP
ool
.
get
(
username
);
}
else
if
(
playingP
layerP
ool
.
has
(
username
))
{
info
=
playingP
layerP
ool
.
get
(
username
);
if
(
pendingPool
.
has
(
username
))
{
info
=
pendingPool
.
get
(
username
);
}
else
if
(
playingPool
.
has
(
username
))
{
info
=
playingPool
.
get
(
username
);
}
if
(
info
)
{
if
(
password
==
info
.
password
)
{
...
...
@@ -543,7 +558,7 @@ let endClearResponse = function(query, res) {
return
notFoundResponse
(
res
);
let
count
=
0
;
let
clearFromPool
=
function
(
pool
)
{
let
shadow_pool
=
new
Map
(
pool
);
let
shadow_pool
=
new
Map
(
pool
.
pool
);
for
(
let
[
iterate_user
,
iterate_info
]
of
shadow_pool
.
entries
())
{
if
(
iterate_user
!=
"
*
"
&&
iterate_user
!=
user
)
continue
;
if
(
iterate_info
.
address
==
arena_info
.
address
&&
iterate_info
.
port
==
arena_info
.
port
)
{
...
...
@@ -552,8 +567,8 @@ let endClearResponse = function(query, res) {
}
}
};
clearFromPool
(
playingP
layerP
ool
);
clearFromPool
(
pendingP
layerP
ool
);
clearFromPool
(
playingPool
);
clearFromPool
(
pendingPool
);
res
.
end
(
`
${
count
}
user cleared.`
);
};
...
...
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