Skip to content

Commit a44c465

Browse files
committed
Customizable messages
1 parent a4470d2 commit a44c465

File tree

7 files changed

+204
-31
lines changed

7 files changed

+204
-31
lines changed

DefaultMessages.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ This document provides a list of default messages of the plugin. You can use the
6868
- **Episodes**
6969
```
7070
👤 {eventArgs.Users[0].Username} is still watching on {eventArgs.DeviceName}:
71-
🎬 {episode.Series.Name} ({eventArgs.Item.ProductionYear})
72-
S{seasonNumber} - E{episodeNumber}
71+
🎬 {eventArgs.Item.Series.Name} ({eventArgs.Item.ProductionYear})
72+
S{playbackSeasonNumber} - E{playbackEpisodeNumber}
7373
'{eventArgs.Item.Name}'
7474
```
7575

@@ -87,8 +87,8 @@ This document provides a list of default messages of the plugin. You can use the
8787
- **Episodes**
8888
```
8989
👤 {eventArgs.Users[0].Username} is watching on {eventArgs.DeviceName}:
90-
🎬 {episode.Series.Name} ({eventArgs.Item.ProductionYear})
91-
S{seasonNumber} - E{episodeNumber}
90+
🎬 {eventArgs.Item.Series.Name} ({eventArgs.Item.ProductionYear})
91+
S{playbackSeasonNumber} - E{playbackEpisodeNumber}
9292
'{eventArgs.Item.Name}'
9393
📺 [{eventArgs.Item.MediaType}] {eventArgs.Item.Genres}
9494
🕒 {duration}
@@ -106,8 +106,8 @@ This document provides a list of default messages of the plugin. You can use the
106106
- **Episodes**
107107
```
108108
👤 {eventArgs.Users[0].Username} stopped watching:
109-
🎬 {episode.Series.Name} ({eventArgs.Item.ProductionYear})
110-
S{seasonNumber} - E{episodeNumber}
109+
🎬 {eventArgs.Item.Series.Name} ({eventArgs.Item.ProductionYear})
110+
S{playbackSeasonNumber} - E{playbackEpisodeNumber}
111111
'{eventArgs.Item.Name}'
112112
```
113113

Jellyfin.Plugin.TelegramNotifier/Configuration/DefaultMessageConfiguration.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ static DefaultMessageConfiguration()
3232
"🎬 {eventArgs.Item.Name} ({eventArgs.Item.ProductionYear})";
3333

3434
PlaybackProgressEpisodes = "👤 {eventArgs.Users[0].Username} is still watching on {eventArgs.DeviceName}:\n" +
35-
"🎬 {episode.Series.Name} ({eventArgs.Item.ProductionYear})\n" +
36-
" S{seasonNumber} - E{episodeNumber}\n" +
35+
"🎬 {eventArgs.Item.Series.Name} ({eventArgs.Item.ProductionYear})\n" +
36+
" S{playbackSeasonNumber} - E{playbackEpisodeNumber}\n" +
3737
" '{eventArgs.Item.Name}'";
3838

3939
PlaybackStartMovies = "👤 {eventArgs.Users[0].Username} is watching on {eventArgs.DeviceName}:\n" +
@@ -43,8 +43,8 @@ static DefaultMessageConfiguration()
4343
"📽 {eventArgs.Item.Overview}";
4444

4545
PlaybackStartEpisodes = "👤 {eventArgs.Users[0].Username} is watching on {eventArgs.DeviceName}:\n" +
46-
"🎬 {episode.Series.Name} ({eventArgs.Item.ProductionYear})\n" +
47-
" S{seasonNumber} - E{episodeNumber}\n" +
46+
"🎬 {eventArgs.Item.Series.Name} ({eventArgs.Item.ProductionYear})\n" +
47+
" S{playbackSeasonNumber} - E{playbackEpisodeNumber}\n" +
4848
" '{eventArgs.Item.Name}'\n" +
4949
"📺 [{eventArgs.Item.MediaType}] {eventArgs.Item.Genres}\n" +
5050
"🕒 {duration}\n" +
@@ -54,8 +54,8 @@ static DefaultMessageConfiguration()
5454
"🎬 {eventArgs.Item.Name} ({eventArgs.Item.ProductionYear})";
5555

5656
PlaybackStopEpisodes = "👤 {eventArgs.Users[0].Username} stopped watching:\n" +
57-
"🎬 {episode.Series.Name} ({eventArgs.Item.ProductionYear})\n" +
58-
" S{seasonNumber} - E{episodeNumber}\n" +
57+
"🎬 {eventArgs.Item.Series.Name} ({eventArgs.Item.ProductionYear})\n" +
58+
" S{playbackSeasonNumber} - E{playbackEpisodeNumber}\n" +
5959
" '{eventArgs.Item.Name}'";
6060

6161
PluginInstallationCancelled = "🔴 {eventArgs.Argument.Name} plugin installation cancelled (version {eventArgs.Argument.Version}):";

Jellyfin.Plugin.TelegramNotifier/Configuration/Web/configPage.html

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,20 @@ <h3>---------- Notification Configuration ---------- |Save at the end ↓|</h3>
9090
</label>
9191
</div>
9292
<template id="template-notification-type">
93-
<label class="checkboxContainer">
93+
<label class="checkboxContainer" style="margin-bottom: 0;">
9494
<input is="emby-checkbox" type="checkbox" data-name="notificationTypeValue" />
9595
<span data-name="notificationTypeName"></span>
9696
</label>
9797
<div>
98-
<button class="edit-template-button raised" is="emby-button">
98+
<button class="edit-template-button raised" is="emby-button"
99+
style="top: 0; margin-bottom: 2em; cursor: pointer;">
99100
<span>Edit template</span>
100101
</button>
101102
<button class="reset-template-button raised" style="display: none;" is="emby-button">
102103
<span>Reset template</span>
103104
</button>
104-
<textarea data-name="txtTemplate" style="width: 100%; height: 400px; display: none"></textarea>
105+
<textarea data-name="txtTemplate"
106+
style="width: 100%; height: 150px; display: none; margin-bottom: 2em;"></textarea>
105107
</div>
106108
</template>
107109
<template id="template-notification-type-without-textarea">
@@ -111,23 +113,35 @@ <h3>---------- Notification Configuration ---------- |Save at the end ↓|</h3>
111113
</label>
112114
</template>
113115
<template id="template-notification-subtype">
114-
<label class="checkboxContainer" style="margin-left: 4em;">
116+
<label class="checkboxContainer" style="margin-left: 4em; margin-bottom: 0;">
115117
<input is="emby-checkbox" type="checkbox" data-name="notificationSubtypeValue" />
116118
<span data-name="notificationSubtypeName"></span>
117119
</label>
118120
<div>
119-
<button class="edit-template-button raised" is="emby-button">
121+
<button class="edit-template-button raised" is="emby-button"
122+
style="top: 0; margin-left: 4em; margin-bottom: 2em; cursor: pointer;">
120123
<span>Edit template</span>
121124
</button>
122-
<button class="reset-template-button raised" style="display: none;" is="emby-button">
125+
<button class="reset-template-button raised" style="display: none; margin-left: 4em;"
126+
is="emby-button">
123127
<span>Reset template</span>
124128
</button>
125-
<textarea data-name="txtTemplate" style="width: 100%; height: 400px; display: none"></textarea>
129+
<textarea data-name="txtTemplate"
130+
style="width: 100%; height: 150px; display: none; margin-left: 4em; margin-bottom: 2em;"></textarea>
126131
</div>
127132
</template>
128133
<div>
129134
<div class="sectionTitleContainer flex align-items-center">
130135
<h4>Notification Types</h4>
136+
<a is="emby-linkbutton" rel="noopener noreferrer"
137+
class="raised button-alt headerHelpButton emby-button" target="_blank"
138+
href="https://github.com/RomainPierre7/jellyfin-plugin-TelegramNotifier/blob/main/DefaultMessages.md">
139+
Default message guide </a>
140+
</div>
141+
<div class="label" style="margin-bottom: 2em; margin-top: 1em;">
142+
You can edit messages (personalization, translation, etc.). The important thing is that if you
143+
want to use dynamic data, you must respect the {} placeholders in your personalized message.
144+
To help you, you'll find some examples in this guide :
131145
</div>
132146
<div data-name="notificationTypeContainer">
133147
</div>

Jellyfin.Plugin.TelegramNotifier/Configuration/Web/configPage.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,39 @@ export default function (view) {
2929
"UserDataSaved": "User Data Saved"
3030
},
3131

32+
defaultMessages: {
33+
"ItemAddedMovies": "🎬 {item.Name} ({item.ProductionYear})\n added to library",
34+
"ItemAddedSeries": "📺 [Serie] {serie.Name} ({item.ProductionYear}) added to library",
35+
"ItemAddedSeasons": "📺 {season.Series.Name} ({item.ProductionYear})\n Season {seasonNumber} added to library",
36+
"ItemAddedEpisodes": "📺 {episode.Series.Name} ({item.ProductionYear})\n S{eSeasonNumber} - E{episodeNumber}\n '{item.Name}' added to library",
37+
"ItemAddedAlbums": "🎵 [Album] {album.Name} ({item.ProductionYear}) added to library",
38+
"ItemAddedSongs": "🎵 [Audio] {audio.Name} ({item.ProductionYear}) added to library",
39+
"AuthenticationFailure": "🔒 Authentication failure on {eventArgs.Argument.DeviceName} for user {eventArgs.Argument.Username}",
40+
"AuthenticationSuccess": "🔓 Authentication success for user {eventArgs.Argument.User.Name} on {eventArgs.Argument.SessionInfo.DeviceName}",
41+
"PendingRestart": "🔄 Jellyfin is pending a restart.",
42+
"PlaybackProgressMovies": "👤 {eventArgs.Users[0].Username} is still watching on {eventArgs.DeviceName}:\n🎬 {eventArgs.Item.Name} ({eventArgs.Item.ProductionYear})",
43+
"PlaybackProgressEpisodes": "👤 {eventArgs.Users[0].Username} is still watching on {eventArgs.DeviceName}:\n🎬 {eventArgs.Item.Series.Name} ({eventArgs.Item.ProductionYear})\n S{playbackSeasonNumber} - E{playbackEpisodeNumber}\n '{eventArgs.Item.Name}'",
44+
"PlaybackStartMovies": "👤 {eventArgs.Users[0].Username} is watching on {eventArgs.DeviceName}:\n🎬 {eventArgs.Item.Name} ({eventArgs.Item.ProductionYear})\n📺 [{eventArgs.Item.MediaType}] {eventArgs.Item.Genres}\n🕒 {duration}\n📽 {eventArgs.Item.Overview}",
45+
"PlaybackStartEpisodes": "👤 {eventArgs.Users[0].Username} is watching on {eventArgs.DeviceName}:\n🎬 {eventArgs.Item.Series.Name} ({eventArgs.Item.ProductionYear})\n S{playbackSeasonNumber} - E{playbackEpisodeNumber}\n '{eventArgs.Item.Name}'\n📺 [{eventArgs.Item.MediaType}] {eventArgs.Item.Genres}\n🕒 {duration}\n📽 {eventArgs.Item.Overview}",
46+
"PlaybackStopMovies": "👤 {eventArgs.Users[0].Username} stopped watching:\n🎬 {eventArgs.Item.Name} ({eventArgs.Item.ProductionYear})",
47+
"PlaybackStopEpisodes": "👤 {eventArgs.Users[0].Username} stopped watching:\n🎬 {eventArgs.Item.Series.Name} ({eventArgs.Item.ProductionYear})\n S{playbackSeasonNumber} - E{playbackEpisodeNumber}\n '{eventArgs.Item.Name}'",
48+
"PluginInstallationCancelled": "🔴 {eventArgs.Argument.Name} plugin installation cancelled (version {eventArgs.Argument.Version}):",
49+
"PluginInstallationFailed": "🔴 {eventArgs.InstallationInfo} plugin installation failed (version {eventArgs.VersionInfo}):\n{eventArgs.Exception}",
50+
"PluginInstalled": "🚧 {eventArgs.Argument.Name} plugin installed (version {eventArgs.Argument.Version})",
51+
"PluginInstalling": "🚧 {eventArgs.Argument.Name} plugin is installing (version {eventArgs.Argument.Version})",
52+
"PluginUninstalled": "🚧 {eventArgs.Argument.Name} plugin uninstalled",
53+
"PluginUpdated": "🚧 {eventArgs.Argument.Name} plugin updated to version {eventArgs.Argument.Version}:🗒️ {eventArgs.Argument.Changelog}",
54+
"SessionStart": "👤 {eventArgs.Argument.UserName} has started a session on:\n💻 {eventArgs.Argument.Client} ({eventArgs.Argument.DeviceName})\n",
55+
"SubtitleDownloadFailure": "🚫 Subtitle download failed for {eventArgs.Item.Name}",
56+
"TaskCompleted": "🧰 Task {eventArgs.Task.Name} completed: {eventArgs.Task.CurrentProgress}%\n🗒️ ({eventArgs.Task.Category}) {eventArgs.Task.Description}",
57+
"UserCreated": "👤 User {eventArgs.Argument.Username} created.",
58+
"UserDeleted": "🗑️ User {eventArgs.Argument.Username} deleted.",
59+
"UserLockedOut": "👤🔒 User {eventArgs.Argument.Username} locked out",
60+
"UserPasswordChanged": "👤 User {eventArgs.Argument.Username} changed his password.",
61+
"UserUpdated": "👤 User {eventArgs.Argument.Username} has been updated",
62+
"UserDataSaved": "👤 User {eventArgs.Argument.Username} data saved."
63+
},
64+
3265
loadNotificationTypes: function (userConfig) {
3366
const temp = document.querySelector("#template-notification-type");
3467
const temp_without_textarea = document.querySelector("#template-notification-type-without-textarea");
@@ -49,6 +82,9 @@ export default function (view) {
4982
name.innerText = TelegramNotifierConfig.notificationType.values[key][0];
5083
} else {
5184
name.innerText = TelegramNotifierConfig.notificationType.values[key];
85+
const textarea = template.querySelector('[data-name="txtTemplate"]');
86+
textarea.value = userConfig === null ? this.defaultMessages[key] : userConfig[key + 'StringMessage'];
87+
textarea.dataset.value = key;
5288
}
5389
value.dataset.value = key;
5490
if (userConfig === null) {
@@ -64,14 +100,18 @@ export default function (view) {
64100
template = subtemp.cloneNode(true).content;
65101
const name = template.querySelector("[data-name=notificationSubtypeName]");
66102
const value = template.querySelector("[data-name=notificationSubtypeValue]");
103+
const textarea = template.querySelector('[data-name="txtTemplate"]');
67104

68105
name.innerText = subtype;
69106
const subkey = key + subtype.replace(/\s/g, '');
70107
value.dataset.value = subkey;
108+
textarea.dataset.value = subkey;
71109
if (userConfig === null) {
72110
value.checked = false;
111+
textarea.value = this.defaultMessages[subkey];
73112
} else {
74113
value.checked = userConfig[subkey] === true;
114+
textarea.value = userConfig[subkey + 'StringMessage'];
75115
}
76116
container.appendChild(template);
77117
}
@@ -83,12 +123,16 @@ export default function (view) {
83123
const notificationTypeKeys = Object.keys(TelegramNotifierConfig.notificationType.values).sort();
84124
for (const key of notificationTypeKeys) {
85125
userConfig[key] = document.querySelector(`[data-name=notificationTypeValue][data-value=${key}]`).checked;
126+
if (typeof TelegramNotifierConfig.notificationType.values[key] === 'string') {
127+
userConfig[key + 'StringMessage'] = document.querySelector(`[data-name=txtTemplate][data-value=${key}]`).value;
128+
}
86129

87130
// Notification subtypes
88131
if (typeof TelegramNotifierConfig.notificationType.values[key] !== 'string') {
89132
for (const subtype of TelegramNotifierConfig.notificationType.values[key].slice(1)) {
90133
const subkey = key + subtype.replace(/\s/g, '');
91134
userConfig[subkey] = document.querySelector(`[data-name=notificationSubtypeValue][data-value=${subkey}]`).checked;
135+
userConfig[subkey + 'StringMessage'] = document.querySelector(`[data-name=txtTemplate][data-value=${subkey}]`).value;
92136
}
93137
}
94138
}
@@ -136,6 +180,20 @@ export default function (view) {
136180
}
137181
});
138182

183+
document.body.addEventListener('click', function (event) {
184+
const button = event.target.closest('.reset-template-button');
185+
186+
if (button) {
187+
const container = button.closest('div');
188+
const textarea = container.querySelector('textarea[data-name="txtTemplate"]');
189+
const key = textarea.dataset.value;
190+
191+
if (textarea) {
192+
textarea.value = TelegramNotifierConfig.notificationType.defaultMessages[key];
193+
}
194+
}
195+
});
196+
139197
},
140198

141199
loadConfig: function () {

Jellyfin.Plugin.TelegramNotifier/Jellyfin.Plugin.TelegramNotifier.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>net8.0</TargetFramework>
5-
<AssemblyVersion>10.9.10.2</AssemblyVersion>
5+
<AssemblyVersion>11.0.0.0</AssemblyVersion>
66
<RootNamespace>Jellyfin.Plugin.TelegramNotifier</RootNamespace>
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>
88
<Nullable>enable</Nullable>

0 commit comments

Comments
 (0)