peertube-plugin-livechat/shared/lib/video.ts

93 lines
2.2 KiB
TypeScript
Raw Normal View History

2024-05-23 09:42:14 +00:00
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { parseConfigUUIDs } from './config'
interface VideoHasWebchatSettings {
'chat-per-live-video': boolean
'chat-all-lives': boolean
'chat-all-non-lives': boolean
'chat-videos-list': string
}
interface SharedVideoBase {
uuid: string
isLive: boolean
pluginData?: {
'livechat-active'?: boolean
'livechat-remote'?: boolean
}
}
interface SharedVideoFrontend extends SharedVideoBase {
isLocal: boolean
}
interface SharedVideoBackend extends SharedVideoBase {
remote: boolean
}
type SharedVideo = SharedVideoBackend | SharedVideoFrontend
/**
* Indicate if the video has a local chat.
* @param settings plugin settings
* @param video the video
* @returns true if the video has a local chat
*/
function videoHasWebchat (settings: VideoHasWebchatSettings, video: SharedVideo): boolean {
// Never use webchat on remote videos.
if ('isLocal' in video) {
if (!video.isLocal) return false
} else {
if (video.remote) return false
}
if (settings['chat-per-live-video'] && video.isLive && video.pluginData && video.pluginData['livechat-active']) {
return true
}
if (settings['chat-all-lives']) {
if (video.isLive) return true
}
if (settings['chat-all-non-lives']) {
if (!video.isLive) return true
}
const uuids = parseConfigUUIDs(settings['chat-videos-list'])
if (uuids.includes(video.uuid)) {
return true
}
return false
}
interface VideoHasRemoteWebchatSettings {
'federation-no-remote-chat': boolean
}
/**
* Indicates if the video has a remote chat.
* @param settings plugin settings
* @param video the video
* @returns true if the video has a remote chat
*/
function videoHasRemoteWebchat (settings: VideoHasRemoteWebchatSettings, video: SharedVideo): boolean {
if (settings['federation-no-remote-chat']) { return false }
if ('isLocal' in video) {
if (video.isLocal) return false
} else {
if (!video.remote) return false
}
if (!video.pluginData) { return false }
if (!video.pluginData['livechat-remote']) { return false }
return true
}
export {
videoHasWebchat,
videoHasRemoteWebchat
}