mirror of
https://github.com/chrononeko/chronocat.git
synced 2024-11-25 09:37:35 +00:00
feat(event): implement entrypoint
This commit is contained in:
parent
b4dabd0e6c
commit
fb7bc6dca3
1
packages/engine-chronocat-event/src/globalVars.ts
Normal file
1
packages/engine-chronocat-event/src/globalVars.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export const emittedBuddyReqList: string[] = []
|
186
packages/engine-chronocat-event/src/index.ts
Normal file
186
packages/engine-chronocat-event/src/index.ts
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
import type {
|
||||||
|
Element,
|
||||||
|
OnBuddyReqChange,
|
||||||
|
OnMemberInfoChange,
|
||||||
|
OnMemberListChange,
|
||||||
|
OnProfileChanged,
|
||||||
|
OnRecvMsg,
|
||||||
|
Peer,
|
||||||
|
RedIpcArgs,
|
||||||
|
RedIpcDataEvent,
|
||||||
|
RedIpcDataRequest,
|
||||||
|
RedMessage,
|
||||||
|
} from '@chronocat/red'
|
||||||
|
import { MsgType, SendType } from '@chronocat/red'
|
||||||
|
import type { ChronocatContext } from '@chronocat/shell'
|
||||||
|
import type { IpcManData } from 'ipcman'
|
||||||
|
import { ipcMan } from 'ipcman'
|
||||||
|
import { emittedBuddyReqList } from './globalVars'
|
||||||
|
import {
|
||||||
|
FriendRequestDispatchMessage,
|
||||||
|
MessageCreatedDispatchMessage,
|
||||||
|
} from './messages'
|
||||||
|
|
||||||
|
declare const __DEFINE_CHRONO_VERSION__: string
|
||||||
|
|
||||||
|
export const name = 'engine-chronocat-event'
|
||||||
|
export const version = __DEFINE_CHRONO_VERSION__
|
||||||
|
|
||||||
|
const requestMethodMap: Record<string, string> = {}
|
||||||
|
|
||||||
|
export const apply = async (ctx: ChronocatContext) => {
|
||||||
|
const dispatcher = async (method: string, payload: unknown) => {
|
||||||
|
switch (method) {
|
||||||
|
case 'nodeIKernelMsgListener/onRecvMsg': {
|
||||||
|
const { msgList } = payload as OnRecvMsg
|
||||||
|
|
||||||
|
// const prepareRole = async (msg: Message) => {
|
||||||
|
// if (msg.chatType === ChatType.Group) {
|
||||||
|
// await getMemberInfo({
|
||||||
|
// forceUpdate: false,
|
||||||
|
// groupCode: +msg.peerUid,
|
||||||
|
// uids: [msg.senderUid],
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// const fillRole = (msg: Message) => {
|
||||||
|
// if (msg.chatType === ChatType.Group) {
|
||||||
|
// msg.roleType = roleMap[msg.peerUid]?.[msg.senderUin]
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
const filteredPayload = await Promise.all(
|
||||||
|
msgList.filter(filterMessage).map(async (msg) => {
|
||||||
|
// await prepareRole(msg)
|
||||||
|
// msg = await uixCache.preprocessObject(msg)
|
||||||
|
// setMsgCache(msg)
|
||||||
|
// fillRole(msg)
|
||||||
|
return msg
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
if (filteredPayload.length)
|
||||||
|
ctx.chronocat.emit(new MessageCreatedDispatchMessage(filteredPayload))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'nodeIKernelProfileListener/onProfileSimpleChanged':
|
||||||
|
case 'nodeIKernelProfileListener/onProfileDetailInfoChanged':
|
||||||
|
case 'nodeIKernelGroupListener/onSearchMemberChange':
|
||||||
|
case 'nodeIKernelGroupService/getNextMemberList': {
|
||||||
|
// const authData = await ctx.chronocat.getAuthData()
|
||||||
|
|
||||||
|
const { profiles, infos } = payload as OnProfileChanged
|
||||||
|
|
||||||
|
// if (profiles.get(authData.uid))
|
||||||
|
// selfProfile.value = profiles.get(authData.uid)
|
||||||
|
|
||||||
|
const profile = profiles ?? infos
|
||||||
|
for (const [uid, { uin }] of profile) ctx.chronocat.uix.add(uid, uin)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'nodeIKernelGroupListener/onMemberInfoChange': {
|
||||||
|
const { members } = payload as OnMemberInfoChange
|
||||||
|
|
||||||
|
for (const [uid, { uin }] of members) {
|
||||||
|
ctx.chronocat.uix.add(uid, uin)
|
||||||
|
|
||||||
|
// if (!(groupCode in roleMap)) roleMap[groupCode] = {}
|
||||||
|
// roleMap[groupCode][uin] = role
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'nodeIKernelGroupListener/onMemberListChange': {
|
||||||
|
const { info } = payload as OnMemberListChange
|
||||||
|
|
||||||
|
const groupCode = info.sceneId.split('_')[0]
|
||||||
|
if (!groupCode) return
|
||||||
|
|
||||||
|
for (const [uid, { uin }] of info.infos) {
|
||||||
|
ctx.chronocat.uix.add(uid, uin)
|
||||||
|
|
||||||
|
// if (!(groupCode in roleMap)) roleMap[groupCode] = {}
|
||||||
|
// roleMap[groupCode][uin] = role
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'nodeIKernelBuddyListener/onBuddyReqChange': {
|
||||||
|
const { buddyReqs } = payload as OnBuddyReqChange
|
||||||
|
|
||||||
|
buddyReqs.forEach((x) => {
|
||||||
|
if (x.reqType !== 1 || x.reqSubType !== 1) return
|
||||||
|
|
||||||
|
const uin = ctx.chronocat.uix.getUin(x.friendUid)
|
||||||
|
if (!uin) return
|
||||||
|
|
||||||
|
const key = `${uin}:${x.reqTime}`
|
||||||
|
if (emittedBuddyReqList.includes(key)) return
|
||||||
|
|
||||||
|
emittedBuddyReqList.push(key)
|
||||||
|
|
||||||
|
ctx.chronocat.emit(new FriendRequestDispatchMessage(x, uin))
|
||||||
|
})
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handler = (data: IpcManData) => {
|
||||||
|
switch (data.type) {
|
||||||
|
case 'event': {
|
||||||
|
const d = data.args[1] as RedIpcDataEvent
|
||||||
|
void dispatcher(d.cmdName, d.payload)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'wrapped-request': {
|
||||||
|
requestMethodMap[data.id] = (data.args[1] as RedIpcDataRequest)[0]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'wrapped-response': {
|
||||||
|
const method = requestMethodMap[data.id]
|
||||||
|
if (!method) return
|
||||||
|
delete requestMethodMap[data.id]
|
||||||
|
void dispatcher(method, data.args[1] /* RedIpcDataResponse */)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ipcMan<RedIpcArgs>({
|
||||||
|
handler,
|
||||||
|
getId: (p) => p?.[0]?.callbackId,
|
||||||
|
})
|
||||||
|
|
||||||
|
await ctx.chronocat.whenReady()
|
||||||
|
}
|
||||||
|
|
||||||
|
export const filterMessage = (
|
||||||
|
message:
|
||||||
|
| {
|
||||||
|
peer: Peer
|
||||||
|
elements: Element[]
|
||||||
|
}
|
||||||
|
| RedMessage,
|
||||||
|
) =>
|
||||||
|
'peer' in message
|
||||||
|
? !message.elements.some((x) => x.walletElement || x.arkElement)
|
||||||
|
: !(
|
||||||
|
message.msgType === MsgType.Ark ||
|
||||||
|
message.msgType === MsgType.Wallet ||
|
||||||
|
(message.msgType === MsgType.System &&
|
||||||
|
message.subMsgType === 17 &&
|
||||||
|
message.sendType === SendType.System &&
|
||||||
|
message.elements[0]!.elementType === 8 &&
|
||||||
|
message.elements[0]!.grayTipElement!.subElementType === 16 &&
|
||||||
|
message.elements[0]!.grayTipElement!.jsonGrayTipElement!.busiId ===
|
||||||
|
'81')
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user