Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
N
Neos
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
love_飞影
Neos
Commits
1ec3eb3a
Commit
1ec3eb3a
authored
Mar 07, 2023
by
Chunchi Che
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feat/client/chat' into 'main'
Feat/client/chat See merge request
mycard/Neos!121
parents
5d7ae541
5ae71ed4
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
175 additions
and
8 deletions
+175
-8
neos-protobuf
neos-protobuf
+1
-1
src/api/ocgcore/idl/ocgcore.ts
src/api/ocgcore/idl/ocgcore.ts
+136
-3
src/api/ocgcore/ocgAdapter/ctos/ctosChat.ts
src/api/ocgcore/ocgAdapter/ctos/ctosChat.ts
+19
-0
src/api/ocgcore/ocgAdapter/protoDecl.ts
src/api/ocgcore/ocgAdapter/protoDecl.ts
+1
-0
src/api/ocgcore/ocgHelper.ts
src/api/ocgcore/ocgHelper.ts
+10
-0
src/ui/Duel/sendBox.tsx
src/ui/Duel/sendBox.tsx
+5
-1
src/ui/Duel/timeLine.tsx
src/ui/Duel/timeLine.tsx
+3
-3
No files found.
neos-protobuf
@
308767ca
Subproject commit
fc8be2c49a17c13ad25040e99293fc29d8b9f4e1
Subproject commit
308767ca7ca67e28f99a45687a1cc8209e91453d
src/api/ocgcore/idl/ocgcore.ts
View file @
1ec3eb3a
...
...
@@ -363,7 +363,7 @@ export namespace ygopro {
}
}
export
class
YgoCtosMsg
extends
pb_1
.
Message
{
#
one_of_decls
:
number
[][]
=
[[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
]];
#
one_of_decls
:
number
[][]
=
[[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
]];
constructor
(
data
?:
|
any
[]
...
...
@@ -379,6 +379,7 @@ export namespace ygopro {
ctos_tp_result
?:
never
;
ctos_time_confirm
?:
never
;
ctos_response
?:
never
;
ctos_chat
?:
never
;
}
|
{
ctos_player_info
?:
never
;
...
...
@@ -391,6 +392,7 @@ export namespace ygopro {
ctos_tp_result
?:
never
;
ctos_time_confirm
?:
never
;
ctos_response
?:
never
;
ctos_chat
?:
never
;
}
|
{
ctos_player_info
?:
never
;
...
...
@@ -403,6 +405,7 @@ export namespace ygopro {
ctos_tp_result
?:
never
;
ctos_time_confirm
?:
never
;
ctos_response
?:
never
;
ctos_chat
?:
never
;
}
|
{
ctos_player_info
?:
never
;
...
...
@@ -415,6 +418,7 @@ export namespace ygopro {
ctos_tp_result
?:
never
;
ctos_time_confirm
?:
never
;
ctos_response
?:
never
;
ctos_chat
?:
never
;
}
|
{
ctos_player_info
?:
never
;
...
...
@@ -427,6 +431,7 @@ export namespace ygopro {
ctos_tp_result
?:
never
;
ctos_time_confirm
?:
never
;
ctos_response
?:
never
;
ctos_chat
?:
never
;
}
|
{
ctos_player_info
?:
never
;
...
...
@@ -439,6 +444,7 @@ export namespace ygopro {
ctos_tp_result
?:
never
;
ctos_time_confirm
?:
never
;
ctos_response
?:
never
;
ctos_chat
?:
never
;
}
|
{
ctos_player_info
?:
never
;
...
...
@@ -451,6 +457,7 @@ export namespace ygopro {
ctos_tp_result
?:
never
;
ctos_time_confirm
?:
never
;
ctos_response
?:
never
;
ctos_chat
?:
never
;
}
|
{
ctos_player_info
?:
never
;
...
...
@@ -463,6 +470,7 @@ export namespace ygopro {
ctos_tp_result
?:
CtosTpResult
;
ctos_time_confirm
?:
never
;
ctos_response
?:
never
;
ctos_chat
?:
never
;
}
|
{
ctos_player_info
?:
never
;
...
...
@@ -475,6 +483,7 @@ export namespace ygopro {
ctos_tp_result
?:
never
;
ctos_time_confirm
?:
CtosTimeConfirm
;
ctos_response
?:
never
;
ctos_chat
?:
never
;
}
|
{
ctos_player_info
?:
never
;
...
...
@@ -487,6 +496,20 @@ export namespace ygopro {
ctos_tp_result
?:
never
;
ctos_time_confirm
?:
never
;
ctos_response
?:
CtosGameMsgResponse
;
ctos_chat
?:
never
;
}
|
{
ctos_player_info
?:
never
;
ctos_join_game
?:
never
;
ctos_update_deck
?:
never
;
ctos_hs_ready
?:
never
;
ctos_hs_start
?:
never
;
ctos_hs_not_ready
?:
never
;
ctos_hand_result
?:
never
;
ctos_tp_result
?:
never
;
ctos_time_confirm
?:
never
;
ctos_response
?:
never
;
ctos_chat
?:
CtosChat
;
}
))
)
{
...
...
@@ -536,6 +559,9 @@ export namespace ygopro {
if
(
"
ctos_response
"
in
data
&&
data
.
ctos_response
!=
undefined
)
{
this
.
ctos_response
=
data
.
ctos_response
;
}
if
(
"
ctos_chat
"
in
data
&&
data
.
ctos_chat
!=
undefined
)
{
this
.
ctos_chat
=
data
.
ctos_chat
;
}
}
}
get
ctos_player_info
()
{
...
...
@@ -660,6 +686,15 @@ export namespace ygopro {
get
has_ctos_response
()
{
return
pb_1
.
Message
.
getField
(
this
,
10
)
!=
null
;
}
get
ctos_chat
()
{
return
pb_1
.
Message
.
getWrapperField
(
this
,
CtosChat
,
11
)
as
CtosChat
;
}
set
ctos_chat
(
value
:
CtosChat
)
{
pb_1
.
Message
.
setOneofWrapperField
(
this
,
11
,
this
.
#
one_of_decls
[
0
],
value
);
}
get
has_ctos_chat
()
{
return
pb_1
.
Message
.
getField
(
this
,
11
)
!=
null
;
}
get
msg
()
{
const
cases
:
{
[
index
:
number
]:
...
...
@@ -673,7 +708,8 @@ export namespace ygopro {
|
"
ctos_hand_result
"
|
"
ctos_tp_result
"
|
"
ctos_time_confirm
"
|
"
ctos_response
"
;
|
"
ctos_response
"
|
"
ctos_chat
"
;
}
=
{
0
:
"
none
"
,
1
:
"
ctos_player_info
"
,
...
...
@@ -686,9 +722,10 @@ export namespace ygopro {
8
:
"
ctos_tp_result
"
,
9
:
"
ctos_time_confirm
"
,
10
:
"
ctos_response
"
,
11
:
"
ctos_chat
"
,
};
return
cases
[
pb_1
.
Message
.
computeOneofCase
(
this
,
[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
])
pb_1
.
Message
.
computeOneofCase
(
this
,
[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
])
];
}
static
fromObject
(
data
:
{
...
...
@@ -702,6 +739,7 @@ export namespace ygopro {
ctos_tp_result
?:
ReturnType
<
typeof
CtosTpResult
.
prototype
.
toObject
>
;
ctos_time_confirm
?:
ReturnType
<
typeof
CtosTimeConfirm
.
prototype
.
toObject
>
;
ctos_response
?:
ReturnType
<
typeof
CtosGameMsgResponse
.
prototype
.
toObject
>
;
ctos_chat
?:
ReturnType
<
typeof
CtosChat
.
prototype
.
toObject
>
;
}):
YgoCtosMsg
{
const
message
=
new
YgoCtosMsg
({});
if
(
data
.
ctos_player_info
!=
null
)
{
...
...
@@ -746,6 +784,9 @@ export namespace ygopro {
data
.
ctos_response
);
}
if
(
data
.
ctos_chat
!=
null
)
{
message
.
ctos_chat
=
CtosChat
.
fromObject
(
data
.
ctos_chat
);
}
return
message
;
}
toObject
()
{
...
...
@@ -766,6 +807,7 @@ export namespace ygopro {
ctos_response
?:
ReturnType
<
typeof
CtosGameMsgResponse
.
prototype
.
toObject
>
;
ctos_chat
?:
ReturnType
<
typeof
CtosChat
.
prototype
.
toObject
>
;
}
=
{};
if
(
this
.
ctos_player_info
!=
null
)
{
data
.
ctos_player_info
=
this
.
ctos_player_info
.
toObject
();
...
...
@@ -797,6 +839,9 @@ export namespace ygopro {
if
(
this
.
ctos_response
!=
null
)
{
data
.
ctos_response
=
this
.
ctos_response
.
toObject
();
}
if
(
this
.
ctos_chat
!=
null
)
{
data
.
ctos_chat
=
this
.
ctos_chat
.
toObject
();
}
return
data
;
}
serialize
():
Uint8Array
;
...
...
@@ -843,6 +888,10 @@ export namespace ygopro {
writer
.
writeMessage
(
10
,
this
.
ctos_response
,
()
=>
this
.
ctos_response
.
serialize
(
writer
)
);
if
(
this
.
has_ctos_chat
)
writer
.
writeMessage
(
11
,
this
.
ctos_chat
,
()
=>
this
.
ctos_chat
.
serialize
(
writer
)
);
if
(
!
w
)
return
writer
.
getResultBuffer
();
}
static
deserialize
(
bytes
:
Uint8Array
|
pb_1
.
BinaryReader
):
YgoCtosMsg
{
...
...
@@ -922,6 +971,12 @@ export namespace ygopro {
CtosGameMsgResponse
.
deserialize
(
reader
))
);
break
;
case
11
:
reader
.
readMessage
(
message
.
ctos_chat
,
()
=>
(
message
.
ctos_chat
=
CtosChat
.
deserialize
(
reader
))
);
break
;
default
:
reader
.
skipField
();
}
...
...
@@ -2419,6 +2474,84 @@ export namespace ygopro {
return
CtosTimeConfirm
.
deserialize
(
bytes
);
}
}
export
class
CtosChat
extends
pb_1
.
Message
{
#
one_of_decls
:
number
[][]
=
[];
constructor
(
data
?:
|
any
[]
|
{
message
?:
string
;
}
)
{
super
();
pb_1
.
Message
.
initialize
(
this
,
Array
.
isArray
(
data
)
?
data
:
[],
0
,
-
1
,
[],
this
.
#
one_of_decls
);
if
(
!
Array
.
isArray
(
data
)
&&
typeof
data
==
"
object
"
)
{
if
(
"
message
"
in
data
&&
data
.
message
!=
undefined
)
{
this
.
message
=
data
.
message
;
}
}
}
get
message
()
{
return
pb_1
.
Message
.
getFieldWithDefault
(
this
,
1
,
""
)
as
string
;
}
set
message
(
value
:
string
)
{
pb_1
.
Message
.
setField
(
this
,
1
,
value
);
}
static
fromObject
(
data
:
{
message
?:
string
}):
CtosChat
{
const
message
=
new
CtosChat
({});
if
(
data
.
message
!=
null
)
{
message
.
message
=
data
.
message
;
}
return
message
;
}
toObject
()
{
const
data
:
{
message
?:
string
;
}
=
{};
if
(
this
.
message
!=
null
)
{
data
.
message
=
this
.
message
;
}
return
data
;
}
serialize
():
Uint8Array
;
serialize
(
w
:
pb_1
.
BinaryWriter
):
void
;
serialize
(
w
?:
pb_1
.
BinaryWriter
):
Uint8Array
|
void
{
const
writer
=
w
||
new
pb_1
.
BinaryWriter
();
if
(
this
.
message
.
length
)
writer
.
writeString
(
1
,
this
.
message
);
if
(
!
w
)
return
writer
.
getResultBuffer
();
}
static
deserialize
(
bytes
:
Uint8Array
|
pb_1
.
BinaryReader
):
CtosChat
{
const
reader
=
bytes
instanceof
pb_1
.
BinaryReader
?
bytes
:
new
pb_1
.
BinaryReader
(
bytes
),
message
=
new
CtosChat
();
while
(
reader
.
nextField
())
{
if
(
reader
.
isEndGroup
())
break
;
switch
(
reader
.
getFieldNumber
())
{
case
1
:
message
.
message
=
reader
.
readString
();
break
;
default
:
reader
.
skipField
();
}
}
return
message
;
}
serializeBinary
():
Uint8Array
{
return
this
.
serialize
();
}
static
deserializeBinary
(
bytes
:
Uint8Array
):
CtosChat
{
return
CtosChat
.
deserialize
(
bytes
);
}
}
export
class
CtosGameMsgResponse
extends
pb_1
.
Message
{
#
one_of_decls
:
number
[][]
=
[[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
]];
constructor
(
...
...
src/api/ocgcore/ocgAdapter/ctos/ctosChat.ts
0 → 100644
View file @
1ec3eb3a
import
{
ygopro
}
from
"
../../idl/ocgcore
"
;
import
{
YgoProPacket
}
from
"
../packet
"
;
import
{
CTOS_CHAT
}
from
"
../protoDecl
"
;
import
{
strEncodeUTF16
}
from
"
../util
"
;
/*
* CTOS Chat
*
* @param message - 玩家发送的消息
*
* @usage - TODO*/
export
default
class
CtosChat
extends
YgoProPacket
{
constructor
(
pb
:
ygopro
.
YgoCtosMsg
)
{
const
message
=
pb
.
ctos_chat
.
message
;
const
exData
=
strEncodeUTF16
(
message
);
super
(
exData
.
length
+
1
,
CTOS_CHAT
,
exData
);
}
}
src/api/ocgcore/ocgAdapter/protoDecl.ts
View file @
1ec3eb3a
...
...
@@ -11,6 +11,7 @@ export const CTOS_HAND_RESULT = 3;
export
const
CTOS_TP_RESULT
=
4
;
export
const
CTOS_TIME_CONFIRM
=
21
;
export
const
CTOS_RESPONSE
=
1
;
export
const
CTOS_CHAT
=
22
;
export
const
STOC_JOIN_GAME
=
18
;
export
const
STOC_CHAT
=
25
;
...
...
src/api/ocgcore/ocgHelper.ts
View file @
1ec3eb3a
...
...
@@ -14,6 +14,7 @@ import HandResult from "./ocgAdapter/ctos/ctosHandResult";
import
TpResult
from
"
./ocgAdapter/ctos/ctosTpResult
"
;
import
TimeConfirm
from
"
./ocgAdapter/ctos/ctosTimeConfirm
"
;
import
GameMsgResponse
from
"
./ocgAdapter/ctos/ctosGameMsgResponse/mod
"
;
import
Chat
from
"
./ocgAdapter/ctos/ctosChat
"
;
export
function
sendUpdateDeck
(
deck
:
IDeck
)
{
const
updateDeck
=
new
ygopro
.
YgoCtosMsg
({
...
...
@@ -119,6 +120,15 @@ export function sendTimeConfirm() {
socketMiddleWare
({
cmd
:
socketCmd
.
SEND
,
payload
});
}
export
function
sendChat
(
message
:
string
)
{
const
chat
=
new
ygopro
.
YgoCtosMsg
({
ctos_chat
:
new
ygopro
.
CtosChat
({
message
}),
});
const
payload
=
new
Chat
(
chat
).
serialize
();
socketMiddleWare
({
cmd
:
socketCmd
.
SEND
,
payload
});
}
export
function
sendSelectIdleCmdResponse
(
value
:
number
)
{
const
response
=
new
ygopro
.
YgoCtosMsg
({
ctos_response
:
new
ygopro
.
CtosGameMsgResponse
({
...
...
src/ui/Duel/sendBox.tsx
View file @
1ec3eb3a
import
React
,
{
useState
}
from
"
react
"
;
import
{
Input
,
Button
,
Row
,
Col
}
from
"
antd
"
;
import
{
SendOutlined
}
from
"
@ant-design/icons
"
;
import
{
sendChat
}
from
"
../../api/ocgcore/ocgHelper
"
;
const
SendBox
=
()
=>
{
const
[
content
,
setContent
]
=
useState
(
""
);
...
...
@@ -20,7 +21,10 @@ const SendBox = () => {
<
Col
>
<
Button
icon=
{
<
SendOutlined
/>
}
onClick=
{
()
=>
{}
}
onClick=
{
()
=>
{
sendChat
(
content
);
setContent
(
""
);
}
}
disabled=
{
!
content
}
/>
</
Col
>
...
...
src/ui/Duel/timeLine.tsx
View file @
1ec3eb3a
import
React
,
{
useEffect
,
useState
}
from
"
react
"
;
import
{
Timeline
,
TimelineItemProps
}
from
"
antd
"
;
import
{
Setting
Outlined
}
from
"
@ant-design/icons
"
;
import
{
Message
Outlined
}
from
"
@ant-design/icons
"
;
import
{
useAppSelector
}
from
"
../../hook
"
;
import
{
selectChat
}
from
"
../../reducers/chatSlice
"
;
...
...
@@ -12,9 +12,9 @@ const DuelTimeLine = () => {
setItems
((
prev
)
=>
prev
.
concat
([
{
dot
:
<
Setting
Outlined
/>,
dot
:
<
Message
Outlined
/>,
children
:
chat
,
color
:
"
red
"
,
color
:
"
green
"
,
},
])
);
...
...
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