Compare commits
26 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
4dfa9b46cf
|
|||
|
34d426b617
|
|||
|
1187125335
|
|||
|
e92f2890e1
|
|||
|
e7282a4b88
|
|||
|
333a4ab04e
|
|||
|
413d3715c7
|
|||
|
400c1c16ef
|
|||
|
f321f956f7
|
|||
|
879056f539
|
|||
|
e86ef0a8f3
|
|||
|
1981a69a00
|
|||
|
435744172f
|
|||
|
c916c5ea2d
|
|||
|
80b203a079
|
|||
|
d5489da5f7
|
|||
|
5394ef2046
|
|||
|
585c94718e
|
|||
|
6b3ec6517f
|
|||
|
3a4d5f8fae
|
|||
|
398163df18
|
|||
|
3295b9d77e
|
|||
|
3fd8dd9650
|
|||
|
acc7cc58ec
|
|||
|
6e176978fb
|
|||
|
12bf26ef29
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
src/vendor/
|
src/vendor/
|
||||||
dist
|
dist
|
||||||
|
*.code-workspace
|
||||||
21
LICENSE.TXT
Normal file
21
LICENSE.TXT
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020 Foundry Network
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
61
README.md
Normal file
61
README.md
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# Session Title Suggestions for FoundryVTT
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This FoundryVTT module allows players to suggest titles for the session, similar to how podcast titles are suggested. In my own sessions, I record every session's audio and make it into a podcast. Many of my favorite podcasts use a random, funny, out-of-context quote from the episode for the title. Inspired by this, I created this module so players can suggest titles and the GM can list them all and choose the best one. Players can use the `/title` or `/t` command to suggest a title. The GM (or other configurable role) can use the `/titles` or `/ts` command to get a list of all the suggestions for the most recent day's session.
|
||||||
|
|
||||||
|
## Example
|
||||||
|

|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Players can suggest session titles using the `/title`, `/t`, or `t/` command.
|
||||||
|
- GMs or trusted players can view all suggested titles for the most recent session using the `/titles` or `/ts` command. (Role is configurable in settings)
|
||||||
|
- Copy the titles using the clipboard icon button next to each suggestion in the list.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
This module requires the Chat Commander module to be installed and enabled. You can find it [here](https://gitlab.com/woodentavern/foundryvtt-chat-command-lib).
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. In the "Manifest URL" field, paste the following URL: `https://github.com/anthonyscorrea/asc-session-title-suggestions/releases/latest/download/module.json`.
|
||||||
|
2. Click "Install" and wait for the installation to complete.
|
||||||
|
3. Enable the module in your game settings.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Suggesting a Title
|
||||||
|
|
||||||
|
Players can suggest a title for the current session by typing one of the following commands in the chat:
|
||||||
|
|
||||||
|
`/title [Your Suggested Title]`
|
||||||
|
`/t [Your Suggested Title]`
|
||||||
|
|
||||||
|
Example:
|
||||||
|
`/title The Great Heist`
|
||||||
|
|
||||||
|
### Viewing Suggested Titles
|
||||||
|
|
||||||
|
GMs or trusted players can view all the suggested titles for the most recent session by typing one of the following commands in the chat:
|
||||||
|
|
||||||
|
`/titles`
|
||||||
|
`/ts`
|
||||||
|
|
||||||
|
This will display a list of all the title suggestions.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
If you want to contribute to the development of this module, feel free to fork the repository and submit a pull request. Any contributions, such as bug fixes, feature requests, or enhancements, are welcome.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is licensed under the MIT License. See the [LICENSE](LICENSE.TXT) file for details.
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
|
||||||
|
For any questions or issues, please open an issue on this GitHub repository.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Thank you for using the FoundryVTT Session Title Suggestions Module! Happy gaming!
|
||||||
BIN
screenshot.png
Normal file
BIN
screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 198 KiB |
4
scripts/zip-for-release.sh
Executable file
4
scripts/zip-for-release.sh
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
echo "version:"$(cat src/module.json|jq .version)
|
||||||
|
echo "download:"$(cat src/module.json|jq .download)
|
||||||
|
git archive --format zip --output dist/module.zip main:src
|
||||||
|
cp src/module.json dist/
|
||||||
11
src/lang/en.json
Normal file
11
src/lang/en.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"SESSION_TITLE_SUGGESTIONS.SETTING_ROLE_HINT": "Select the minimum role required to use the /titles command.",
|
||||||
|
"SESSION_TITLE_SUGGESTIONS.SETTING_ROLE_NAME": "List Titles Command Required Role",
|
||||||
|
"SESSION_TITLE_SUGGESTIONS.INVALID_DATE": "Invalid date provided.",
|
||||||
|
"SESSION_TITLE_SUGGESTIONS.NO_SUGGESTIONS": "No session title suggestions found.",
|
||||||
|
"SESSION_TITLE_SUGGESTIONS.SUGGESTION_AUTOCOMPLETE_MESSAGE": "Enter your session title suggestion.",
|
||||||
|
"SESSION_TITLE_SUGGESTIONS.SUGGESTION_LIST_COMMAND_DESCRIPTION": "List all title suggestions for the provided date",
|
||||||
|
"SESSION_TITLE_SUGGESTIONS.SUGGESTION_COMMAND_DESCRIPTION": "Suggest a title for this session",
|
||||||
|
"SESSION_TITLE_SUGGESTIONS.SUGGESTION_FLAVOR": "suggesting a session title",
|
||||||
|
"SESSION_TITLE_SUGGESTIONS.SUGGESTION_LIST_FLAVOR": "session title suggestions"
|
||||||
|
}
|
||||||
@@ -4,18 +4,27 @@
|
|||||||
"description": "A simple module that keeps track of session title suggestions",
|
"description": "A simple module that keeps track of session title suggestions",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "lmxsdl"
|
"name": "anthonyscorrea",
|
||||||
|
"url": "https://github.com/anthonyscorrea"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"version": "0.1.1",
|
"url": "https://github.com/anthonyscorrea/asc-session-title-suggestions",
|
||||||
"compatibility": {
|
"compatibility": {
|
||||||
"minimum": "10",
|
"minimum": "12",
|
||||||
"verified": "11"
|
"verified": "14"
|
||||||
},
|
},
|
||||||
"download": "https://gitea.ascorrea.com/asc/asc-session-title-suggestions/releases/download/0.1.1/asc-session-title-suggestions-0.1.1.zip",
|
"languages": [
|
||||||
"manifest":"https://gitea.ascorrea.com/asc/asc-session-title-suggestions/raw/branch/master/src/module.json",
|
{
|
||||||
|
"lang": "en",
|
||||||
|
"name": "English",
|
||||||
|
"path": "lang/en.json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"download": "https://github.com/anthonyscorrea/asc-session-title-suggestions/releases/download/0.5.4/module.zip",
|
||||||
|
"manifest": "https://github.com/anthonyscorrea/asc-session-title-suggestions/releases/latest/download/module.json",
|
||||||
|
"version": "0.5.4",
|
||||||
"scripts": [
|
"scripts": [
|
||||||
"scripts/main.js"
|
"scripts/asc-session-title-suggestions.js"
|
||||||
],
|
],
|
||||||
"esmodules":[
|
"esmodules":[
|
||||||
],
|
],
|
||||||
|
|||||||
157
src/scripts/asc-session-title-suggestions.js
Normal file
157
src/scripts/asc-session-title-suggestions.js
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
const MODULE_ID = "asc-session-title-suggestions"
|
||||||
|
const NAME = "/title"
|
||||||
|
|
||||||
|
const template_path = "modules/asc-session-title-suggestions/templates"
|
||||||
|
|
||||||
|
const TEMPLATES = {
|
||||||
|
'suggestion': {
|
||||||
|
flavor:`${template_path}/suggestion-flavor.hbs`,
|
||||||
|
content:`${template_path}/suggestion-content.hbs`
|
||||||
|
},
|
||||||
|
"suggestionList": {
|
||||||
|
flavor:`${template_path}/suggestion-list-flavor.hbs`,
|
||||||
|
content:`${template_path}/suggestion-list-content.hbs`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSuggestionTitle(message) {
|
||||||
|
return message.getFlag?.(MODULE_ID, "session_title_suggestion")
|
||||||
|
?? message.flags?.[MODULE_ID]?.session_title_suggestion
|
||||||
|
?? message.flags?.session_title_suggestion
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSuggestionDate(message) {
|
||||||
|
return new Date(message.timestamp)
|
||||||
|
}
|
||||||
|
|
||||||
|
function toSuggestionViewData(message) {
|
||||||
|
return {
|
||||||
|
title: getSuggestionTitle(message),
|
||||||
|
userName: message.user?.name ?? message.author?.name ?? game.users.get(message.userId)?.name ?? "",
|
||||||
|
timestamp: message.timestamp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function registerClipboardCopyButton() {
|
||||||
|
copyToClipboardListener = (event) => {
|
||||||
|
let text=event.target.dataset.clipboardText;
|
||||||
|
if (text.includes(';;;')){
|
||||||
|
text = text.split(';;;').join('\n')
|
||||||
|
}
|
||||||
|
console.log(`Session Title Suggestions | Copying "${text}" to clipboard`);
|
||||||
|
navigator.clipboard.writeText(text)
|
||||||
|
}
|
||||||
|
$(document).on('click', 'a.clipboard', copyToClipboardListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function registerCustomChatCommands() {
|
||||||
|
game.chatCommands.register({
|
||||||
|
name: NAME,
|
||||||
|
module: "_chatcommands",
|
||||||
|
aliases: ["/t", "t/"],
|
||||||
|
description: game.i18n.localize("SESSION_TITLE_SUGGESTIONS.SUGGESTION_COMMAND_DESCRIPTION"),
|
||||||
|
icon: '<i class="fa-solid fa-podcast"></i>',
|
||||||
|
requiredRole: "NONE",
|
||||||
|
callback: async (chat, parameters, messageData) => {
|
||||||
|
const titleSuggestion = parameters
|
||||||
|
const newMessageData = {}
|
||||||
|
newMessageData.content = await renderTemplate(TEMPLATES.suggestion.content, {content:titleSuggestion})
|
||||||
|
newMessageData.flavor = await renderTemplate(TEMPLATES.suggestion.flavor)
|
||||||
|
newMessageData.flags = {
|
||||||
|
[MODULE_ID]: {
|
||||||
|
session_title_suggestion: titleSuggestion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newMessageData;
|
||||||
|
},
|
||||||
|
autocompleteCallback: (menu, alias, parameters) => [
|
||||||
|
game.chatCommands.createInfoElement(game.i18n.localize("SESSION_TITLE_SUGGESTIONS.SUGGESTION_AUTOCOMPLETE_MESSAGE"))
|
||||||
|
],
|
||||||
|
closeOnComplete: true
|
||||||
|
}, true);
|
||||||
|
|
||||||
|
game.chatCommands.register({
|
||||||
|
name: NAME+"s",
|
||||||
|
module: "_chatcommands",
|
||||||
|
aliases: ["/ts"],
|
||||||
|
description: game.i18n.localize("SESSION_TITLE_SUGGESTIONS.SUGGESTION_LIST_COMMAND_DESCRIPTION"),
|
||||||
|
icon: '<i class="fa-solid fa-podcast"></i>',
|
||||||
|
requiredRole: game.settings.get("asc-session-title-suggestions", "titleListCommandRole"),
|
||||||
|
callback: async (chat, parameters, messageData) => {
|
||||||
|
const newMessageData = {}
|
||||||
|
const suggestions = game.messages.filter(m => {
|
||||||
|
return getSuggestionTitle(m)
|
||||||
|
})
|
||||||
|
if (!suggestions.length) {
|
||||||
|
ui.notifications.warn(game.i18n.localize("SESSION_TITLE_SUGGESTIONS.NO_SUGGESTIONS") || "No session title suggestions found.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let selected_message_date
|
||||||
|
if (!parameters) {
|
||||||
|
selected_message_date = getSuggestionDate(suggestions[suggestions.length-1])
|
||||||
|
|
||||||
|
} else {
|
||||||
|
const epoch_date = Date.parse(parameters)
|
||||||
|
if (Number.isNaN(epoch_date)){
|
||||||
|
ui.notifications.error(`${game.i18n.localize("SESSION_TITLE_SUGGESTIONS.INVALID_DATE")} (${parameters})`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
selected_message_date = new Date(epoch_date)
|
||||||
|
}
|
||||||
|
const filtered_suggestions = suggestions.filter(m=>{
|
||||||
|
const message_date = getSuggestionDate(m)
|
||||||
|
return message_date.toDateString() == selected_message_date.toDateString()
|
||||||
|
}).map(toSuggestionViewData)
|
||||||
|
newMessageData.content = await renderTemplate(TEMPLATES.suggestionList.content, {messages:filtered_suggestions })
|
||||||
|
newMessageData.flavor = await renderTemplate(TEMPLATES.suggestionList.flavor, {date:selected_message_date.toDateString()})
|
||||||
|
return newMessageData;
|
||||||
|
},
|
||||||
|
autocompleteCallback: (menu, alias, parameters) => {
|
||||||
|
const suggestions = game.messages.filter(m => {
|
||||||
|
return getSuggestionTitle(m)
|
||||||
|
})
|
||||||
|
const dates = new Set(
|
||||||
|
suggestions.map(s=>getSuggestionDate(s).toDateString())
|
||||||
|
)
|
||||||
|
const entries = [...dates].map(date=>{
|
||||||
|
return game.chatCommands.createCommandElement(`${alias} ${date}`, date)
|
||||||
|
})
|
||||||
|
|
||||||
|
entries.length = Math.min(entries.length, menu.maxEntries);
|
||||||
|
return entries;
|
||||||
|
},
|
||||||
|
closeOnComplete: true
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Hooks.on("init", function() {
|
||||||
|
//This code runs once the Foundry VTT software begins its initialization workflow
|
||||||
|
registerClipboardCopyButton();
|
||||||
|
loadTemplates([
|
||||||
|
...Object.values(TEMPLATES.suggestion),
|
||||||
|
...Object.values(TEMPLATES.suggestionList)
|
||||||
|
])
|
||||||
|
game.settings.register("asc-session-title-suggestions", "titleListCommandRole", {
|
||||||
|
name: game.i18n.localize("SESSION_TITLE_SUGGESTIONS.SETTING_ROLE_NAME"),
|
||||||
|
scope: "world",
|
||||||
|
config: true,
|
||||||
|
type: String,
|
||||||
|
default: "TRUSTED",
|
||||||
|
requiresReload: true,
|
||||||
|
choices: {
|
||||||
|
"PLAYER": game.i18n.localize("USER.RolePlayer"),
|
||||||
|
"TRUSTED": game.i18n.localize("USER.RoleTrusted"),
|
||||||
|
"ASSISTANT": game.i18n.localize("USER.RoleAssistant"),
|
||||||
|
"GAMEMASTER": game.i18n.localize("USER.RoleGamemaster")
|
||||||
|
},
|
||||||
|
hint: game.i18n.localize("SESSION_TITLE_SUGGESTIONS.SETTING_ROLE_HINT")
|
||||||
|
});
|
||||||
|
import ('https://cdn.jsdelivr.net/npm/title-case@4.3.2/dist/index.min.js')
|
||||||
|
.then((module)=>{console.log('asc','loading...');Handlebars.registerHelper("titlecase", module.titleCase)})
|
||||||
|
});
|
||||||
|
|
||||||
|
Hooks.on("ready", function() {
|
||||||
|
//This code runs once core initialization is ready and game data is available.
|
||||||
|
registerCustomChatCommands();
|
||||||
|
});
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
const NAME = "/title"
|
|
||||||
|
|
||||||
const template_path = "modules/asc-session-title-suggestions/templates"
|
|
||||||
|
|
||||||
const TEMPLATES = {
|
|
||||||
'suggestion': {
|
|
||||||
flavor:`${template_path}/suggestion-flavor.hbs`,
|
|
||||||
content:`${template_path}/suggestion-content.hbs`
|
|
||||||
},
|
|
||||||
"suggestionList": {
|
|
||||||
flavor:`${template_path}/suggestion-list-flavor.hbs`,
|
|
||||||
content:`${template_path}/suggestion-list-content.hbs`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function registerClipboardCopyButton() {
|
|
||||||
copyToClipboardListener = (event) => {
|
|
||||||
const text=event.target.dataset.clipboardText;
|
|
||||||
console.log(`Session Title Suggestions | Copying "${text}" to clipboard`);
|
|
||||||
navigator.clipboard.writeText(text)
|
|
||||||
}
|
|
||||||
$(document).on('click', 'a.clipboard', copyToClipboardListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function registerCustomChatCommands() {
|
|
||||||
game.chatCommands.unregister(NAME)
|
|
||||||
game.chatCommands.register({
|
|
||||||
name: NAME,
|
|
||||||
module: "_chatcommands",
|
|
||||||
aliases: ["/t", "t/"],
|
|
||||||
description: "Suggest a title for this episode",
|
|
||||||
icon: '<i class="fa-solid fa-podcast"></i>',
|
|
||||||
requiredRole: "NONE",
|
|
||||||
callback: async (chat, parameters, messageData) => {
|
|
||||||
const titleSuggestion = parameters
|
|
||||||
const newMessageData = {}
|
|
||||||
newMessageData.content = await renderTemplate(TEMPLATES.suggestion.content, {content:titleSuggestion})
|
|
||||||
newMessageData.flavor = await renderTemplate(TEMPLATES.suggestion.flavor)
|
|
||||||
newMessageData.flags = {session_title_suggestion: titleSuggestion}
|
|
||||||
return newMessageData;
|
|
||||||
},
|
|
||||||
autocompleteCallback: (menu, alias, parameters) => [game.chatCommands.createInfoElement("Enter a message.")],
|
|
||||||
closeOnComplete: true
|
|
||||||
});
|
|
||||||
|
|
||||||
game.chatCommands.unregister(NAME+"s")
|
|
||||||
game.chatCommands.register({
|
|
||||||
name: NAME+"s",
|
|
||||||
module: "_chatcommands",
|
|
||||||
aliases: ["/ts"],
|
|
||||||
description: "List all titles for the most recent episode",
|
|
||||||
icon: '<i class="fa-solid fa-podcast"></i>',
|
|
||||||
requiredRole: "TRUSTED",
|
|
||||||
callback: async (chat, parameters, messageData) => {
|
|
||||||
const newMessageData = {}
|
|
||||||
const suggestions = game.messages.filter(m => {
|
|
||||||
return m.flags.session_title_suggestion
|
|
||||||
})
|
|
||||||
|
|
||||||
const last_message_date = new Date(suggestions[suggestions.length-1].timestamp)
|
|
||||||
const filtered_suggestions = suggestions.filter(m=>{
|
|
||||||
const message_date = new Date(m.timestamp)
|
|
||||||
return message_date.toDateString() == last_message_date.toDateString()
|
|
||||||
})
|
|
||||||
newMessageData.content = await renderTemplate(TEMPLATES.suggestionList.content, {messages:filtered_suggestions })
|
|
||||||
newMessageData.flavor = await renderTemplate(TEMPLATES.suggestionList.flavor, {date:last_message_date.toDateString()})
|
|
||||||
return newMessageData;
|
|
||||||
},
|
|
||||||
autocompleteCallback: (menu, alias, parameters) => [game.chatCommands.createInfoElement("Enter a message.")],
|
|
||||||
closeOnComplete: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("Hello World! This code runs immediately when the file is loaded.");
|
|
||||||
|
|
||||||
Hooks.on("init", function() {
|
|
||||||
//This code runs once the Foundry VTT software begins its initialization workflow
|
|
||||||
registerCustomChatCommands();
|
|
||||||
registerClipboardCopyButton();
|
|
||||||
loadTemplates(flavor_template_path)
|
|
||||||
Object.values(TEMPLATES.suggestion).forEach((template_path)=>{
|
|
||||||
loadTemplates(template_path)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
Object.values(TEMPLATES.suggestionList).forEach((template_path)=>{
|
|
||||||
loadTemplates(template_path)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
});
|
|
||||||
|
|
||||||
Hooks.on("ready", function() {
|
|
||||||
//This code runs once core initialization is ready and game data is available.
|
|
||||||
});
|
|
||||||
@@ -1 +1 @@
|
|||||||
<i class="fa-solid fa-podcast"></i> suggesting an session title...
|
<i class="fa-solid fa-podcast"></i> {{localize 'SESSION_TITLE_SUGGESTIONS.SUGGESTION_FLAVOR'}}...
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
<ul>{{~#each messages ~}}
|
<ul>{{~#each messages ~}}
|
||||||
<li><a class="fa-regular fa-clipboard clipboard" style="padding-left:.5em;padding-right:.5em;" data-clipboard-text="{{this.flags.session_title_suggestion}}"></a><i>"{{this.flags.session_title_suggestion}}"</i> - {{this.user?.name}}</li>
|
<li><a class="fa-regular fa-clipboard clipboard" style="padding-left:.5em;padding-right:.5em;" data-clipboard-text="{{titlecase this.title}}"></a><i>"{{titlecase this.title}}"</i> - {{this.userName}}</li>
|
||||||
{{~/each~}}</ul>
|
{{~/each~}}</ul><a class="fa-regular fa-clipboard clipboard" style="padding-left:.5em;padding-right:.5em;" data-clipboard-text="{{#each messages}}- _"{{titlecase this.title}}"_ - {{this.userName}} {{/each}}"></a> Copy All
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
<i class="fa-solid fa-podcast"></i> title suggestions ({{date}}):
|
<i class="fa-solid fa-podcast"></i> {{localize "SESSION_TITLE_SUGGESTIONS.SUGGESTION_LIST_FLAVOR"}} ({{date}}):
|
||||||
Reference in New Issue
Block a user