Add automatic creation of vote message with random movies
When a !nextwp event is created the bot will fetch random movies and create a message that people can vote on
This commit is contained in:
@ -2,8 +2,8 @@ import { GuildMember } from "discord.js";
|
||||
import { Config } from "../configuration";
|
||||
import { Maybe, PermissionLevel } from "../interfaces";
|
||||
import { logger } from "../logger";
|
||||
import { CreateUserByNameOperationRequest, DeleteUserRequest, SystemApi, UpdateUserPasswordOperationRequest, UpdateUserPolicyOperationRequest, UserApi } from "./apis";
|
||||
import { UpdateUserPasswordRequest } from "./models";
|
||||
import { CreateUserByNameOperationRequest, DeleteUserRequest, GetItemsRequest, GetMovieRemoteSearchResultsOperationRequest, ItemLookupApi, ItemsApi, LibraryApi, SystemApi, UpdateUserPasswordOperationRequest, UpdateUserPolicyOperationRequest, UserApi } from "./apis";
|
||||
import { BaseItemDto, UpdateUserPasswordRequest } from "./models";
|
||||
import { UserDto } from "./models/UserDto";
|
||||
import { Configuration, ConfigurationParameters } from "./runtime";
|
||||
|
||||
@ -12,6 +12,7 @@ export class JellyfinHandler {
|
||||
|
||||
private userApi: UserApi
|
||||
private systemApi: SystemApi
|
||||
private moviesApi: ItemsApi
|
||||
private token: string
|
||||
private authHeader: { headers: { 'X-Emby-Authorization': string } }
|
||||
private config: Config
|
||||
@ -24,7 +25,7 @@ export class JellyfinHandler {
|
||||
}
|
||||
return this.serverName
|
||||
}
|
||||
constructor(_config: Config, _userApi?: UserApi, _systemApi?: SystemApi) {
|
||||
constructor(_config: Config, _userApi?: UserApi, _systemApi?: SystemApi, _itemsApi?: ItemsApi) {
|
||||
this.config = _config
|
||||
this.token = this.config.bot.jellfin_token
|
||||
this.authHeader = {
|
||||
@ -40,8 +41,14 @@ export class JellyfinHandler {
|
||||
basePath: this.config.bot.jellyfin_url,
|
||||
headers: this.authHeader.headers
|
||||
}
|
||||
const libraryApiConfigurationParams: ConfigurationParameters = {
|
||||
basePath: this.config.bot.jellyfin_url,
|
||||
headers: this.authHeader.headers
|
||||
}
|
||||
|
||||
this.userApi = _userApi ?? new UserApi(new Configuration(userApiConfigurationParams))
|
||||
this.systemApi = _systemApi ?? new SystemApi(new Configuration(systemApiConfigurationParams))
|
||||
this.moviesApi = _itemsApi ?? new ItemsApi(new Configuration(libraryApiConfigurationParams))
|
||||
logger.info(`Initialized Jellyfin handler`, { requestId: 'Init' })
|
||||
}
|
||||
|
||||
@ -222,7 +229,38 @@ export class JellyfinHandler {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
export enum UserUpsertResult {enabled, created}
|
||||
public async getAllMovies(guildId: string, requestId: string): Promise<BaseItemDto[]> {
|
||||
logger.info("requesting all movies from jellyfin", { guildId: guildId, requestId })
|
||||
|
||||
const liloJfUser = await this.getUser(<GuildMember>{ guild: { id: guildId }, displayName: "lilo" }, requestId)
|
||||
|
||||
const searchParams: GetItemsRequest = {
|
||||
userId: liloJfUser?.id,
|
||||
parentId: "f137a2dd21bbc1b99aa5c0f6bf02a805" // collection ID for all movies
|
||||
}
|
||||
const movies = (await (this.moviesApi.getItems(searchParams))).items?.filter(item => !item.isFolder)
|
||||
// logger.debug(JSON.stringify(movies, null, 2), { guildId: guildId, requestId })
|
||||
logger.info(`Found ${movies?.length} movies in total`, { guildId: guildId, requestId })
|
||||
return movies ?? []
|
||||
}
|
||||
|
||||
public async getRandomMovies(count: number, guildId: string, requestId: string): Promise<BaseItemDto[]> {
|
||||
logger.info(`${count} random movies requested.`, { guildId: guildId, requestId })
|
||||
const allMovies = await this.getAllMovies(guildId, requestId)
|
||||
if (count >= allMovies.length) {
|
||||
logger.info(`${count} random movies requested but found only ${allMovies.length}. Returning all Movies.`)
|
||||
return allMovies
|
||||
}
|
||||
const movies: BaseItemDto[] = []
|
||||
for (let i = 0; i < count; i++) {
|
||||
const index = Math.random() * allMovies.length
|
||||
movies.push(...allMovies.splice(index, 1)) // maybe out of bounds? ?
|
||||
}
|
||||
|
||||
return movies
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
export enum UserUpsertResult { enabled, created }
|
||||
|
||||
|
Reference in New Issue
Block a user