Included user ID in table, Modified to rate limit snappy seperately from rdrama

master
j 2024-06-16 22:18:40 -04:00
parent 5345d182b7
commit ad3f827a99
3 changed files with 22 additions and 11 deletions

View File

@ -6,6 +6,9 @@ CREATE TABLE IF NOT EXISTS user_mentions (
-- because a single comment can mention multiple users. -- because a single comment can mention multiple users.
rdrama_comment_id TEXT NOT NULL, rdrama_comment_id TEXT NOT NULL,
-- The ID of the user who made the comment.
rdrama_user_id INTEGER NOT NULL,
-- The mentioned Reddit username in a standardized format (e.g., u/username). Lowercased -- The mentioned Reddit username in a standardized format (e.g., u/username). Lowercased
-- to ensure consistency and prevent duplicate entries due to case differences. -- to ensure consistency and prevent duplicate entries due to case differences.
username TEXT NOT NULL, username TEXT NOT NULL,

View File

@ -33,22 +33,25 @@ export class DatabaseService {
* @example * @example
* await DatabaseService.insertUserMention({ * await DatabaseService.insertUserMention({
* rdrama_comment_id: 456, * rdrama_comment_id: 456,
* rdrama_user_id: 123,
* username: 'mentionedUser', * username: 'mentionedUser',
* message: 'You were mentioned in a comment.' * message: 'You were mentioned in a comment.'
* }); * });
* *
* @param {Object} mention - The user mention object to insert. * @param {Object} mention - The user mention object to insert.
* @param {number} mention.rdrama_comment_id - The ID of the comment from the r/Drama platform. * @param {number} mention.rdrama_comment_id - The ID of the comment from the r/Drama platform.
* @param {number} mention.rdrama_user_id - The ID of the user who made the comment.
* @param {string} mention.username - The mentioned Reddit username. * @param {string} mention.username - The mentioned Reddit username.
* @param {string} [mention.message] - The content of the message sent to the mentioned user. * @param {string} [mention.message] - The content of the message sent to the mentioned user.
* @throws {Error} Will throw an error if the insert operation fails. * @throws {Error} Will throw an error if the insert operation fails.
*/ */
public static async insertUserMention(mention: { rdrama_comment_id: number; username: string; message?: string }): Promise<void> { public static async insertUserMention(mention: { rdrama_comment_id: number, rdrama_user_id: number, username: string, message?: string }): Promise<void> {
const db = await DatabaseService.getDatabase() const db = await DatabaseService.getDatabase();
const sql = `INSERT INTO user_mentions (rdrama_comment_id, username, message) VALUES (?, ?, ?)`; const sql = `INSERT INTO user_mentions (rdrama_comment_id, rdrama_user_id, username, message) VALUES (?, ?, ?, ?)`;
await db.run(sql, [mention.rdrama_comment_id, mention.username, mention.message]); await db.run(sql, [mention.rdrama_comment_id, mention.rdrama_user_id, mention.username, mention.message]);
} }
/** /**
* Queries the database to check if a username has been mentioned. * Queries the database to check if a username has been mentioned.
* *
@ -135,14 +138,18 @@ export class DatabaseService {
* @returns {Promise<boolean>} True if the cooldown period has passed, allowing new notifications to be sent. * @returns {Promise<boolean>} True if the cooldown period has passed, allowing new notifications to be sent.
* @throws {Error} Will throw an error if the check operation fails. * @throws {Error} Will throw an error if the check operation fails.
*/ */
public static async canSendNotification(): Promise<boolean> { public static async canSendNotification(comment: Comment): Promise<boolean> {
const db = await DatabaseService.getDatabase() const db = await DatabaseService.getDatabase()
const cooldownHours = process.env.NOTIFICATION_COOLDOWN_HOURS || 4; const cooldownHours = process.env.NOTIFICATION_COOLDOWN_HOURS || 4;
const sql = ` const snappyUID = 261
SELECT MAX(sent_time) as last_notification_time
FROM user_mentions let sql = `
`; SELECT MAX(sent_time) as last_notification_time
const result = await db.get(sql); FROM user_mentions
WHERE rdrama_user_id ${comment.author_id === snappyUID ? '=' : '!='} ?
`;
const result = await db.get(sql, [snappyUID])
if (!result || !result.last_notification_time) { if (!result || !result.last_notification_time) {
// No notifications have been sent yet, or unable to retrieve the last sent time. // No notifications have been sent yet, or unable to retrieve the last sent time.

View File

@ -13,7 +13,7 @@ class WorkflowOrchestrator {
*/ */
async executeWorkflow(comment: Comment) { async executeWorkflow(comment: Comment) {
try { try {
const canSend = await DatabaseService.canSendNotification(); const canSend = await DatabaseService.canSendNotification(comment);
const coolDownHours = process.env.NOTIFICATION_COOLDOWN_HOURS const coolDownHours = process.env.NOTIFICATION_COOLDOWN_HOURS
if (!canSend) { if (!canSend) {
console.log(`Last Message Sent less than ${coolDownHours ? coolDownHours : 4} hours ago. Set NOTIFICATION_COOLDOWN_HOURS to change this`) console.log(`Last Message Sent less than ${coolDownHours ? coolDownHours : 4} hours ago. Set NOTIFICATION_COOLDOWN_HOURS to change this`)
@ -77,6 +77,7 @@ class WorkflowOrchestrator {
await DatabaseService.insertUserMention({ await DatabaseService.insertUserMention({
rdrama_comment_id: comment.id, rdrama_comment_id: comment.id,
rdrama_user_id: comment.author_id,
username: redditUser, username: redditUser,
message: redditMessage, message: redditMessage,
}); });