简短的开场白
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 43s

This commit is contained in:
Song367 2025-08-14 20:17:16 +08:00
parent 0b02f01bec
commit dcef985ffd

102
server.js
View File

@ -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(),
@ -532,7 +543,21 @@ io.on('connection', (socket) => {
// 断开连接
socket.on('disconnect', () => {
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'));