Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
4dfa9b46cf
|
|||
|
34d426b617
|
|||
|
1187125335
|
|||
|
e92f2890e1
|
|||
|
e7282a4b88
|
|||
|
333a4ab04e
|
|||
|
413d3715c7
|
|||
|
400c1c16ef
|
|||
|
f321f956f7
|
|||
|
879056f539
|
|||
|
e86ef0a8f3
|
@@ -2,12 +2,16 @@
|
||||
|
||||
## 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. A GM or trusted player can use the `/titles` or `/ts` command to get a list of all the suggestions for the most recent day's session.
|
||||
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.
|
||||
- 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
|
||||
|
||||
|
||||
BIN
screenshot.png
Normal file
BIN
screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 198 KiB |
@@ -1,2 +1,4 @@
|
||||
git archive --format zip --output dist/module.zip master:src
|
||||
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/
|
||||
@@ -2,9 +2,10 @@
|
||||
"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,12 +4,14 @@
|
||||
"description": "A simple module that keeps track of session title suggestions",
|
||||
"authors": [
|
||||
{
|
||||
"name": "lmxsdl"
|
||||
"name": "anthonyscorrea",
|
||||
"url": "https://github.com/anthonyscorrea"
|
||||
}
|
||||
],
|
||||
"url": "https://github.com/anthonyscorrea/asc-session-title-suggestions",
|
||||
"compatibility": {
|
||||
"minimum": "11",
|
||||
"verified": ["11","12"]
|
||||
"minimum": "12",
|
||||
"verified": "14"
|
||||
},
|
||||
"languages": [
|
||||
{
|
||||
@@ -18,11 +20,11 @@
|
||||
"path": "lang/en.json"
|
||||
}
|
||||
],
|
||||
"download": "https://github.com/anthonyscorrea/asc-session-title-suggestions/releases/download/0.3.3/module.zip",
|
||||
"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.3.3",
|
||||
"version": "0.5.4",
|
||||
"scripts": [
|
||||
"scripts/main.js"
|
||||
"scripts/asc-session-title-suggestions.js"
|
||||
],
|
||||
"esmodules":[
|
||||
],
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
const MODULE_ID = "asc-session-title-suggestions"
|
||||
const NAME = "/title"
|
||||
|
||||
const template_path = "modules/asc-session-title-suggestions/templates"
|
||||
@@ -13,9 +14,30 @@ const TEMPLATES = {
|
||||
}
|
||||
}
|
||||
|
||||
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) => {
|
||||
const text=event.target.dataset.clipboardText;
|
||||
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)
|
||||
}
|
||||
@@ -36,7 +58,11 @@ function registerCustomChatCommands() {
|
||||
const newMessageData = {}
|
||||
newMessageData.content = await renderTemplate(TEMPLATES.suggestion.content, {content:titleSuggestion})
|
||||
newMessageData.flavor = await renderTemplate(TEMPLATES.suggestion.flavor)
|
||||
newMessageData.flags = {session_title_suggestion: titleSuggestion}
|
||||
newMessageData.flags = {
|
||||
[MODULE_ID]: {
|
||||
session_title_suggestion: titleSuggestion
|
||||
}
|
||||
}
|
||||
return newMessageData;
|
||||
},
|
||||
autocompleteCallback: (menu, alias, parameters) => [
|
||||
@@ -55,34 +81,38 @@ function registerCustomChatCommands() {
|
||||
callback: async (chat, parameters, messageData) => {
|
||||
const newMessageData = {}
|
||||
const suggestions = game.messages.filter(m => {
|
||||
return m.flags.session_title_suggestion
|
||||
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 = new Date(suggestions[suggestions.length-1].timestamp)
|
||||
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")} (${parameter})`);
|
||||
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 = new Date(m.timestamp)
|
||||
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 m.flags.session_title_suggestion
|
||||
return getSuggestionTitle(m)
|
||||
})
|
||||
const dates = new Set(
|
||||
suggestions.map(s=>new Date(s.timestamp).toDateString())
|
||||
suggestions.map(s=>getSuggestionDate(s).toDateString())
|
||||
)
|
||||
const entries = [...dates].map(date=>{
|
||||
return game.chatCommands.createCommandElement(`${alias} ${date}`, date)
|
||||
@@ -98,8 +128,10 @@ function registerCustomChatCommands() {
|
||||
Hooks.on("init", function() {
|
||||
//This code runs once the Foundry VTT software begins its initialization workflow
|
||||
registerClipboardCopyButton();
|
||||
Object.values(TEMPLATES.suggestion).forEach((template_path)=>loadTemplates(template_path))
|
||||
Object.values(TEMPLATES.suggestionList).forEach((template_path)=>loadTemplates(template_path))
|
||||
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",
|
||||
@@ -115,11 +147,11 @@ Hooks.on("init", function() {
|
||||
},
|
||||
hint: game.i18n.localize("SESSION_TITLE_SUGGESTIONS.SETTING_ROLE_HINT")
|
||||
});
|
||||
import ('https://cdn.jsdelivr.net/npm/title-case@4.3.1/dist/index.min.js')
|
||||
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,3 +1,3 @@
|
||||
<ul>{{~#each messages ~}}
|
||||
<li><a class="fa-regular fa-clipboard clipboard" style="padding-left:.5em;padding-right:.5em;" data-clipboard-text="{{titlecase this.flags.session_title_suggestion}}"></a><i>"{{titlecase this.flags.session_title_suggestion}}"</i> - {{this.user.name}}</li>
|
||||
{{~/each~}}</ul>
|
||||
<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><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
|
||||
|
||||
Reference in New Issue
Block a user