Skip to content

Commit f3f8fc3

Browse files
committed
feat: 红包抽奖消息
link #22
1 parent 8f026ca commit f3f8fc3

File tree

5 files changed

+235
-0
lines changed

5 files changed

+235
-0
lines changed

README.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,8 @@ export interface SuperChatMsg {
450450
| --- | --- |
451451
| onGift | 收到礼物 |
452452
| onGuardBuy | 舰长上舰消息 |
453+
| onRedPocketStart | 用户开启红包抽奖 |
454+
| onRedPocketEnd | 红包抽奖结果 |
453455

454456
<details>
455457
<summary>Type Definitions</summary>
@@ -526,6 +528,93 @@ export interface GuardBuyMsg {
526528
end_time: number
527529
}
528530
```
531+
532+
##### handler.onRedPocketStart
533+
534+
用户开启红包抽奖
535+
536+
```ts
537+
export type Handler = {
538+
/** 用户开启红包抽奖 */
539+
onRedPocketStart: (msg: Message<RedPocketStartMsg>) => void
540+
}
541+
542+
type msgType = 'POPULARITY_RED_POCKET_START'
543+
544+
export interface RedPocketStartMsg {
545+
/** 红包抽奖id */
546+
id: number
547+
/** 红包发送用户 */
548+
user: User
549+
/** 开始时间,秒级时间戳 */
550+
start_time: number
551+
/** 结束时间,秒级时间戳 */
552+
end_time: number
553+
/** 持续时间,秒 */
554+
duration: number
555+
/** 口令弹幕内容 */
556+
danmu: string
557+
/** 红包奖品 */
558+
awards: RedPocketStartAward[]
559+
/** 奖品总价值,除以1000为RMB */
560+
total_price: number
561+
}
562+
563+
interface RedPocketStartAward {
564+
/** 奖品id */
565+
gift_id: number
566+
/** 奖品名称 */
567+
gift_name: string
568+
/** 奖品图片 */
569+
gift_pic: string
570+
/** 奖品数量 */
571+
num: number
572+
}
573+
```
574+
575+
##### handler.onRedPocketEnd
576+
577+
红包抽奖结果
578+
579+
```ts
580+
export type Handler = {
581+
/** 红包抽奖结果 */
582+
onRedPocketEnd: (msg: Message<RedPocketEndMsg>) => void
583+
}
584+
585+
type msgType = 'POPULARITY_RED_POCKET_WINNER_LIST'
586+
587+
export interface RedPocketEndMsg {
588+
/** 红包抽奖id */
589+
id: number
590+
/** 中奖人数 */
591+
total_num: number
592+
/** 中奖列表 */
593+
winner: ({
594+
/** 中奖用户uid */
595+
uid: number
596+
/** 中奖用户昵称 */
597+
uname: string
598+
/** 奖品id */
599+
award_id: number
600+
} & RedPocketEndAward)[]
601+
/** 红包奖品列表 */
602+
awards: Record<string, RedPocketEndAward>
603+
}
604+
605+
interface RedPocketEndAward {
606+
/** 奖品类型,待补充 */
607+
award_type: number
608+
/** 奖品名称 */
609+
award_name: string
610+
/** 奖品图片 */
611+
award_pic: string
612+
/** 奖品图片大图 */
613+
award_big_pic: string
614+
/** 奖品价值,除以1000为RMB */
615+
award_price: number
616+
}
617+
```
529618
</details>
530619

531620
#### 房间管理相关

src/listener/index.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
INTERACT_WORD, ENTRY_EFFECT, LIKE_INFO_V3_CLICK, type UserActionMsgHandler,
88
LIKE_INFO_V3_UPDATE, type LikedChangeMsgHandler,
99
ONLINE_RANK_COUNT, type RankCountChangeMsgHandler,
10+
POPULARITY_RED_POCKET_START, type RedPocketStartMsgHandler,
11+
POPULARITY_RED_POCKET_WINNER_LIST, type RedPocketEndMsgHandler,
1012
room_admin_entrance, ROOM_ADMIN_REVOKE, type RoomAdminSetMsgHandler,
1113
ROOM_CHANGE, type RoomInfoChangeHandler,
1214
ROOM_SILENT_ON, ROOM_SILENT_OFF, type RoomSilentMsgHandler,
@@ -37,6 +39,8 @@ export type MsgHandler = Partial<
3739
& UserActionMsgHandler
3840
& LikedChangeMsgHandler
3941
& RankCountChangeMsgHandler
42+
& RedPocketStartMsgHandler
43+
& RedPocketEndMsgHandler
4044
& RoomAdminSetMsgHandler
4145
& RoomInfoChangeHandler
4246
& RoomSilentMsgHandler
@@ -168,6 +172,26 @@ export const listenAll = (instance: KeepLiveTCP | KeepLiveWS, roomId: number, ha
168172
})
169173
}
170174

175+
// POPULARITY_RED_POCKET_START
176+
if (handler[POPULARITY_RED_POCKET_START.handlerName] || rawHandlerNames.has(POPULARITY_RED_POCKET_START.eventName)) {
177+
rawHandlerNames.delete(POPULARITY_RED_POCKET_START.eventName)
178+
instance.on(POPULARITY_RED_POCKET_START.eventName as any, (data: WSMessage<any>) => {
179+
isHandleRaw && rawHandler[POPULARITY_RED_POCKET_START.eventName]?.(data.data)
180+
const parsedData = POPULARITY_RED_POCKET_START.parser(data.data, roomId)
181+
handler[POPULARITY_RED_POCKET_START.handlerName]?.(normalizeDanmu(POPULARITY_RED_POCKET_START.eventName, parsedData, data.data))
182+
})
183+
}
184+
185+
// POPULARITY_RED_POCKET_WINNER_LIST
186+
if (handler[POPULARITY_RED_POCKET_WINNER_LIST.handlerName] || rawHandlerNames.has(POPULARITY_RED_POCKET_WINNER_LIST.eventName)) {
187+
rawHandlerNames.delete(POPULARITY_RED_POCKET_WINNER_LIST.eventName)
188+
instance.on(POPULARITY_RED_POCKET_WINNER_LIST.eventName as any, (data: WSMessage<any>) => {
189+
isHandleRaw && rawHandler[POPULARITY_RED_POCKET_WINNER_LIST.eventName]?.(data.data)
190+
const parsedData = POPULARITY_RED_POCKET_WINNER_LIST.parser(data.data, roomId)
191+
handler[POPULARITY_RED_POCKET_WINNER_LIST.handlerName]?.(normalizeDanmu(POPULARITY_RED_POCKET_WINNER_LIST.eventName, parsedData, data.data))
192+
})
193+
}
194+
171195
// room_admin_entrance, ROOM_ADMIN_REVOKE
172196
if (handler[room_admin_entrance.handlerName] || handler[ROOM_ADMIN_REVOKE.handlerName] || rawHandlerNames.has(room_admin_entrance.eventName) || rawHandlerNames.has(ROOM_SILENT_OFF.eventName)) {
173197
rawHandlerNames.delete(room_admin_entrance.eventName)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import type { Message, User } from '../types/app'
2+
3+
export interface RedPocketStartMsg {
4+
/** 红包抽奖id */
5+
id: number
6+
/** 红包发送用户 */
7+
user: User
8+
/** 开始时间,秒级时间戳 */
9+
start_time: number
10+
/** 结束时间,秒级时间戳 */
11+
end_time: number
12+
/** 持续时间,秒 */
13+
duration: number
14+
/** 口令弹幕内容 */
15+
danmu: string
16+
/** 红包奖品 */
17+
awards: RedPocketStartAward[]
18+
/** 奖品总价值,除以1000为RMB */
19+
total_price: number
20+
}
21+
22+
interface RedPocketStartAward {
23+
/** 奖品id */
24+
gift_id: number
25+
/** 奖品名称 */
26+
gift_name: string
27+
/** 奖品图片 */
28+
gift_pic: string
29+
/** 奖品数量 */
30+
num: number
31+
}
32+
33+
const parser = (data: any, roomId: number): RedPocketStartMsg => {
34+
const rawData = data.data
35+
36+
return {
37+
id: rawData.lot_id,
38+
user: {
39+
uid: rawData.sender_uid,
40+
uname: rawData.sender_name,
41+
face: rawData.sender_face,
42+
},
43+
start_time: rawData.start_time,
44+
end_time: rawData.end_time,
45+
duration: rawData.last_time,
46+
danmu: rawData.danmu,
47+
awards: rawData.awards,
48+
total_price: rawData.total_price,
49+
}
50+
}
51+
52+
export const POPULARITY_RED_POCKET_START = {
53+
parser,
54+
eventName: 'POPULARITY_RED_POCKET_START' as const,
55+
handlerName: 'onRedPocketStart' as const,
56+
}
57+
58+
export type Handler = {
59+
/** 用户开启红包抽奖 */
60+
onRedPocketStart: (msg: Message<RedPocketStartMsg>) => void
61+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import type { Message } from '../types/app'
2+
3+
export interface RedPocketEndMsg {
4+
/** 红包抽奖id */
5+
id: number
6+
/** 中奖人数 */
7+
total_num: number
8+
/** 中奖列表 */
9+
winner: ({
10+
/** 中奖用户uid */
11+
uid: number
12+
/** 中奖用户昵称 */
13+
uname: string
14+
/** 奖品id */
15+
award_id: number
16+
} & RedPocketEndAward)[]
17+
/** 红包奖品列表 */
18+
awards: Record<string, RedPocketEndAward>
19+
}
20+
21+
interface RedPocketEndAward {
22+
/** 奖品类型,待补充 */
23+
award_type: number
24+
/** 奖品名称 */
25+
award_name: string
26+
/** 奖品图片 */
27+
award_pic: string
28+
/** 奖品图片大图 */
29+
award_big_pic: string
30+
/** 奖品价值,除以1000为RMB */
31+
award_price: number
32+
}
33+
34+
const parser = (data: any, roomId: number): RedPocketEndMsg => {
35+
const rawData = data.data
36+
37+
return {
38+
id: rawData.lot_id,
39+
total_num: rawData.total_num,
40+
winner: rawData.winner_info.map((item: any[]) => ({
41+
uid: item[0],
42+
uname: item[1],
43+
award_id: item[3],
44+
...rawData.awards[item[3]],
45+
})),
46+
awards: rawData.awards,
47+
}
48+
}
49+
50+
export const POPULARITY_RED_POCKET_WINNER_LIST = {
51+
parser,
52+
eventName: 'POPULARITY_RED_POCKET_WINNER_LIST' as const,
53+
handlerName: 'onRedPocketEnd' as const,
54+
}
55+
56+
export type Handler = {
57+
/** 红包抽奖结果 */
58+
onRedPocketEnd: (msg: Message<RedPocketEndMsg>) => void
59+
}

src/parser/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ export { GUARD_BUY, type Handler as GuardBuyHandler, type GuardBuyMsg } from './
66
export { INTERACT_WORD, ENTRY_EFFECT, LIKE_INFO_V3_CLICK, type Handler as UserActionMsgHandler, type UserActionMsg } from './INTERACT_WORD_ENTRY_EFFECT'
77
export { LIKE_INFO_V3_UPDATE, type Handler as LikedChangeMsgHandler, type LikedChangeMsg } from './LIKE_INFO_V3_UPDATE'
88
export { ONLINE_RANK_COUNT, type Handler as RankCountChangeMsgHandler, type RankCountChangeMsg } from './ONLINE_RANK_COUNT'
9+
export { POPULARITY_RED_POCKET_START, type Handler as RedPocketStartMsgHandler, type RedPocketStartMsg } from './POPULARITY_RED_POCKET_START'
10+
export { POPULARITY_RED_POCKET_WINNER_LIST, type Handler as RedPocketEndMsgHandler, type RedPocketEndMsg } from './POPULARITY_RED_POCKET_WINNER_LIST'
911
export { room_admin_entrance, ROOM_ADMIN_REVOKE, type Handler as RoomAdminSetMsgHandler, type RoomAdminSetMsg } from './ROOM_ADMIN'
1012
export { ROOM_CHANGE, type Handler as RoomInfoChangeHandler, type RoomInfoChangeMsg } from './ROOM_CHANGE'
1113
export { ROOM_SILENT_ON, ROOM_SILENT_OFF, type Handler as RoomSilentMsgHandler, type RoomSilentMsg } from './ROOM_SILENT'

0 commit comments

Comments
 (0)