Files
chatroom/resources/js/chat.js
lkddi 8fcccf72a5 feat(baccarat): 实现百家乐实时下注人数统计功能
- 新增 BaccaratPoolUpdated 事件,用于通过 WebSocket 广播实时下注数据更新
- 增加数据库迁移以在 baccarat_rounds 表中添加对应的下注人数统计字段
- 更新 BaccaratRound 模型以及 BaccaratController,支持实时下注统计更新与 WebSocket 事件分发
- 更新前端 chat.js 以及 baccarat-panel.blade.php,利用 Alpine.js 和 Echo 接收事件并动态渲染 "大"、"小"、"豹子" 的实时下注计数
2026-03-28 17:02:10 +08:00

183 lines
7.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import "./bootstrap";
// 这个文件负责处理浏览器与 Laravel Reverb WebSocket 服务器的通信。
// 通过 Presence Channel 实现聊天室的核心监听。
export function initChat(roomId) {
if (!roomId) {
console.error("未提供 roomId无法初始化 WebSocket 连接。");
return;
}
// 监听全局系统事件(如 AI 机器人开关)
window.Echo.channel('chat.system')
.listen('ChatBotToggled', (e) => {
console.log("机器人开关:", e);
window.dispatchEvent(new CustomEvent("chat:bot-toggled", { detail: e }));
});
// 加入带有登录人员追踪的 Presence Channel
window.Echo.join(`room.${roomId}`)
// 当自己成功连接时,获取当前在这里的所有人列表
.here((users) => {
console.log("当前房间内的在线人员:", users);
// 触发自定义事件,让具体的前端 UI 去接管渲染
window.dispatchEvent(
new CustomEvent("chat:here", { detail: users }),
);
})
// 监听其他人的加入
.joining((user) => {
console.log(user.username + " 进入了房间");
window.dispatchEvent(
new CustomEvent("chat:joining", { detail: user }),
);
})
// 监听其他人的离开
.leaving((user) => {
console.log(user.username + " 离开了房间");
window.dispatchEvent(
new CustomEvent("chat:leaving", { detail: user }),
);
})
// 监听新发送的文本消息
.listen("MessageSent", (e) => {
console.log("收到新发言:", e.message);
window.dispatchEvent(
new CustomEvent("chat:message", { detail: e.message }),
);
})
// 监听踢出事件(通常判断是不是自己被踢出了)
.listen("UserKicked", (e) => {
console.log("踢出通知:", e);
window.dispatchEvent(new CustomEvent("chat:kicked", { detail: e }));
})
// 监听封口禁言事件
.listen("UserMuted", (e) => {
console.log("禁言通知:", e);
window.dispatchEvent(new CustomEvent("chat:muted", { detail: e }));
})
// 监听房间主题被改变
.listen("RoomTitleUpdated", (e) => {
console.log("主题改变:", e);
window.dispatchEvent(
new CustomEvent("chat:title-updated", { detail: e }),
);
})
// 监听管理员全员清屏
.listen("ScreenCleared", (e) => {
console.log("全员清屏:", e);
window.dispatchEvent(
new CustomEvent("chat:screen-cleared", { detail: e }),
);
})
// 监听管理员触发的全屏特效(烟花/下雨/雷电)
.listen("EffectBroadcast", (e) => {
console.log("特效播放:", e);
window.dispatchEvent(new CustomEvent("chat:effect", { detail: e }));
})
// 监听任命公告(礼花 + 隆重弹窗)
.listen("AppointmentAnnounced", (e) => {
console.log("任命公告:", e);
window.dispatchEvent(
new CustomEvent("chat:appointment-announced", { detail: e }),
);
})
// ─── 婚姻系统:全局事件(广播给整个房间) ────────────────
.listen(".marriage.accepted", (e) => {
console.log("结婚公告:", e);
window.dispatchEvent(
new CustomEvent("chat:marriage-accepted", { detail: e }),
);
})
.listen(".marriage.divorced", (e) => {
console.log("离婚公告:", e);
window.dispatchEvent(
new CustomEvent("chat:marriage-divorced", { detail: e }),
);
})
.listen(".wedding.celebration", (e) => {
console.log("婚礼庆典:", e);
window.dispatchEvent(
new CustomEvent("chat:wedding-celebration", { detail: e }),
);
})
// ─── 节日福利:系统定时发放 ────────────────────────────────
.listen(".holiday.started", (e) => {
console.log("节日福利开始:", e);
window.dispatchEvent(
new CustomEvent("chat:holiday.started", { detail: e }),
);
})
// ─── 百家乐:开局 & 结算 ──────────────────────────────────
.listen(".baccarat.opened", (e) => {
console.log("百家乐开局:", e);
window.dispatchEvent(
new CustomEvent("chat:baccarat.opened", { detail: e }),
);
})
.listen(".baccarat.pool_updated", (e) => {
console.log("百家乐押注更新:", e);
window.dispatchEvent(
new CustomEvent("chat:baccarat.pool_updated", { detail: e }),
);
})
.listen(".baccarat.settled", (e) => {
console.log("百家乐结算:", e);
window.dispatchEvent(
new CustomEvent("chat:baccarat.settled", { detail: e }),
);
});
}
/**
* 初始化婚姻私人频道监听(求婚通知 / 拒绝通知 / 红包领取通知)
* 在用户登录成功后调用,监听 user.{id} 私人频道的婚姻事件。
*
* @param {number} userId 当前登录用户 ID
*/
export function initMarriagePrivateChannel(userId) {
if (!userId || !window.Echo) return;
window.Echo.private(`user.${userId}`)
// 收到求婚通知(目标方)
.listen(".marriage.proposed", (e) => {
console.log("收到求婚:", e);
window.dispatchEvent(
new CustomEvent("chat:marriage-proposed", { detail: e }),
);
})
// 求婚被拒绝(发起方)
.listen(".marriage.rejected", (e) => {
console.log("求婚被拒:", e);
window.dispatchEvent(
new CustomEvent("chat:marriage-rejected", { detail: e }),
);
})
// 求婚过期(发起方)
.listen(".marriage.expired", (e) => {
console.log("求婚超时:", e);
window.dispatchEvent(
new CustomEvent("chat:marriage-expired", { detail: e }),
);
})
// 协议离婚申请通知(对方)
.listen(".marriage.divorce-requested", (e) => {
console.log("离婚申请:", e);
window.dispatchEvent(
new CustomEvent("chat:divorce-requested", { detail: e }),
);
})
// 红包领取成功通知
.listen(".envelope.claimed", (e) => {
console.log("红包到账:", e);
window.dispatchEvent(
new CustomEvent("chat:envelope-claimed", { detail: e }),
);
});
}
// 供全局调用
window.initChat = initChat;
window.initMarriagePrivateChannel = initMarriagePrivateChannel;