migrate from pg to sequelize
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -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
59
eslint.config.mjs
Normal 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,
|
||||
]
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
37
src/database/models/birthday.js
Normal file
37
src/database/models/birthday.js
Normal 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' },
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
36
src/database/models/blacklist.js
Normal file
36
src/database/models/blacklist.js
Normal 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' },
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
24
src/database/models/discorduser.js
Normal file
24
src/database/models/discorduser.js
Normal 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' },
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
37
src/database/models/event.js
Normal file
37
src/database/models/event.js
Normal 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' },
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
41
src/database/models/event_roles.js
Normal file
41
src/database/models/event_roles.js
Normal 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' },
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
45
src/database/models/event_schedule.js
Normal file
45
src/database/models/event_schedule.js
Normal 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' },
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
43
src/database/models/index.js
Normal file
43
src/database/models/index.js
Normal 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
|
||||
49
src/database/models/init-models.js
Normal file
49
src/database/models/init-models.js
Normal 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
|
||||
49
src/database/models/static.js
Normal file
49
src/database/models/static.js
Normal 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' },
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
38
src/database/models/static_members.js
Normal file
38
src/database/models/static_members.js
Normal 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' },
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
11
src/index.js
11
src/index.js
@@ -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)
|
||||
}
|
||||
})()
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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 () => {
|
||||
|
||||
Reference in New Issue
Block a user