Skip to content
14 changes: 11 additions & 3 deletions src/views/Robot/auto-danmaku-setting-dialog/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,13 @@

<q-card-section>
<div class="text-h6">设置自动发送的弹幕</div>
<div>
<q-toggle v-model="active" size="md" label="是否开启自动发送弹幕">
</q-toggle>
</div>
</q-card-section>

<q-card-section>
<q-card-section v-if="active">
<div>
输入框中的特殊标记会自动替换成指定的文本
</div>
Expand All @@ -37,7 +41,7 @@
</ul>
</q-card-section>

<q-card-section class="q-pt-none">
<q-card-section v-if="active" class="q-pt-none">
<div>
<q-checkbox v-model="manage.like" label="点赞" />
<q-input outlined v-model="manage.likeText" label="有人点赞时发送" />
Expand All @@ -54,14 +58,18 @@
<q-checkbox v-model="manage.welcome" label="欢迎词" />
<q-input outlined v-model="manage.welcomeText" label="有人进直播间时发送" />
</div>
<div>
<q-checkbox v-model="isOpenChatgpt" label="GPT问答机器人" />
<q-input outlined v-model="manage.gptToken" label="输入chatgpt的token才可以启用。启用后,管家会使用 chatgpt 但回答问题,回答不会超过10个字" />
</div>
</q-card-section>
</q-card>
</q-dialog>
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import { manage } from '../message/robot';
import { manage, isOpenChatgpt, active } from '../message/robot';
// 是否打开设置页面
const dialog = ref(false);
// 是否最大化设置页面
Expand Down
31 changes: 25 additions & 6 deletions src/views/Robot/message/robot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import type { SendMessage, SetInterval } from "@/types";
import * as EVENTS from "@/constants/events";
import { chatGTPApi, getEmojiApi } from "@/api";
import { create_entry_sql, create_danmu_sql, create_gift_sql, sign_sql, formatUname } from "@/utils/initSQL";
import { reactive, ref, watch } from "vue";
import { reactive, ref, toRef, watch } from "vue";
import { Notify } from "quasar";
import { LOGIN_INFO, MANAGE } from "@/constants";
import { getStore, setStore } from "@/store";
Expand All @@ -28,6 +28,13 @@ const getEmojiList = async () => {
emojiList.value = result.data;
};

watch(active, value => {
if (value && !connected.value) {
active.value = false;
Notify.create("未连接直播间,无法启动自动弹幕");
}
})


export const manage = reactive({
roomid: await (getStore(MANAGE.roomid)) || '3796382',
Expand All @@ -44,6 +51,13 @@ export const manage = reactive({
gptToken: await getStore(MANAGE.gptToken) || ''
});

export const isOpenChatgpt = ref(false);

watch(toRef(manage, 'gptToken'), value => {
console.log(value);
isOpenChatgpt.value = value.length > 0;
});

// 更新store,做持久化
watch(manage, (val) => {
const keys = Object.keys(MANAGE) as Key[]
Expand All @@ -67,8 +81,8 @@ const welcome = [

const intro = [
`我是管家${manage.robotName},我会和${manage.hostName}一起陪伴大家`,
`可以在弹幕里@${manage.robotName},和我聊天一起玩哦~`
];
manage.gptToken && intro.push(`可以在弹幕里@${manage.robotName},和我聊天一起玩哦~`)

const bossList = [
{
Expand Down Expand Up @@ -201,7 +215,7 @@ const init_listener = async () => {
return;
}
// 主人命令
if (uid === 405579368) {
if (uid === 405579368 || uid === 8212729) {
switch (question) {
case '下线':
active.value = false;
Expand All @@ -226,7 +240,7 @@ const init_listener = async () => {
if (item.barrageType === "like") {
// 点赞事件
if (!manage.like) return;
const message = manage.likeText.replaceAll('{user}', formatUname(item.uname)).replaceAll('{up}', manage.hostName);
const message = manage.likeText.replaceAll('{user}', formatUname(uname)).replaceAll('{up}', manage.hostName);
messages.push(...autoSlice(message));
} else {
!isEmoji && create_danmu_sql({ ...item, roomid: manage.roomid });
Expand Down Expand Up @@ -284,7 +298,11 @@ watch(active, async (value) => {
const roomInfo = await getMyFollowLiveInfo();
const target = roomInfo.rooms.find((room: { roomid: number; }) => room.roomid === parseInt(manage.roomid));
loopLimit -= 1;
if (loopLimit === 0) clearInterval(liveInfoIntever);
if (loopLimit === 0) {
Notify.create('当前主播未开播,无法启动自动回复');
active.value = false;
clearInterval(liveInfoIntever);
}
if (target !== undefined) {
console.log("已得到直播间信息");
clearInterval(liveInfoIntever);
Expand Down Expand Up @@ -339,7 +357,8 @@ export const startWebsocket = async () => {
return;
}
// 获取直播间信息
const { by_room_ids } = await getLiveStatusApi(manage.roomid);
const data = await getLiveStatusApi(manage.roomid);
const { by_room_ids } = data;
const roomid = Object.keys(by_room_ids)[0];
if (!roomid) {
Notify.create("直播间不存在");
Expand Down
15 changes: 1 addition & 14 deletions src/views/Robot/room.vue
Original file line number Diff line number Diff line change
Expand Up @@ -128,20 +128,7 @@ const stopRecord = async () => {
<div>
<div class="flex">
<AutoDanmakuSettingDialog />
<q-toggle v-model="active" size="md" :disable="!connected">
<div class="i-carbon-machine-learning text-2xl font-bold" :class="active ? 'text-green' : 'text-gray'" />
<q-tooltip v-if="connected">
开启机器人
</q-tooltip>
</q-toggle>
<q-icon class="i-carbon-add-alt" color="primary">
<q-tooltip>
修改GPT-Token
</q-tooltip>
<q-popup-proxy>
<q-input v-model="manage.gptToken" dense autofocus />
</q-popup-proxy>
</q-icon>
<q-toggle v-model="active" size="md" :label="active ? '已开启自动弹幕' : '未开启自动弹幕'"/>
</div>
</div>
</q-card-section>
Expand Down