quick units, add kelvin support

This commit is contained in:
bignutty 2024-08-28 21:14:36 +02:00
parent f910be7ab7
commit 9eeb7f2721
3 changed files with 46 additions and 17 deletions

View file

@ -11,12 +11,14 @@ const { ApplicationCommandOptionTypes } = require('detritus-client/lib/constants
const modifiers = { const modifiers = {
"°C": (i)=>i, "°C": (i)=>i,
"°F": (i)=>(i*(9/5))+32 "°F": (i)=>(i*(9/5))+32,
"K": (i)=>i+273.15
} }
const unitNames = { const unitNames = {
"°C": "Celcius", "°C": "Celcius",
"°F": "Fahrenheit" "°F": "Fahrenheit",
"K": "Kelvin"
} }
function temperature(value, units){ function temperature(value, units){
@ -54,7 +56,7 @@ function renderWeatherCard(context, data, units){
if(data.result.warnings.length >= 1){ if(data.result.warnings.length >= 1){
for(const w of [data.result.warnings[0]]){ for(const w of [data.result.warnings[0]]){
if(description.includes(stringwrap(w.label, 50))) continue; if(description.includes(stringwrap(w.label, 50))) continue;
description += `\n\n${icon("weather_warning_" + (w.icon || "generic").toLowerCase())} **${stringwrap(w.label, 50)}**\n-# ${stringwrap(w.source, 50)}${link(w.url, "Learn More", "Learn more about this alert")}` description += `\n\n${icon("weather_warning_" + (w.icon || "generic").toLowerCase())} **${stringwrap(w.label, 50)}**\n-# ${stringwrap(w.source, 50)} • ${link(w.url, "Learn More", "Learn more about this alert")}`
} }
} }
@ -118,6 +120,10 @@ module.exports = {
{ {
value: "fahrenheit", value: "fahrenheit",
name: "Fahrenheit" name: "Fahrenheit"
},
{
value: "kelvin",
name: "Kelvin"
} }
], ],
required: false required: false
@ -139,11 +145,15 @@ module.exports = {
data = data.response.body data = data.response.body
let units = ["°C", "°F"] let units = ["°C", "°F"]
if(args.units) if(["f","fahrenheit","°f"].includes(args.units.toLowerCase())) units = ["°F", "°C"] if(args.units){
if(args.units == "fahrenheit") units = ["°F"]
else if (args.units == "kelvin") units = ["K"]
}
let pages = [] let pages = []
pages.push(page(renderWeatherCard(context, data, units[0]))) for(const u of units) pages.push(page(renderWeatherCard(context, data, u)))
pages.push(page(renderWeatherCard(context, data, units[1])))
if(pages.length == 1) return editOrReply(context, pages[0])
await paginator.createPaginator({ await paginator.createPaginator({
context, context,

View file

@ -2,7 +2,7 @@ const { paginator } = require('#client');
const { createEmbed, page, formatPaginationEmbeds } = require("#utils/embed"); const { createEmbed, page, formatPaginationEmbeds } = require("#utils/embed");
const { guildFeaturesField } = require("#utils/fields"); const { guildFeaturesField } = require("#utils/fields");
const { icon, highlight, timestamp, codeblock, iconPill, smallIconPill } = require("#utils/markdown"); const { icon, highlight, timestamp, codeblock, smallIconPill } = require("#utils/markdown");
const { editOrReply } = require("#utils/message"); const { editOrReply } = require("#utils/message");
// TODO: Turn this into a general purpose permissions constant // TODO: Turn this into a general purpose permissions constant

View file

@ -11,12 +11,14 @@ const { Permissions } = require("detritus-client/lib/constants");
const modifiers = { const modifiers = {
"°C": (i)=>i, "°C": (i)=>i,
"°F": (i)=>(i*(9/5))+32 "°F": (i)=>(i*(9/5))+32,
"K": (i)=>i+273.15
} }
const unitNames = { const unitNames = {
"°C": "Celcius", "°C": "Celcius",
"°F": "Fahrenheit" "°F": "Fahrenheit",
"K": "Kelvin"
} }
function temperature(value, units){ function temperature(value, units){
@ -54,7 +56,7 @@ function renderWeatherCard(context, data, units){
if(data.result.warnings.length >= 1){ if(data.result.warnings.length >= 1){
for(const w of [data.result.warnings[0]]){ for(const w of [data.result.warnings[0]]){
if(description.includes(stringwrap(w.label, 50))) continue; if(description.includes(stringwrap(w.label, 50))) continue;
description += `\n\n${icon("weather_warning_" + (w.icon || "generic").toLowerCase())} **${stringwrap(w.label, 50)}**\n-# ${stringwrap(w.source, 50)}${link(w.url, "Learn More", "Learn more about this alert")}` description += `\n\n${icon("weather_warning_" + (w.icon || "generic").toLowerCase())} **${stringwrap(w.label, 50)}**\n-# ${stringwrap(w.source, 50)} • ${link(w.url, "Learn More", "Learn more about this alert")}`
} }
} }
@ -88,6 +90,15 @@ function renderWeatherCard(context, data, units){
return e; return e;
} }
let quickUnits = [
{ value: "-f", units: "°F" },
{ value: "-c", units: "°C" },
{ value: "-k", units: "K" },
{ value: "-fahrenheit", units: "°F" },
{ value: "-celcius", units: "°C" },
{ value: "-kelvin", units: "K" }
]
module.exports = { module.exports = {
name: 'weather', name: 'weather',
aliases: ['forecast'], aliases: ['forecast'],
@ -95,9 +106,9 @@ module.exports = {
metadata: { metadata: {
description: 'Displays information about the weather.', description: 'Displays information about the weather.',
description_short: 'Local weather information', description_short: 'Local weather information',
examples: ['weather Otter, Germany -t f'], examples: ['weather Otter, Germany -t f','weather Mountain View -k'],
category: 'utils', category: 'utils',
usage: 'weather <location> [-t <c|f>', usage: 'weather <location> [-t <c|f> OR -c, -f, -k]',
slashCommand: "weather" slashCommand: "weather"
}, },
args: [ args: [
@ -108,17 +119,25 @@ module.exports = {
context.triggerTyping(); context.triggerTyping();
if(!args.query) return editOrReply(context, createEmbed("warning", context, `Missing Parameter (location).`)) if(!args.query) return editOrReply(context, createEmbed("warning", context, `Missing Parameter (location).`))
try{ try{
// Quick Units
let units = ["°C", "°F"]
if(["f","fahrenheit","°f"].includes(args.t.toLowerCase())) units = ["°F", "°C"]
for(const u of quickUnits){
if(args.query.endsWith(u.value)){
args.query = args.query.substr(0, args.query.length - 3)
units = [u.units]
}
}
let data = await darksky(context, args.query) let data = await darksky(context, args.query)
data = data.response.body data = data.response.body
let units = ["°C", "°F"]
if(["f","fahrenheit","°f"].includes(args.t.toLowerCase())) units = ["°F", "°C"]
let pages = [] let pages = []
pages.push(page(renderWeatherCard(context, data, units[0]))) for(const u of units) pages.push(page(renderWeatherCard(context, data, u)))
pages.push(page(renderWeatherCard(context, data, units[1])))
if(pages.length == 1) return editOrReply(context, pages[0])
await paginator.createPaginator({ await paginator.createPaginator({
context, context,
pages, pages,