diff --git a/server.js b/server.js index d5260db..3d891e6 100644 --- a/server.js +++ b/server.js @@ -138,12 +138,13 @@ const scenes = [ apiKey: 'bot-20250724150616-xqpz8', // 起床场景的API key openingLines: [ // '你靠得近点...像梦里那样', - "刚醒就看到你,比闹钟好使一百倍。", + "刚醒就看到你,真好。", // "昨晚梦里喊你名字喊醒了,现在视频看到你,心跳比梦里还烫。", // "你穿我T恤的样子...让我想咬住衣领不放。", "宝贝早...你声音比阳光还暖。", // "喉咙里有咖啡味...要不要来尝尝?记得上次你咬我锁骨时,咖啡还温着。", - "晨雾遮住你半张脸...但你的呼吸声比雾气更潮湿,让我想起你咬我耳垂的感觉。" + // "喂...嗯...刚醒...", + "困死我了...你起这么早啊?" ] }, { @@ -153,14 +154,14 @@ const scenes = [ tag: 'driving', apiKey: 'bot-20250623140339-r8f8b', // 开车场景的API key openingLines: [ - '宝贝起了?看到你的脸,我这早起的怨气‘咻’一下就飞走了。车窗外的阳光都没你眼睛亮。', - '刚过桥,下面河水在闪光,突然就好想带你来兜风…你负责吃零食看风景,我负责偷瞄你。', + '喂?刚把导航设好。你说吧,我听着呢。', + '喂,宝贝,我开车呢,刚出小区', // '看到那个大钟楼没?每次路过都想你。想着要是能牵着你的手,站在最高层往下看该多好。', - '唉,快到了…真不想挂。感觉你像块小磁铁,隔着屏幕都想把我吸过去。今天上班肯定满脑子都是你。', - '要开始堵车了...要是你在副驾的话,这段路该多甜呀', - '宝贝起床了,刚过红绿灯就忍不住想你了,路上全是你的影子~', - '车载音乐随机到那首我们接吻时哼的歌,心跳又乱了', - '导航说今天要开58分钟,其实想开58小时去你心里' + '喂宝?开车呢,你说。', + '喂宝?路上呢,你说。', + // '宝贝起床了,刚过红绿灯就忍不住想你了,路上全是你的影子~', + // '车载音乐随机到那首我们接吻时哼的歌,心跳又乱了', + // '导航说今天要开58分钟,其实想开58小时去你心里' ] }, { @@ -170,11 +171,11 @@ const scenes = [ tag: 'coffee', apiKey: 'bot-20250804180724-4dgtk', // 喝茶场景的API key openingLines: [ - '拿铁拉花是你上次画的爱心形状,甜度刚好', - '摩卡有点苦,要是加上你的笑容就甜了', - '咖啡师问我一个人?我说在等我的甜度', - '今天的冰拿铁好甜,是不是你偷偷往我杯子里撒糖了?', - '拉花师给我在咖啡里画了颗心形的奶泡,说是给视频里的小仙女加糖', + '喂宝?公司楼下喝咖啡呢。', + '宝贝,今天的第一杯咖啡,你喝了吗?', + '报告领导,咖啡补给中!', + '咖啡太好喝了,猜我在哪摸鱼呢。', + // '拉花师给我在咖啡里画了颗心形的奶泡,说是给视频里的小仙女加糖', // '这杯好苦…但一看到你,就自动回甘了。比加十包糖都管用。你说你是不是我的专属甜味剂?' ] }, @@ -185,13 +186,11 @@ const scenes = [ tag: 'sleep', apiKey: 'bot-20250808120704-lbxwj', // 睡觉场景的API key openingLines: [ - '宝贝,一看到你,我这电量‘噌’就满了。准备关机前最后充会儿电…嗯,用眼睛充。', - '熄灯前最后一道光是你,真好。感觉今天积攒的烦心事,都被你眼睛里的星星照没了。', - '唉…手指头碰不到你屏幕都嫌凉。下次见面,这距离得用抱抱补回来,利息按秒算。', - '周围好安静,就剩你的呼吸声当背景音乐了。比什么助眠App都好使…就是听久了,心跳会抢拍子。', - '困不困?我眼皮在打架了…但就是想再多看你几秒。感觉多看一秒,梦里遇见你的概率就大一点。', - '好啦,我的小月亮,该哄世界睡觉了…但你先哄哄我?随便说句什么,我当睡前故事收藏。', - '捕捉到一只睡前小可爱…成功!', + '宝贝,一看到你,就不困了。', + '熄灯前最后一道光是你,真好。', + '宝贝困不困?我眼皮在打架了…', + '宝贝,困不困?', + // '捕捉到一只睡前小可爱…成功!', '世界要静音了…但你的声音是白名单。多说几句?' ] } @@ -343,7 +342,19 @@ app.get('/api/current-scene/opening-line', (req, res) => { // Socket.IO 连接处理 io.on('connection', (socket) => { + // 检查是否超过最大用户数 + if (connectedClients.size >= MAX_USERS) { + console.log('拒绝连接,已达到最大用户数:', socket.id); + socket.emit('connection-rejected', { + reason: '系统当前只支持一位用户同时使用,请稍后再试' + }); + socket.disconnect(true); + return; + } + console.log('用户连接:', socket.id); + activeUser = socket.id; + connectedClients.set(socket.id, { socket: socket, currentVideo: getDefaultVideo(), @@ -531,8 +542,22 @@ io.on('connection', (socket) => { // 断开连接 socket.on('disconnect', () => { - console.log('用户断开连接:', socket.id); - connectedClients.delete(socket.id); + console.log('用户断开连接:', socket.id); + const client = connectedClients.get(socket.id); + if (client) { + // 广播用户离开事件 + socket.broadcast.emit('user-disconnected', { + id: socket.id, + username: client.username + }); + } + connectedClients.delete(socket.id); + + // 清除活跃用户 + if (activeUser === socket.id) { + activeUser = null; + console.log('活跃用户已清除,系统现在可供新用户使用'); + } }); }); @@ -546,3 +571,38 @@ server.listen(PORT, '0.0.0.0', async () => { // 导出消息历史管理器供其他模块使用 module.exports = { messageHistory }; console.log(`访问 http://localhost:${PORT} 开始使用`); + +// 在现有的代码的基础上添加以下内容 + +// 在 connectedClients 定义后立即添加(约第97行) +let activeUser = null; // 当前活跃用户 +const MAX_USERS = 1; // 最大用户数 + +// 在静态文件中间件之前添加主页路由检查(约第37行之后) +app.use(cors()); +app.use(express.json()); + +// 主页路由 - 必须在静态文件服务之前 +app.get('/', (req, res) => { + if (connectedClients.size >= MAX_USERS) { + // 如果已有用户在线,重定向到等待页面 + res.sendFile(path.join(__dirname, 'src', 'waiting.html')); + } else { + // 否则正常访问主页 + res.sendFile(path.join(__dirname, 'src', 'index.html')); + } +}); + +// 检查可用性API +app.get('/api/check-availability', (req, res) => { + const available = connectedClients.size < MAX_USERS; + res.json({ + available, + currentUsers: connectedClients.size, + maxUsers: MAX_USERS + }); +}); + +// 静态文件服务 - 必须在主页路由之后 +app.use(express.static('src')); +app.use('/videos', express.static('videos'));