diff --git a/commands/misc/fm.js b/commands/misc/fm.js new file mode 100644 index 0000000..9b0d0f4 --- /dev/null +++ b/commands/misc/fm.js @@ -0,0 +1,25 @@ +const fmlogin = require("../../util/lastfm/fmlogin"); +const displayCurrentScrobble = require("../../util/lastfm/displayCurrentScrobble"); + +module.exports = { + name: 'fm', + description: 'Last fm commands. See `help fm` for more info.', + moreHelp: ["Set username: `fm set `",], + async execute({ message, args }) { + let sendText = "Something went wrong."; + switch (args[0]) { + case "help": + sendText = this.moreHelp; + break; + case "set": + sendText = await fmlogin(message.author.id, args[1]); + break; + default: + break; + } + if(args.length < 1){ + sendText = await displayCurrentScrobble(message.author.id); + } + message.channel.send(sendText); + } +}; \ No newline at end of file diff --git a/commands/misc/prefix.js b/commands/misc/prefix.js index 0e33320..19ec7d1 100644 --- a/commands/misc/prefix.js +++ b/commands/misc/prefix.js @@ -13,7 +13,7 @@ module.exports = { return; }else{ setServerPrefix(client, args[0], message.guild.id) - message.channel.send(`The prefix for this server is now set to ${args[0]}`) + message.channel.send(`The prefix for this server is now set to ${args[0]}\nIf for some reason you are unable to use the new prefix, you can mention the bot as a prefix instead`); } } }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 48c4709..472cee8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "UNLICENSE", "dependencies": { "@zuzak/owo": "^1.14.1", - "discord.js": "^14.4.0", + "discord.js": "^13.6.0", + "dotenv": "^16.4.5", "express": "^4.18.2", "mysql": "^2.18.1", "parse-ms": "^2.1.0", @@ -640,7 +641,30 @@ "ws": "8.14.2" }, "engines": { - "node": ">=16.11.0" + "node": ">=16.11.0", + "npm": ">=7.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/ee-first": { @@ -2691,6 +2715,16 @@ "ws": "8.14.2" } }, + "dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" + }, + "dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", diff --git a/package.json b/package.json index 9c90a0d..9ff0f19 100644 --- a/package.json +++ b/package.json @@ -1,26 +1,27 @@ -{ - "name": "discord_bot", - "version": "1.0.0", - "description": "My second attempt at making a bot in javascript", - "main": "server.js", - "dependencies": { - "@zuzak/owo": "^1.14.1", - "discord.js": "^14.4.0", - "express": "^4.18.2", - "mysql": "^2.18.1", - "parse-ms": "^2.1.0", - "prompt-sync": "^4.2.0", - "seedrandom": "^3.0.5", - "sqlite3": "^5.1.6", - "valid-url": "^1.0.9" - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/SileNce5k/discord_bot.git" - }, - "author": "SileNce5k", - "license": "UNLICENSE" -} +{ + "name": "discord_bot", + "version": "1.0.0", + "description": "My second attempt at making a bot in javascript", + "main": "server.js", + "dependencies": { + "@zuzak/owo": "^1.14.1", + "discord.js": "^14.4.0", + "dotenv": "^16.4.5", + "express": "^4.18.2", + "mysql": "^2.18.1", + "parse-ms": "^2.1.0", + "prompt-sync": "^4.2.0", + "seedrandom": "^3.0.5", + "sqlite3": "^5.1.6", + "valid-url": "^1.0.9" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/SileNce5k/discord_bot.git" + }, + "author": "SileNce5k", + "license": "UNLICENSE" +} diff --git a/server.js b/server.js index 7d9e8af..64dde7d 100644 --- a/server.js +++ b/server.js @@ -17,6 +17,8 @@ async function checkAndConvertJSONToSQL(){ } } const createDatabaseTables = require('./server/createDatabaseTables'); +const createLastfmTable = require('./server/createLastfmTable'); +createLastfmTable(); checkAndConvertJSONToSQL(); const { Collection, Client, GatewayIntentBits, Partials } = require('discord.js'); const client = new Client({ intents: [GatewayIntentBits.Guilds ,GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent], partials: [Partials.Channel] }); diff --git a/server/createLastfmTable.js b/server/createLastfmTable.js new file mode 100644 index 0000000..6b3c71b --- /dev/null +++ b/server/createLastfmTable.js @@ -0,0 +1,21 @@ +const sqlite3 = require('sqlite3').verbose(); +module.exports = async function () { + const db = new sqlite3.Database('data/database.db'); + return new Promise ((resolve, reject)=>{ + db.run( + `CREATE TABLE IF NOT EXISTS lastfm ( + userID INTEGER PRIMARY KEY, + lastfmUsername TEXT)`, + (err) => { + if (err) { + console.error(`Error while creating table 'lastfm': ${err}`); + reject(err); + } else { + console.log("Table 'lastfm' created successfully."); + resolve(); + } + db.close(); + } + ); + }) +} \ No newline at end of file diff --git a/server/message.js b/server/message.js index 0740a41..5065a5f 100644 --- a/server/message.js +++ b/server/message.js @@ -7,7 +7,10 @@ module.exports = function(client, owners, message, globalPrefix){ if (serverPrefix) { prefix = serverPrefix; } - + if(message.content.startsWith(`<@${client.user.id}>`)){ + let regex = new RegExp("(<@" + client.user.id + ">) *") + message.content = message.content.replace(regex, prefix); + } let args = message.content.slice(prefix.length).split(" ") const commandName = args.shift().toLowerCase(); diff --git a/util/lastfm/displayCurrentScrobble.js b/util/lastfm/displayCurrentScrobble.js new file mode 100644 index 0000000..456a512 --- /dev/null +++ b/util/lastfm/displayCurrentScrobble.js @@ -0,0 +1,48 @@ +require("dotenv").config(); +module.exports = async function(userID) { + let sendText = ""; + let scrobble = {}; + const apiKey = process.env.LAST_FM_API_KEY; + let lastfmUsername = await new Promise((resolve, reject)=>{ + const sqlite3 = require('sqlite3').verbose(); + const db = new sqlite3.Database('data/database.db'); + db.get( + `SELECT * FROM lastfm WHERE userID = ?`, + [userID], + (error, row) => { + if (error) { + console.error(error); + reject(error); + } else { + if (row == undefined) { + resolve(undefined); + } + resolve(row.lastfmUsername); + } + db.close(); + } + ); + }); + if(lastfmUsername != undefined){ + scrobble = await new Promise ((resolve, reject) => { + fetch(`https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=${lastfmUsername}&api_key=${apiKey}&format=json`) + .then(response => response.json()) + .then(data => { + let scrobble = {}; + let track = data.recenttracks.track[0]; + scrobble.artist = track.artist["#text"]; + scrobble.song = track.name; + scrobble.album = track.album["#text"]; + resolve(scrobble); + }) + .catch(error => { + console.error(error); + reject(error); + }); + }); + sendText = `Currently scrobbling:\n${scrobble.artist} - ${scrobble.song}\nAlbum: ${scrobble.album}`; + } else { + sendText = "You haven't set your last.fm username yet. Use `fm set ` to set it."; + } + return sendText; +} \ No newline at end of file diff --git a/util/lastfm/fmlogin.js b/util/lastfm/fmlogin.js new file mode 100644 index 0000000..9700bb4 --- /dev/null +++ b/util/lastfm/fmlogin.js @@ -0,0 +1,65 @@ +const sqlite3 = require('sqlite3').verbose(); +module.exports = async function(userID, lastfmUsername) { + let sendText = ""; + // If the user already has a last.fm username set, just update it. + let entryExists = await new Promise((resolve, reject)=>{ + const db = new sqlite3.Database('data/database.db'); + db.get( + `SELECT * FROM lastfm WHERE userID = ?`, + [userID], + (error, row) => { + if (error) { + console.error(error); + reject(error); + } else { + resolve(row); + } + db.close(); + } + ); + }); + if (!entryExists) { + + sendText = await new Promise((resolve, reject)=>{ + const db = new sqlite3.Database('data/database.db'); + + db.run( + `INSERT INTO lastfm (userID, lastfmUsername) VALUES (?, ?)`, + [userID, lastfmUsername], + function (error) { + if (error) { + console.error(error); + let sendText = "Error while adding last.fm username. Check console."; + reject(sendText); + } else { + let sendText = `Your last.fm username has been set to '${lastfmUsername}'.`; + console.log(sendText); + resolve(sendText); + } + db.close(); + } + ); + }); + }else { + sendText = await new Promise((resolve, reject)=>{ + const db = new sqlite3.Database('data/database.db'); + db.run( + `UPDATE lastfm SET lastfmUsername = ? WHERE userID = ?`, + [lastfmUsername, userID], + function (error) { + if (error) { + console.error(error); + let sendText = "Error while updating last.fm username. Check console."; + reject(sendText); + } else { + let sendText = `Your last.fm username has been updated to '${lastfmUsername}'.`; + console.log(sendText); + resolve(sendText); + } + db.close(); + } + ); + }); + } + return sendText; +} \ No newline at end of file diff --git a/util/timer/sendTimerReminder.js b/util/timer/sendTimerReminder.js index 717c0d4..2f571d2 100644 --- a/util/timer/sendTimerReminder.js +++ b/util/timer/sendTimerReminder.js @@ -1,3 +1,3 @@ module.exports = function (client, timer) { - client.channels.cache.get(timer.channel).send(`<@${timer.user}>, ${timer.customMessage}`); + client.channels.cache.get(timer.channel).send(`<@${timer.user}>, your timer (ID: ${timer.ID}) is up!\nCustom message:\n"${timer.customMessage}"`); } \ No newline at end of file