Compare commits
	
		
			47 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 36d1306180 | |||
| 69bde313b5 | |||
| 7af3d87048 | |||
| 73741230b1 | |||
| 4f6d4f646a | |||
| 6169649261 | |||
| 0560c4620c | |||
| be3ee5e493 | |||
| 251e6ae3d6 | |||
| 2edd0312dc | |||
| e52e845851 | |||
| 61544feaba | |||
| 1966640239 | |||
| fa9998e92c | |||
| c1a449bafe | |||
| d5d82043f0 | |||
| f2b5ee502f | |||
| 749e1c89ab | |||
| 0d5799796a | |||
| b7986d276b | |||
| 8540381834 | |||
| 7e67d1fed9 | |||
| 0cb19ba8f1 | |||
| 5dcf766593 | |||
| 808bdd033e | |||
| 33f031d333 | |||
| 40d9523e21 | |||
| 26e74a62c1 | |||
| c0f91aad79 | |||
| 79ffde5f34 | |||
| 911b9e4884 | |||
| 31a9e0eb28 | |||
| bcf788293e | |||
| 934b6dfead | |||
| cd0c8c0017 | |||
| 83f803d0e7 | |||
| 2cb652aee6 | |||
| 034d14eb15 | |||
| c8bfc47ddf | |||
| b67982ed38 | |||
| e3144fc402 | |||
| 1970f4b0cb | |||
| 8ac4f568a0 | |||
| 09f4efc96c | |||
| 6e0c3b8ef6 | |||
| 8ee36f7510 | |||
| 1593e126eb | 
@@ -22,6 +22,6 @@ jobs:
 | 
				
			|||||||
      - name: Log in to the Container registry
 | 
					      - name: Log in to the Container registry
 | 
				
			||||||
        run: docker login -u ${{ env.USER }} -p ${{ secrets.TOKEN }} ${{ env.REGISTRY }}
 | 
					        run: docker login -u ${{ env.USER }} -p ${{ secrets.TOKEN }} ${{ env.REGISTRY }}
 | 
				
			||||||
      - name: Build Container
 | 
					      - name: Build Container
 | 
				
			||||||
        run: docker build -t "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" -t "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ node -p "require('./package.json').version" }}" .
 | 
					        run: docker build -t "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" .
 | 
				
			||||||
      - name: Push Container
 | 
					      - name: Push Container
 | 
				
			||||||
        run: docker push --all-tags "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}"
 | 
					        run: docker push --all-tags "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										19
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1,12 +1,12 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "node-jellyfin-discord-bot",
 | 
					  "name": "node-jellyfin-discord-bot",
 | 
				
			||||||
  "version": "1.1.1",
 | 
					  "version": "1.1.3",
 | 
				
			||||||
  "lockfileVersion": 2,
 | 
					  "lockfileVersion": 2,
 | 
				
			||||||
  "requires": true,
 | 
					  "requires": true,
 | 
				
			||||||
  "packages": {
 | 
					  "packages": {
 | 
				
			||||||
    "": {
 | 
					    "": {
 | 
				
			||||||
      "name": "node-jellyfin-discord-bot",
 | 
					      "name": "node-jellyfin-discord-bot",
 | 
				
			||||||
      "version": "1.1.1",
 | 
					      "version": "1.1.3",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@discordjs/rest": "^1.7.0",
 | 
					        "@discordjs/rest": "^1.7.0",
 | 
				
			||||||
@@ -17,6 +17,7 @@
 | 
				
			|||||||
        "@types/uuid": "^9.0.1",
 | 
					        "@types/uuid": "^9.0.1",
 | 
				
			||||||
        "axios": "^1.3.5",
 | 
					        "axios": "^1.3.5",
 | 
				
			||||||
        "date-fns": "^2.29.3",
 | 
					        "date-fns": "^2.29.3",
 | 
				
			||||||
 | 
					        "date-fns-tz": "^2.0.0",
 | 
				
			||||||
        "discord-api-types": "^0.37.38",
 | 
					        "discord-api-types": "^0.37.38",
 | 
				
			||||||
        "discord.js": "^14.9.0",
 | 
					        "discord.js": "^14.9.0",
 | 
				
			||||||
        "dotenv": "^16.0.3",
 | 
					        "dotenv": "^16.0.3",
 | 
				
			||||||
@@ -2626,6 +2627,14 @@
 | 
				
			|||||||
        "url": "https://opencollective.com/date-fns"
 | 
					        "url": "https://opencollective.com/date-fns"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/date-fns-tz": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-OAtcLdB9vxSXTWHdT8b398ARImVwQMyjfYGkKD2zaGpHseG2UPHbHjXELReErZFxWdSLph3c2zOaaTyHfOhERQ==",
 | 
				
			||||||
 | 
					      "peerDependencies": {
 | 
				
			||||||
 | 
					        "date-fns": ">=2.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/debug": {
 | 
					    "node_modules/debug": {
 | 
				
			||||||
      "version": "4.3.4",
 | 
					      "version": "4.3.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
 | 
				
			||||||
@@ -8905,6 +8914,12 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz",
 | 
				
			||||||
      "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA=="
 | 
					      "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "date-fns-tz": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-OAtcLdB9vxSXTWHdT8b398ARImVwQMyjfYGkKD2zaGpHseG2UPHbHjXELReErZFxWdSLph3c2zOaaTyHfOhERQ==",
 | 
				
			||||||
 | 
					      "requires": {}
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "debug": {
 | 
					    "debug": {
 | 
				
			||||||
      "version": "4.3.4",
 | 
					      "version": "4.3.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "node-jellyfin-discord-bot",
 | 
					  "name": "node-jellyfin-discord-bot",
 | 
				
			||||||
  "version": "1.1.1",
 | 
					  "version": "1.1.3",
 | 
				
			||||||
  "description": "A discord bot to sync jellyfin accounts with discord roles",
 | 
					  "description": "A discord bot to sync jellyfin accounts with discord roles",
 | 
				
			||||||
  "main": "index.js",
 | 
					  "main": "index.js",
 | 
				
			||||||
  "license": "MIT",
 | 
					  "license": "MIT",
 | 
				
			||||||
@@ -13,6 +13,7 @@
 | 
				
			|||||||
    "@types/uuid": "^9.0.1",
 | 
					    "@types/uuid": "^9.0.1",
 | 
				
			||||||
    "axios": "^1.3.5",
 | 
					    "axios": "^1.3.5",
 | 
				
			||||||
    "date-fns": "^2.29.3",
 | 
					    "date-fns": "^2.29.3",
 | 
				
			||||||
 | 
					    "date-fns-tz": "^2.0.0",
 | 
				
			||||||
    "discord-api-types": "^0.37.38",
 | 
					    "discord-api-types": "^0.37.38",
 | 
				
			||||||
    "discord.js": "^14.9.0",
 | 
					    "discord.js": "^14.9.0",
 | 
				
			||||||
    "dotenv": "^16.0.3",
 | 
					    "dotenv": "^16.0.3",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,8 @@
 | 
				
			|||||||
import { format } from "date-fns";
 | 
					import { format, isToday, toDate } from "date-fns";
 | 
				
			||||||
 | 
					import {utcToZonedTime} from "date-fns-tz"
 | 
				
			||||||
import { GuildScheduledEvent } from "discord.js";
 | 
					import { GuildScheduledEvent } from "discord.js";
 | 
				
			||||||
import { logger } from "../logger";
 | 
					import { logger } from "../logger";
 | 
				
			||||||
 | 
					import de from "date-fns/locale/de";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function createDateStringFromEvent(event: GuildScheduledEvent, requestId: string, guildId?: string): string {
 | 
					export function createDateStringFromEvent(event: GuildScheduledEvent, requestId: string, guildId?: string): string {
 | 
				
			||||||
    if(!event.scheduledStartAt) {
 | 
					    if(!event.scheduledStartAt) {
 | 
				
			||||||
@@ -8,9 +10,14 @@ export function createDateStringFromEvent(event: GuildScheduledEvent, requestId:
 | 
				
			|||||||
        return `"habe keinen Startzeitpunkt ermitteln können"`
 | 
					        return `"habe keinen Startzeitpunkt ermitteln können"`
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const date = format(event.scheduledStartAt, "dd.MM")
 | 
					    const timeZone = 'Europe/Berlin'
 | 
				
			||||||
    const time = format(event.scheduledStartAt, "HH:mm")
 | 
					    const zonedDateTime = utcToZonedTime(event.scheduledStartAt, timeZone)
 | 
				
			||||||
 | 
					    const time = format(zonedDateTime, "HH:mm", {locale: de})
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if(isToday(zonedDateTime)) {
 | 
				
			||||||
 | 
					        return `heute um ${time}`
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const date = format(zonedDateTime, "eeee dd.MM", {locale: de})
 | 
				
			||||||
    return `am ${date} um ${time}`
 | 
					    return `am ${date} um ${time}`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -2,7 +2,7 @@ import { GuildMember } from "discord.js";
 | 
				
			|||||||
import { JellyfinConfig, Maybe, PermissionLevel } from "../interfaces";
 | 
					import { JellyfinConfig, Maybe, PermissionLevel } from "../interfaces";
 | 
				
			||||||
import { logger } from "../logger";
 | 
					import { logger } from "../logger";
 | 
				
			||||||
import { CreateUserByNameOperationRequest, DeleteUserRequest, GetItemsRequest, ItemsApi, SystemApi, UpdateUserPasswordOperationRequest, UpdateUserPolicyOperationRequest, UserApi } from "./apis";
 | 
					import { CreateUserByNameOperationRequest, DeleteUserRequest, GetItemsRequest, ItemsApi, SystemApi, UpdateUserPasswordOperationRequest, UpdateUserPolicyOperationRequest, UserApi } from "./apis";
 | 
				
			||||||
import { BaseItemDto, UpdateUserPasswordRequest } from "./models";
 | 
					import { BaseItemDto, UpdateUserPasswordRequest, UpdateUserPolicyRequest } from "./models";
 | 
				
			||||||
import { UserDto } from "./models/UserDto";
 | 
					import { UserDto } from "./models/UserDto";
 | 
				
			||||||
import { Configuration, ConfigurationParameters } from "./runtime";
 | 
					import { Configuration, ConfigurationParameters } from "./runtime";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,24 +52,46 @@ export class JellyfinHandler {
 | 
				
			|||||||
    return (Math.random() * 10000 + 10000).toFixed(0)
 | 
					    return (Math.random() * 10000 + 10000).toFixed(0)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async createUserAccountForDiscordUser(discordUser: GuildMember, level: PermissionLevel, guildId?: string, requestId?: string): Promise<UserDto> {
 | 
					  public async createUserAccountForDiscordUser(discordUser: GuildMember, level: PermissionLevel, requestId: string, guildId?: string): Promise<UserDto> {
 | 
				
			||||||
    const newUserName = this.generateJFUserName(discordUser, level)
 | 
					    const newUserName = this.generateJFUserName(discordUser, level)
 | 
				
			||||||
    logger.info(`New Username for ${discordUser.displayName}: ${newUserName}`, { guildId, requestId })
 | 
					    logger.info(`New Username for ${discordUser.displayName}: ${newUserName}`, { guildId, requestId })
 | 
				
			||||||
    const req: CreateUserByNameOperationRequest = {
 | 
					    const req: CreateUserByNameOperationRequest = {
 | 
				
			||||||
      createUserByNameRequest: {
 | 
					      createUserByNameRequest: {
 | 
				
			||||||
        name: newUserName,
 | 
					        name: newUserName,
 | 
				
			||||||
        password: this.generatePasswordForUser(),
 | 
					        password: this.generatePasswordForUser()
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    logger.debug(JSON.stringify(req), { requestId, guildId })
 | 
					    logger.debug(JSON.stringify(req), { requestId, guildId })
 | 
				
			||||||
    const createResult = await this.userApi.createUserByName(req)
 | 
					    const createResult = await this.userApi.createUserByName(req)
 | 
				
			||||||
    if (createResult) {
 | 
					    if (createResult) {
 | 
				
			||||||
 | 
					      if(createResult.policy) {
 | 
				
			||||||
 | 
					        this.setUserPermissions(createResult, requestId, guildId)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      (await discordUser.createDM()).send(`Ich hab dir mal nen Account angelegt :)\nDein Username ist ${createResult.name}, dein Password ist "${req.createUserByNameRequest.password}"!`)
 | 
					      (await discordUser.createDM()).send(`Ich hab dir mal nen Account angelegt :)\nDein Username ist ${createResult.name}, dein Password ist "${req.createUserByNameRequest.password}"!`)
 | 
				
			||||||
      return createResult
 | 
					      return createResult
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else throw new Error('Could not create User in Jellyfin')
 | 
					    else throw new Error('Could not create User in Jellyfin')
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async setUserPermissions(user: UserDto, requestId: string, guildId?: string) {
 | 
				
			||||||
 | 
					    if(!user.policy || !user.id) {
 | 
				
			||||||
 | 
					      logger.error(`Cannot update user policy. User ${user.name} has no policy to modify`, {guildId, requestId}) 
 | 
				
			||||||
 | 
					      return
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    user.policy.enableVideoPlaybackTranscoding = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const operation: UpdateUserPolicyRequest = {
 | 
				
			||||||
 | 
					      ...user.policy,
 | 
				
			||||||
 | 
					      enableVideoPlaybackTranscoding: false
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const request: UpdateUserPolicyOperationRequest = {
 | 
				
			||||||
 | 
					      userId: user.id,
 | 
				
			||||||
 | 
					      updateUserPolicyRequest: operation
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    this.userApi.updateUserPolicy(request)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async isUserAlreadyPresent(discordUser: GuildMember, requestId?: string): Promise<boolean> {
 | 
					  public async isUserAlreadyPresent(discordUser: GuildMember, requestId?: string): Promise<boolean> {
 | 
				
			||||||
    const jfuser = await this.getUser(discordUser, requestId)
 | 
					    const jfuser = await this.getUser(discordUser, requestId)
 | 
				
			||||||
    logger.debug(`Presence for DiscordUser ${discordUser.id}:${jfuser !== undefined}`, { guildId: discordUser.guild.id, requestId })
 | 
					    logger.debug(`Presence for DiscordUser ${discordUser.id}:${jfuser !== undefined}`, { guildId: discordUser.guild.id, requestId })
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user