Skip to content

Update Production Bot from QA Bot #202

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 74 commits into from
Aug 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
054128a
migrate from insou api to circles for the handbook commands (#128)
imagine-hussain Feb 22, 2023
ea97f33
prettier formatted
AcdSoftCo Feb 22, 2023
81e5085
chore(deps): update `renovate` config
lhjt Mar 22, 2023
883a0d8
chore(deps): update docker/build-push-action action to v4 (#134)
renovate[bot] Mar 23, 2023
d0656ca
Projects description command feature (#145)
zcDay1 May 16, 2023
9a4c9ec
disable annoying carrotboard pins
abiramen Aug 18, 2023
2f59c71
rolesPermOverride command is a script or one-time use command to atta…
AcdSoftCo Sep 16, 2023
617c373
Revert "rolesPermOverride command is a script or one-time use command…
AcdSoftCo Sep 16, 2023
da9b795
rolesPermOverride command (#152)
zcDay1 Sep 20, 2023
d55e093
Roles perm override (#153)
zcDay1 Sep 24, 2023
b2562be
Project descriptions (#154)
zcDay1 Sep 25, 2023
9f7c78d
Merge branch 'projects-bot' into develop
zcDay1 Sep 26, 2023
65f32ef
Dev/course channel fix 3 (#158)
Bigbugman Oct 21, 2023
7912884
Merge branch 'projects-bot' into develop
zcDay1 Oct 21, 2023
027f8fe
dev/course-channel-fix-5 (#160)
abe123442 Oct 22, 2023
a2cafe4
Merge branch 'projects-bot' into develop
zcDay1 Oct 22, 2023
4bac7ae
Update rolesPermOverride.js
zcDay1 Oct 24, 2023
b9576b5
Course Command Fixing - Collection Null Value Error (#162)
Domin0de Oct 31, 2023
0f34280
Dev/upgrade handbook url (#164)
abe123442 Nov 3, 2023
35f1f3b
Fixed bug for courses that do not yet have an offering term (Default:…
abe123442 Nov 3, 2023
34e2f53
Implementation of the Lunch Buddy feature (#167)
Domin0de Jan 21, 2024
6da7e8e
[DISC-107] Adding csesocLinks to get CSESoc related links (#170)
chlowoee Apr 21, 2024
dc2088f
[DISC-109] Adding bot-status for events and member count (#169)
ericwu2205 May 5, 2024
e4e3aa1
Update dependency nodemailer to v6.9.9 [SECURITY] (#168)
renovate[bot] May 15, 2024
28dad18
Update dependency axios to v0.28.0 [SECURITY] (#166)
renovate[bot] May 15, 2024
e02999a
fix(deps): update dependency yaml to v2.2.2 [security] (#147)
renovate[bot] May 15, 2024
1d16f9d
Update dependency dotenv to v16 (#141)
renovate[bot] May 15, 2024
ed9e422
chore(deps): update actions/checkout action to v4 (#157)
renovate[bot] May 15, 2024
ea0b2f8
fix(deps): update dependency discordjs-button-pagination to v3 (#140)
renovate[bot] May 15, 2024
e9cc79b
Remove unused discord-tictactoe dependency and updated canvas (#173)
Domin0de May 15, 2024
90a3e00
fix(deps): update weekly patch updates (#142)
renovate[bot] May 15, 2024
a1c4112
fix(deps): update dependency @discordjs/builders to v1 (#135)
renovate[bot] May 15, 2024
720e1c6
fix(deps): update dependency discord.js to v14 (#139)
renovate[bot] May 15, 2024
b2c1a88
Update to fix v14 breaking changes (#176)
Domin0de May 15, 2024
05f2dd7
chore(deps): update actions/setup-node action to v4 (#172)
renovate[bot] May 15, 2024
1b1ba66
Nitpick refactor for courses command (#126)
XenocidePC May 25, 2024
14d467c
fix(deps): update dependency mathjs to v12 (#182)
renovate[bot] May 27, 2024
dead83e
fix(deps): update dependency axios to v1 (#181)
renovate[bot] May 27, 2024
31a2eb0
fix(deps): update dependency @discordjs/rest to v2 (#179)
renovate[bot] May 27, 2024
0269b1c
chore(deps): update dependency eslint-config-prettier to v9 (#175)
renovate[bot] May 27, 2024
eeb06f1
fix(deps): update dependency nodemon to v3 (#183)
renovate[bot] May 27, 2024
3848496
chore(deps): update node.js to v20 (#171)
renovate[bot] May 27, 2024
8e1acf4
fix(deps): update dependency mathjs to v13 (#184)
renovate[bot] Jun 5, 2024
0762214
DISC-119-unielectives-review (#188)
h34312575s Jun 16, 2024
a586bb2
[DISC-120] Update eslint dependency and nodejs to v20
renovate[bot] Jun 27, 2024
7bebb5f
[DISC-120] Update to prettier and corresponding eslint plugin
renovate[bot] Jun 27, 2024
ab156e2
chore(deps): lock file maintenance (#186)
renovate[bot] Jun 27, 2024
0478938
chore(deps): update weekly minor updates (#143)
renovate[bot] Jun 27, 2024
84d63f4
[DISC-120] Fix to renovate.json file (#190)
Domin0de Jun 27, 2024
d2ff9ac
[DISC-120] Declare file type for requiring data (#192)
Domin0de Jun 28, 2024
719f36d
[DISC-120] Adjust data type for file (#193)
Domin0de Jun 28, 2024
c7f335f
[DISC-120] Move to using fs for configuration (#194)
Domin0de Jun 28, 2024
56701c8
Move file to config
Domin0de Jun 28, 2024
5fa634f
Fix spelling error
Domin0de Jun 28, 2024
f4b82ae
Append setup command for puppeteer browser
Domin0de Jun 28, 2024
132b068
Downloading dependencies and requirements for puppeteer
Domin0de Jun 29, 2024
da4e542
Modification to installation order
Domin0de Jun 29, 2024
36d43cd
Affirm installation
Domin0de Jun 29, 2024
6e593c8
Revert prior changes and set to use alternate folder for chromium ins…
Domin0de Jul 8, 2024
804c65f
Manually ignore puppeteer config file in eslint
Domin0de Jul 8, 2024
54dc641
Attempt fix to eslint hanging
Domin0de Jul 8, 2024
e65eb61
[DISC-117] Adding travelguides command (#187)
chlowoee Jul 9, 2024
7028f56
Modify location and method for chromium install
Domin0de Jul 9, 2024
ada9f90
Alter setup to use chromium base
Domin0de Jul 9, 2024
d8f9e47
Update to puppeteer version
Domin0de Jul 9, 2024
c651c4c
Replace secondary node image with puppeteer
Domin0de Jul 14, 2024
0c17f44
Fix capitalisation inconsistency and assume permission set
Domin0de Jul 14, 2024
dff8d4b
Reappend entrypoint permission modification
Domin0de Jul 14, 2024
a34fca4
Reset user from image setup
Domin0de Jul 14, 2024
5298768
Attempt return to puppeteer user after setup
Domin0de Jul 17, 2024
eecb1b5
[DISC-110] Adding Course Chats 1-year "Subscription" (#191)
ericwu2205 Jul 17, 2024
8ed55ab
[DISC-121] Implement Logging for User Rejoining (#199)
Domin0de Aug 8, 2024
1f6ff77
Merge branch 'projects-bot' into develop
Domin0de Aug 8, 2024
2f55736
Fix to incorrect conflict resolution commit
Domin0de Aug 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 7 additions & 78 deletions commands/admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,7 @@ const { SlashCommandBuilder } = require("@discordjs/builders");
const { Permissions } = require("discord.js");

const COMMAND_KICKUNVERIFIED = "kickunverified";
const COMMAND_MIGRATE = "migratecourses";
const COMMAND_REMOVECOURSEROLES = "nukeremovecourseroles";

// yeah i know this code is copy pasted from the other file
// but whatever, the migration command is temporary!
const is_valid_course = (course) => {
const reg_comp_course = /^comp\d{4}$/;
const reg_math_course = /^math\d{4}$/;
const reg_binf_course = /^binf\d{4}$/;
const reg_engg_course = /^engg\d{4}$/;
const reg_seng_course = /^seng\d{4}$/;
const reg_desn_course = /^desn\d{4}$/;

return (
reg_comp_course.test(course.toLowerCase()) ||
reg_math_course.test(course.toLowerCase()) ||
reg_binf_course.test(course.toLowerCase()) ||
reg_engg_course.test(course.toLowerCase()) ||
reg_seng_course.test(course.toLowerCase()) ||
reg_desn_course.test(course.toLowerCase())
);
};
const COMMAND_DROPUSERTABLE = "dropusertable";

module.exports = {
data: new SlashCommandBuilder()
Expand All @@ -36,19 +15,8 @@ module.exports = {
)
.addSubcommand((subcommand) =>
subcommand
.setName(COMMAND_MIGRATE)
.setDescription("Migrates a course role to permission overwrites.")
.addStringOption((option) =>
option
.setName("course")
.setDescription("Course role to remove")
.setRequired(true),
),
)
.addSubcommand((subcommand) =>
subcommand
.setName(COMMAND_REMOVECOURSEROLES)
.setDescription("WARNING: Removes course roles from the server."),
.setName(COMMAND_DROPUSERTABLE)
.setDescription("Deletes the user table and reliant tables."),
),
async execute(interaction) {
try {
Expand Down Expand Up @@ -93,50 +61,11 @@ module.exports = {
});
});
return await interaction.reply("Removed unverified members.");
} else if (interaction.options.getSubcommand() === COMMAND_MIGRATE) {
const course = interaction.options.getString("course");
if (!is_valid_course(course)) {
return await interaction.reply("Error: invalid course.");
}

const role = await interaction.guild.roles.cache.find(
(course_role) => course_role.name.toLowerCase() === course.toLowerCase(),
);

if (role === undefined) {
return await interaction.reply("Error: no role exists for course " + course);
}

const channel = await interaction.guild.channels.cache.find(
(role_channel) => role_channel.name.toLowerCase() === role.name.toLowerCase(),
);

if (channel === undefined) {
return await interaction.reply("Error: no channel exists for course " + course);
}

await interaction.deferReply();
for (const member of role.members.values()) {
await channel.permissionOverwrites.create(member, {
VIEW_CHANNEL: true,
});
}
return await interaction.editReply(
"Migrated course role to permission overwrites.",
);
} else if (interaction.options.getSubcommand() === COMMAND_REMOVECOURSEROLES) {
// get all roles, and find courses which match the regex
const course_roles = await interaction.guild.roles.cache.filter((role) =>
is_valid_course(role.name),
);

await interaction.deferReply();

for (const role of course_roles.values()) {
await role.delete();
}
} else if (interaction.options.getSubcommand() === COMMAND_DROPUSERTABLE) {
const userDB = global.userDB;
await userDB.drop_table();

return await interaction.editReply("Removed all course roles.");
return await interaction.editReply("Deleted user table.");
}

return await interaction.reply("Error: unknown subcommand.");
Expand Down
34 changes: 34 additions & 0 deletions events/guildMemberAdd.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
const { Events } = require("discord.js");

const CSESOC_SERVER_ID = "693779865916276746";
const REPORT_CHANNEL_ID = "1270283342176059443";

module.exports = {
name: Events.GuildMemberAdd,
once: false,
execute(member) {
/** @type {DBuser} */
const userDB = global.userDB;

// Get report channel
if (member.user.bot || member.user.system || member.guild.id !== CSESOC_SERVER_ID) return;

// Get old user info before joining
userDB.get_user_info(member.id).then((user_data) => {
userDB.user_join(member.id).then((joinType) => {
if (joinType === "rejoin") {
// Fetch the channel to output details
const reportChannel = member.guild.channels.cache.get(REPORT_CHANNEL_ID);

// Fetch formatted date values from joining and leaving events
const joinDate = user_data.joinDate.toLocaleDateString("en-AU");
const leaveDate = user_data.leaveDate.toLocaleDateString("en-AU");

reportChannel.send(
`${member.user} (${member.user.tag}) has rejoined the server. [Last in server: ${leaveDate}, Last joined: ${joinDate}]`,
);
}
});
});
},
};
15 changes: 15 additions & 0 deletions events/guildMemberRemove.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const { Events } = require("discord.js");

module.exports = {
name: Events.GuildMemberRemove,
once: false,
execute(member) {
/** @type {DBuser} */
const userDB = global.userDB;

// Get report channel
if (member.user.bot || member.user.system) return;

userDB.user_leave(member.id);
},
};
57 changes: 55 additions & 2 deletions lib/database/database.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class DBuser {
console.log("Running creating user table");
await client.query("BEGIN");
const query = `CREATE TABLE users (
userid INTEGER PRIMARY KEY,
userid TEXT PRIMARY KEY,
joindate DATE NOT NULL,
leavedate DATE,
userleft BOOLEAN
Expand Down Expand Up @@ -196,7 +196,7 @@ class DBuser {
try {
await client.query("BEGIN");
const values = [time, true, userid];
const query = "UPDATE users SET leavedate = $1 , userleft = $2 where userid = $3";
const query = "UPDATE users SET leavedate = $1 , userleft = $2 where userid = $3";
await client.query(query, values);

await client.query("COMMIT");
Expand All @@ -215,6 +215,8 @@ class DBuser {
time.setMilliseconds(0);
time = time.toISOString();

let type = "new";

const client = await this.pool.connect();
try {
await client.query("BEGIN");
Expand All @@ -227,6 +229,9 @@ class DBuser {
query = "UPDATE users SET joindate=$1, userleft=$2 where userid=$3";
values = [time, false, userid];
await client.query(query, values);

// Report rejoining user to channel
type = "rejoin";
} else {
query =
"INSERT INTO users (USERID, JOINDATE, LEAVEDATE, USERLEFT) VALUES ($1,$2,$3,$4)";
Expand All @@ -241,6 +246,40 @@ class DBuser {
client.release();
// console.log("Client released successfully.")
}

return type;
}

async get_user_info(userid) {
const client = await this.pool.connect();
let info = null;

try {
await client.query("BEGIN");

const query = "select * from users where userid = $1";
const values = [userid];
const result = await client.query(query, values);

if (result.rows.length != 0) {
const row = result.rows[0];

info = {
userId: row["userid"],
joinDate: row["joindate"],
leaveDate: row["leavedate"],
userLeft: row["userleft"],
};
}
} catch (ex) {
console.log(`An unexpected error occurred: ${ex}`);
} finally {
await client.query("ROLLBACK");
client.release();
// console.log("Client released successfully.")
}

return info;
}

// Adding a user role
Expand Down Expand Up @@ -477,6 +516,20 @@ class DBuser {
client.release();
}
}

async deleteUsers() {
// Temporary - delete after use
const client = await this.pool.connect();
try {
// Query to delete users who have left the server
const query = `DROP TABLE users CASCADE;`;
await client.query(query);
} catch (error) {
console.error(error);
} finally {
client.release();
}
}
}

module.exports = {
Expand Down
Loading