migrate from pg to sequelize

This commit is contained in:
Rene Kievits
2024-09-14 02:20:30 +02:00
parent 5ed26bd488
commit 9fd47761b0
26 changed files with 1205 additions and 745 deletions

3
.gitignore vendored
View File

@@ -1,3 +1,6 @@
.env
node_modules/
package-lock.json
src/database/config/
src/database/migrations/
src/database/seeders/

59
eslint.config.mjs Normal file
View File

@@ -0,0 +1,59 @@
import globals from 'globals'
import pluginJs from '@eslint/js'
export default [
{
files: ['eslint.config.mjs'],
languageOptions: {
sourceType: 'module',
ecmaVersion: 2021,
},
rules: {
'semi': ['error', 'never'],
'quotes': ['error', 'single'],
'indent': ['error', 2],
'linebreak-style': ['error', 'unix'],
'comma-dangle': ['error', 'always-multiline'],
'no-unused-vars': ['error', {
vars: 'all',
args: 'after-used',
ignoreRestSiblings: true,
caughtErrors: 'none',
argsIgnorePattern: '_',
}],
},
},
{
files: ['**/*.js'],
languageOptions: {
sourceType: 'commonjs',
ecmaVersion: 2021,
},
rules: {
'semi': ['error', 'never'],
'quotes': ['error', 'single'],
'indent': ['error', 2],
'linebreak-style': ['error', 'unix'],
'comma-dangle': ['error', {
arrays: 'always-multiline',
objects: 'always-multiline',
imports: 'always-multiline',
exports: 'always-multiline',
functions: 'never',
}],
'no-unused-vars': ['error', {
vars: 'all',
args: 'after-used',
ignoreRestSiblings: true,
caughtErrors: 'none',
argsIgnorePattern: '_',
}],
},
},
{
languageOptions: {
globals: globals.browser,
},
},
pluginJs.configs.recommended,
]

View File

@@ -9,5 +9,12 @@
},
"scripts": {
"test": "jest"
},
"devDependencies": {
"@eslint/js": "^9.10.0",
"eslint": "^9.10.0",
"globals": "^15.9.0",
"sequelize-auto": "^0.8.8",
"sequelize-cli": "^6.6.2"
}
}

View File

@@ -1,51 +1,50 @@
const { getClient } = require('./database')
const {
birthday: Birthday,
discorduser: DiscordUser,
} = require('./models')
const CreateBirthday = async (user, birthday) => {
const CreateBirthday = async (userName, birthdayDate) => {
try {
const client = getClient()
const userResult = await client.query(`
SELECT * FROM discorduser
WHERE name = $1;`,
[user]
)
const [user, _] = await DiscordUser.findOrCreate({
where: { name: userName },
defaults: { name: userName },
})
if (userResult.rows.length === 0) {
await client.query(`
INSERT INTO discorduser (name)
VALUES ($1);`,
[user]
)
}
const formattedBirthday = new Date(
birthdayDate.split('.').reverse().join('-')
).toISOString().slice(0, 10)
const res = await client.query(`
INSERT INTO birthday (date, discorduser)
VALUES ($1, $2);`,
[new Date(birthday.split('.').reverse().join('-')).toISOString().slice(0, 10), user]
)
const birthday = await Birthday.create({
date: formattedBirthday,
discorduser: user.name,
})
return res.rowCount > 0
return birthday !== null
} catch (error) {
console.error('Error creating birthday entry:', error)
return false
}
}
const ReadBirthday = async (user) => {
const ReadBirthday = async (userName) => {
try {
const client = getClient()
if (userName) {
const user = await DiscordUser.findOne({
where: {
name: userName,
},
})
if (user) {
const res = await client.query(`
SELECT * FROM birthday
WHERE discorduser = $1;`,
[user]
)
return res.rows
const birthdays = await Birthday.findAll({
where: {
discorduser: user.name,
},
})
return birthdays
} else return []
} else {
const res = await client.query(`
SELECT * FROM birthday`,
)
return res.rows
const birthdays = await Birthday.findAll()
return birthdays
}
} catch (error) {
console.error('Error reading birthday table:', error)
@@ -53,39 +52,51 @@ const ReadBirthday = async (user) => {
}
}
const UpdateBirthday = async (user, birthday) => {
const UpdateBirthday = async (userName, birthdayDate) => {
try {
const client = getClient()
const user = await DiscordUser.findOne({
where: {
name: userName,
},
})
if (!birthday) return false
await client.query(`
UPDATE birthday
SET birthday = $2
WHERE discorduser = $1;`,
[user, birthday]
if (user) {
const [updated] = await Birthday.update(
{
date: new Date(
birthdayDate.split('.').reverse().join('-')
).toISOString().slice(0, 10),
},
{
where: {
discorduser: user.name,
},
}
)
return true
return updated > 0
} else return false
} catch (error) {
console.error('Error updating birthday table:', error)
return false
}
}
const DeleteBirthday = async (user) => {
const DeleteBirthday = async (userName) => {
try {
const client = getClient()
const user = await DiscordUser.findOne({
where: {
name: userName,
},
})
if (!user) return false
await client.query(`
DELETE FROM birthday
WHERE discorduser = $1;`,
[user]
)
return true
if (user) {
const deleted = await Birthday.destroy({
where: {
discorduser: user.name,
},
})
return deleted > 0
} else return false
} catch (error) {
console.error('Error deleting birthday table:', error)
return false

View File

@@ -1,55 +1,52 @@
const { getClient } = require('./database')
const {
blacklist: Blacklist,
discorduser: DiscordUser,
} = require('./models')
const CreateBlacklist = async (reportedUser, reason, reportedByUser) => {
try {
const client = getClient()
const existingBlacklist = await Blacklist.findOne({
where: {
name: reportedUser,
},
})
const alreadyReportedResult = await client.query(
"SELECT name FROM blacklist WHERE name = $1",
[reportedUser]
)
if (existingBlacklist) return existingBlacklist
if (alreadyReportedResult.rows.length === 1)
return alreadyReportedResult.rows[0]
const [reportingUser] = await DiscordUser.findOrCreate({
where: {
name: reportedByUser,
},
defaults: {
name: reportedByUser,
},
})
const userResult = await client.query(
"SELECT * FROM discorduser WHERE name = $1",
[reportedByUser]
)
const blacklistEntry = await Blacklist.create({
name: reportedUser,
reason,
reportedby: reportingUser.name,
})
if (userResult.rows.length === 0)
await client.query(
"INSERT INTO discorduser (name) VALUES ($1)",
[reportedByUser]
)
await client.query(
"INSERT INTO blacklist (name, reason, reportedby) VALUES ($1, $2, $3)",
[reportedUser, reason, reportedByUser]
)
return true
return blacklistEntry !== null
} catch (error) {
console.error('Error creating blacklist entry:', error)
return false
}
}
const ReadBlacklist = async (user) => {
const ReadBlacklist = async (userName) => {
try {
const client = getClient()
if (user) {
const res = await client.query(
"SELECT * FROM blacklist WHERE name=$1",
[user]
)
return res.rows[0] || false
if (userName) {
const blacklistEntry = await Blacklist.findOne({
where: {
name: userName,
},
})
return blacklistEntry || false
} else {
const res = await client.query(
"SELECT * FROM blacklist"
)
return res.rows
const allBlacklistEntries = await Blacklist.findAll()
return allBlacklistEntries
}
} catch (error) {
console.error('Error reading blacklist table:', error)
@@ -59,32 +56,35 @@ const ReadBlacklist = async (user) => {
const UpdateBlacklist = async (reportedUser, reason) => {
try {
const client = getClient()
if (!reportedUser) return false
await client.query(
"UPDATE blacklist SET reason = $2 WHERE name = $1",
[reportedUser, reason]
const [updated] = await Blacklist.update(
{ reason },
{
where: {
name: reportedUser,
},
}
)
return true
return updated > 0
} catch (error) {
console.error('Error updating blacklist table:', error)
return false
}
}
const DeleteBlacklist = async (user) => {
const DeleteBlacklist = async (userName) => {
try {
const client = getClient()
if (!userName) return false
if (!user) return false
const deleted = await Blacklist.destroy({
where: {
name: userName,
},
})
await client.query(
"DELETE FROM blacklist WHERE name = $1",
[user]
)
return true
return deleted > 0
} catch (error) {
console.error('Error deleting blacklist table:', error)
return false

View File

@@ -1,32 +0,0 @@
const { Client } = require('pg')
let client = null
const createClient = (config) => {
client = new Client(config);
return client;
};
const connectDatabase = async (client) => {
try {
await client.connect()
console.log('Database connected')
} catch (error) {
console.error('Database connection error:', error)
throw new Error('Connection failed');
}
}
const getClient = () => {
if (!client) {
throw new Error('Client has not been initialized. Call createClient first.');
}
return client;
};
module.exports = {
createClient,
connectDatabase,
getClient,
}

View File

@@ -1,13 +1,13 @@
const { getClient } = require('./database')
const {
event_schedule: EventTimes,
event_role_view: EventRoleView,
event_roles: EventRoles,
} = require('./models')
const ReadEvents = async () => {
try {
const client = getClient()
const res = await client.query(
"SELECT * FROM event_times"
)
return res.rows
const events = await EventTimes.findAll()
return events
} catch (error) {
console.error('Error reading event entries:', error)
return false
@@ -16,34 +16,30 @@ const ReadEvents = async () => {
const GetEventRole = async () => {
try {
const client = getClient()
const res = await client.query(
"SELECT * FROM event_role_view"
)
const eventRoles = await EventRoleView.findAll()
const rolesEventMap = new Map()
res.rows.forEach(row => rolesEventMap.set(row.event_name, row.role))
eventRoles.forEach(row => rolesEventMap.set(row.event_name, row.role))
return rolesEventMap
} catch (error) {
console.error(error)
console.error('Error fetching event roles:', error)
return false
}
}
const GetIconRole = async () => {
try {
const client = getClient()
const eventIcons = await EventRoles.findAll({
attributes: ['role', 'icon_name'],
})
const rolesIconMap = new Map()
const res = await client.query(
"SELECT role, icon_name FROM event_roles"
)
const rolesEventMap = new Map()
res.rows.forEach(row => rolesEventMap.set(row.icon_name, row.role))
eventIcons.forEach(row => rolesIconMap.set(row.icon_name, row.role))
return rolesEventMap
return rolesIconMap
} catch (error) {
console.error(error)
console.error('Error fetching icon roles:', error)
return false
}
}

View File

@@ -0,0 +1,37 @@
const Sequelize = require('sequelize')
module.exports = function(sequelize, DataTypes) {
return sequelize.define('birthday', {
id: {
autoIncrement: true,
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
},
date: {
type: DataTypes.DATEONLY,
allowNull: false,
},
discorduser: {
type: DataTypes.STRING(100),
allowNull: false,
references: {
model: 'discorduser',
key: 'name',
},
},
}, {
sequelize,
tableName: 'birthday',
schema: 'public',
timestamps: false,
indexes: [
{
name: 'birthday_pkey',
unique: true,
fields: [
{ name: 'id' },
],
},
],
})
}

View File

@@ -0,0 +1,36 @@
const Sequelize = require('sequelize')
module.exports = function(sequelize, DataTypes) {
return sequelize.define('blacklist', {
name: {
type: DataTypes.STRING(100),
allowNull: false,
primaryKey: true,
},
reason: {
type: DataTypes.TEXT,
allowNull: false,
},
reportedby: {
type: DataTypes.STRING(100),
allowNull: true,
references: {
model: 'discorduser',
key: 'name',
},
},
}, {
sequelize,
tableName: 'blacklist',
schema: 'public',
timestamps: false,
indexes: [
{
name: 'blacklist_pkey',
unique: true,
fields: [
{ name: 'name' },
],
},
],
})
}

View File

@@ -0,0 +1,24 @@
const Sequelize = require('sequelize')
module.exports = function(sequelize, DataTypes) {
return sequelize.define('discorduser', {
name: {
type: DataTypes.STRING(100),
allowNull: false,
primaryKey: true,
},
}, {
sequelize,
tableName: 'discorduser',
schema: 'public',
timestamps: false,
indexes: [
{
name: 'discorduser_pkey',
unique: true,
fields: [
{ name: 'name' },
],
},
],
})
}

View File

@@ -0,0 +1,37 @@
const Sequelize = require('sequelize')
module.exports = function(sequelize, DataTypes) {
return sequelize.define('event', {
id: {
autoIncrement: true,
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
},
name: {
type: DataTypes.STRING(255),
allowNull: false,
unique: 'event_name_key',
},
}, {
sequelize,
tableName: 'event',
schema: 'public',
timestamps: false,
indexes: [
{
name: 'event_name_key',
unique: true,
fields: [
{ name: 'name' },
],
},
{
name: 'event_pkey',
unique: true,
fields: [
{ name: 'id' },
],
},
],
})
}

View File

@@ -0,0 +1,41 @@
const Sequelize = require('sequelize')
module.exports = function(sequelize, DataTypes) {
return sequelize.define('event_roles', {
event_id: {
type: DataTypes.INTEGER,
allowNull: true,
references: {
model: 'event',
key: 'id',
},
},
role: {
type: DataTypes.STRING(50),
allowNull: false,
},
icon_name: {
type: DataTypes.STRING(50),
allowNull: true,
},
role_id: {
autoIncrement: true,
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
},
}, {
sequelize,
tableName: 'event_roles',
schema: 'public',
timestamps: false,
indexes: [
{
name: 'event_roles_pkey',
unique: true,
fields: [
{ name: 'role_id' },
],
},
],
})
}

View File

@@ -0,0 +1,45 @@
const Sequelize = require('sequelize')
module.exports = function(sequelize, DataTypes) {
return sequelize.define('event_schedule', {
id: {
autoIncrement: true,
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
},
event_id: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: 'event',
key: 'id',
},
},
day_of_week: {
type: DataTypes.STRING(9),
allowNull: true,
},
start_time: {
type: DataTypes.TIME,
allowNull: true,
},
end_time: {
type: DataTypes.TIME,
allowNull: true,
},
}, {
sequelize,
tableName: 'event_schedule',
schema: 'public',
timestamps: false,
indexes: [
{
name: 'event_schedule_pkey',
unique: true,
fields: [
{ name: 'id' },
],
},
],
})
}

View File

@@ -0,0 +1,43 @@
'use strict'
const fs = require('fs')
const path = require('path')
const Sequelize = require('sequelize')
const process = require('process')
const basename = path.basename(__filename)
const env = process.env.NODE_ENV || 'development'
const config = require(__dirname + '/../config/config.json')[env]
const db = {}
let sequelize
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config)
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config)
}
fs
.readdirSync(__dirname)
.filter(file => {
return (
file.indexOf('.') !== 0 &&
file !== basename &&
file.slice(-3) === '.js' &&
file.indexOf('.test.js') === -1
)
})
.forEach(file => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes)
db[model.name] = model
})
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db)
}
})
db.sequelize = sequelize
db.Sequelize = Sequelize
module.exports = db

View File

@@ -0,0 +1,49 @@
var DataTypes = require('sequelize').DataTypes
var _birthday = require('./birthday')
var _blacklist = require('./blacklist')
var _discorduser = require('./discorduser')
var _event = require('./event')
var _event_roles = require('./event_roles')
var _event_schedule = require('./event_schedule')
var _static = require('./static')
var _static_members = require('./static_members')
function initModels(sequelize) {
var birthday = _birthday(sequelize, DataTypes)
var blacklist = _blacklist(sequelize, DataTypes)
var discorduser = _discorduser(sequelize, DataTypes)
var event = _event(sequelize, DataTypes)
var event_roles = _event_roles(sequelize, DataTypes)
var event_schedule = _event_schedule(sequelize, DataTypes)
var static = _static(sequelize, DataTypes)
var static_members = _static_members(sequelize, DataTypes)
discorduser.belongsToMany(static, { as: 'static_id_statics', through: static_members, foreignKey: 'username', otherKey: 'static_id' })
static.belongsToMany(discorduser, { as: 'username_discordusers', through: static_members, foreignKey: 'static_id', otherKey: 'username' })
birthday.belongsTo(discorduser, { as: 'discorduser_discorduser', foreignKey: 'discorduser'})
discorduser.hasMany(birthday, { as: 'birthdays', foreignKey: 'discorduser'})
blacklist.belongsTo(discorduser, { as: 'reportedby_discorduser', foreignKey: 'reportedby'})
discorduser.hasMany(blacklist, { as: 'blacklists', foreignKey: 'reportedby'})
static_members.belongsTo(discorduser, { as: 'username_discorduser', foreignKey: 'username'})
discorduser.hasMany(static_members, { as: 'static_members', foreignKey: 'username'})
event_roles.belongsTo(event, { as: 'event', foreignKey: 'event_id'})
event.hasMany(event_roles, { as: 'event_roles', foreignKey: 'event_id'})
event_schedule.belongsTo(event, { as: 'event', foreignKey: 'event_id'})
event.hasMany(event_schedule, { as: 'event_schedules', foreignKey: 'event_id'})
static_members.belongsTo(static, { as: 'static', foreignKey: 'static_id'})
static.hasMany(static_members, { as: 'static_members', foreignKey: 'static_id'})
return {
birthday,
blacklist,
discorduser,
event,
event_roles,
event_schedule,
static,
static_members,
}
}
module.exports = initModels
module.exports.initModels = initModels
module.exports.default = initModels

View File

@@ -0,0 +1,49 @@
const Sequelize = require('sequelize')
module.exports = function(sequelize, DataTypes) {
return sequelize.define('static', {
id: {
autoIncrement: true,
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
},
name: {
type: DataTypes.STRING(12),
allowNull: false,
unique: 'unique_name',
},
creator: {
type: DataTypes.STRING(255),
allowNull: false,
},
size: {
type: DataTypes.INTEGER,
allowNull: true,
},
time: {
type: DataTypes.DATE,
allowNull: true,
},
}, {
sequelize,
tableName: 'static',
schema: 'public',
timestamps: false,
indexes: [
{
name: 'static_pkey',
unique: true,
fields: [
{ name: 'id' },
],
},
{
name: 'unique_name',
unique: true,
fields: [
{ name: 'name' },
],
},
],
})
}

View File

@@ -0,0 +1,38 @@
const Sequelize = require('sequelize')
module.exports = function(sequelize, DataTypes) {
return sequelize.define('static_members', {
static_id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
references: {
model: 'static',
key: 'id',
},
},
username: {
type: DataTypes.STRING(100),
allowNull: false,
primaryKey: true,
references: {
model: 'discorduser',
key: 'name',
},
},
}, {
sequelize,
tableName: 'static_members',
schema: 'public',
timestamps: false,
indexes: [
{
name: 'static_members_pkey',
unique: true,
fields: [
{ name: 'static_id' },
{ name: 'username' },
],
},
],
})
}

View File

@@ -1,23 +1,37 @@
const { getClient } = require('./database')
const {
static: Static,
static_members: StaticMembers,
discorduser: DiscordUser,
} = require('./models')
const CreateStatic = async (name, creator, members, size) => {
try {
const client = getClient()
const staticEntry = await Static.create({
name,
creator,
size,
})
const result = await client.query(
"INSERT INTO static (name, creator, size) VALUES ($1, $2, $3) RETURNING id",
[name, creator, size]
const staticId = staticEntry.id
await Promise.all(
members.map(async member => {
const [user] = await DiscordUser.findOrCreate({
where: {
name: member,
},
defaults: {
name: member,
},
})
await StaticMembers.create({
static_id: staticId,
member: user.name,
})
})
)
const staticId = result.rows[0].id
for (const member of members) {
await client.query(
"INSERT INTO static_members (static_id, member) VALUES ($1, $2)",
[staticId, member]
)
}
return true
} catch (error) {
console.error('Error creating static entry:', error)
@@ -27,13 +41,10 @@ const CreateStatic = async (name, creator, members, size) => {
const ReadStatic = async (name) => {
try {
const client = getClient()
const res = await client.query(
"SELECT * FROM static WHERE name = $1",
[name]
)
return res.rows
const staticEntry = await Static.findOne({
where: { name },
})
return staticEntry || false
} catch (error) {
console.error('Error reading static entry:', error)
return false
@@ -42,12 +53,21 @@ const ReadStatic = async (name) => {
const DeleteStatic = async (name) => {
try {
const client = getClient()
const staticEntry = await Static.findOne({
where: { name },
})
await client.query(
"DELETE FROM static WHERE name = $1",
[name]
)
if (!staticEntry) return false
await StaticMembers.destroy({
where: {
static_id: staticEntry.id,
},
})
await staticEntry.destroy()
return true
} catch (error) {
console.error('Error deleting static entry:', error)
return false

View File

@@ -37,7 +37,7 @@ const client = new Client({
],
partials: [
Partials.Channel,
]
],
})
client.on('interactionCreate', async interaction => {
@@ -52,13 +52,13 @@ client.on('interactionCreate', async interaction => {
const res = await handleBlacklistAdd(reportedUser, reason, reportedByUser)
if (res) {
if (res.name === reportedUser)
interaction.reply({ content: `This user has already been reported`, ephemeral: true })
interaction.reply({ content: 'This user has already been reported', ephemeral: true })
else {
interaction.reply({ content: `Player ** ${reportedUser}** had been successfully reported for ${reason}`, ephemeral: true })
updateGlobalMessage(interaction)
}
} else
interaction.reply({ content: `ERROR trying to add the player to the blacklist, please contact @Crylia`, ephemeral: true })
interaction.reply({ content: 'ERROR trying to add the player to the blacklist, please contact @Crylia', ephemeral: true })
break
case 'blacklist-check-player':
@@ -102,18 +102,18 @@ client.on('interactionCreate', async interaction => {
await handleBirthdayUpdate(user, birthday) :
handleBirthdayAdd(user, birthday) ?
await interaction.reply({ content: `Set ${birthday} as your birthday.Everyone will be notified once the day arrives!`, ephemeral: true }) :
await interaction.reply({ content: `Something went wrong when setting / updating your birthday, please contact @crylia`, ephemeral: true })
await interaction.reply({ content: 'Something went wrong when setting / updating your birthday, please contact @crylia', ephemeral: true })
break
case 'birthday-check':
const birthdayCheck = await handleBirthdayCheck(interaction.user.username)
birthdayCheck ?
await interaction.reply({ content: `Your birthday is currently set to ${new Date(birthdayCheck[0].date).toLocaleDateString('de-DE')}.`, ephemeral: true }) :
await interaction.reply({ content: "You don't have a birthday set. Use the`birthday` command to set one.", ephemeral: true })
await interaction.reply({ content: 'You don\'t have a birthday set. Use the`birthday` command to set one.', ephemeral: true })
break
case 'birthday-delete':
await handleBirthdayDelete(interaction.user.username) ?
await interaction.reply({ content: "Your birthday has been deleted.", ephemeral: true }) :
await interaction.reply({ content: "You don't have a birthday set.", ephemeral: true })
await interaction.reply({ content: 'Your birthday has been deleted.', ephemeral: true }) :
await interaction.reply({ content: 'You don\'t have a birthday set.', ephemeral: true })
break
case 'static-create':
@@ -185,12 +185,12 @@ const connectDiscord = async () => {
option.setName('player')
.setDescription('The in-game name of the player')
.setRequired(true)
)
),
].map(command => command.toJSON())
await rest.put(
Routes.applicationCommands(process.env.CLIENT_ID),
{ body: commands },
{ body: commands }
)
console.log('Successfully reloaded application (/) commands.')
} catch (error) {

View File

@@ -1,5 +1,5 @@
const { GetIconRole } = require('../database/eventdb')
const cron = require('node-cron');
const cron = require('node-cron')
let reminderMessageID = null
let rolesMap = new Map()
@@ -20,7 +20,7 @@ const editReactionMessage = async (client) => {
const rolesChannel = (await guild.channels.fetch()).find(ch => ch.name === 'roles')
if (!rolesChannel) {
console.log("Channel not found")
console.log('Channel not found')
return
}
const message = await rolesChannel.messages.fetch(reminderMessageID)
@@ -28,7 +28,7 @@ const editReactionMessage = async (client) => {
const newRolesFromDB = await GetIconRole()
if (areMapsEqual(rolesMap, newRolesFromDB)) {
console.log(`No changes to the roles, quitting`)
console.log('No changes to the roles, quitting')
return
}
@@ -82,8 +82,8 @@ const editReactionMessage = async (client) => {
const roleToRemove = message.guild.roles.cache.find(r => r.name === role.name)
if (!roleToRemove) continue
const members = await message.guild.members.fetch();
const membersWithRole = members.filter(member => member.roles.cache.has(roleToRemove.id));
const members = await message.guild.members.fetch()
const membersWithRole = members.filter(member => member.roles.cache.has(roleToRemove.id))
for (const member of membersWithRole.values())
await member.roles.remove(roleToRemove)
@@ -101,7 +101,7 @@ const createReactionMessage = async (client) => {
const rolesChannel = (await guild.channels.fetch()).find(ch => ch.name === 'roles')
if (!rolesChannel) {
console.log("Channel not found")
console.log('Channel not found')
return
}

View File

@@ -9,7 +9,7 @@ const handleStaticAdd = async (name, creator, members, size) => {
}
const handleStaticGet = async (name) => {
if (!name) return false;
if (!name) return false
const result = await ReadStatic(name)

View File

@@ -1,16 +1,13 @@
const { Sequelize } = require('sequelize')
const { connectDiscord } = require('./discord/discordClient')
const { connectDatabase, createClient } = require('./database/database');
require('dotenv').config();
(async () => {
try {
const client = createClient({
connectionString: `postgresql://${process.env.DB_USER}:${process.env.DB_PASS}@${process.env.DB_HOST}/${process.env.DB_NAME}`
})
connectDatabase(client).then(() => {
connectDiscord()
})
} catch (error) {
console.log(error)
console.error('Error initializing application:', error)
}
})()

View File

@@ -1,10 +1,10 @@
const cron = require('node-cron');
const { handleBirthdayGetAll } = require('../features/birthday');
const cron = require('node-cron')
const { handleBirthdayGetAll } = require('../features/birthday')
const startBirthdayCheckCron = async (client) => {
cron.schedule('0 20 * * *', async () => {
try {
console.log('Running birthday check...');
console.log('Running birthday check...')
for (const [guildId, oauthGuild] of await client.guilds.fetch()) {
const guild = await oauthGuild.fetch()
@@ -12,30 +12,30 @@ const startBirthdayCheckCron = async (client) => {
if (!birthdayChannel) continue
const birthdays = await handleBirthdayGetAll();
console.log("birthdays:", birthdays)
const birthdays = await handleBirthdayGetAll()
console.log('birthdays:', birthdays)
if (birthdays.length < 1) continue
let message = '🎉 **Today\'s Birthdays!** 🎉\n\n';
let message = '🎉 **Today\'s Birthdays!** 🎉\n\n'
for (const birthday of birthdays) {
const birthdayDate = new Date(birthday.date);
const birthdayDate = new Date(birthday.date)
if (birthdayDate.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit' }) === new Date().toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit' })) {
(await guild.members.fetch()).forEach(user => {
if (user.user.username === birthday.discorduser) {
message += `🎂 **Happy Birthday, <@${user.id}>!** 🎂\nWishing you a fantastic day filled with joy and surprises! 🎁🎈\n\n**Everyone, make sure to wish <@${user.id}> a wonderful birthday!** 🎊🎉\n\n`;
message += `🎂 **Happy Birthday, <@${user.id}>!** 🎂\nWishing you a fantastic day filled with joy and surprises! 🎁🎈\n\n**Everyone, make sure to wish <@${user.id}> a wonderful birthday!** 🎊🎉\n\n`
}
})
}
}
console.log(message)
if (message !== '🎉 **Today\'s Birthdays!** 🎉\n\n') {
await birthdayChannel.send(message);
await birthdayChannel.send(message)
}
}
} catch (error) {
console.log("Error in scheduled birthday check:", error);
console.log('Error in scheduled birthday check:', error)
}
})
}
});
};
module.exports = { startBirthdayCheckCron };
module.exports = { startBirthdayCheckCron }

View File

@@ -1,4 +1,4 @@
const cron = require('node-cron');
const cron = require('node-cron')
const { ReadEvents, GetEventRole } = require('../database/eventdb')
const { EmbedBuilder } = require('discord.js')
@@ -11,28 +11,28 @@ const FetchEvents = async () => {
}
const convertToISO = (time, date) => {
const utcDate = new Date(`${date}T${time}`);
utcDate.setHours(utcDate.getHours());
return utcDate.toISOString().split('.')[0];
};
const utcDate = new Date(`${date}T${time}`)
utcDate.setHours(utcDate.getHours())
return utcDate.toISOString().split('.')[0]
}
const convertToUTC = (time) => {
const [hours, minutes, seconds] = time.split(':').map(Number);
const date = new Date();
date.setUTCHours(hours - 2, minutes, seconds);
return date.toISOString().split('.')[0];
};
const [hours, minutes, seconds] = time.split(':').map(Number)
const date = new Date()
date.setUTCHours(hours - 2, minutes, seconds)
return date.toISOString().split('.')[0]
}
const isReminderTime = (eventStartUTC) => {
const now = new Date();
const [eventHours, eventMinutes] = eventStartUTC.split('T')[1].split(':').map(Number);
const eventStartDateTime = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), eventHours, eventMinutes));
const reminderTime = new Date(eventStartDateTime.getTime() - 15 * 60 * 1000);
const now = new Date()
const [eventHours, eventMinutes] = eventStartUTC.split('T')[1].split(':').map(Number)
const eventStartDateTime = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), eventHours, eventMinutes))
const reminderTime = new Date(eventStartDateTime.getTime() - 15 * 60 * 1000)
console.log(now, reminderTime, eventStartDateTime)
return now >= reminderTime && now < eventStartDateTime;
};
return now >= reminderTime && now < eventStartDateTime
}
const getDayOfWeek = () => new Date(Date.UTC(new Date().getUTCFullYear(), new Date().getUTCMonth(), new Date().getUTCDate())).toLocaleDateString('en-US', { weekday: 'long' });
const getDayOfWeek = () => new Date(Date.UTC(new Date().getUTCFullYear(), new Date().getUTCMonth(), new Date().getUTCDate())).toLocaleDateString('en-US', { weekday: 'long' })
const startEventCheckCron = async (client) => {
cron.schedule('45 * * * *', async () => {