diff --git a/manifest.json b/manifest.json
index 4e41c51..5867ecc 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,10 +1,10 @@
 {
   "manifest_version": 4,
   "type": "extension",
-  "name": "LLOneBot v3.19.1",
+  "name": "LLOneBot v3.19.3",
   "slug": "LLOneBot",
-  "description": "LiteLoaderQQNT的OneBotApi,不支持商店在线更新",
-  "version": "3.19.1",
+  "description": "使你的NTQQ支持OneBot11协议进行QQ机器人开发, 不支持商店在线更新",
+  "version": "3.19.3",
   "icon": "./icon.jpg",
   "authors": [
     {
diff --git a/src/main/main.ts b/src/main/main.ts
index 6777540..869d95a 100644
--- a/src/main/main.ts
+++ b/src/main/main.ts
@@ -4,16 +4,16 @@ import {BrowserWindow, dialog, ipcMain} from 'electron';
 import * as fs from 'node:fs';
 import {Config} from "../common/types";
 import {
+    CHANNEL_CHECK_VERSION,
     CHANNEL_ERROR,
     CHANNEL_GET_CONFIG,
     CHANNEL_LOG,
-    CHANNEL_CHECK_VERSION,
     CHANNEL_SELECT_FILE,
     CHANNEL_SET_CONFIG,
     CHANNEL_UPDATE,
 } from "../common/channels";
 import {ob11WebsocketServer} from "../onebot11/server/ws/WebsocketServer";
-import {DATA_DIR, wrapText} from "../common/utils";
+import {DATA_DIR} from "../common/utils";
 import {
     friendRequests,
     getFriend,
@@ -21,11 +21,19 @@ import {
     getGroupMember,
     llonebotError,
     refreshGroupMembers,
-    selfInfo, uidMaps
+    selfInfo,
+    uidMaps
 } from "../common/data";
 import {hookNTQQApiCall, hookNTQQApiReceive, ReceiveCmdS, registerReceiveHook} from "../ntqqapi/hook";
 import {OB11Constructor} from "../onebot11/constructor";
-import {ChatType, FriendRequestNotify, GroupNotifies, GroupNotifyTypes, RawMessage} from "../ntqqapi/types";
+import {
+    ChatType,
+    FriendRequestNotify,
+    GroupMemberRole,
+    GroupNotifies,
+    GroupNotifyTypes,
+    RawMessage
+} from "../ntqqapi/types";
 import {ob11HTTPServer} from "../onebot11/server/http";
 import {OB11FriendRecallNoticeEvent} from "../onebot11/event/notice/OB11FriendRecallNoticeEvent";
 import {OB11GroupRecallNoticeEvent} from "../onebot11/event/notice/OB11GroupRecallNoticeEvent";
@@ -107,8 +115,8 @@ function onLoad() {
         const config = getConfigUtil().getConfig()
         return config;
     })
-    ipcMain.on(CHANNEL_SET_CONFIG, (event, ask:boolean, config: Config) => {
-        if (!ask){
+    ipcMain.on(CHANNEL_SET_CONFIG, (event, ask: boolean, config: Config) => {
+        if (!ask) {
             setConfig(config).then();
             return
         }
@@ -285,6 +293,7 @@ function onLoad() {
                                 log("变动管理员获取成功")
                                 groupAdminNoticeEvent.user_id = parseInt(member1.uin);
                                 groupAdminNoticeEvent.sub_type = notify.type == GroupNotifyTypes.ADMIN_UNSET ? "unset" : "set";
+                                // member1.role = notify.type == GroupNotifyTypes.ADMIN_SET ? GroupMemberRole.admin : GroupMemberRole.normal;
                                 postOB11Event(groupAdminNoticeEvent, true);
                             } else {
                                 log("获取群通知的成员信息失败", notify, getGroup(notify.group.groupCode));
@@ -358,13 +367,19 @@ function onLoad() {
         log("llonebot pid", process.pid)
         llonebotError.otherError = "";
         startTime = Date.now();
-        dbUtil.getReceivedTempUinMap().then(m=>{
+        dbUtil.getReceivedTempUinMap().then(m => {
             for (const [key, value] of Object.entries(m)) {
                 uidMaps[value] = key;
             }
         })
         startReceiveHook().then();
-        NTQQGroupApi.getGroups(true).then()
+        // NTQQGroupApi.getGroups(true).then(_groups => {
+        //     _groups.map(group => {
+        //         if (!groups.find(g => g.groupCode == group.groupCode)) {
+        //             groups.push(group)
+        //         }
+        //     })
+        // })
         const config = getConfigUtil().getConfig()
         if (config.ob11.enableHttp) {
             ob11HTTPServer.start(config.ob11.httpPort)
@@ -397,7 +412,7 @@ function onLoad() {
         }
         log("self info", selfInfo, globalThis.authData);
         if (selfInfo.uin) {
-            async function getUserNick(){
+            async function getUserNick() {
                 try {
                     getSelfNickCount++;
                     const userInfo = (await NTQQUserApi.getUserDetailInfo(selfInfo.uid));
@@ -413,6 +428,7 @@ function onLoad() {
                     return setTimeout(getUserNick, 1000);
                 }
             }
+
             getUserNick().then()
             start().then();
         } else {
diff --git a/src/ntqqapi/api/group.ts b/src/ntqqapi/api/group.ts
index f23836a..2e1bd2b 100644
--- a/src/ntqqapi/api/group.ts
+++ b/src/ntqqapi/api/group.ts
@@ -10,7 +10,7 @@ export class NTQQGroupApi{
     static async getGroups(forced = false) {
         let cbCmd = ReceiveCmdS.GROUPS
         if (process.platform != "win32") {
-            cbCmd = ReceiveCmdS.GROUPS_UNIX
+            cbCmd = ReceiveCmdS.GROUPS_STORE
         }
         const result = await callNTQQApi<{
             updateType: number,
diff --git a/src/ntqqapi/hook.ts b/src/ntqqapi/hook.ts
index bc6f29e..9636b54 100644
--- a/src/ntqqapi/hook.ts
+++ b/src/ntqqapi/hook.ts
@@ -2,7 +2,7 @@ import {BrowserWindow} from 'electron';
 import {NTQQApiClass} from "./ntcall";
 import {NTQQMsgApi, sendMessagePool} from "./api/msg"
 import {ChatType, Group, GroupMember, RawMessage, User} from "./types";
-import {friends, groups, selfInfo, tempGroupCodeMap, uidMaps} from "../common/data";
+import {friends, getGroupMember, groups, selfInfo, tempGroupCodeMap, uidMaps} from "../common/data";
 import {OB11GroupDecreaseEvent} from "../onebot11/event/notice/OB11GroupDecreaseEvent";
 import {v4 as uuidv4} from "uuid"
 import {postOB11Event} from "../onebot11/server/postOB11Event";
@@ -25,7 +25,7 @@ export let ReceiveCmdS = {
     USER_INFO: "nodeIKernelProfileListener/onProfileSimpleChanged",
     USER_DETAIL_INFO: "nodeIKernelProfileListener/onProfileDetailInfoChanged",
     GROUPS: "nodeIKernelGroupListener/onGroupListUpdate",
-    GROUPS_UNIX: "onGroupListUpdate",
+    GROUPS_STORE: "onGroupListUpdate",
     GROUP_MEMBER_INFO_UPDATE: "nodeIKernelGroupListener/onMemberInfoChange",
     FRIENDS: "onBuddyListChange",
     MEDIA_DOWNLOAD_COMPLETE: "nodeIKernelMsgListener/onRichMediaDownloadComplete",
@@ -229,7 +229,6 @@ async function processGroupEvent(payload: {groupList: Group[]}) {
         for (const group of newGroupList) {
             let existGroup = groups.find(g => g.groupCode == group.groupCode);
             if (existGroup) {
-
                 if (existGroup.memberCount > group.memberCount) {
                     log(`群(${group.groupCode})成员数量减少${existGroup.memberCount} -> ${group.memberCount}`);
                     const oldMembers = existGroup.members;
@@ -263,19 +262,35 @@ async function processGroupEvent(payload: {groupList: Group[]}) {
 }
 
 // 群列表变动
-registerReceiveHook<{ groupList: Group[], updateType: number }>(process.platform == "win32" ? ReceiveCmdS.GROUPS : ReceiveCmdS.GROUPS_UNIX, (payload) => {
-    log("群列表变动", payload)
+registerReceiveHook<{ groupList: Group[], updateType: number }>(ReceiveCmdS.GROUPS, (payload) => {
     if (payload.updateType != 2) {
         updateGroups(payload.groupList).then();
     } else {
-        processGroupEvent(payload).then();
+        if (process.platform == "win32") {
+            processGroupEvent(payload).then();
+        }
+    }
+})
+registerReceiveHook<{ groupList: Group[], updateType: number }>(ReceiveCmdS.GROUPS_STORE, (payload) => {
+    if (payload.updateType != 2) {
+        updateGroups(payload.groupList).then();
+    } else {
+        if (process.platform != "win32") {
+            processGroupEvent(payload).then();
+        }
     }
 })
 
-registerReceiveHook<{groupCode: string, dataSource: number, members: Set<GroupMember>}>(ReceiveCmdS.GROUP_MEMBER_INFO_UPDATE, (payload) => {
+registerReceiveHook<{groupCode: string, dataSource: number, members: Set<GroupMember>}>(ReceiveCmdS.GROUP_MEMBER_INFO_UPDATE, async (payload) => {
     const groupCode = payload.groupCode;
     const members = Array.from(payload.members.values());
-    // log("群成员变动", groupCode, payload.members.keys(), payload.members.values())
+    // log("群成员信息变动", groupCode, members)
+    for(const member of members) {
+        const existMember = await getGroupMember(groupCode, member.uin);
+        if (existMember){
+            Object.assign(existMember, member);
+        }
+    }
     // const existGroup = groups.find(g => g.groupCode == groupCode);
     // if (existGroup) {
     //     log("对比群成员", existGroup.members, members)
diff --git a/src/ntqqapi/ntcall.ts b/src/ntqqapi/ntcall.ts
index b7efc15..480921d 100644
--- a/src/ntqqapi/ntcall.ts
+++ b/src/ntqqapi/ntcall.ts
@@ -162,7 +162,12 @@ export function callNTQQApi<ReturnType>(params: NTQQApiParams) {
 
         ipcMain.emit(
             channel,
-            {},
+            {
+                sender: {
+                    send: (..._args: unknown[]) => {
+                    },
+                },
+            },
             {type: 'request', callbackId: uuid, eventName},
             apiArgs
         )
diff --git a/src/ntqqapi/types/msg.ts b/src/ntqqapi/types/msg.ts
index 1436cbd..299bf05 100644
--- a/src/ntqqapi/types/msg.ts
+++ b/src/ntqqapi/types/msg.ts
@@ -1,4 +1,5 @@
 import {GroupMemberRole} from "./group";
+import exp from "constants";
 
 export enum ElementType {
     TEXT = 1,
@@ -209,6 +210,44 @@ export interface FaceElement {
     faceType: 1
 }
 
+export interface MarketFaceElement {
+    "itemType": 6,
+    "faceInfo": 1,
+    "emojiPackageId": 203875,
+    "subType": 3,
+    "mediaType": 0,
+    "imageWidth": 200,
+    "imageHeight": 200,
+    "faceName": string,
+    "emojiId": "094d53bd1c9ac5d35d04b08e8a6c992c",
+    "key": "a8b1dd0aebc8d910",
+    "param": null,
+    "mobileParam": null,
+    "sourceType": null,
+    "startTime": null,
+    "endTime": null,
+    "emojiType": 1,
+    "hasIpProduct": null,
+    "voiceItemHeightArr": null,
+    "sourceName": null,
+    "sourceJumpUrl": null,
+    "sourceTypeName": null,
+    "backColor": null,
+    "volumeColor": null,
+    "staticFacePath": "E:\\SystemDocuments\\QQ\\721011692\\nt_qq\\nt_data\\Emoji\\marketface\\203875\\094d53bd1c9ac5d35d04b08e8a6c992c_aio.png",
+    "dynamicFacePath": "E:\\SystemDocuments\\QQ\\721011692\\nt_qq\\nt_data\\Emoji\\marketface\\203875\\094d53bd1c9ac5d35d04b08e8a6c992c",
+    "supportSize": [
+        {
+            "width": 300,
+            "height": 300
+        },
+        {
+            "width": 200,
+            "height": 200
+        }
+    ],
+    "apngSupportSize": null
+}
 export interface VideoElement {
     "filePath": string,
     "fileName": string,
@@ -321,5 +360,6 @@ export interface RawMessage {
         faceElement: FaceElement;
         videoElement: VideoElement;
         fileElement: FileElement;
+        marketFaceElement: MarketFaceElement;
     }[];
 }
\ No newline at end of file
diff --git a/src/onebot11/action/go-cqhttp/SendForwardMsg.ts b/src/onebot11/action/go-cqhttp/SendForwardMsg.ts
index 67a2564..ff14537 100644
--- a/src/onebot11/action/go-cqhttp/SendForwardMsg.ts
+++ b/src/onebot11/action/go-cqhttp/SendForwardMsg.ts
@@ -1,18 +1,22 @@
-import SendMsg from "../msg/SendMsg";
+import SendMsg, {convertMessage2List} from "../msg/SendMsg";
 import {OB11PostSendMsg} from "../../types";
 import {ActionName} from "../types";
 
-export class GoCQHTTPSendGroupForwardMsg extends SendMsg {
-    actionName = ActionName.GoCQHTTP_SendGroupForwardMsg;
+export class GoCQHTTPSendForwardMsg extends SendMsg {
+    actionName = ActionName.GoCQHTTP_SendForwardMsg;
 
     protected async check(payload: OB11PostSendMsg) {
-        if (payload.messages){
-            payload.message = this.convertMessage2List(payload.messages);
-        }
+        if (payload.user_id) this.actionName = ActionName.GoCQHTTP_SendPrivateForwardMsg;
+        if (payload.group_id) this.actionName = ActionName.GoCQHTTP_SendGroupForwardMsg;
+        if (payload.messages) payload.message = convertMessage2List(payload.messages);
         return super.check(payload);
     }
 }
 
-export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendGroupForwardMsg {
+export class GoCQHTTPSendPrivateForwardMsg extends GoCQHTTPSendForwardMsg {
     actionName = ActionName.GoCQHTTP_SendPrivateForwardMsg;
+}
+
+export class GoCQHTTPSendGroupForwardMsg extends GoCQHTTPSendForwardMsg {
+    actionName = ActionName.GoCQHTTP_SendGroupForwardMsg;
 }
\ No newline at end of file
diff --git a/src/onebot11/action/group/GetGroupList.ts b/src/onebot11/action/group/GetGroupList.ts
index 5c3eb49..f48aff2 100644
--- a/src/onebot11/action/group/GetGroupList.ts
+++ b/src/onebot11/action/group/GetGroupList.ts
@@ -3,12 +3,18 @@ import {OB11Constructor} from "../../constructor";
 import {groups} from "../../../common/data";
 import BaseAction from "../BaseAction";
 import {ActionName} from "../types";
+import {NTQQGroupApi} from "../../../ntqqapi/api";
+import {log} from "../../../common/utils";
 
 
 class GetGroupList extends BaseAction<null, OB11Group[]> {
     actionName = ActionName.GetGroupList
 
     protected async _handle(payload: null) {
+        // if (groups.length === 0) {
+        //     const groups = await NTQQGroupApi.getGroups(true)
+        //     log("get groups", groups)
+        // }
         return OB11Constructor.groups(groups);
     }
 }
diff --git a/src/onebot11/action/index.ts b/src/onebot11/action/index.ts
index d0edfd2..bfc5530 100644
--- a/src/onebot11/action/index.ts
+++ b/src/onebot11/action/index.ts
@@ -14,7 +14,7 @@ import GetVersionInfo from "./system/GetVersionInfo";
 import CanSendRecord from "./system/CanSendRecord";
 import CanSendImage from "./system/CanSendImage";
 import GetStatus from "./system/GetStatus";
-import {GoCQHTTPSendGroupForwardMsg, GoCQHTTPSendPrivateForwardMsg} from "./go-cqhttp/SendForwardMsg";
+import {GoCQHTTPSendForwardMsg, GoCQHTTPSendGroupForwardMsg, GoCQHTTPSendPrivateForwardMsg} from "./go-cqhttp/SendForwardMsg";
 import GoCQHTTPGetStrangerInfo from "./go-cqhttp/GetStrangerInfo";
 import SendLike from "./user/SendLike";
 import SetGroupAddRequest from "./group/SetGroupAddRequest";
@@ -73,6 +73,7 @@ export const actionHandlers = [
     new CleanCache(),
 
     //以下为go-cqhttp api
+    new GoCQHTTPSendForwardMsg(),
     new GoCQHTTPSendGroupForwardMsg(),
     new GoCQHTTPSendPrivateForwardMsg(),
     new GoCQHTTPGetStrangerInfo(),
diff --git a/src/onebot11/action/types.ts b/src/onebot11/action/types.ts
index 5985b1b..2216dc0 100644
--- a/src/onebot11/action/types.ts
+++ b/src/onebot11/action/types.ts
@@ -51,6 +51,7 @@ export enum ActionName {
     GetRecord = "get_record",
     CleanCache = "clean_cache",
     // 以下为go-cqhttp api
+    GoCQHTTP_SendForwardMsg = "send_forward_msg",
     GoCQHTTP_SendGroupForwardMsg = "send_group_forward_msg",
     GoCQHTTP_SendPrivateForwardMsg = "send_private_forward_msg",
     GoCQHTTP_GetStrangerInfo = "get_stranger_info",
diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts
index 27205e1..03c1fe9 100644
--- a/src/onebot11/constructor.ts
+++ b/src/onebot11/constructor.ts
@@ -203,6 +203,9 @@ export class OB11Constructor {
             } else if (element.faceElement) {
                 message_data["type"] = OB11MessageDataType.face;
                 message_data["data"]["id"] = element.faceElement.faceIndex.toString();
+            } else if (element.marketFaceElement) {
+                message_data["type"] = OB11MessageDataType.mface;
+                message_data["data"]["text"] = element.marketFaceElement.faceName;
             }
             if (message_data.type !== "unknown" && message_data.data) {
                 const cqCode = encodeCQCode(message_data);
@@ -224,8 +227,9 @@ export class OB11Constructor {
         if (msg.senderUin){
             let member = await getGroupMember(msg.peerUid, msg.senderUin);
             if (member && member.cardName !== msg.sendMemberName) {
+                const event = new OB11GroupCardEvent(parseInt(msg.peerUid), parseInt(msg.senderUin), msg.sendMemberName, member.cardName)
                 member.cardName = msg.sendMemberName;
-                return new OB11GroupCardEvent(parseInt(msg.peerUid), parseInt(msg.senderUin), msg.sendMemberName, member.cardName)
+                return event
             }
         }
         // log("group msg", msg);
diff --git a/src/onebot11/types.ts b/src/onebot11/types.ts
index fcfbf77..907c84b 100644
--- a/src/onebot11/types.ts
+++ b/src/onebot11/types.ts
@@ -108,10 +108,16 @@ export enum OB11MessageDataType {
     reply = "reply",
     json = "json",
     face = "face",
-    mface = "face", // 商城表情
+    mface = "mface", // 商城表情
     node = "node",  // 合并转发消息
 }
 
+export interface OB11MessageMFace{
+    type: OB11MessageDataType.mface,
+    data: {
+        text: string
+    }
+}
 export interface OB11MessageText {
     type: OB11MessageDataType.text,
     data: {
@@ -199,7 +205,7 @@ export interface OB11MessageJson {
 
 export type OB11MessageData =
     OB11MessageText |
-    OB11MessageFace |
+    OB11MessageFace | OB11MessageMFace |
     OB11MessageAt | OB11MessageReply |
     OB11MessageImage | OB11MessageRecord | OB11MessageFile | OB11MessageVideo |
     OB11MessageNode | OB11MessageCustomMusic | OB11MessageJson
diff --git a/src/renderer/index.ts b/src/renderer/index.ts
index 17a6ae3..9453a24 100644
--- a/src/renderer/index.ts
+++ b/src/renderer/index.ts
@@ -150,7 +150,7 @@ async function onSettingWindowCreated(view: Element) {
             ),
             SettingItem(
                 '日志文件目录',
-                `${window.LiteLoader.plugins['LLOneBot'].path.data}`,
+                `${window.LiteLoader.plugins['LLOneBot'].path.data}/logs`,
                 SettingButton('打开', 'config-open-log-path'),
             ),
         ]),
diff --git a/src/version.ts b/src/version.ts
index e570f95..38e1d2c 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1 +1 @@
-export const version = "3.19.1"
\ No newline at end of file
+export const version = "3.19.3"
\ No newline at end of file