This commit is contained in:
2025-07-22 16:43:10 +08:00
parent a90dce06f3
commit 52bae0735f
36 changed files with 10224 additions and 1658 deletions
+5118 -1598
View File
File diff suppressed because it is too large Load Diff
+10 -4
View File
@@ -4,11 +4,10 @@ import { DialogBubble } from "./DialogBubble";
import { Dialog } from "./DemoData";
const { ccclass, property } = _decorator;
const BUTTOM_Y = -346.354;
const BUTTOM_Y = -955.571;
@ccclass("ChatContentsLayout")
export class ChatContentsLayout extends Component {
@property(DemoManager)
manager: DemoManager = null;
@property(DialogBubble)
@@ -21,6 +20,11 @@ export class ChatContentsLayout extends Component {
protected start(): void {
this.lBubble.node.active = false;
this.rBubble.node.active = false;
}
protected onEnable(): void {
if (!this.manager) this.manager = DemoManager.getInstance();
this.manager.layoutout = this;
}
@@ -43,11 +47,13 @@ export class ChatContentsLayout extends Component {
newBubbleNode.setParent(this.node);
newBubble.node.active = true;
let offset = newBubble.updateBubbleContent(dialog.content);
let pos = newBubble.node.position;
newBubble.node.position = new Vec3(pos.x, initPosY, pos.z);
let offset = newBubble.updateBubbleContent(dialog.content);
initPosY += offset + 40;
initPosY += offset + 20;
this.bubbles.push(newBubble);
}
}
+9 -43
View File
@@ -1,15 +1,14 @@
import { _decorator, Component, EditBox, Label, Node } from "cc";
import { l10n } from "db://localization-editor/l10n";
import { DemoManager } from "./DemoManager";
const { ccclass, property } = _decorator;
import { _decorator, Component } from "cc";
@ccclass("ChatGPTService")
export class ChatGPTService extends Component {
@property(DemoManager)
manager: DemoManager = null;
export class ChatGPTService {
private static _instance: ChatGPTService;
@property(EditBox)
editBox: EditBox = null;
public static getInstance() {
if (!this._instance) {
this._instance = new ChatGPTService();
}
return this._instance;
}
private apiurl: string = "https://cloud.fastgpt.cn/api/v1/chat/completions";
private apikey: string =
@@ -36,39 +35,6 @@ export class ChatGPTService extends Component {
xhr.send(JSON.stringify(data));
});
}
protected async start(): Promise<void> {
// console.log(l10n.t("hello"));
// l10n.changeLanguage("zh-Hans-CN");
// console.log(l10n.t("hello"));
// l10n.changeLanguage("en");
// console.log(l10n.t("hello"));
}
public async OnClickSend() {
const str = this.editBox.string;
if (!str || str == "") return;
console.log("post:" + str);
if (this.manager) {
this.manager.updateDialog(true, str);
}
let ret = await this.Post({
model: "llama3.1:8b",
messages: [{ role: "user", content: str }],
temperature: 0.8,
});
const rep = ret.choices[0].message.content;
if (rep == null) {
console.warn("rep null");
}
if (this.manager) {
this.manager.updateDialog(false, rep);
}
console.log("ret:" + rep);
}
}
export type GPTResquest = {
+40
View File
@@ -0,0 +1,40 @@
import { _decorator, Component, EditBox, Node } from "cc";
import { DemoManager } from "./DemoManager";
import { ChatGPTService } from "./ChatGPTService";
const { ccclass, property } = _decorator;
@ccclass("ChatPanel")
export class ChatPanel extends Component {
manager: DemoManager = null;
@property(EditBox)
editBox: EditBox = null;
protected onEnable(): void {
if (!this.manager) this.manager = DemoManager.getInstance();
}
public async OnClickSend() {
const str = this.editBox.string;
if (!str || str == "") return;
console.log("post:" + str);
this.editBox.string = "";
DemoManager.getInstance().updateDialog(true, str);
let ret = await ChatGPTService.getInstance().Post({
model: "llama3.1:8b",
messages: [{ role: "user", content: str }],
temperature: 0.8,
});
const rep = ret.choices[0].message.content;
if (rep == null) {
console.warn("rep null");
}
if (this.manager) {
this.manager.updateDialog(false, rep);
}
console.log("ret:" + rep);
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "21603c89-8340-4ef7-90c2-abc81f7d915c",
"files": [],
"subMetas": {},
"userData": {}
}
+23 -7
View File
@@ -1,16 +1,32 @@
import { _decorator, Component, Node } from "cc";
import { DemoData, Dialog } from "./DemoData";
import { find } from "cc";
import { ChatContentsLayout } from "./ChatContentsLayout";
const { ccclass, property } = _decorator;
import { DemoData } from "./DemoData";
export class DemoManager {
private static _instance: DemoManager;
public static getInstance() {
if (!this._instance) {
this._instance = new DemoManager();
}
return this._instance;
}
private constructor() {
this.demoData = new DemoData();
}
@ccclass("DemoManager")
export class DemoManager extends Component {
demoData: DemoData;
public layoutout: ChatContentsLayout;
start() {
this.demoData = new DemoData();
EnterChat(id: number) {
find("Canvas/ChatPanel").active = true;
find("Canvas/GirlDetailPanel").active = false;
}
EnterDetail(id: number) {
find("Canvas/GirlListPanel").active = false;
find("Canvas/GirlDetailPanel").active = true;
}
public updateDialog(isPlayer: boolean, str: string) {
+36 -2
View File
@@ -1,4 +1,5 @@
import { _decorator, Component, Label, Node, Size, UITransform } from "cc";
import Tools from "./tools";
const { ccclass, property } = _decorator;
@ccclass("DialogBubble")
@@ -11,13 +12,46 @@ export class DialogBubble extends Component {
contentT: UITransform = null;
updateBubbleContent(str: string) {
const lines = str.split("\n");
let len = 0;
let index = 0;
for (let i = 0; i < lines.length; i++) {
const element = lines[i];
if (element.length > len) {
len = element.length;
index = i;
}
}
let finalLen = 0;
// for (let i = 0; i < lines[index].length; i++) {
// const element = lines[index][i];
// if ("\u4e00" <= element[i] && element[i] <= "\u9fff") {
// finalLen += 35;
// } else {
// finalLen += 18;
// }
// }
if (Tools.IsChinese(lines[index])) {
finalLen = 35 * lines[index].length;
} else {
finalLen = 21 * lines[index].length;
}
this.content.string = str;
this.contentT.setContentSize(
new Size(Math.min(finalLen, 950), this.contentT.contentSize.y)
);
this.content.updateRenderData();
this.bg.setContentSize(
new Size(this.contentT.contentSize.x + 5, this.contentT.contentSize.y + 5)
new Size(
this.contentT.contentSize.x + 30,
this.contentT.contentSize.y + 20
)
);
return this.bg.contentSize.y / 2;
return this.bg.contentSize.y;
}
}
+23
View File
@@ -0,0 +1,23 @@
import { _decorator, Component, Label, Node, Sprite } from "cc";
import { DemoManager } from "./DemoManager";
const { ccclass, property } = _decorator;
@ccclass("GirlDetailPanel")
export class GirlDetailPanel extends Component {
@property(Sprite)
avatar: Sprite;
@property(Label)
girlName: Label;
@property(Label)
desc: Label;
@property(Node)
chatBtn: Node;
id = 0;
start() {
this.id = 1;
}
OnClickChatBtn() {
DemoManager.getInstance().EnterChat(this.id);
}
}
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "ded86cbd-223c-467b-873f-3a8ac30222a9",
"files": [],
"subMetas": {},
"userData": {}
}
+9
View File
@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "35555c27-2be1-4310-9685-8944c2895a50",
"files": [],
"subMetas": {},
"userData": {}
}
@@ -0,0 +1,46 @@
import {
_decorator,
Component,
find,
Label,
Node,
NodeEventType,
Sprite,
} from "cc";
import { DemoManager } from "../DemoManager";
const { ccclass, property } = _decorator;
@ccclass("GirlListItem")
export class GirlListItem extends Component {
@property(Sprite)
avatar: Sprite;
@property(Label)
girlName: Label;
@property(Label)
desc: Label;
@property(Label)
price: Label;
@property(Node)
chatBtn: Node;
id: number = -1;
start() {
// this.avatar = this.node
// .getChildByName("avatar/Avatar")
// .getComponent(Sprite);
// this.girlName = this.node.getChildByName("Desc/Name").getComponent(Label);
// this.desc = this.node.getChildByName("Desc/desc").getComponent(Label);
// this.price = this.node.getChildByName("purchase/price").getComponent(Label);
// this.chatBtn = this.node.getChildByName("purchase/Button");
this.id = 1;
}
refreshData() {}
onClickDetail() {
DemoManager.getInstance().EnterDetail(this.id);
}
update(deltaTime: number) {}
}
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "72a618a4-f0ec-4a35-a867-e0583cd4b931",
"files": [],
"subMetas": {},
"userData": {}
}
@@ -0,0 +1,14 @@
import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('GirlListPanel')
export class GirlListPanel extends Component {
start() {
}
update(deltaTime: number) {
}
}
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "879c46b0-1dbd-4038-a620-b162fd51034a",
"files": [],
"subMetas": {},
"userData": {}
}
+11
View File
@@ -0,0 +1,11 @@
export default class Tools {
private static chineseReg: RegExp;
public static IsChinese(s: string): boolean {
if (!this.chineseReg) {
this.chineseReg = new RegExp("^[\u4E00-\u9FFFF]+$");
}
if (!this.chineseReg.test(s)) {
return false;
} else return true;
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "1f5a82c7-aaf4-49e9-a874-58d6cda51644",
"files": [],
"subMetas": {},
"userData": {}
}
+9
View File
@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "c7e0637f-44e3-45ea-8770-dca22503ce78",
"files": [],
"subMetas": {},
"userData": {}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

+134
View File
@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "4cef8664-eeed-4be5-b33b-1bb74a6019cb",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "4cef8664-eeed-4be5-b33b-1bb74a6019cb@6c48a",
"displayName": "avatar_mask",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "4cef8664-eeed-4be5-b33b-1bb74a6019cb",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "4cef8664-eeed-4be5-b33b-1bb74a6019cb@f9941",
"displayName": "avatar_mask",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 120,
"height": 120,
"rawWidth": 120,
"rawHeight": 120,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-60,
-60,
0,
60,
-60,
0,
-60,
60,
0,
60,
60,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
120,
120,
120,
0,
0,
120,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-60,
-60,
0
],
"maxPos": [
60,
60,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "4cef8664-eeed-4be5-b33b-1bb74a6019cb@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "4cef8664-eeed-4be5-b33b-1bb74a6019cb@6c48a"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B

+134
View File
@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "943325de-7f76-4f86-881b-e3413d3ec18e",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "943325de-7f76-4f86-881b-e3413d3ec18e@6c48a",
"displayName": "bg",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "943325de-7f76-4f86-881b-e3413d3ec18e",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "943325de-7f76-4f86-881b-e3413d3ec18e@f9941",
"displayName": "bg",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 204,
"height": 217,
"rawWidth": 204,
"rawHeight": 217,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-102,
-108.5,
0,
102,
-108.5,
0,
-102,
108.5,
0,
102,
108.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
217,
204,
217,
0,
0,
204,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-102,
-108.5,
0
],
"maxPos": [
102,
108.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "943325de-7f76-4f86-881b-e3413d3ec18e@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "943325de-7f76-4f86-881b-e3413d3ec18e@6c48a"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 961 B

+134
View File
@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "d3a6a283-9dd4-4193-b450-46f35eea4a3e",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "d3a6a283-9dd4-4193-b450-46f35eea4a3e@6c48a",
"displayName": "chat_bubble",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "d3a6a283-9dd4-4193-b450-46f35eea4a3e",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "d3a6a283-9dd4-4193-b450-46f35eea4a3e@f9941",
"displayName": "chat_bubble",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 67,
"height": 58,
"rawWidth": 67,
"rawHeight": 58,
"borderTop": 28,
"borderBottom": 28,
"borderLeft": 30,
"borderRight": 30,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-33.5,
-29,
0,
33.5,
-29,
0,
-33.5,
29,
0,
33.5,
29,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
58,
67,
58,
0,
0,
67,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-33.5,
-29,
0
],
"maxPos": [
33.5,
29,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "d3a6a283-9dd4-4193-b450-46f35eea4a3e@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "d3a6a283-9dd4-4193-b450-46f35eea4a3e@6c48a"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "576e4681-c296-43d6-b7db-8cf25086a115",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "576e4681-c296-43d6-b7db-8cf25086a115@6c48a",
"displayName": "chat_bubble_corner",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "576e4681-c296-43d6-b7db-8cf25086a115",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "576e4681-c296-43d6-b7db-8cf25086a115@f9941",
"displayName": "chat_bubble_corner",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": -0.5,
"trimX": 0,
"trimY": 1,
"width": 33,
"height": 29,
"rawWidth": 33,
"rawHeight": 30,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-16.5,
-14.5,
0,
16.5,
-14.5,
0,
-16.5,
14.5,
0,
16.5,
14.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
29,
33,
29,
0,
0,
33,
0
],
"nuv": [
0,
0,
1,
0,
0,
0.9666666666666667,
1,
0.9666666666666667
],
"minPos": [
-16.5,
-14.5,
0
],
"maxPos": [
16.5,
14.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "576e4681-c296-43d6-b7db-8cf25086a115@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "576e4681-c296-43d6-b7db-8cf25086a115@6c48a"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 882 B

+134
View File
@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "65616b52-cb0d-4d8a-b432-e6d8e1368ccf",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "65616b52-cb0d-4d8a-b432-e6d8e1368ccf@6c48a",
"displayName": "return_btn",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "65616b52-cb0d-4d8a-b432-e6d8e1368ccf",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "65616b52-cb0d-4d8a-b432-e6d8e1368ccf@f9941",
"displayName": "return_btn",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 36,
"height": 64,
"rawWidth": 36,
"rawHeight": 64,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-18,
-32,
0,
18,
-32,
0,
-18,
32,
0,
18,
32,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
64,
36,
64,
0,
0,
36,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-18,
-32,
0
],
"maxPos": [
18,
32,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "65616b52-cb0d-4d8a-b432-e6d8e1368ccf@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "65616b52-cb0d-4d8a-b432-e6d8e1368ccf@6c48a"
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "06eb8ab2-9d64-4f5e-a03b-c3f89459f54c",
"files": [],
"subMetas": {},
"userData": {}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "4879d105-bcc4-4865-909e-3557b8a5e094",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "ChatPanel"
}
}