4 Commits

5 changed files with 76 additions and 30 deletions

10
src/lang/en.json Normal file
View File

@@ -0,0 +1,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.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"
}

View File

@@ -7,13 +7,20 @@
"name": "lmxsdl" "name": "lmxsdl"
} }
], ],
"version": "0.1.2", "version": "0.2",
"compatibility": { "compatibility": {
"minimum": "10", "minimum": "10",
"verified": "11" "verified": "11"
}, },
"download": "https://gitea.ascorrea.com/asc/asc-session-title-suggestions/releases/download/0.1.2/asc-session-title-suggestions-0.1.2.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://gitea.ascorrea.com/asc/asc-session-title-suggestions/releases/download/0.2/module.zip",
"manifest": "https://gitea.ascorrea.com/asc/asc-session-title-suggestions/releases/download/latest/module.json",
"scripts": [ "scripts": [
"scripts/main.js" "scripts/main.js"
], ],

View File

@@ -24,12 +24,11 @@ function registerClipboardCopyButton() {
function registerCustomChatCommands() { function registerCustomChatCommands() {
game.chatCommands.unregister(NAME)
game.chatCommands.register({ game.chatCommands.register({
name: NAME, name: NAME,
module: "_chatcommands", module: "_chatcommands",
aliases: ["/t", "t/"], aliases: ["/t", "t/"],
description: "Suggest a title for this episode", description: game.i18n.localize("SESSION_TITLE_SUGGESTIONS.SUGGESTION_COMMAND_DESCRIPTION"),
icon: '<i class="fa-solid fa-podcast"></i>', icon: '<i class="fa-solid fa-podcast"></i>',
requiredRole: "NONE", requiredRole: "NONE",
callback: async (chat, parameters, messageData) => { callback: async (chat, parameters, messageData) => {
@@ -40,55 +39,85 @@ function registerCustomChatCommands() {
newMessageData.flags = {session_title_suggestion: titleSuggestion} newMessageData.flags = {session_title_suggestion: titleSuggestion}
return newMessageData; return newMessageData;
}, },
autocompleteCallback: (menu, alias, parameters) => [game.chatCommands.createInfoElement("Enter a message.")], autocompleteCallback: (menu, alias, parameters) => [
game.chatCommands.createInfoElement(game.i18n.localize("SESSION_TITLE_SUGGESTIONS.SUGGESTION_AUTOCOMPLETE_MESSAGE"))
],
closeOnComplete: true closeOnComplete: true
}); }, true);
game.chatCommands.unregister(NAME+"s")
game.chatCommands.register({ game.chatCommands.register({
name: NAME+"s", name: NAME+"s",
module: "_chatcommands", module: "_chatcommands",
aliases: ["/ts"], aliases: ["/ts"],
description: "List all titles for the most recent episode", description: game.i18n.localize("SESSION_TITLE_SUGGESTIONS.SUGGESTION_LIST_COMMAND_DESCRIPTION"),
icon: '<i class="fa-solid fa-podcast"></i>', icon: '<i class="fa-solid fa-podcast"></i>',
requiredRole: "TRUSTED", requiredRole: game.settings.get("asc-session-title-suggestions", "titleListCommandRole"),
callback: async (chat, parameters, messageData) => { callback: async (chat, parameters, messageData) => {
const newMessageData = {} const newMessageData = {}
const suggestions = game.messages.filter(m => { const suggestions = game.messages.filter(m => {
return m.flags.session_title_suggestion return m.flags.session_title_suggestion
}) })
let selected_message_date
const last_message_date = new Date(suggestions[suggestions.length-1].timestamp) if (!parameters) {
selected_message_date = new Date(suggestions[suggestions.length-1].timestamp)
} else {
const epoch_date = Date.parse(parameters)
if (Number.isNaN(epoch_date)){
ui.notifications.error(`${game.i18n.localize("SESSION_TITLE_SUGGESTIONS.INVALID_DATE")} (${parameter})`);
return;
}
selected_message_date = new Date(epoch_date)
}
const filtered_suggestions = suggestions.filter(m=>{ const filtered_suggestions = suggestions.filter(m=>{
const message_date = new Date(m.timestamp) const message_date = new Date(m.timestamp)
return message_date.toDateString() == last_message_date.toDateString() return message_date.toDateString() == selected_message_date.toDateString()
}) })
newMessageData.content = await renderTemplate(TEMPLATES.suggestionList.content, {messages:filtered_suggestions }) newMessageData.content = await renderTemplate(TEMPLATES.suggestionList.content, {messages:filtered_suggestions })
newMessageData.flavor = await renderTemplate(TEMPLATES.suggestionList.flavor, {date:last_message_date.toDateString()}) newMessageData.flavor = await renderTemplate(TEMPLATES.suggestionList.flavor, {date:selected_message_date.toDateString()})
return newMessageData; return newMessageData;
}, },
autocompleteCallback: (menu, alias, parameters) => [game.chatCommands.createInfoElement("Enter a message.")], autocompleteCallback: (menu, alias, parameters) => {
const suggestions = game.messages.filter(m => {
return m.flags.session_title_suggestion
})
const dates = new Set(
suggestions.map(s=>new Date(s.timestamp).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 closeOnComplete: true
}); }, true);
} }
console.log("Hello World! This code runs immediately when the file is loaded.");
Hooks.on("init", function() { Hooks.on("init", function() {
//This code runs once the Foundry VTT software begins its initialization workflow //This code runs once the Foundry VTT software begins its initialization workflow
registerCustomChatCommands();
registerClipboardCopyButton(); registerClipboardCopyButton();
loadTemplates(flavor_template_path) Object.values(TEMPLATES.suggestion).forEach((template_path)=>loadTemplates(template_path))
Object.values(TEMPLATES.suggestion).forEach((template_path)=>{ Object.values(TEMPLATES.suggestionList).forEach((template_path)=>loadTemplates(template_path))
loadTemplates(template_path) game.settings.register("asc-session-title-suggestions", "titleListCommandRole", {
} name: game.i18n.localize("SESSION_TITLE_SUGGESTIONS.SETTING_ROLE_NAME"),
) scope: "world",
Object.values(TEMPLATES.suggestionList).forEach((template_path)=>{ config: true,
loadTemplates(template_path) 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")
});
}); });
Hooks.on("ready", function() { Hooks.on("ready", function() {
//This code runs once core initialization is ready and game data is available. //This code runs once core initialization is ready and game data is available.
registerCustomChatCommands();
}); });

View File

@@ -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'}}...

View File

@@ -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}}):