diff --git a/commands/message/search/weather.js b/commands/message/search/weather.js deleted file mode 100644 index 9eba05b..0000000 --- a/commands/message/search/weather.js +++ /dev/null @@ -1,60 +0,0 @@ -const { createEmbed } = require('../../../labscore/utils/embed') -const { editOrReply } = require('../../../labscore/utils/message') -const { STATICS } = require('../../../labscore/utils/statics') - -const { weather } = require('../../../labscore/api'); -const { pill, icon } = require('../../../labscore/utils/markdown'); - -const { Permissions } = require("detritus-client/lib/constants"); - -module.exports = { - name: 'weather', - aliases: ['forecast'], - label: 'query', - metadata: { - description: 'Displays information about the weather.', - description_short: 'Local weather information', - examples: ['weather Otter, Germany'], - category: 'search', - usage: 'weather ' - }, - permissionsClient: [Permissions.EMBED_LINKS, Permissions.SEND_MESSAGES, Permissions.USE_EXTERNAL_EMOJIS, Permissions.READ_MESSAGE_HISTORY], - run: async (context, args) => { - context.triggerTyping(); - if(!args.query) return editOrReply(context, {embeds:[createEmbed("warning", context, `Missing Parameter (location).`)]}) - try{ - let data = await weather(context, args.query) - - data = data.response.body - - let e = createEmbed("default", context, { - description: `**${data.name}** ${pill(data.temperature.celcius.main)} ${pill(data.temperature.fahrenheit.main)}\n*${data.display.name}, ${data.display.description}*`, - fields: [{ - name: `${icon("upvote")} Maximum Temperature`, - value: `${pill(data.temperature.celcius.max)} ${pill(data.temperature.fahrenheit.max)}\n\n${icon("downvote")} **Minimum Temperature**\n${pill(data.temperature.celcius.min)} ${pill(data.temperature.fahrenheit.min)}`, - inline: true - },{ - name: `Humidity`, - value: `${pill(data.misc.humidity)}\n\n**Felt Temperature**\n${pill(data.temperature.celcius.feels_like)} ${pill(data.temperature.fahrenheit.feels_like)}`, - inline: true - },{ - name: `Wind Speed`, - value: `${pill(data.wind.speed)}\n\n**Wind Direction**\n${pill(data.wind.degree + '°')}`, - inline: false - }], - thumbnail: { - url: data.display.icon - }, - footer: { - iconUrl: STATICS.openweathermap, - text: `OpenWeatherMap • ${context.application.name}` - } - }) - - return editOrReply(context, {embeds: [e]}) - }catch(e){ - console.log(e) - return editOrReply(context, {embeds:[createEmbed("warning", context, `No weather data available for given location.`)]}) - } - }, -}; \ No newline at end of file diff --git a/commands/message/utils/weather.js b/commands/message/utils/weather.js new file mode 100644 index 0000000..9de33bf --- /dev/null +++ b/commands/message/utils/weather.js @@ -0,0 +1,58 @@ +const { createEmbed } = require('../../../labscore/utils/embed') +const { editOrReply } = require('../../../labscore/utils/message') + +const { darksky } = require('../../../labscore/api'); +const { pill, iconPill, smallIconPill, smallPill, icon } = require('../../../labscore/utils/markdown'); + +const { Permissions } = require("detritus-client/lib/constants"); + +module.exports = { + name: 'weather', + aliases: ['forecast'], + label: 'query', + metadata: { + description: 'Displays information about the weather.', + description_short: 'Local weather information', + examples: ['weather Otter, Germany'], + category: 'utils', + usage: 'weather ' + }, + permissionsClient: [Permissions.EMBED_LINKS, Permissions.SEND_MESSAGES, Permissions.USE_EXTERNAL_EMOJIS, Permissions.READ_MESSAGE_HISTORY], + run: async (context, args) => { + context.triggerTyping(); + if(!args.query) return editOrReply(context, {embeds:[createEmbed("warning", context, `Missing Parameter (location).`)]}) + try{ + let data = await darksky(context, args.query) + + data = data.response.body + + let description = `### ${data.result.location} • ${data.result.current.condition}\n${iconPill("thermometer", data.result.current.temperature.current + "°C")} ​ ​ ​ ​ ${pill("Wind")} ${smallPill(data.result.current.wind.speed + " km/h")}` + + let secondaryPills = []; + if(data.result.current.humidity > 0) secondaryPills.push(`${pill("Humidity")} ${smallPill(data.result.current.humidity)}`) + if(data.result.current.uvindex > 0) secondaryPills.push(`${pill("UV Index")} ${smallPill(data.result.current.uvindex)}`) + + if(secondaryPills.length >= 1) description += '\n' + secondaryPills.join(` ​ ​ ​ ​ `) + + // Render Forecasts + description += `\n` + for(const i of data.result.forecast){ + description += `\n${pill(i.day)} ​ ​ ${smallPill(i.condition)} ${icon("thermometer")} Between ${smallPill(i.temperature.min + "°C")} and ${smallPill(i.temperature.max + "°C")} ` + } + + + let e = createEmbed("default", context, { + description, + thumbnail: { + url: data.result.current.icon + }, + timestamp: new Date(data.result.current.date) + }) + + return editOrReply(context, {embeds: [e]}) + }catch(e){ + console.log(e) + return editOrReply(context, {embeds:[createEmbed("warning", context, `No weather data available for given location.`)]}) + } + }, +}; \ No newline at end of file diff --git a/labscore/api/index.js b/labscore/api/index.js index 8a4be71..e4eb74f 100644 --- a/labscore/api/index.js +++ b/labscore/api/index.js @@ -176,6 +176,12 @@ module.exports.weather = async function(context, location){ }) } +module.exports.darksky = async function(context, location){ + return await request(Api.UTILS_WEATHER, "GET", {}, { + location: location + }) +} + module.exports.wikihow = async function(context, query){ return await request(Api.SEARCH_WIKIHOW, "GET", {}, { q: query diff --git a/labscore/constants.js b/labscore/constants.js index 21a5278..8cd3250 100644 --- a/labscore/constants.js +++ b/labscore/constants.js @@ -191,6 +191,7 @@ module.exports.REDESIGN_ICONS = Object.freeze({ "generative_ai": "<:ico_generative_ai:1165258096227135498>", "latency": "<:ico_latency:1165258097338630235>", + "thermometer": "<:ico_thermometer:1167576335133200414>", "exclaim_0": "<:ico_exclaim_0:1165263543583649842>", "exclaim_1": "<:ico_exclaim_1:1165263545747914853>",