Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
S
srvpro2
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
srvpro2
Commits
93745262
Commit
93745262
authored
Feb 16, 2026
by
nanahira
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add ClientKeyProvider
parent
17fa2913
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
122 additions
and
97 deletions
+122
-97
src/feats/client-key-provider/index.ts
src/feats/client-key-provider/index.ts
+1
-0
src/feats/client-key-provider/provider.ts
src/feats/client-key-provider/provider.ts
+16
-0
src/feats/feats-module.ts
src/feats/feats-module.ts
+7
-3
src/feats/index.ts
src/feats/index.ts
+1
-0
src/feats/random-duel/provider.ts
src/feats/random-duel/provider.ts
+88
-66
src/feats/reconnect/index.ts
src/feats/reconnect/index.ts
+6
-24
src/join-handlers/join-blank-pass-random-duel.ts
src/join-handlers/join-blank-pass-random-duel.ts
+1
-1
src/join-handlers/join-handler-module.ts
src/join-handlers/join-handler-module.ts
+1
-2
src/join-handlers/random-duel-join-handler.ts
src/join-handlers/random-duel-join-handler.ts
+1
-1
No files found.
src/feats/client-key-provider/index.ts
0 → 100644
View file @
93745262
export
*
from
'
./provider
'
;
src/feats/client-key-provider/provider.ts
0 → 100644
View file @
93745262
import
{
Client
}
from
'
../../client
'
;
export
class
ClientKeyProvider
{
// Keep this switch for future compatibility with srvpro identity policies.
isLooseIdentityRule
=
false
;
getClientKey
(
client
:
Client
):
string
{
if
(
!
this
.
isLooseIdentityRule
&&
client
.
vpass
)
{
return
client
.
name_vpass
;
}
if
(
this
.
isLooseIdentityRule
)
{
return
client
.
name
||
client
.
ip
||
'
undefined
'
;
}
return
`
${
client
.
ip
}
:
${
client
.
name
}
`
;
}
}
src/feats/feats-module.ts
View file @
93745262
...
@@ -9,15 +9,19 @@ import { SideTimeout } from './side-timeout';
...
@@ -9,15 +9,19 @@ import { SideTimeout } from './side-timeout';
import
{
RandomDuelModule
}
from
'
./random-duel
'
;
import
{
RandomDuelModule
}
from
'
./random-duel
'
;
import
{
WaitForPlayerProvider
}
from
'
./wait-for-player-provider
'
;
import
{
WaitForPlayerProvider
}
from
'
./wait-for-player-provider
'
;
import
{
ResourceModule
}
from
'
./resource
'
;
import
{
ResourceModule
}
from
'
./resource
'
;
import
{
MenuManager
}
from
'
./menu-manager
'
;
import
{
ClientKeyProvider
}
from
'
./client-key-provider
'
;
export
const
FeatsModule
=
createAppContext
<
ContextState
>
()
export
const
FeatsModule
=
createAppContext
<
ContextState
>
()
.
use
(
ResourceModule
)
.
provide
(
ClientKeyProvider
)
.
provide
(
MenuManager
)
.
provide
(
ClientVersionCheck
)
.
provide
(
ClientVersionCheck
)
.
provide
(
Welcome
)
.
provide
(
Welcome
)
.
provide
(
PlayerStatusNotify
)
.
provide
(
PlayerStatusNotify
)
.
provide
(
Reconnect
)
.
provide
(
Reconnect
)
.
provide
(
WaitForPlayerProvider
)
.
provide
(
WaitForPlayerProvider
)
// chat refresh
.
provide
(
SideTimeout
)
.
provide
(
SideTimeout
)
.
use
(
RandomDuelModule
)
.
use
(
ResourceModule
)
// chat bad words
.
use
(
RandomDuelModule
)
// chat random duel block
.
use
(
WindbotModule
)
.
use
(
WindbotModule
)
.
define
();
.
define
();
src/feats/index.ts
View file @
93745262
export
*
from
'
./client-version-check
'
;
export
*
from
'
./client-version-check
'
;
export
*
from
'
./client-key-provider
'
;
export
*
from
'
./menu-manager
'
;
export
*
from
'
./menu-manager
'
;
export
*
from
'
./welcome
'
;
export
*
from
'
./welcome
'
;
export
*
from
'
./random-duel
'
;
export
*
from
'
./random-duel
'
;
...
...
src/feats/random-duel/provider.ts
View file @
93745262
This diff is collapsed.
Click to expand it.
src/feats/reconnect/index.ts
View file @
93745262
...
@@ -29,6 +29,7 @@ import { getSpecificFields } from '../../utility/metadata';
...
@@ -29,6 +29,7 @@ import { getSpecificFields } from '../../utility/metadata';
import
{
YGOProCtosDisconnect
}
from
'
../../utility/ygopro-ctos-disconnect
'
;
import
{
YGOProCtosDisconnect
}
from
'
../../utility/ygopro-ctos-disconnect
'
;
import
{
isUpdateDeckPayloadEqual
}
from
'
../../utility/deck-compare
'
;
import
{
isUpdateDeckPayloadEqual
}
from
'
../../utility/deck-compare
'
;
import
{
CanReconnectCheck
}
from
'
./can-reconnect-check
'
;
import
{
CanReconnectCheck
}
from
'
./can-reconnect-check
'
;
import
{
ClientKeyProvider
}
from
'
../client-key-provider
'
;
interface
DisconnectInfo
{
interface
DisconnectInfo
{
key
:
string
;
key
:
string
;
...
@@ -54,13 +55,13 @@ declare module '../../client' {
...
@@ -54,13 +55,13 @@ declare module '../../client' {
declare
module
'
../../room
'
{
declare
module
'
../../room
'
{
interface
Room
{
interface
Room
{
noReconnect
?:
boolean
;
noReconnect
?:
boolean
;
isLooseReconnectRule
?:
boolean
;
}
}
}
}
export
class
Reconnect
{
export
class
Reconnect
{
private
disconnectList
=
new
Map
<
string
,
DisconnectInfo
>
();
private
disconnectList
=
new
Map
<
string
,
DisconnectInfo
>
();
private
reconnectTimeout
=
this
.
ctx
.
config
.
getInt
(
'
RECONNECT_TIMEOUT
'
);
// 超时时间,单位:毫秒(默认 180000ms = 3分钟)
private
reconnectTimeout
=
this
.
ctx
.
config
.
getInt
(
'
RECONNECT_TIMEOUT
'
);
// 超时时间,单位:毫秒(默认 180000ms = 3分钟)
private
clientKeyProvider
=
this
.
ctx
.
get
(()
=>
ClientKeyProvider
);
constructor
(
private
ctx
:
Context
)
{
constructor
(
private
ctx
:
Context
)
{
// 检查是否启用断线重连(默认启用)
// 检查是否启用断线重连(默认启用)
...
@@ -142,7 +143,7 @@ export class Reconnect {
...
@@ -142,7 +143,7 @@ export class Reconnect {
}
}
private
async
registerDisconnect
(
client
:
Client
,
room
:
Room
)
{
private
async
registerDisconnect
(
client
:
Client
,
room
:
Room
)
{
const
key
=
this
.
getAuthorizeKey
(
client
,
room
);
const
key
=
this
.
clientKeyProvider
.
getClientKey
(
client
);
// 通知房间
// 通知房间
await
room
.
sendChat
(
await
room
.
sendChat
(
...
@@ -764,22 +765,6 @@ export class Reconnect {
...
@@ -764,22 +765,6 @@ export class Reconnect {
return
undefined
;
return
undefined
;
}
}
private
getAuthorizeKey
(
client
:
Client
,
room
?:
Room
):
string
{
// 参考 srvpro 逻辑
// 如果有 vpass 且不是宽松匹配模式,优先用 name_vpass
if
(
!
room
?.
isLooseReconnectRule
&&
client
.
vpass
)
{
return
client
.
name_vpass
;
}
// 宽松匹配模式或内部客户端
if
(
room
?.
isLooseReconnectRule
)
{
return
client
.
name
||
client
.
ip
||
'
undefined
'
;
}
// 默认:ip:name
return
`
${
client
.
ip
}
:
${
client
.
name
}
`
;
}
private
getClientRoom
(
client
:
Client
):
Room
|
undefined
{
private
getClientRoom
(
client
:
Client
):
Room
|
undefined
{
if
(
!
client
.
roomName
)
{
if
(
!
client
.
roomName
)
{
return
undefined
;
return
undefined
;
...
@@ -836,11 +821,8 @@ export class Reconnect {
...
@@ -836,11 +821,8 @@ export class Reconnect {
// 宽松模式或匹配条件
// 宽松模式或匹配条件
const
matchCondition
=
const
matchCondition
=
room
.
isLooseReconnectRule
||
this
.
clientKeyProvider
.
getClientKey
(
player
)
===
player
.
ip
===
newClient
.
ip
||
this
.
clientKeyProvider
.
getClientKey
(
newClient
);
(
newClient
.
vpass
&&
newClient
.
vpass
===
player
.
vpass
&&
newClient
.
roompass
===
player
.
roompass
);
if
(
matchCondition
)
{
if
(
matchCondition
)
{
return
player
;
return
player
;
...
@@ -865,7 +847,7 @@ export class Reconnect {
...
@@ -865,7 +847,7 @@ export class Reconnect {
this
.
clearDisconnectInfo
(
disconnectInfo
);
this
.
clearDisconnectInfo
(
disconnectInfo
);
continue
;
continue
;
}
}
const
key
=
this
.
getAuthorizeKey
(
newClient
,
room
);
const
key
=
this
.
clientKeyProvider
.
getClientKey
(
newClient
);
if
(
key
!==
disconnectInfo
.
key
)
{
if
(
key
!==
disconnectInfo
.
key
)
{
continue
;
continue
;
}
}
...
...
src/join-handlers/join-blank-pass-random-duel.ts
View file @
93745262
...
@@ -13,7 +13,7 @@ export class JoinBlankPassRandomDuel {
...
@@ -13,7 +13,7 @@ export class JoinBlankPassRandomDuel {
}
}
const
result
=
await
this
.
randomDuelProvider
.
findOrCreateRandomRoom
(
const
result
=
await
this
.
randomDuelProvider
.
findOrCreateRandomRoom
(
''
,
''
,
client
.
ip
,
client
,
);
);
if
(
result
.
errorMessage
)
{
if
(
result
.
errorMessage
)
{
return
client
.
die
(
result
.
errorMessage
,
ChatColor
.
RED
);
return
client
.
die
(
result
.
errorMessage
,
ChatColor
.
RED
);
...
...
src/join-handlers/join-handler-module.ts
View file @
93745262
import
{
createAppContext
}
from
'
nfkit
'
;
import
{
createAppContext
}
from
'
nfkit
'
;
import
{
ContextState
}
from
'
../app
'
;
import
{
ContextState
}
from
'
../app
'
;
import
{
ClientVersionCheck
,
MenuManager
}
from
'
../feats
'
;
import
{
ClientVersionCheck
}
from
'
../feats
'
;
import
{
JoinWindbotAi
,
JoinWindbotToken
}
from
'
../feats/windbot
'
;
import
{
JoinWindbotAi
,
JoinWindbotToken
}
from
'
../feats/windbot
'
;
import
{
JoinRoom
}
from
'
./join-room
'
;
import
{
JoinRoom
}
from
'
./join-room
'
;
import
{
JoinFallback
}
from
'
./fallback
'
;
import
{
JoinFallback
}
from
'
./fallback
'
;
...
@@ -19,7 +19,6 @@ export const JoinHandlerModule = createAppContext<ContextState>()
...
@@ -19,7 +19,6 @@ export const JoinHandlerModule = createAppContext<ContextState>()
.
provide
(
RandomDuelJoinHandler
)
.
provide
(
RandomDuelJoinHandler
)
.
provide
(
JoinWindbotAi
)
.
provide
(
JoinWindbotAi
)
.
provide
(
JoinRoom
)
.
provide
(
JoinRoom
)
.
provide
(
MenuManager
)
.
provide
(
JoinBlankPassMenu
)
.
provide
(
JoinBlankPassMenu
)
.
provide
(
JoinBlankPassRandomDuel
)
.
provide
(
JoinBlankPassRandomDuel
)
.
provide
(
JoinBlankPassWindbotAi
)
.
provide
(
JoinBlankPassWindbotAi
)
...
...
src/join-handlers/random-duel-join-handler.ts
View file @
93745262
...
@@ -20,7 +20,7 @@ export class RandomDuelJoinHandler {
...
@@ -20,7 +20,7 @@ export class RandomDuelJoinHandler {
}
}
const
result
=
await
this
.
randomDuelProvider
.
findOrCreateRandomRoom
(
const
result
=
await
this
.
randomDuelProvider
.
findOrCreateRandomRoom
(
type
,
type
,
client
.
ip
,
client
,
);
);
if
(
result
.
errorMessage
)
{
if
(
result
.
errorMessage
)
{
return
client
.
die
(
result
.
errorMessage
,
ChatColor
.
RED
);
return
client
.
die
(
result
.
errorMessage
,
ChatColor
.
RED
);
...
...
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